Anda di halaman 1dari 67

PIC16F84

El PIC16F84 es un microcontrolador a 8 bits de la familia PIC perteneciente a la Gama


Media (segn la clasificacin dada a los microcontroladores por la misma empresa
fabricante) Microchip.
PIC16F84

ndice
[ocultar]

1 Estructura

2 Usos

3 Programa de ejemplo

4 Otro Programa de ejemplo

5 Datos curiosos sobre este PIC

6 Vase tambin

7 Enlaces externos

Estructura[editar]
Se trata de uno de los microcontroladores ms populares del mercado actual, ideal para
principiantes, debido a su arquitectura de 8 bits, 18 pines, y un conjunto de
instruccionesRISC muy amigable para memorizar y fcil de entender, internamente consta
de:

Memoria Flash de programa (1K x 14 bits).

Memoria EEPROM de datos (64 x 8 bits).

Memoria RAM (68 registros x 8 bits).

Un temporizador/contador (timer de 8 bits).

Un divisor de frecuencia.

Varios puertos de entrada-salida (13 pines en dos puertos, 5 pines el puerto A y 8


pines el puerto B).
Otras caractersticas son:

Manejo de interrupciones (de 4 fuentes).


Perro guardin (watchdog).

Bajo consumo.

Frecuencia de reloj externa mxima 10MHz. (Hasta 20MHz en nuevas versiones).


La frecuencia de reloj interna es un cuarto de la externa, lo que significa que con un
reloj de 20Mhz, el reloj interno sera de 5Mhz y as pues se ejecutan 5 Millones de
Instrucciones por Segundo (5 MIPS)

No posee conversores analgicos-digital ni digital-analgicos.

Pipe-line de 2 etapas, 1 para bsqueda de instruccin y otra para la ejecucin de la


instruccin (los saltos ocupan un ciclo ms).

Repertorio de instrucciones reducido (RISC), con tan solo 30 instrucciones


distintas.

4 tipos distintos de instrucciones, orientadas a byte, orientadas a bit, operacin


entre registros, de salto.

Usos[editar]
En los ltimos aos se ha popularizado el uso de este microcontrolador debido a su bajo
costo y tamao. Se ha usado en numerosas aplicaciones, que van desde los automviles a
decodificadores de televisin. Es muy popular su uso por los aficionados a la robtica y
electrnica.
Puede ser programado tanto en lenguaje ensamblador como en Basic y principalmente
en C, para el que existen numerosos compiladores. Cuando se utilizan los compiladores
Basic, es posible desarrollar tiles aplicaciones en tiempo rcord, especialmente dirigidas
al campo domstico y educacional.

Programa de ejemplo[editar]
A continuacin hay un pequeo programa en ensamblador (MPASM) que pone a 0 las
posiciones de memoria 20 y 21 (en hexadecimal) usando un direccionamiento indirecto:

MOVLW 20h
MOVWF FSR
CLRF INDF
INCF FSR
CLRF INDF

MOVLW k: (Move Literal to W) Es una instruccin que carga en el registro de trabajo W, un


literal (constante) k, que en este caso es 20h.
MOVWF f: (Move W to File), Copia el contenido del registro W a la posicin de memoria f.
En este caso, FSR representa una direccin de memoria. FSR es el registro usado para
direccionamiento indirecto. En FSR se carga la direccin de memoria que se va a
direccionar con INDF (otro registro).
CLRF f: (Clear File), Pone en 0 el registro en la posicin de memoria f.
INCF f: (Increment File), Incrementa en uno el valor almacenado en la posicin de
memoria f. .l.

Otro Programa de ejemplo[editar]


Este otro programa permite poner a valor lgico uno la salida RB0 del microcontrolador
cuando se detecta un valor lgico uno en la entrada RA0 mediante el uso de saltos
incondicionales GOTO (ir a...):

SIGUE BTFSS PORTA,0 ; testea el pin RA0 del PORTA, si


encuentra un "1" salta una instruccin, de lo contrario continua
GOTO APAGA ; salta a la subrutina APAGA
GOTO ENCIENDE ; salta a la subrutina ENCIENDE
APAGA BCF PORTB,0 ; pone en "0" el pin RB0 del PORTB
GOTO SIGUE ; vuelve al testeo
ENCIENDE BSF PORTB,0 ; pone en "1" el pin RB0 del PORTB
GOTO SIGUE ; todo de nuevo

Datos curiosos sobre este PIC[editar]


Las secciones de curiosidades deben ser evitadas.
Puedes mejorar este artculo introduciendo la informacin til de esta seccin en el resto del texto y quitando los datos
inapropiados.

El PIC16F84 posee una ULA (Unidad Lgica Aritmtica) limitada que impide hacer
clculos matemticos bsicos, como por ejemplo, una multiplicacin de dos nmeros a
8 bits en una nica instruccin, o una divisin en una nica instruccin. Por lo que el
programador debe valerse de otras tcnicas matemticas que se apoyan en el juego
de instrucciones aritmticas disponibles en este PIC para realizar este clculo
matemtico bsico.

Los datos almacenados en la memoria EEPROM pueden durar almacenados por


ms de 40 aos.

La memoria de datos no se puede acceder completamente en un nico registro


sino que se debe acceder por bancos, por lo que se debe estar atento al momento de
escribir el programa de no sobrescribir algn registro en el banco 0 queriendo escribir
sobre el banco 1.

Muchos estudiantes de electrnica, por no decir la mayora, eligen este PIC para
iniciarse en la programacin de microcontroladores cuando en el mercado existen
otros PIC con una arquitectura interna mucho ms simple que la que posee este
microntrolador.
DISEO, PROGRAMACIN E IMPLANTACIN DE UN SISTEMA DE CONTROL CON
ELMICROCONTROLADOR PIC 16F84
INTRODUCCIN
En el siguiente proyecto de Microcontroladores PIC haremos una explicacin terica sobre
su funcionamiento, programacin y sus caractersticas principales, para as llegar al
desarrollo del diseo y su implantacin prctica. Para este proyecto se utilizara el
PIC 16F84 o en su defecto el PIC 16C84.

Ya que el " PIC 16F84 " es un MICROCONTROLADOR con memoria de programa tipo
FLASH, lo que representa gran facilidad en el desarrollo de prototipos y en su aprendizaje
ya que no se requiere de borrado con luz ultravioleta como las versiones EPROM sino,
permite reprogramarlo nuevamente sin ser borrado con anterioridad. Por esta razn, lo
usaremos en la mayora de aplicaciones que se desarrollan a lo largo del estudio.

El PIC 16C84 es un microcontrolador de la familia MICROCHIP, totalmente compatible con


el PIC 16F84. Su principal caracterstica es que posee memoria "EEPROM" en lugar de
memoria Flash, pero su manejo es igual. Con respecto al PIC16F84,
este microcontroladorpresenta dos diferencias:
La memoria de datos tiene menor tamao, aqu se tienen 32 registros de
propsito general (el mapa de memoria de datos llega hasta 2Fh).
En el momento de programar el microcontrolador, el fusible de seleccin del
temporizador de arranque (Power Up Timer) trabaja de forma inversa, es decir,
si en el PIC 16F84 se selecciona la opcin "Low" para activarlo, en el PIC 16C84
se debe seleccionar "High".

Este microcontrolador ha sido reemplazado de forma gradual por el PIC 16F84, por lo
tanto, los diseos que lo utilicen como elemento de control deben ser actualizados.
Aunque, como se ve, es un proceso casi transparente.

Este microcontrolador se basa en la Arquitectura Harvard, en la cual el programa y los


datos se pueden trabajar desde memorias separadas, lo que posibilita que
las instrucciones y los datos posean longitudes diferentes. Esta misma estructura es la que
permite la superposicin de los ciclos de bsqueda y ejecucin de las instrucciones, lo cual
se ve reflejado en una mayor velocidad del microcontrolador.
MARCO TERICO

- MEMORIA DE PROGRAMA

Es una memoria de 1 K byte de longitud con palabra de 14 bits. Como es del tipo FLASH
se puede programar y borrar elctricamente, en otras palabras, se puede programar o
borrar sin necesidad de un borrador de luz ultravioleta, lo que facilita el desarrollo de
programas y la experimentacin. Como el PIC 16F84 tiene un contador de programa de 13
bits, tiene una capacidad de direccionamiento de 8K x 14, pero solamente tiene
implementado el primer 1K x 14 (000h hasta 03FFh). Si se direccionan posiciones de
memoria superiores a 3FFh se causar un solapamiento o desborde con el espacio del
primer 1K.

- VECTOR DE RESET
Cuando ocurre un reset o se enciende el microcontrolador, el contador de programa se
pone en ceros (000h). Por esta razn, en la primera direccin del programa se debe
escribir todo lo relacionado con la iniciacin del mismo.

- VECTOR DE INTERRUPCION

Cuando el microcontrolador recibe una seal de interrupcin el contador de programa


apunta a la direccin 04h de la memoria de programa, por eso all se debe escribir toda la
programacin necesaria para atender dicha interrupcin.

- REGISTROS (Memoria RAM)

El PIC 16F84 puede direccionar 128 posiciones de memoria RAM, pero solamente tiene
implementado fsicamente los primeros 80 (0 a 4Fh). De estos los primeros 12 son
registros que cumplen un propsito especial en el control del microcontrolador y los 68
siguientes son registros de uso general que se pueden usar para guardar los datos
temporales de la tarea que se esta ejecutando. Los registros estn organizados como dos
bancos (paginas) de 128 posiciones de 8 bits cada una (128 x 8); todas las posiciones se
pueden accesar directa o indirectamente (estas ultimas a travs del registro FSR). Para
seleccionar que pagina de registro se trabaja en un momento determinado se utiliza el bit
RP0 del registro STATUS.
- PINES Y FUNCIONES

Los PUERTOS son el puente entre el microcontrolador y el mundo exterior. Son lneas
digitales que trabajan entre cero y cinco voltios y se pueden configurar como entradas o
como salidas.

El PIC 16F84 tiene dos puertos. El puerto A con 5 lneas y el puerto B con 8 lneas. Cada
pin se puede configurar como entrada o como salida independiente programado por un par
de registros diseados para tal fin. En ese registro un "0" configura el pin del puerto
correspondiente como salida y un "1" lo configura como entrada.

- PUERTO A

RA0 = Pin de Entrada/Salida (TTL).

RA1 = Pin de Entrada/Salida (TTL).

RA2 = Pin de Entrada/Salida (TTL).

RA3 = Pin de Entrada/Salida (TTL).

RA4/TOCKI = Pin de Entrada/Salida o entrada de Reloj Externo para el TMR0, cuando


este pin se configura como salida es de tipo Open Drain (ST), cuando funciona como
salida se debe conectar a Vcc (+5V) a travs de una resistencia.

- PUERTO B

RB0/INT = Pin de Entrada/Salida o entrada de interrupcin externa. (TTL/ST).

RB1 = Pin de Entrada/Salida (TTL).

RB2 = Pin de Entrada/Salida (TTL).

RB3 = Pin de Entrada/Salida (TTL).

RB4 = Pin de Entrada/Salida con Interrupcin por cambio de Flanco (TTL).

RB5 = Pin de Entrada/Salida con Interrupcin por cambio de Flanco (TTL).


RB6 = Pin de Entrada/Salida con Interrupcin por cambio de Flanco (TTL/ST).

RB7 = Pin de Entrada/Salida con Interrupcin por cambio de Flanco (TTL/ST).

- PINES ADICIONALES

MCLR = Pin de Reset del Microcontrolador (Master Clear). Se activa (el pic se resetea)
cuando tiene un "0" lgico en su entrada.

Vss = Ground o Tierra

VDD = Fuente Positiva (+5V)

OSC2/CLKOUT = Entrada del Oscilador del Cristal. Se conecta al Cristal o Resonador en


modo XT (Oscilador de Cristal). En modo RC (Resistencia-Condensador), este pin acta
como salida el cual tiene 1/4 de la frecuencia que entra por el pin OCS1/CLKIN.

OSC1/CLKIN = Entrada del Oscilador del Cristal / Entrada de reloj de una Fuente Externa.

El Puerto B tiene Internamente unas resistencias de pull-up conectadas a sus pines (sirven
para fijar el pin a un nivel de cinco voltios), su uso puede ser habilitado o deshabilitado
bajo control del programa. Todas las resistencias de pull-up conectan o desconectan a la
vez. La resistencia de pull-up es desconectada automticamente en un pin si este se
programa como salida. El pin RB0/INT se puede configurar por software para que funcione
como interrupcin externa.

El pin RA4/TOCKI del puerto A puede ser configurado como un pin de entrada/salida como
se mencionaba anteriormente o como entrada del temporizador/contador. Cuando este pin
se programa como entrada digital, funciona como un disparador de Schmitt (Schmitt
trigger, ST), esto quiere decir que puede reconocer seales un poco distorsionadas y
llevarlas a niveles lgicos (cero y cinco voltios). Cuando se usa como salida digital se
comporta como colector abierto, por lo tanto se debe poner una resistencia de pull-up
(resistencia externa conectada a un nivel lgico de cinco voltios). Como salida, la lgica es
inversa: un "0" escrito al pin del puerto entrega en el pin un "1" lgico. Adems como salida
no puede manejar cargas como fuente, slo en el modo sumidero.

Como este dispositivo es de tecnologa CMOS, todos los pines deben estar conectado a
alguna parte, nunca dejarlos al aire por que se puede daar el integrado. Los pines que no
se estn usando se deben conectar la fuente de alimentacin +5V con una resistencia de <
5 Kilo Ohmio.

La mxima capacidad de corriente de cada uno de los pines de los puertos en modo
sumidero (sink) es de 25 mA y en modo fuente (source) es de 20 mA.

El consumo de corriente del microcontrolador para su funcionamiento depende del voltaje


de operacin, la frecuencia y de las cargas que tengan sus pines.

Por Ejemplo: Para un reloj de 4 MHz el consumo es de aproximadamente de 2mA; aunque


este se puede reducir a 40 microamperios cuando est en el modo sleep (en este modo el
micro se detiene y disminuye el consumo de potencia). Se sale de este estado cuando se
produce alguna condicin especial que veremos mas adelante.
PINES Y FUNCIONES (Figura)

- EL OSCILADOR EXTERNO

Todo Microcontrolador requiere un circuito externo que le indique la velocidad a la que


debe trabajar. Este circuito, que se conoce con el nombre de oscilador o reloj, es muy
simple pero de vital importancia para el buen funcionamiento del sistema. El PIC 16F84
puede utilizar cuatro tipos de oscilador diferentes. Estos tipos son:
RC. Oscilador con resistencia y condensador.

XT. Cristal de cuarzo.

HS. Cristal de alta velocidad.

LP. Cristal para baja frecuencia y bajo consumo de potencia.

En el momento de programar o "quemar" el microcontrolador se debe especificar que tipo


de oscilador se usa. Esto se hace a travs de unos fusibles llamados "fusibles de
configuracin".

En la mayora de las practicas que se realizan se sugiere el cristal de 4 MHz, por que
garantiza una mayor precisin y un buen arranque del microcontrolador. Internamente esta
frecuencia esta dividida por cuatro, lo que hace que la frecuencia efectiva de trabajo sea
de 1 MHz, por lo que cada instruccin se realiza en un microsegundo (1 S). El cristal
debe ir acompaado de dos condensadores y se conecta como se muestra en la figura
siguiente.

Dependiendo de la aplicacin, se pueden utilizar cristales de otras frecuencias; por


ejemplo se usa el cristal de 3.579545 MHz por que es muy econmico, el de 32.768 KHz
cuando se necesita crear bases de tiempo de un segundo muy precisas. El lmite de
velocidad de estos microcontroladores es de 10 MHz.

Si no se requiere mucha presicin en el oscilador y se requiere economizar dinero, se


puede utilizar una resistencia y un condensador, como se muestra a continuacin.

Los valores recomendados para este tipo de oscilador son: 5 KW Rext 100 KW y Cext
> 20 pF.

Nota: Cuando el oscilador del dispositivo esta en modo RC, no maneje el pin OSC1 con un
reloj externo por que puede daar el dispositivo.

La frecuencia del oscilador dividida por cuatro est disponible en el pin OSC2/CLKOUT, y
puede ser usada para chequear propsitos o para sincronizar otra lgica.
RESET

En los microcontroladores se requiere un pin de reset para reiniciar el funcionamiento del


sistema cuando sea necesario, ya sea por una falla que se presente o por que as se halla
diseado el sistema. El pin de reset en los PIC es llamado "Master Clear". El PIC 16F84
admite diferentes tipos de reset:
Al encendido (Power On Reset)

Pulso en el pin Master Clear durante operacin normal

Pulso en el pin Master Clear durante el modo de bajo consumo (modo sleep)

El rebase del conteo del circuito de vigilancia (watchdog) durante operacin


normal.
El rebase del conteo del circuito de vigilancia (watchdog) durante el modo de
bajo consumo (sleep)

El reset al encendido se consigue gracias a dos temporizadores. El primero de ellos es el


OST (Oscillator Star-Up Timer: Temporizador de encendido del oscilador), orientado a
mantener el microcontrolador en reset hasta que el oscilador de cristal es estable. El
segundo es el PWRT (Power-Up Timer: Temporizador de encendido), que provee un
retardo fijo de 72 mS (nominal) en el encendido nicamente, diseado para mantener el
dispositivo en reset mientras la fuente se estabiliza. Para utilizar estos temporizadores,
solo basta con conectar el pin Master Clear a la fuente de alimentacin evitndose utilizar
las tradicionales redes RC externas en el pin de reset.

- El reset por Master Clear se consigue llevando momentneamente este pin a un estado
lgico bajo, mientras que el watchdog WDT produce un reset cuando su temporizador
rebasa la cuenta, o sea que pasa de 0FFh a 00H. Cuando se quiere tener control sobre el
reset del sistema se puede conectar un botn como se muestra en la siguiente figura.

- Reset por Brown-Out: Un brown-out es una condicin en donde la alimentacin del


dispositivo (Vdd) baja a un valor mnimo, pero no a cero y luego se normaliza. El
dispositivo debe resetearse en caso de presentarse un brown-out. Para resetear un PIC
16F84 cuando un brown-out ocurre se debe construir un circuito de proteccin externo
como el de la siguiente figura:

Circuito de Proteccin # 1.

Este circuito entrar en un reset activo cuando VDD baja por debajo de Vz + 0.7, en donde
Vz = Voltaje del Zener.

Circuito de Proteccin # 2.

Este circuito es ms econmico, aunque menos eficaz. El transistor Q1 pasar a un estado


de corte cuando VDD est por debajo de un cierto nivel tal que:VDD * (R1 / (R1 + R2)) =
0.7 V
REGISTROS (Memoria Ram)

El PIC 16F84 puede direccionar 128 posiciones de memoria RAM, pero solamente tiene
implementado fsicamente los primeros 80 (0 a 4Fh). De estos los primeros 12 son
registros que cumplen un propsito especial en el control del microcontrolador y los 68
siguientes son registros de uso general que se pueden usar para guardar los datos
temporales de la tarea que se esta ejecutando. Los registros estn organizados como dos
bancos (paginas) de 128 posiciones de 8 bits cada una (128 x 8); todas las posiciones se
pueden accesar directa o indirectamente (estas ultimas a travs del registro FSR). Para
seleccionar que pagina de registro se trabaja en un momento determinado se utiliza el bit
RP0 del registro STATUS.

00h o INDO: Registro para el direccionamiento indirecto de datos. Este no es un registro


disponible fsicamente; utiliza el contenido del FSR y el bit RP0 del registro STATUS para
seleccionar indirectamente la memoria de datos o RAM del usuario; la instruccin
determinara que se debe sealar con el registro sealado.

01h o TMR0: Temporizador/contador de 8 bits. Este se puede incrementar con una seal
externa aplicada al pin RA4/TOCKI o de a cuerdo a una seal interna proveniente del reloj
de instrucciones del microcontrolador. La rata o tasa de incremento del registro se puede
determinar por medio de un preescalador, localizado en el registro OPTION. Los anteriores
microcontroladores no contaban con la generacin de una interrupcin cuando se
rebasaba la cuenta (el paso de 0FFh a 00h).

02h o PCL: CONTADOR DE PROGRAMA. Se utiliza para direccionar las palabras de 14


bits del programa del usuario que se encuentra almacenado en la memoria ROM; este
contador tiene un tamao de 13 bits. Sobre el byte bajo, se puede escribir o leer a voluntad
directamente, mientras que en el byte alto, no. El byte alto se maneja mediante el registro
PCLATH (0Ah). A diferencia de los PIC de primera generacin el 16F84 ante una condicin
de reset inicia el contador de programa con todos sus bits en "cero". Durante la ejecucin
normal del programa, y dado que todas las instrucciones ocupan solo una posicin de
memoria, el contador se incrementa con cada instruccin, a menos que se trate de alguna
instruccin de salto.

03h o STATUS: REGISTRO DE ESTADO. Contiene el estado Aritmtico de la ALU, la


causa de reset y los bits de preseleccin de pagina para la memoria de datos. En la
figura se muestran los bits correspondientes a este registro. Los bits 5 y 6 (RP0 y RP1)
son los bits de seleccin de pagina (Bank 0 y Bank 1), para el direccionamiento directo de
la memoria de datos; solamente RP0 se usa en los PIC 16F84. RP1 se puede utilizar como
un bit de propsito general de lectura/escritura. Los bits TO y PD no se pueden modificar
por un proceso de escritura; ellos muestran la condicin por la cual se ocasiono el ultimo
reset.

IRP RP1 RP0 T0 PD Z DC C

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

Selector de pgina para direccionamiento indirecto. Este bit no se


utiliza efectivamente en el PIC 16F84, por lo que se puede utilizar
IRP como un bit de propsito general.

Selectores de pgina para un seleccionamiento directo. Solamente


RP0 se utiliza en el PIC 16F84. RP1 se puede utilizar como un bit de
RP1,0 propsito general.

Time Out o bit de finalizacin del temporizador. Se coloca en 0


T0 cuando el circuito de vigilancia Watchdog finaliza la temporizacin

Power Down o bit de bajo consumo. Se coloca en 0 por la instruccin


PD sleep.

Zero o bit de cero. Se coloca en 1 cuando el resultado de una


Z operacin aritmtica o lgica es cero.

Digit Carry o bit de acarreo de dgito. En operaciones aritmticas se


activa cuando hay un acarreo entre el bit 3 y 4, es decir cuando hay
DC acarreo entre el nible de menor y de mayor peso.

Carry o bit de acarreo. En instrucciones aritmticas se activa cuando


C se presenta acarreo desde el bit ms significativo del resultado.

04h o FSR: REGISTRO SELECTOR DE REGISTROS. En asocio con el registro IND0, se


utiliza para seleccionar indirectamente los otros registros disponibles. Mientras que los
antecesores del PIC 16F84 solo posean 5 bits activos, en este microcontrolador se
poseen solo 8 bits. Si en el programa no se utilizan llamadas indirectas, este registro se
puede utilizar como un registro de propsito general.

05h o PORTA: PUERTO DE ENTRADA/SALIDA DE 5 BITS (RA0~ RA4). Este puerto al


igual que todos sus similares en los PIC, puede leerse o escribirse como si se tratara de un
registro cualquiera. El registro que controla el sentido (entrada o salida) de los pines de
este puerto esta localizado en la pagina 1 (Banco 1), en la posicin 85h y se llama TRISA.

06h o PORTB: PUERTO DE ENTRADA/SALIDA DE 8 BITS (RB0~RB7). Al igual que en


todos los PIC, este puede leerse o escribirse como si se tratara de un registro cualquiera;
algunos de sus pines tienen funciones alternas en la generacin de interrupciones. El
registro de control para la configuracin de la funcin de sus pines se localiza en la pagina
1 (Banco 1), en la direccin 86h y se llama TRISB.

08h o EEDATA: REGISTRO DE DATOS DE LA EEPROM. Este registro contiene el dato


que se va a escribir en la memoria EEPROM de datos o el que se ley de sta.

09h o EEADR: REGISTRO DE DIRECCION DE LA EEPROM. Aqu se mantiene la


direccin de la EEPROM de datos que se van a trabajar, bien sea para una operacin de
lectura o para una de escritura

0Ah o PCLATH: REGISTRO PARA LA PARTE ALTA DE LA DIRECCION. Este registro


contiene la parte alta del contador de programa y no se puede acceder directamente.

0Bh o INTCON: REGISTRO PARA EL CONTROL DE INTERRUPCIONES. Es el


encargado del manejo de las interrupciones y contiene los bits que se muestran en la
figura.

GIE EEIE TOIE INTE RBIE TOIF INTF RBIF

Bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

Global Interrup Enable o Habilitador general de interrupciones.

0: Deshabilita todas las interrupciones

GIE 1: Habilita las interrupciones

EEPROM Write Interrup Enable o Habilitacin de interrupcin por


escritura de la EEPROM.

0: La deshabilita

EEIE 1: La habilita

TMR0 Interrup Enable o Habilitacin de interrupcin del temporizador


TMR0.

0: La deshabilita

T0IE 1: La habilita

INT Interrup Enable o Habilitacin de la interrupcin INT.

0: La deshabilita

INTE 1: La habilita

RBIE RBIF Interrup Enable o Habilitacin de la interrupcin RBIF.

0: La deshabilita
1: La habilita

TMR0 Overflow Interrup Flag o Bandera de la interrupcin por


desbordamiento del TMR0.

Se coloca en 1 cuando el TMR0 pasa de 0FFh a 00h; sta debe ser


TOIF puesta a 0 por programa.

INT Interrup Flag o Bandera de interrupcin INT.

Se coloca en 1 cuando la interrupcin INT ocurre; sta debe ser


INTF puesta cero por programa.

RB Port Change Interrup Flag o Bandera de interrupcin por cambio


en el puerto B.

Se coloca en 1 cuando una de las entradas (RB4 a RB7) cambia; sta


RBIF debe ser puesta a 0 por programa

81h u OPTION: REGISTRO DE CONFIGURACION MULTIPLE. Posee varios bits para


configurar el preescalador, la interrupcin externa, el timer y las caractersticas del Puerto
B. Los bits que contiene y las funciones que realiza este registro se muestran en la figura.
El preescalador es compartido entre el TMR0 y el WDT; su asignacin es mutuamente
excluyente ya que solamente puede uno de ellos ser preescalado a la vez.

PS
0
RBPU INTEDG GRTS RTE PSA PS2 PS1
bit
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 0

Portb Pull-up Enable o Habilitacin de pull-up del puerto B.

0: Habilita las pull-ups internas

RBPU 1: Las deshabilita

INT Interrup Edge Select o Selector de flanco de la interrupcin INT.

0: Flanco de bajada

INTEDG 1: Flanco de subida

TMR0 Signal Source o Fuente de seal del TMR0.

0: Ciclo de instrucciones interno (Temporizador)

RTS 1: Transicin en el pin RA4/TOCKI (Contador)

TMR0 Signal Edge o Flanco de la seal del TMR0

0: Incremento de transicin de bajo a alto

RTE 1: Incremento en transicin


Preescaler Assignment o Asignacin del preescalador

0: TMR0 (Contador / Temporizador)

PSA 1: WDT (Circuito de vigilancia)

Preescaler Value o Valores del preescalador.

Valor TMR0 WDT

000 1:2 1:1

001 1:4 1:2

010 1:8 1:4

011 1:16 1:8

100 1:32 1:16

101 1:64 1:32

110 1:128 1:64

PS2, 1, 0 111 1:256 1:128

85h o TRISA: REGISTRO DE CONFIGURACION DEL PUERTO A. Es el registro de


control para el puerto A. Un "cero" en el bit correspondiente al pin lo configura como salida,
mientras que un "uno" lo hace como entrada.

86h o TRISB: REGISTRO DE CONFIGURACION DEL PUERTO B. Es el registro de


control para el puerto B. Un "cero" en el bit correspondiente al pin lo configura como salida,
mientras que un "uno" lo hace como entrada.

88h o EECON1: REGISTRO DE PARA EL CONTROL DE LA MEMORIA EEPROM DE


DATOS. Este es el registro de control para la memoria de datos y solo destina cinco bits
para ello, los ms bajos; los tres bits superiores permanecen sin implementar. En la
figura se muestran las funciones de estos bits.

U U U EEIF WRERR WREN WR RD

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

U Unimplemented. No implementados.

EEPROM Write Completion Interrup Flag o Bandera de finalizacin de


la escritura. Se coloca en "1" cuando finaliza con xito la escritura de
la EEPROM de datos; se debe colocar en "0" por programa. El bit de
habilitacin correspondiente es el EEIE, localizado en el registro
EEIF INTCON.

Write Error Flag o Bandera de error de escritura. Si se coloca en "1"


WRER cuando la operacin de escritura termina prematuramente, debido a
R cualquier condicin de reset.
Write Enable o habilitacin de escritura. Si se coloca en "0" no permite
WREN las operaciones de escritura; en "1" las habilita.

Write Control o Control de escritura. Al colocarse en "1" inicia un ciclo


de escritura. Este bit slo es puesto a "0" por hardware, una vez la
WR escritura termina.

Read Control o Control de lectura. Al colocarse en "1" se inicia una


lectura de la EEPROM de datos, la cual toma un ciclo de reloj de
instrucciones. Este bit slo se limpia (colocar en "0") por hardware, al
RD finalizar la lectura de la posicin de la EEPROM.

89h o EECON2: REGISTRO AUXILIAR PARA EL CONTROL DE LA MEMORIA EEPROM


DE DATOS. Este registro no es implementado fsicamente por el microcontrolador, pero
que es necesario en las operaciones de escritura en la EEPROM de datos; ante cualquier
intento de lectura se tendrn "ceros".

0Ch a 4Fh: REGISTRO DE PROPOSITO GENERAL. Estas 68 posiciones estn


implementadas en la memoria RAM esttica, la cual conforma el rea de trabajo del
usuario; a ellas tambin se accede cuando en la pagina 1 (Banco 1) se direccionan las
posiciones 8Ch a CFh. Esto se ha diseado as para evitar un excesivo cambio de paginas
en el manejo de la RAM del usuario, agilizando los procesos que se estn llevando a cabo
y descomplicando la labor del programador.

REGISTRO DE TRABAJO W. Este es el registro de trabajo principal, se comporta de


manera similar al acumulador en los microprocesadores. Este registro participa en casi
todo el programa y por consiguiente en la mayora de las instrucciones.

PILA (STACK). Estos registros no forman parte de ningn banco de memoria y no


permiten el acceso por parte del usuario. Se usan para guardar el valor del contador de
programa cuando se hace un llamado a una subrutina (CALL ), o cuando se atiende una
interrupcin; luego, cuando el micro regresa a seguir ejecutando su tarea normal, el
contador de programa recupera su valor leyndolo nuevamente desde la pila. El PIC
16F84 tiene una pila de 8 niveles, esto significa que se pueden anidar 8 llamados a
subrutina sin tener problema alguno.
CARACTERSTICAS ESPECIALES

Algunos elementos que forman parte de los PIC no se encuentran en microcontroladores


de otros fabricantes, o simplemente representan alguna ventaja o facilidad a la hora de
hacer un diseo. A continuacin una corta descripcin de las ms significativas.

- CIRCUITO DE VIGILANCIA (Watchdog Timer)

Su funcin es restablecer el programa cuando ste se ha perdido por fallas en la


programacin o por alguna razn externa. Es muy til cuando se trabaja en ambientes con
mucha interferencia o ruido electromagntico. Esta conformado por un oscilador RC que
se encuentra dentro del microprocesador. Este oscilador corre de manera independiente al
oscilador principal. Cuando se habilita su funcionamiento, dicho circuito hace que el
microcontrolador sufra un reset cada determinado tiempo (que se puede programar entre
18 mS y 2 segundos). Este reset lo puede evitar el usuario mediante una instruccin
especial del microcontrolador (CLRWT: Borra el contenido del watchdog), la cual se debe
ejecutar antes de que termine el periodo nominal de dicho temporizador. De esta manera si
el programa se ha salido de su flujo normal, por algn ruido o interferencia externa, el
sistema se reiniciar (cuando se acabe el tiempo programado y no se haya borrado el
contador) y el programa puede restablecerse para continuar con su funcionamiento
normal.

- TEMPORIZADOR DE ENCENDIDO (Power-up Timer)

Este proporciona un reset al microcontrolador en el momento de conectar la fuente de


alimentacion, lo que garantiza un arranque correcto del sistema. En el momento de grabar
el microcontrolador se debe habilitar el fusible de configuracin "Power-up Timer", para ello
se debe seleccionar "ON". Su tiempo de retardo es de 72 milisegundos.

- MODO DE BAJO CONSUMO (Sleep)

Esta caracterstica permite que el microcontrolador entre en un estado pasivo donde


consume muy poca potencia. Cuando se entra en este modo el oscilador principal se
detiene, pero el temporizador del circuito de vigilancia (watchdog) se reinicia y empieza su
conteo nuevamente. Se entra en ese estado por la ejecucin de una instruccin especial
(llamada SLEEP) y se sale de l cuando el microcontrolador sufre un reset por un pulso en
el pin MCLR, por que el watchdog hace que se reinicie el sistema o por que ocurre una
interrupcin al sistema.

- INTERRUPCIONES

Este microcontrolador incluye el manejo de interrupciones, lo cual representa grandes


ventajas. El PIC16F84 posee cuatro formas de interrupcin que son:
Interrupcin externa en el pin RB0/INT

Finalizacin del temporizador/contador TMR0

Finalizacin de escritura en la EEPROM de datos

Cambio de estado en los pines RB4 a RB7

El registro 0Bh o INTCON contiene las banderas de las interrupciones INT, cambio en el
puerto B y finalizacin del conteo del TMR0, al igual que el control para habilitar o
deshabilitar cada una de las fuentes de interrupcin, incluida la de escritura de la memoria
EEPROM. Slo la bandera de finalizacin de la escritura reside en el registro 88h
o EECON1.

Si el bit GIE (Global Interrup Enable) se coloca en 0, deshabilita todas las interrupciones.
Cuando una interrupcin es atendida, el bit GIE se coloca en 0 automticamente pare
evitar interferencias con otras interrupciones que se pudieran presentar, la direccin de
retorno se coloca en la pila y el PIC se carga con la direccin 04h. Una vez en la rutina de
servicio, la fuente de interrupcin se puede determinar examinando las banderas de
interrupcin. La bandera respectiva se debe colocar, por software, en cero antes de
regresar de la interrupcin, para evitar que se vuelva a detectar nuevamente la misma
interrupcin. La instruccin RETFIE permite al usuario retornar de la interrupcin, a la vez
que habilita de nuevo las interrupciones, al colocar el bit GIE en uno. Debe tenerse
presente que solamente el contador de programa es puesto en la pila al atenderse la
interrupcin; por lo tanto, es conveniente que el programador tenga cuidado con el registro
de estados y el de trabajo, ya que se pueden introducir resultados inesperados si dentro de
ella se modifican.

Interrupcin Externa. Acta sobre el pin RB0/INT y se puede configurar para activarse con
el flanco de subida o el de bajada, de acuerdo al bit INTEDG (Interrup Edge Select Bit,
localizado en el registro OPTION). Cuando se presenta un flanco valido en el pin INT, la
bandera INTF (INTCON) se coloca en uno. La interrupcin se puede deshabilitar
colocando el bit de control INTE (INTCON) en cero. Cuando se atiende la interrupcin, a
travs de la rutina de servicio, INTF se debe colocar en cero antes de regresar al programa
principal. La interrupcin puede reactivar al microcontrolador despus de la instruccin
SLEEP, si previamente el bit INTE fue habilitado

Interrupcin por finalizacin de la temporizacin. La superacin del conteo mximo (0FFh)


en el TMR0 colocara el bit TOIF (INTCON) en uno. El bit de control respectivo es TOIE
(INTCON).

Interrupcin por cambio en el puerto RB. Un cambio en los pines del puerto B (RB4 a RB7)
colocar en uno el bit RBIF (INTCON). El bit de control respectivo es RBIE (INTCON).

Interrupcin por finalizacin de escritura. Cuando la escritura de un dato en la EEPROM


finaliza, se coloca en 1 el bit EEIF (EECON1). El bit de control respectivo es EEIE
(INTCON).

LGICA DE INTERRUPCIONES PARA EL PIC 16FXX

- MEMORIA DE DATOS DE LA EEPROM

El PIC 16F84 tiene una memoria EEPROM de datos de 64 posiciones (00h a 3Fh), de 8
bits cada una. Este bloque de memoria no se encuentra mapeado en ningn banco, el
acceso a esas posiciones se consigue a travs de dos registros de la RAM:

- El registro EEADR (posicin 09), que debe contener la direccin de la posicin de la


EEPROM a ser accesada.

- El registro EEDATA (posicin 08), que contiene el dato de 8 bits que se va a escribir o el
que se obtuvo de la ultima lectura.

Adicionalmente, existen dos registros de control: el EECON1 (88h), que posee cinco bits
que manejan las operaciones de lectura/escritura y el EECON2 (89h), que aunque no es
un registro fsico, es necesario para realizar las operaciones de escritura.

La lectura toma un ciclo de reloj de instrucciones, mientras que las escritura, por ser
controlada por un temporizador incorporado, tiene un tiempo nominal de 10 milisegundos,
este tiempo puede variar con la temperatura y el voltaje. Cuando se va a realizar una
operacin de escritura, automticamente se hace primero la operacin de borrado. El
numero tpico de ciclos de borrado/escritura de la EEPROM de datos es de 1.000.000.

- FUSIBLES DE CONFIGURACION

El PIC 16F84 posee cinco fusibles, cada uno de los cuales es un bit. Estos fusibles se
pueden programas para seleccionar varias configuraciones del dispositivo: tipo de
oscilador, proteccin de cdigo, habilitacin del circuito de vigilancia y el temporizador al
encendido. Los bits se localizan en la posicin de memoria 2007h, posicin a la cual el
usuario slo tiene acceso durante la programacin del microcontrolador. Cuando se
programa la proteccin del cdigo, el contenido de cada posicin de la memoria no se
puede leer completamente, de tal manera que el cdigo del programa no se puede
reconstruir. Adicionalmente, todas las posiciones de memoria del programa se protegen
contra la reprogramacin.

Una vez protegido el cdigo, el fusible de proteccin solo puede ser borrado

(puesto a 1) si se borra toda la memoria del programa y la de datos.

- LAS PULL-UP INTERNAS


Cada uno de los pines del puerto B tiene un elemento dbil pull-up interno (250 uA tpico);
este elemento es automticamente desconectado cuando el pin se configura como salida.
Adicionalmente, el bit RBPU (OPTION) controla todos estos elementos, los cuales estn
deshabilitados frente a una condicin de reset. Estos elementos pull-up son especialmente
tiles cuando el microcontrolador va a colocarse en el modo de bajo consumo, ya que
ayudan a no tener las entradas flotantes, significado una reduccin en el consumo de
corriente.

- LA ARQUITECTURA

- LA ARQUITECTURA TRADICIONAL

La arquitectura tradicional de computadoras y microprocesadores se basa en el esquema


propuesto por John Von Neumann, en el cual la unidad central de proceso, o CPU, esta
conectada a una memoria nica que contiene las instrucciones del programa y los datos
(ver figura). El tamao de la unidad de datos o instrucciones esta fijado por el ancho del
bus de la memoria. Es decir que un microprocesador de 8 bits, que tiene adems un bus
de 8 bits que lo conecta con la memoria, deber manejar datos e instrucciones de una o
ms unidades de 8 bits (bytes) de longitud. Cuando deba acceder a una instruccin o dato
de ms de un byte de longitud, deber realizar ms de un acceso a la memoria. Por otro
lado este bus nico limita la velocidad de operacin del microprocesador, ya que no se
puede buscar de memoria una nueva instruccin, antes de que finalicen las transferencias
de datos que pudieran resultar de la instruccin anterior. Es decir que las dos principales
limitaciones de esta arquitectura tradicional son :

Que la longitud de las instrucciones esta limitada por la unidad de longitud


de los datos, por lo tanto el microprocesador debe hacer varios accesos a
memoria para buscar instrucciones complejas.

Que la velocidad de operacin (o ancho de banda de operacin) esta


limitada por el efecto de cuello de botella que significa un bus nico para datos
e instrucciones que impide superponer ambos tiempos de acceso.

La arquitectura von Neumann permite el diseo de programas con cdigo automodificable,


prctica bastante usada en las antiguas computadoras que solo tenan acumulador y
pocos modos de direccionamiento, pero innecesaria, en las computadoras modernas.

Arquitectura von Neumann

- La arquitectura Harvard y sus ventajas

La arquitectura conocida como Harvard, consiste simplemente en un esquema en el que el


CPU esta conectado a dos memorias por intermedio de dos buses separados. Una de las
memorias contiene solamente las instrucciones del programa, y es llamada Memoria de
Programa. La otra memoria solo almacena los datos y es llamada Memoria de Datos.
Ambos buses son totalmente independientes y pueden ser de distintos anchos. Para un
procesador de Set de Instrucciones Reducido, o RISC (Reduced Instruccin Set
Computer), el set de instrucciones y el bus de la memoria de programa pueden disearse
de manera tal que todas las instrucciones tengan una sola posicin de memoria de
programa de longitud. Adems, como los buses son independientes, el CPU puede estar
accediendo a los datos para completar la ejecucin de una instruccin, y al mismo tiempo
estar leyendo la prxima instruccin a ejecutar. Se puede observar claramente que las
principales ventajas de esta arquitectura son:
Que el tamao de las instrucciones no esta relacionado con el de los datos, y por lo tanto
puede ser optimizado para que cualquier instruccin ocupe una sola posicin de memoria
de programa, logrando as mayor velocidad y menor longitud de programa.

Que el tiempo de acceso a las instrucciones puede superponerse con el de


los datos, logrando una mayor velocidad de operacin.

Una pequea desventaja de los procesadores con arquitectura Harvard, es que deben
poseer instrucciones especiales para acceder a tablas de valores constantes que pueda
ser necesario incluir en los programas, ya que estas tablas se encontraran fsicamente en
la memoria de programa (por ejemplo en la EPROM de un microprocesador).

Arquitectura Harvard

Los microcontroladores PIC 16C5X, 16CXX y 17CXX poseen arquitectura Harvard, con
una memoria de datos de 8 bits, y una memoria de programa que, segn el modelo, puede
ser de 12 bits para los 16C5X, 14 bits para los 16CXX y 16 bits para los 17CXX.
DIAGRAMA DE BLOQUE

Diagrama de bloque del pic 16fxx


DIDERENCIA DE LOS TRADICIONALES MICROPROCESADORES Y LOS

MICROCONTROLADORES PIC

La figura siguiente se representa un diagrama simplificado de la arquitectura interna del


camino de los datos en el CPU de los microcontroladores PIC y los tradicionales
microprocesadores. Este diagrama puede no representar con exactitud el circuito interno
de estos microcontroladores, pero es exacto y claro desde la ptica del programador. La
figura representa el mismo diagrama para un microprocesador ficticio de arquitectura
tradicional. Se puede observar que la principal diferencia entre ambos radica en la
ubicacin del registro de trabajo, que para los PIC's se denomina W (Working Register), y
para los tradicionales es el Acumulador(A).

En los microcontroladores tradicionales todas las operaciones se realizan sobre el


acumulador. La salida del acumulador esta conectada a una de las entradas de la Unidad
Aritmtica y Lgica (ALU), y por lo tanto ste es siempre uno de los dos operandos de
cualquier instruccin. Por convencin, las instrucciones de simple operando (borrar,
incrementar, decrementar, complementar), actan sobre el acumulador. La salida de la
ALU va solamente a la entrada del acumulador, por lo tanto el resultado de cualquier
operacin siempre quedara en este registro. Para operar sobre un dato de memoria, luego
realizar la operacin siempre hay que mover el acumulador a la memoria con una
instruccin adicional.

En los microcontroladores PIC, la salida de la ALU va al registro W y tambin a la memoria


de datos, por lo tanto el resultado puede guardarse en cualquiera de los dos destinos. En
las instrucciones de doble operando, uno de los dos datos siempre debe estar en el
registro W, como ocurra en el modelo tradicional con el acumulador. En las instrucciones
de simple operando el dato en este caso se toma de la memoria (tambin por convencin).
La gran ventaja de esta arquitectura es que permite un gran ahorro de instrucciones ya
que el resultado de cualquier instruccin que opere con la memoria, ya sea de simple o
doble operando, puede dejarse en la misma posicin de memoria o en el registro W, segn
se seleccione con un bit de la misma instruccin. Las operaciones con constantes
provenientes de la memoria de programa (literales) se realizan solo sobre el registro W.
En la memoria de datos de los PIC's se encuentran ubicados casi todos los registros de
control del microprocesador y sus perifricos autocontenidos, y tambin las posiciones de
memoria de usos generales. En el caso de los 16CXX, algunos registros especiales de
solo escritura (TRIS y OPTION) no estn accesibles dentro del bloque de memoria de
datos, sino que solo se pueden cargar desde el registro W por medio de instrucciones
especiales.

Contador de Programa

Este registro, normalmente denominado PC, es totalmente equivalente al de todos los


microprocesadores y contiene la direccin de la prxima instruccin a ejecutar. Se
incrementa automticamente al ejecutar cada instruccin, de manera que la secuencia
natural de ejecucin del programa es lineal, una instruccin despus de la otra. Algunas
instrucciones que llamaremos de control, cambian el contenido del PC alterando la
secuencia lineal de ejecucin. Dentro de estas instrucciones se encuentran el GOTO y el
CALL que permiten cargar en forma directa un valor constante en el PC haciendo que el
programa salte a cualquier posicin de la memoria. Otras instrucciones de control son los
SKIP o salteos condicionales, que producen un incremento adicional del PC si se cumple
una condicin especifica, haciendo que el programa saltee, sin ejecutar, la instruccin
siguiente.

Al resetearse el microprocesador, todos los bits del PC toman valor 1, de manera que la
direccin de arranque del programa es siempre la ultima posicin de memoria de
programa. En esta posicin se deber poner una instruccin de salto al punto donde
verdaderamente se inicia el programa.

A diferencia de la mayora de los microprocesadores convencionales, el PC es tambin


accesible al programador como registro de memoria interna de datos, en la posicin de 02.
Es decir que cualquier instruccin comn que opere sobre registros puede ser utilizada
para alterar el PC y desviar la ejecucin del programa. El uso indiscriminado de este tipo
de instrucciones complica el programa y puede ser muy peligroso, ya que puede producir
comportamientos difciles de predecir. Sin embargo, algunas de esta instrucciones
utilizadas con cierto mtodo, pueden ser muy tiles para implementar poderosas
estructuras de control tales como el goto computado. Como el microprocesador opera con
datos de 8 bits, y la memoria de datos es tambin de 8 bits, estas instrucciones solo
pueden leer o modificar los bits 0 a 7 del PC.

Stack
En los microcontroladores PIC el stack es una memoria interna dedicada, de tamao
limitado, separada de las memorias de datos y de programa, inaccesible al programador, y
organizada en forma de pila, que es utilizada solamente, y en forma automtica, para
guardar las direcciones de retorno de subrrutinas e interrupciones. Cada posicin es de 11
bits y permite guardar una copia completa del PC. Como en toda memoria tipo pila, los
datos son accedidos de manera tal que el primero que entra es el ultimo que sale.

En los 16C5X el stack es de solo dos posiciones, mientras que en los 16XXX es de 8
posiciones y en los 17CXX es de 16 posiciones. Esto representa, en cierta medida, una
limitacin de estos microcontroladores, ya que no permite hacer uso intensivo del
anidamiento de subrutinas. En los 16C5X, solo se pueden anidar dos niveles de
subrutinas, es decir que una subrutina que es llamada desde el programa principal, puede
a su vez llamar a otra subrutina, pero esta ultima no puede llamar a una tercera, porque se
desborda la capacidad del stack, que solo puede almacenar dos direcciones de retorno.
Esto de hecho representa una traba para el programador y adems parece impedir o
dificultar la programacin estructurada, sin embargo es una buena solucin de compromiso
ya que estos microcontroladores estn diseados para aplicaciones de alta velocidad en
tiempo real, en las que el overhead (demoras adicionales) que ocasiona un excesivo
anidamiento de subrutinas es inaceptable. Por otra parte existen tcnicas de organizacin
del programa que permiten mantener la claridad de la programacin estructurada, sin
necesidad de utilizar tantas subrutinas anidadas.

Como ya se menciono anteriormente, el stack y el puntero interno que lo direcciona, son


invisibles para el programador, solo se los accede automticamente para guardar o
rescatar las direcciones de programa cuando se ejecutan las instrucciones de llamada o
retorno de subrutinas, o cuando se produce una interrupcin o se ejecuta una instruccin
de retorno de ella.

- Palabra de Estado del Procesador


La palabra de estado del procesador contiene los tres bits de estado de la ALU (C, DC y
Z), y otros bits que por comodidad se incluyeron en este registro.

76543210

REGISTRO STATUS

El bit Z indica que el resultado de la ultima operacin fue CERO. El bit C indica acarreo del
bit ms significativo (bit 7) del resultado de la ultima operacin de suma. En el caso de la
resta se comporta comporta a la inversa, C resulta 1 si no hubo pedido de prstamo. El bit
DC (digit carry) indica acarreo del cuarto bit (bit 3) del resultado de la ultima operacin de
suma o resta, con un comportamiento anlogo al del bit C, y es til para operar en BCD
(para sumar o restar nmeros en cdigo BCD empaquetado). El bit C es usado adems en
las operaciones de rotacin derecha o izquierda como un paso intermedio entre el bit 0 y el
bit 7.

El bit PD (POWER DOWN) sirve para detectar si la alimentacin fue apagada y encendida
nuevamente, tiene que ver con la secuencia de inicializacin, el watch dog timer y la
instruccin sleep, y su uso se detallara en la seccin referida al modo POWER DOWN. El
bit TO (TIME-OUT) sirve para detectar si una condicin de reset fue producida por el watch
dog timer, esta relacionado con los mismos elementos que el bit anterior y su uso se
detallara en la seccin referida al WATCH DOG TIMER. Los bits de seleccin de pagina
PA0/PA1/PA2 se utilizan en las instrucciones de salto GOTO y CALL, y se explicaran con
detalle en la seccin referida a las instrucciones de control, y a la organizacin de la
memoria de programa. En realidad en el 16C54 estos bits no se usan y sirven para
propsitos generales. En el 16C57 el PA0 si se usa pero los otros dos no. En el 16C55 se
utilizan PA0 y PA1. PA2 esta reservado para uso futuro y en cualquiera de los PIC 16C5X
sirve para propsitos generales.

OTROS REGISTROS ESPECIALES

Las ocho primeras posiciones del rea de datos estn reservadas para alojar registros de
propsito especial, quedando las restantes libres para contener los datos u operandos que
se desee (registros de propsito general).

El registro INDF que ocupa la posicin 0 no est implementando fsicamente y, como se ha


explicado, se le referencia en el direccionamiento indirecto de datos aunque se utiliza el
contenido de FSR.

En la direccin esta el registro TAR0 (Temporizador) que puede ser ledo y escrito como
cualquier otro registro. Puede incrementar su valor con una seal externa aplicada al pin
T0CKI o mediante el oscilador interno.
El PC ocupa la posicin 2 del rea de datos en donde se halla el registro PCL al que se
aaden 3 bits auxiliares y se conectan con los dos niveles de la Pila en las instrucciones
CALL y RETLW.

El registro de Estado ocupa la posicin 3 y entre sus bits se encuentran los sealizadores
C, DC y Z y los bits PA1 y PA0 que seleccionan la pgina en la memoria de programa. El
bit 7 (PA2) no est implementando en los PIC de la gama baja.

FRS se ubica en la direccin 4 y puede usarse para contener las direccin del dato en las
instrucciones con direccionamiento indirecto y tambin para guardar operandos en sus 5
bits de menos peso.

Los registros que ocupan las posiciones 5 ,6 y 7 soportan los Puertos A, B y C de E/S.
Pueden ser ledos y escritos como cualquier otro registro y manejan los valores de los bits
que entran y salen por los pines de E/S del microcontrolador.
PROGRAMACIN EN LENGUAJE ENSAMBLADOR

El programa fuente esta compuesto por una sucesin de lneas de programa. Cada lnea
de programa esta compuesta por 4 campos separados por uno o ms espacios o
tabulaciones. Estos campos son:

[Etiqueta] Comando [Operando(s)] [;Comentario]

La etiqueta es opcional. El comando puede ser un mnemnico del conjunto de


instrucciones. El operando esta asociado al comando, si no hay comando no hay
operando, e inclusive algunos comandos no llevan operando. El comentario es opcional
para el compilador aunque es buena prctica considerarlo obligatorio para el programador.

La etiqueta, es el campo que empieza en la primer posicin de la lnea. No se pueden


insertar espacios o tabulaciones antes de la etiqueta sino ser considerado comando.
Identifica la lnea de programa haciendo que el compilador le asigne un valor
automticamente. Si se trata de una lnea cuyo comando es una instruccin de programa
del microcontrolador, se le asigna el valor de la direccin de memoria correspondiente a
dicha instruccin (location counter). En otros casos se le asigna un valor de una constante,
o la direccin de una variable, o ser el nombre de una macroinstruccin, etc.
El comando puede ser un cdigo mnemnico de instruccin del microcontrolador, o una
directiva o pseudoinstruccin para el compilador. En el primer caso ser directamente
traducido a cdigo de maquina, en el segundo caso ser interpretado por el compilador y
realizara alguna accin en tiempo de compilacin como ser asignar un valor a una
etiqueta, etc.

El campo de parmetros puede contener uno o ms parmetros separados por comas. Los
parmetros dependen de la instruccin o directiva. Pueden ser nmeros o literales que
representen constantes o direcciones.

El campo de comentario debe comenzar con un caracter punto y coma. No necesita tener
espacios o tabulaciones separndolo del campo anterior, e incluso puede empezar en la
primer posicin de la lnea. El compilador ignora todo el texto que contenga la lnea
despus de un caracter punto y coma. De esta manera pueden incluirse lneas que
contengan solo comentarios, y es muy buena prctica hacer uso y abuso de esta
posibilidad para que los programas resulten autodocumentados.

- CONJUNTO DE INSTRUCCIONES
El conjunto de instrucciones de los microprocesadores PIC 16CXX consiste en un pequeo
repertorio de solo 33 instrucciones de 12 bits, que pueden ser agrupadas para su estudio
en tres a cinco grupos. En este curso se ha optado por clasificarlas, desde el punto de
vista del programador, en cinco categoras bien definidas de acuerdo con la funcin y el
tipo de operandos involucrados. En primer lugar se agrupan las instrucciones que operan
con bytes y que involucran algn registro de la memoria interna. En segundo lugar se
analizaran las instrucciones que operan solo sobre el registro W y que permiten cargarle
una constante implcita o incluida literalmente en la instruccin (literales). En tercer lugar
se agrupan las instrucciones que operan sobre bits individuales de los registros de la
memoria interna. En cuarto lugar se clasifican las instrucciones de control de flujo del
programa, es decir las que permiten alterar la secuencia lineal de ejecucin de las
instrucciones. Por ltimo se agrupan unas pocas instrucciones que llamaremos especiales,
cuyas funciones o tipos de operandos son muy especficos y no encajan en ninguna de las
clasificaciones anteriores.

Instrucciones de Byte que operan con Registros

Estas instrucciones pueden ser de simple o doble operando de origen. El primer operando
de origen ser siempre el registro seleccionado en la instruccin, el segundo, en caso de
existir, ser el registro W. El destino, es decir donde se guardara el resultado, ser el
registro seleccionado o el W, segn se seleccione con un bit de la instruccin.

El formato genrico de estas instrucciones es el siguiente :


11 10 9 8 7 6 5 4 3 2 1 0

Los bits 0 a 4 (5 bits), denominados f permiten seleccionar uno de 32 registros de la


memoria interna. El bit 5, denominado d, permite especificar el destino del resultado. Si d
= 1 el resultado se guardara en el registro seleccionado. Si d = 0 el resultado se guardara
en W. Los bits 6 a 11 identifican la instruccin especifica a realizar.

Las instrucciones siguientes son las tres operaciones lgicas de doble operando :

ANDWF f,d ;operacin AND lgica, destino = W f


IORWF f,d ;operacin OR lgica, destino = W f
XORWF f,d ;operacin XOR lgica, destino = W f

Los nombres mnemnicos de estas instrucciones provienen de : AND W con F, Inclusive


OR W con F y XOR W con F.
Las que siguen son las cuatro operaciones aritmticas y lgicas sencillas de simple
operando :

MOVF f,d ;movimiento de datos, destino = f


COMF f,d ;complemento lgico, destino = NOT f
INCF f,d ;incremento aritmtico, destino = f + 1
DECF f,d ;decremento aritmtico, destino = f - 1

Los mnemnicos de estas instrucciones provienen de : MOVe File, COMplement File,


NCrement File y DECrement File.

En las siete instrucciones anteriores el nico bit afectado de la palabra de estado del
procesador es el Z, que se pone en 1 si el resultado de la operacin es 00000000, y se
pone en 0 si el resultado tiene cualquier otro valor.

A continuacin siguen las dos instrucciones de rotacin de bits a travs del CARRY :
RLF f,d ;rotacin a la izquierda, destino = f ROT
RRF f,d ;rotacin a la derecha, destino = f ROT

En estas operaciones (Rotate Left File y Rotate Right File) los bits son desplazados de
cada posicin a la siguiente, en sentido derecho o izquierdo. El desplazamiento es
cerrado, formando un anillo, con el bit C (CARRY) de la palabra de estado.

En estas dos instrucciones, el nico bit afectado de la palabra de estado del procesador es
el bit C, que tomar el valor que tenia el bit 7 o el bit 0, segn sea el sentido del
desplazamiento.

Estas instrucciones son muy tiles para la manipulacin de bits, y adems para realizar
operaciones aritmticas, ya que en numeracin binaria, desplazar un nmero a la izquierda
es equivalente a multiplicarlo por 2, y hacia la derecha, a dividirlo por 2.

La instruccin siguiente realiza el intercambio de posiciones entre los cuatro bits menos
significativos y los cuatro ms significativos (nibble bajo y nibble alto).

SWAPF f,d ;intercambia nibbles, destino = SWAP f

Esta instruccin (SWAP File) no afecta ninguno de los bits de la palabra de estado del
procesador.

Esta instruccin es muy til para el manipuleo de nmeros BCD empaquetados, en los que
en un solo byte se guardan dos dgitos BCD (uno en cada nibble).

Las dos operaciones que siguen son la suma y la resta aritmticas :

ADDWF f,d ;suma aritmtica, destino = f + W


SUBWF f,d ;resta aritmtica, destino = f - W

Estas operaciones (ADD W a F y SUBstract W de F) afectan a los tres bits de estado C,


DC y Z.

El bit Z se pone en 1 si el resultado de la operacin es 00000000, y se pone en 0 si el


resultado tiene cualquier otro valor.

La suma se realiza en aritmtica binaria pura sin signo. Si hay un acarreo del bit 7, es decir
que el resultado es mayor que 255, el bit C (carry) resulta 1, en caso contrario resulta 0. Si
hay un acarreo del bit 3, es decir que la suma de las dos mitades (nibbles) menos
significativas (bits 0 a 3) resulta mayor que 15, se pone en 1 el bit DC (digit carry), en caso
contrario se pone en 0.

Ejemplos :
1010 0010 1101 0000
+ 0100 1111 C DC Z + 0110 1111 C DC Z
1111 0001 0 1 0 0011 1111 1 0 0

La resta se realiza sumando, en binario puro sin signo, el registro f ms el complemento a


dos de W (el complemento a 1, o complemento lgico, ms 1)

Ejemplos :

f 0100 0100 0010 1000


W - 0010 1000 C DC Z - 0100 0100 C DC Z
0001 1100 1 0 0 1110 0100 0 1 0
equivalente a :
f 0100 0100 0010 1000
cmp.2 W + 1101 1000 C DC Z + 1011 1100 C DC Z
0001 1100 1 0 0 1110 0100 0 1 0

Los bits de estado C y DC toman el valor normal correspondiente a la suma de f con el


complemento a 2 de W. De esta manera el significado para la operacin de resta resulta
invertido, es decir que C (carry) es 1 si no hubo desborde en la resta, o dicho de otra
manera, si el contenido de W es menor que el de f. El bit DC se comporta de manera
similar, es decir que DC es 1 si no hubo desborde en la mitad menos significativa, lo que
equivale a decir que el nibble bajo del contenido de W es menor que el del registrof.

Las instrucciones que siguen son de simple operando, pero son casos especiales ya que
el destino es siempre el registro seleccionado :

CLRF f ;borrado de contenido, f = 0


MOVWF f ;copia contenido W f, f = W

La instruccin CLRF (CLeaR File) afecta solo al bit Z que resulta siempre 0.
La instruccin MOVWF (MOVe W a F) no afecta ningn bit de la palabra de estado.
Instrucciones de Byte que operan sobre W y Literales

Estas instrucciones se refieren todas al registro W, es decir que uno de los operandos de
origen y el operando de destino son siempre el registro W. En las instrucciones de este
grupo que tienen un segundo operando de origen, este es siempre una constante de
programa literalmente incluida en la instruccin, llamada constante literal o simplemente
literal.

El formato genrico de estas instrucciones es el siguiente :

11 10 9 8 7 6 5 4 3 2 1 0

Los bits 0 a 7 especifican la constante literal de 8 bits que se utilizara en la operacin.


Las tres instrucciones que siguen son las operaciones lgicas tradicionales, similares a las
que ya vimos anteriormente, pero realizadas entre una constante de programa y el registro
W:

IORLW k ; operacin OR lgica, W = W k


ANDLW k ; operacin AND lgica, W = W k
XORLW k ; operacin XOR lgica, W = W k

En estas tres instrucciones (Inclusive OR Literal W, AND Literal W y XOR Literal W) el


nico bit afectado de la palabra de estado del procesador es el Z, que se pone en 1 si el
resultado de la operacin es 00000000, y se pone en 0 si el resultado tiene cualquier otro
valor.

La instruccin que sigue sirve para cargar una constante de programa en el registro W :

MOVLW k ;carga constante en W, W = K

Esta (MOVe Literal W) instruccin no afecta ninguno de los bits de estado del procesador.

La instruccin que sigue (CLeaR W) no correspondera incluirla en este grupo, y pertenece


en realidad al primero, el de las instrucciones que operan sobre registros, ya que se trata
de un caso especial de la instruccin CLRF, con destino W, y f = 0. La incluimos aqu
porque como se le ha asignado un mnemnico particular referido especficamente al
registro W, creemos que, desde el punto de vista del programador, es ms til verla dentro
del grupo de instrucciones referidas a W.

CLRW ;borra el contenido de W, W = 0

Al igual que en la instruccin CLRF, el nico bit de estado afectado es el Z que resulta1

- Instrucciones de Bit
El formato genrico de estas instrucciones es el siguiente :

11 10 9 8 7 6 5 4 3 2 1 0

Los bits 0 a 4 (5 bits), denominados f, permiten seleccionar uno de 32 registros de la


memoria interna. Los bits 5 a 7, denominados b, permiten especificar el numero de bit (0
a 7) sobre el que se operara. Estas instrucciones operan solamente sobre el bit
especificado, el resto de los bits del registro no son alterados. Estas instrucciones no
tienen especificacin de destino, ya que el mismo es siempre el registro seleccionado.

BCF f,b ;borra el bit b de f ;bit f(b) = 0


BSF f,b ;coloca en uno el bit b de f ;bit f(b) = 1

Estas instrucciones (Bit Clear File y Bit Set File) no afectan ningn bit de la palabra de
estado del procesador.

- Instrucciones de Control

GOTO k ;salto a la posicin k (9 bits) del programa

Esta es la tpica instruccin de salto incondicional a cualquier posicin de la memoria de


programa (que en la mayora de los microprocesadores convencionales se llama JUMP).
La constante literal k es la direccin de destino del salto, es decir la nueva direccin de
memoria de programa a partir de la cual comenzarn a leerse las instrucciones despus
de ejecutar la instruccin GOTO. Esta instruccin simplemente carga la constante k en el
registro PC (contador de programa). La nica complicacin de esta instruccin es que la
constante k es de solo 9 bits, mientras que el registro PC es de 11 bits, ya que en el 16C57
debe permitir direccionar una memoria de programa de 2 K. Los dos bits faltantes, bit 9 y
10 del PC, son tomados respectivamente de los bits de seleccin de pgina PA0 y PA1 de
la palabra de estado.

Este comportamiento particular hace que la memoria de programa aparezca como dividida
en paginas de 512 posiciones como se vera ms adelante. El programador debe tener en
cuenta que antes de ejecutar una instruccin GOTO es posible que haya que programar
los bits PA0 y PA1.

La que sigue es la instruccin de llamado a subrutina:

CALL k ;salto a la subrutina en la posicin k (8 bits)

Su comportamiento es muy similar al de la instruccin GOTO, salvo que adems de saltar


guarda en el stack la direccin de retorno de la subrutina (para la instruccin RETLW).
Esto lo hace simplemente guardando en el stack una copia del PC incrementado, antes de
que el mismo sea cargado con la nueva direccin k. La nica diferencia con la instruccin
GOTO respecto de la forma en la que se realiza el salto, es que en la instruccin CALL la
constante k tiene solo 8 bits en vez de 9. En este caso tambin se utilizan PA0 y PA1 para
cargar los bits 9 y 10 del PC, pero adems el bit 8 del PC es cargado siempre con 0. Esto
hace que los saltos a subrutina solo puedan realizarse a posiciones que estn en las
primeras mitades de las paginas mencionadas. El programador debe tener en cuenta este
comportamiento y asegurarse de ubicar las posiciones de inicio de las subrutinas en las
primeras mitades de las paginas.

La instruccin que aparece a continuacin es la de retorno de subrutina:

RETLW k ;retorno de subrutina con constante k, W = k

Esta (RETurn con Literal in W) instruccin produce el retorno de subrutina con una
constante literal k en el registro W. La operacin que realiza consiste simplemente en
sacar del stack un valor y cargarlo en el PC. Ese valor es el PC incrementado antes de
realizar el salto, de la ultima instruccin CALL ejecutada, por lo tanto es la direccin de la
instruccin siguiente a dicho CALL.. Dado que el stack es de 11 bits, el valor cargado en el
PC es una direccin completa, y por lo tanto se puede retornar a cualquier posicin de la
memoria de programa, sin importar como estn los bits de seleccin de pagina. Esta
instruccin adems carga siempre una constante literal en el registro W. Ya que esta es la
nica instruccin de retorno de subrutina de los PIC16CXX, no hay en estos
microprocesadores forma de retornar de una subrutina sin alterar el registro W.

Por otro lado, y con una metodologa especial de programacin, un conjunto de sucesivas
instrucciones RETLW puede ser usado como una tabla de valores constantes incluida en
el programa (Ej. : tablas BCD/7 seg., hexa/ASCII, etc.).

A continuacin se presentan las dos nicas instrucciones de salteo (skip) condicional.


Estas instrucciones son los nicos medios para implementar bifurcaciones condicionales
en un programa. Son muy generales y muy poderosas ya que permiten al programa tomar
decisiones en funcin de cualquier bit de cualquier posicin de la memoria interna de
datos, y eso incluye a los registros de perifricos, los puertos de entrada/salida e incluso la
palabra de estado del procesador. Estas dos instrucciones reemplazan y superan a todo el
conjunto de instrucciones de salto condicional que poseen los microprocesadores sencillos
convencionales (salto por cero, por no cero, por carry, etc.).

BTFSC f,b ;salteo si bit = 0, bit = f(0) saltea


BTFSS f,b ;salteo si bit = 1, bit = f(1) saltea

BTFSC (Bit Test File and Skip if Clear) saltea la prxima instruccin si el bit b del registro f
es cero. La instruccin BTFSS (Bit Test File and Skip if Set) saltea si el bit es 1. Estas
instrucciones pueden usarse para realizar o no una accin segn sea el estado de un bit,
o, en combinacin con GOTO, para realizar una bifurcacin condicional.

Ejemplo 1 : Ejemplo 2:

Las instrucciones que siguen son casos especiales de las de incremento y decremento
vistas anteriormente. Estas instrucciones podran categorizarse dentro del grupo de
instrucciones orientadas a byte sobre registros (primer grupo), ya que efectivamente
operan sobre los mismos, y el formato del cdigo de la instruccin responde al de ese
grupo, pero, a diferencia de las otras, pueden adems alterar el flujo lineal del programa y
por eso se les incluy en este grupo.

DECFSZ f,d ;decrementa y saltea s 0, destino= f - 1, = 0 saltea


INCFSZ f,d ;incrementa y saltea s 0, destino= f + 1, = 0 saltea
Estas dos instrucciones (DECrement File and Skip if Zero, e INCrement File and Skip if
Zero) se comportan de manera similar a DECF e INCF, salvo que no afectan a ningn bit
de la palabra de estado. Una vez realizado el incremento o decremento, si el resultado es
00000000, el microprocesador salteara la prxima instruccin del programa. Estas
instrucciones se utilizan generalmente en combinacin con una instruccin de salto
(GOTO), para el diseo de ciclos o lazos (loops) de instrucciones que deben repetirse una
cantidad determinada de veces.

Ejemplo:
clrf 10 ; pongo cero en la posicin 10 de la memoria interna
loop ; lo que sigue se ejecutar 256 veces

incfsz 10,1; incremento la posicin 10 hasta que llegue a 0


goto loop ; si no llego a cero voy a repetir la secuencia
cuando llegue a cero salteo el goto y sigue la continuacin del programa
Instrucciones Especiales

En este grupo se reunieron las instrucciones que controlan funciones especficas del
microprocesador o que actan sobre registros especiales no direccionados como memoria
interna normal.

La instruccin que sigue es la tpica NO OPERATION, existente en casi todos los


microprocesadores.

NOP ;no hace nada, consume tiempo

Esta instruccin solo sirve para introducir una demora en el programa, equivalente al
tiempo de ejecucin de una instruccin. No afecta ningn bit de la palabra de estado.

La siguiente es una instruccin especifica de control de los puertos de entrada/salida.

TRIS f ;carga el tristate control, TRISf = W

Esta instruccin (TRIState) carga el registro de control de los buffers tristate de un puerto
de entrada salida (data direccin register), con el valor contenido en W. El parmetro f
debe ser la direccin de memoria interna del puerto, aunque el valor W no ser cargado en
el puerto sino en el registro de tristate del mismo. Los valores validos para f son 4 y 5 en
los 16C54/56 y 4, 5 y 6 en los 16C55/57. Esta instruccin no afecta ningn bit de la palabra
de estado.

La siguiente instruccin sirve para programar el registro OPTION que controla el RTCC y
prescaler

OPTION ;carga el registro OPTION, OPTION = W

El registro OPTION no es accesible como memoria interna y solo se lo puede programar


con esta instruccin. Esta instruccin no afecta ningn bit de la palabra de estado.

La instruccin que sigue borra el contador del watch dog timer. Este registro tampoco esta
accesible como memoria, y esta es la nica instruccin que lo modifica.

CLRWDT ;borra el watch dog timer, WDT = 0

Esta instruccin, adems, coloca en uno los bits PD (power down) y TO (time-out) de la
palabra de estado.

La siguiente es una instruccin especial de control del microcontrolador que lo pone en el


modo power down. En este modo el microprocesador se detiene, el oscilador se apaga, los
registros y puertos conservan su estado, y el consumo se reduce al mnimo. La nica
forma de salir de este estado es por medio de un reset o por time-out del watch dog timer.

SLEEP ;coloca el C en modo sleep, WDT = 0

Esta instruccin, adems, borra el bit PD (power down) y setea el bit TO (time-out) de la
palabra de estado.
Direccionamiento de la memoria de datos (RAM)

La memoria interna se direcciona en forma directa por medio de los 5 bits f contenidos
en las instrucciones que operan sobre registros. De esta manera se puede direccionar
cualquier posicin desde la 00 a la 1F. Como se vi en el captulo correspondiente a los
mapas de memoria, las direcciones 10 a 1F corresponden a los bancos de registros, por lo
tanto, en los microcontroladores que tengan ms de un banco, antes de acceder a alguna
variable que se encuentre en esta zona, el programador deber asegurarse de haber
programado los bits de seleccin de banco en el registro FSR.

Los registros especiales y de uso general de la posicin 00 a la 0f estn presentes en


todos los PIC16CXX, al igual que el banco 0 de registros. Los bancos 1, 2 y 3 de registros
estn presentes solo en el 16C57.

El registro FSR, adems de servir para seleccionar el banco activo, sirve como puntero
para direccionamiento indirecto. La posicin 00 del mapa de RAM es la llamada
direccin indirecta. S en cualquier instruccin se opera con la direccin 00, en realidad se
estar operando con la direccin a donde apunte el contenido del FSR. Por ejemplo si el
FSR contiene el valor 14, una instruccin que opere sobre la direccin 0, operara en
realidad sobre la direccin 14. Se puede decir en este ejemplo que la posicin 14 de
memoria fue direccionada en forma indirecta a travs del puntero FSR.

Ejemplo :

Esta porcin de programa borra 5 posiciones de memoria a partir de la direccin 12

FSR equ 04 ; (definicin al comienzo del programa)

movlw 5 ;prepara para repetir 5 veces


movwf 08 ;(el registro 08 es el contador del loop)
movlw 12h ;apunta a la direccin 12h
movwf FSR ;
loop:
clrf 0 ;borra una posicin de memoria
incf FSR ;apunta a la siguiente
decfsz 08 ;si todava no borra todas
goto loop ;sige borrando

El direccionamiento indirecto es muy til para el procesamiento de posiciones consecutivas


de memoria, como en el ejemplo, o para el direccionamiento de datos en subrutinas.

- Direccionamiento de la memoria de programa (EPROM, OTP)


La instruccin GOTO dispone solo de 9 bits en el cdigo de operacin para especificar la
direccin de destino del salto. Al ejecutar una instruccin GOTO el microprocesador toma
los dos bits que restan para completar la direccin de 11 bits, de los bits 5 y 6 de la palabra
de estado. Estos ltimos son llamados bits de seleccin de pgina (PA0 y PA1). El
programador deber asegurarse de que estos dos bits tengan el valor correcto antes de
toda instruccin GOTO.
FIG. Direccionamiento directo con instruccin GOTO

Deber tenerse en cuenta adems que es posible avanzar de una pgina a otra en forma
automtica cuando el PC se incrementa. Esto ocurre si el programa empieza en una
pgina y sigue en la siguiente.

Sin embargo, al incrementarse el PC desde la ltima posicin de una pgina a la primera


de la siguiente, los bits PA0 y PA1 no se modifican, y por lo tanto s se ejecuta una
instruccin GOTO, CALL o alguna que acte sobre el PC, esta producir un salto a la
pgina anterior, a menos que el programador tenga la precaucin de actualizar el valor de
dichos bits. Por este motivo es conveniente dividir el programa en mdulos o rutinas que
estn confinados a una pgina.

En el caso de la instruccin CALL, el direccionamiento se complica un poco ms, ya que la


misma solo dispone de 8 bits para especificar la direccin de destino salto. En este caso
tambin se utilizan los mismos bits de seleccin de pgina para completar los bits dcimo
y decimoprimero de la direccin, pero falta el noveno bit. En estas instrucciones este bit se
carga siempre con 0, lo que implica que solo se pueden realizar saltos a subrutina a las
mitades inferiores de cada pgina. En este caso tambin el programador deber
asegurarse que el estado de los bits PA0 y PA1 sea el correcto al momento de ejecutarse
la instruccin.

FIG.Direccionamiento directo con instruccin CALL

Las instrucciones que operan sobre el PC como registro y alteran su contenido provocando
un salto, responden a un mecanismo muy similar al de las instrucciones CALL para la
formacin de la direccin de destino. En este caso los bits 0 a 7 son el resultado de la
instruccin, el bit 8 es 0 y los bits restantes se toman de PA0 y PA1.

Este mecanismo se llama paginado, y a pesar de que representa una complicacin


bastante molesta para el programador, resulta muy til ya que permite ampliar la
capacidad de direccionamiento de memoria de programa para las instrucciones de salto.
PROYECTO

DIAGRAMA DE FLUJO

ESQUEMA ELCTRICO

PROGRAMACIN EN LENGUAJE ENSAMBLADOR


El PIC16F84A

ndice de contenidos

El PIC16F84A

o ndice de contenidos

o Caractersticas del PIC16F84A

o Disposicin y descripcin de patillas

Disposicin de patillas

Descripcin de patillas

o Arquitectura interna

o Memoria de programa

o Memoria de datos

o El direccionamiento

Direccionamiento Inmediato
Direccionamiento Directo

Direccionamiento bit a bit

Direccionamiento Indirecto

o Memoria de datos EEPROM

o Uso de la EEPROM

Lectura de la memoria EEPROM

Escritura de la memoria EEPROM

Verificacin de la escritura

Rutinas EEPROM

o Puertos de E/S

Puerto A

Puerto B

Configuracin de los puertos de


Entrada/Salida

Limite de corriente para los puertos

o Temporizador/Contador TMR0

El Prescaler

o Encapsulado y marcado del PIC16F84A

DISPOSITIVOS LGICOS MICROPROGRAMABLES El PIC16F84A 5.2

Caractersticas del PIC16F84A

En esta parte estudiaremos la estructura del PIC16F84A


con el fin de entender mejor su funcionamiento.
Empezaremos con una relacin de sus principales
caractersticas:

Repertorio de 35 Instrucciones.

Todas las instrucciones se ejecutan en un solo ciclo


excepto las de salto que necesitan dos.

Versiones para bajo consumo (16LF84A), de 4 MHz


(PIC16F84A-04) y 20 MHz (PIC16F84A-20). Un ciclo
mquina del PIC son 4 ciclos de reloj, por lo cual si
tenemos un PIC con un cristal de 4 MHz, se ejecutarn 1
milln de instrucciones por segundo.

Memoria de programa Flash de 1 K x 14 bits.

Memoria RAM dividida en 2 reas: 22 registros de


propsito especfico (SFR) y 68 de propsito general
(GPR) como memoria de datos.

15 registros de funciones especiales.

Memoria de datos RAM de 68 bytes (68 registros de


proposito general).

Memoria de datos EEPROM de 64 bytes.

Contador de programa de 13 bit (lo que en teora


permitira direccionar 4 KB de memoria, aunque el
16F84 solo dispone de 1KB de memoria implementada).

Pila con 8 niveles de profundidad.

Modos de direccionamiento directo, indirecto y relativo.

ALU de 8 bits y registro de trabajo W del que


normalmente recibe un operando que puede ser
cualquier registro, memoria, puerto de Entrada/Salida o
el propio cdigo de instruccin.

4 fuentes de interrupciones:

o A travs del pin RB0/INT.


o Desbordamiento del temporizador TMR0.

o Interrupcin por cambio de estado de los pins 4:7


del Puerto B.

o Completada la escritura de la memoria EEPROM.

1.000.000 de ciclos de borrado/escritura de la memoria


EEPROM.

40 aos de retencin de la memoria EEPROM.

13 pins de E/S con control individual de direccin.

PortA de 5 bits <RA0:RA4>.

PortB de 8 bits <RB0:RB7>.

Contador/Temporizador TMR0 de 8 bits con divisor


programable.

Power-on Reset (POR).

Power-up Timer (PWRT).

Oscillator Start-up Timer (OST).

Watchdog Timer (WDT).

Proteccin de cdigo.

Modo de bajo consumo SLEEP.

Puede operar bajo 4 modos diferentes de oscilador.

Programacin en serie a travs de dos pins.

Tecnologa de baja potencia y alta velocidad CMOS


Flash/EEPROM.

Caractersticas elctricas mximas (no deben ser


superadas y de mantenerse por un tiempo en algn
mximo puede daarse al PIC)
o Temperatura ambiente mxima para
funcionamiento de -55C to +125C.

o Tensin mxima de VDD respecto a VSS de -0,3 a


+7,5V.

o Tensin de cualquier patilla con respecto a VSS


(excepto VDD, MCLR, y RA4) de -0,3V a (VDD +
0.3V).

o Tensin en MCLR con respecto a VSS -0,3 a +14V.

o Tensin en RA4 con respecto a VSS -0,3 a +8,5V.

o Disipacin de potencia total de 800 mW.

o Mxima corriente de salida a VSS 150 mA.

o Mxima corriente de salida de VDD 100 mA.

o Mxima corriente del puerto "A" como fuente, 50


mA.

o Mxima corriente del puerto "A" como sumidero,


80 mA.

o Mxima corriente del puerto "B" como fuente, 100


mA.

o Mxima corriente del puerto "B" como sumidero,


150 mA.

o Mxima corriente que puede suministrar una sla


salida como fuente o sumidero, 25 mA.

Rango de alimentacin:

o 16LF84A: de 2 a 5,5 V en configuracin de


oscilador XT, RC y LP.

o 16F84A:
de 4 a 5,5 v en configuracin de oscilador XT,
RC y LP.

de 4,5 a 5.5 v en configuracin de oscilador


HS.

Consumo tpico:

o 16LF84A:

de 1 a 4 mA en configuracin de oscilador RC
y XT (FOSC=2 MHz, VDD=5,5V).

de 15 a 45 A en configuracin de oscilador
LP (FOSC=32kHz, VDD=2V, WDT
deshabilitado).

o 16F84A:

de 1,8 a 4.5 mA en configuracin de oscilador


RC y XT (FOSC=4 MHz, VDD=5,5V).

de 3 a 10 mA en configuracin de oscilador
RC y XT durante la programacin de la FLASH
(FOSC=4MHz, VDD=5,5V).

o 16F84A-20: de 10 a 20 mA en configuracin de
oscilador HS (FOSC=20 MHz, VDD=5,5V).

Para mantener la informacin sobre PIC actualizada es


necesario obtener el archivo en PDF que se puede encontrar
en www.microchip.com. Tambin puede encontrarse como
anexo 3 el archivo pic16f84a.pdf, en ingls.

DISPOSITIVOS LGICOS MICROPROGRAMABLES El PIC16F84A 5.3

Disposicin y descripcin de patillas

Disposicin de patillas
Disposicin de patillas para encapsulado DIL 18:
Descripcin de patillas

N Tip
Nombre Descripcin
o

Entrada del oscilador a cristal/Entrada de la


OSC1/CLKIN 16 I
fuente de reloj externa

OSC2/CLKOU Salida del oscilador a cristal. En el modo RC, es


15 O
T una salida con una frecuencia de OSC1

MCLR 4 I/P Reset/Entrada del voltaje de programacin.

RA0 17 I/O Puerto A bidireccional, bit 0

RA1 18 I/O Puerto A bidireccional, bit 1

RA2 1 I/O Puerto A bidireccional, bit 2

RA3 2 I/O Puerto A bidireccional, bit 3

Tambin se utiliza para la entra de reloj para el


RA4/T0CKI 3 I/O
TMR0

RB0/INT 6 I/O Puerto B bidireccional, bit 0


Puede seleccionarse para entrada de
interrupcin externa

RB1 7 I/O Puerto B bidireccional, bit 1

RB2 8 I/O Puerto B bidireccional, bit 2

RB3 9 I/O Puerto B bidireccional, bit 3

Puerto B bidireccional, bit 4


RB4 10 I/O
Interrupcin por cambio de estado

Puerto B bidireccional, bit 5


RB5 11 I/O
Interrupcin por cambio de estado

Puerto B bidireccional, bit 6


RB6 12 I/O
Interrupcin por cambio de estado

Puerto B bidireccional, bit 7


RB7 13 I/O
Interrupcin por cambio de estado

Vss 5 P Tierra de referencia

Vdd 14 P Alimentacin

DISPOSITIVOS LGICOS MICROPROGRAMABLES El PIC16F84A 5.4

Arquitectura interna

Las altas prestaciones de los microcontroladores PIC


derivan de las caractersticas de su arquitectura. Estn
basados en una arquitectura tipo Harvard que posee buses y
espacios de memoria por separado para el programa y los
datos, lo que hace que sean ms rpidos que los
microcontroladores basados en la arquitectura tradicional de
Von Neuman.

Otra caracterstica es su juego de instrucciones reducido


(35 instrucciones) RISC, donde la mayora se ejecutan en un
solo ciclo de reloj excepto las instrucciones de salto que
necesitan dos.

Posee una ALU (Unidad Aritmtico Lgica) de 8 bits capaz


de realizar operaciones de desplazamientos, lgicas, sumas y
restas. Posee un Registro de Trabajo (W) no direccionable que
usa en operaciones con la ALU.
Dependiendo de la instruccin ejecutada, la ALU puede
afectar a los bits de Acarreo , Acarreo Digital (DC) y Cero (Z)
del Registro de Estado (STATUS).

La pila es de 8 niveles. No existe ninguna bandera que


indique que est llena, por lo que ser el programador el que
deber controlar que no se produzca su desbordamiento.

Este microcontrolador posee caractersitcas especiales para


reducir componentes externos con lo que se reducen los
costos y se disminuyen los consumos. Posee 4 diferentes
modos de oscilador, desde el simple circuito oscilador RC con
lo que se disminuyen los costos hasta la utilizacin de un
oscilador a cristal.
En el modo SLEEP el consumo se reduce significativamente
y puede despertarse al microcontrolador utilizando tanto
interrupciones internas como externas y seal de reset.
Adems posee la funcin Watchdog Timer (Perro Guardian)
que protege al micro de cuelgues debido a fallos software
que produzcan bucles infinitos.

DISPOSITIVOS LGICOS MICROPROGRAMABLES El PIC16F84A 5.5

Memoria de programa

La memoria de programa est organizada con palabras de


14 bits con un total de 1 K, del tipo Flash, que durante el
funcionamiento es de solo lectura. Slo se ejecutar el cdigo
contenido en esta memoria, pudiendo almacenar en ella una
cantidad limitada de datos como parte de la instruccin
RETLW. En una sola palabra se agrupa el cdigo de la
instruccin y el operando o su direccin.

El tipo de memoria utilizada en este microcontrolador,


podr ser grabada o borrada elctricamente a nuestro antojo
desde el programador. La memoria tipo Flash tiene la
caracterstica de poderse borrar en bloques completos y no
podrn borrarse posiciones concretas o especficas. Este tipo
de memoria no es voltil, es decir, no pierde los datos si se
interrumpe la energa.

DISPOSITIVOS LGICOS MICROPROGRAMABLES El PIC16F84A 5.6

La memoria para almacenar el programa nos resultar


perfecta para realizar pruebas y experimentos, adems de
para la programacin "on-board" o "in-circuit", esto es, nos
permite la programacin del dispositivo o actualizacin del
programa sin necesidad de retirarlo del circuito donde va
montado.
La memoria del programa comienza en la posicin 0000h y
termina en la posicin 03FFh. Esto es 1Kbyte, es decir, 1024
bytes (210).

En la figura tambin se muestra el PC (Contador de


Programa o Program Counter). Que apunta a la direccin de
memoria de la instruccin en curso y permite que el programa
avance cuando se incrementa.

Tambin se muestra la pila o stack, de 8 niveles (Nivel Pila


1 a Nivel Pila 8). Se utiliza cuando ejecutamos un subproceso
o subrutina, es decir, un conjunto de instrucciones que hemos
aislado de las dems para simplificar. En este caso el contador
de programa (PC) dejar de incrementarse y apuntar a la
posicin de memoria de programa donde empieza la
subrutina; en el primer nivel de la pila se almacenar esta
llamada, hasta que se acaben de ejecutar las instrucciones
que contiene, momento en el cual se seguir con las
instrucciones desde donde haba sido llamada. Por eso es
necesario saber donde se qued el programa almacenndose
la direccin en la pila. Podemos hacer hasta 8 llamadas a
subrutinas una dentro de otra, como si de muecas rusas se
tratase. A esto se le llaman subrutinas anidadas.

El vector de reset se encuentra en la posicin 0000h y el


de interrupcin en la 0004h.

Debido a que el PIC16F84A tiene un contador de programa


de 13 bit puede direccionar un espacio de memoria de 8K x
14, sin embargo slo el primer 1K x 14 (0000h-03FFh) est
implementado fsicamente.

Tener acceso a una localizacin por encima de la direccin


fsicamente implementada producir un solapamiento. Por
ejemplo, para las localizaciones 20h, 420h , 820h, C20h,
1020h, 1420h, 1820h, y 1C20h, la direccin real ser la
misma, as 20h es 32d y 420h es 1056d, 1056d menos 1024d
es igual a 32d, es decir, se direcciona realmente la
localizacin 20h, en binario 20h es 100000b y 420h es
10000100000b, 1K se direcciona con 10 bits (2 10 = 1024) de
manera que de 10000100000b si slo se tienen en cuenta 10
bits queda 0000100000b que es 20h. Con esto debe quedar
claro que despus de 3FF, al incrementarse el PC y pasar a
400, se direccionar de nuevo la posicin 0h

Existen varias versiones de memoria de programa para los


PIC16f84A:

Versin Flash. Se trata de una memoria no voltil, de


bajo consumo, que se puede escribir y borrar. A
diferencia de las memoria de tipo ROM, la memoria
FLASH es programable en el circuito. Es ms rpida y de
mayor densidad que la EEPROM. Esta versin es idnea
para la enseanza y la Ingeniera de diseo.
Versin OTP . ("One Time Programmable")
"Programable una sola vez". Slo se puede grabar una
vez por el usuario sin la posibilidad de borrar lo que se
graba. Resulta mucho ms econmica en la
implementacin de prototipos y pequeas series.

Versin QTP. Es el propio fabricante el que se encarga


de grabar el cdigo en todos los chips que configuran
pedidos medianos y grandes.

Versin SQTP. El fabricante solo graba unas pocas


posiciones de cdigo para labores de identificacin,
numero de serie, palabra clave, checksum, etc.

Las memorias FLASH han sustituido a las EEPROM y son


muy tiles al permitir que los microcontroladores que las
incorporan puedan ser reprogramados "en circuito", es decir,
sin tener que sacar el circuito integrado de la tarjeta. As, un
dispositivo con este tipo de memoria incorporado al control
del motor de un automvil permite que pueda modificarse el
programa durante la rutina de mantenimiento peridico,
compensando los desgastes y otros factores tales como la
compresin, la instalacin de nuevas piezas, etc. La
reprogramacin del microcontrolador puede convertirse en
una labor rutinaria dentro de la puesta a punto.

DISPOSITIVOS LGICOS MICROPROGRAMABLES El PIC16F84A 5.7

Memoria de datos

Est organizada en dos pginas o bancos de registro,


banco 0 y banco 1. Para cambiar de pgina se utiliza un bit
del registro STATUS (RP0).

Cada banco se divide a su vez en dos reas:

RFS (Registros de Funciones Especiales)

RGP (Registros de Propsito General)


En la figura siguiente nos podemos hacer una idea de cmo
estn distribuidos:

DISPOSITIVOS LGICOS MICROPROGRAMABLES El PIC16F84A 5.8

La primera es la de RFS (Registros de Funciones


Especiales) que controlan el funcionamiento del dispositivo.
Estos se emplean para el control del funcionamiento de la
CPU y de los perifricos.
El segundo rea (68 bytes SRAM) es la de RGP (Registros
de Propsito General), y puede accederse a ellos tanto directa
como indirectamente haciendo uso del registro FSR.

Banco 0:

Este banco est formado por 80 bytes, desde la posicin


00 hasta la 4Fh (de la 0 a la 79).

El rea RFS consta de 12 registros que sern utilizados


por funciones especiales del microcontrolador. Comienza
en la direccin 00h y termina en la 0Bh, es decir, de la 0
a la 11.

El rea RGP consta de 68 registros de memoria RAM que


sern utilizados para almacenar datos temporales
requeridos por los programas. Comienza en la direccin
0Ch y termina en la posicin 4Fh (de la 12 a la 79). Esta
parte es la memoria de registros de propsito general.

Banco 1:

Este banco tiene las mismas dimensiones que el


anterior, pero su uso es menor, ya que no tiene banco
para registros de propsito general. Solamente tiene una
seccin de registros especiales que van de la posicin
80h a la 8Bh ( de la 128 a la 139)

La memoria RAM as como algunos registros especiales son


los mismos en los dos bancos del mapa de memoria del PIC.
La anchura de los bytes en la memoria es de 8 bis.

Para direccionar la memoria de datos se emplean dos


modos de direccionamiento, el directo y el indirecto. En el
direccionamiento directo, los 7 bits de menos peso del cdigo
OP de la instruccin proporcionan la direccin en la posicin
de la pgina, mientras que los bits RP1 y RP0 de STATUS
seleccionan la pgina o banco.

En el direccionamiento indirecto el operando de la


instruccin hace referencia al registro IDNF, que ocupa la
posicin 00h del rea de datos. Se accede a la posicin que
apunta el registro FSR 04h del banco 0. Los 7 bits de menos
peso de FSR seleccionan la posicin y su bit de ms peso,
junto con el bit IRP del registro de estado, seleccionan la
pgina.

Para ms informacin ver Registros del PIC16F84A.

El direccionamiento

Para el PIC solamente existen 4 modos de


direccionamiento, entre los cuales, tres de ellos ya fueron
vistos de manera intuitiva cuando vimos las instrucciones. Los
modos de direccionamiento tratan sobre la forma de mover
los datos de unas posiciones de memoria a otras.

Direccionamiento Inmediato

Direccionamiento Directo

Direccionamiento bit a bit

Direccionamiento Indirecto

Direccionamiento Inmediato
El dato manipulado por la instruccin se codifica con la
propia instruccin. En este caso, el dato en cuestin se
denomina literal.

MOVLW k ; Coloca el literal k, que es un valor cualquiera


codificado con 8 bits, en el registro de trabajo w

Direccionamiento Directo
La memoria interna se direcciona de forma directa por
medio de los 8 bits "f" contenidos en las instrucciones que
operan sobre registros. De esta manera se puede direccionar
cualquier posicin desde la 00 a la FF.

En los microcontroladores que tengan ms de un banco,


antes de acceder a alguna variable que se encuentre en la
zona de los bancos de registros, el programador deber
asegurarse de haber programado los bits de seleccin de
banco en el registro OPTION.

Este es el modo ms utilizado, ya que como hemos visto


anteriormente, la memoria RAM est dividida en registros
especficos y en un conjunto de registros de propsito
general. Este modo consiste en codificar el nombre del o de
los registros en cuestin directamente en la instruccin.

MOVWF f ; Desplaza el contenido del registro w al registro f

Direccionamiento bit a bit


Mediante este direccionamiento se manipula un bit
individual en cualquier registro. Este modo de
direccionamiento no se utiliza nunca solo, sino que siempre
va emparejado con el modo de direccionamiento directo.

BCF f,b ; Pone a cero el bit nmero b del registro f

Direccionamiento Indirecto
Es el modo ms potente y utiliza los registros INDF y FSR.
En el registro FSR se introduce la direccin del registro que
se quiere leer cuando se acceda aINDF.

FSR acta como puntero, es decir, el valor que guardemos


en este registro ser la direccin de una posicin de memoria.
Si aumentamos o disminuimos con cualquier operacin el
contenido de FSR nos moveremos entre las posiciones de
memoria.

DISPOSITIVOS LGICOS MICROPROGRAMABLES El PIC16F84A 5.9

El registro INDF no tiene existencia fsica, solamente est


implementado en la posicin 0 como modo de notacin. La
utilidad de este registro no es otra que acceder a los datos
apuntados por el registro FSR, para poder modificarlos, etc.

Esto se ve mucho ms claro en los dos siguientes


ejemplos. El primero de ellos es un pseudo-cdigo para
acceder a la RAM, y el segundo es un algoritmo para
limpiarla.

Ejemplo 1:

El registro 05 contiene el
valor 10 h.

El registro 06 contiene el
Incrementamos el registro FSR
valor 0A h.
(FSR=FSR+1).
Cargamos el valor 05 en el
Ahora apunta a la posicin 06.
registro FSR.

Ahora est apuntado el


Si leemos el registro INDF, este
registro 05. retornar el valor 0A h.

Si leemos el registro INDF,


este retornar el valor 10 h.

INDF 10 h INDF 0A h

001 . 001 .

002 . 002 .

003 . 003 .

FSR 05 h FSR 06 h

005 10 h 005 10 h

006 0A h 006 0A h

007 . 007 .

008 . 008 .

009 . 009 .

00A . 00A .
00B . 00B .

Si leemos del registro INDF de manera indirecta


(con FSR apuntndolo), el valor ledo ser 00. Si escribimos
en este registro de manera indirecta, obtendremos una no-
operacin, aunque el registro estado se ver afectado.

Ejemplo 2:

Limpiar la memoria RAM desde la posicin 10 h a la 20 h.

MOVLW 0X10 ; Inicializamos puntero


MOVWF FSR
NEXT CLRF INDF ; Limpiamos el registro apuntado
INCF FSR ; Incrementamos el puntero
BTFSS FSR,5 ; Los registros estan borrados?
GOTO NEXT ; No, limpiar siguiente
CONTINUAR ; Si, se continua con el
programa
Existe un quinto modo de direccionamiento llamado
direccionamiento relativo que no trataremos por que no est
implementado en los PICs.

Memoria de datos EEPROM

Esta memoria est basada en tecnologa EEPROM, y tiene


una longitud de 8 bits, del mismo modo que la memoria de
datos. Su tamao es de 64 bytes y est situada en un bloque
distinto y aislado de la de datos.

Los 64 bytes EEPROM de Memoria de Datos no forman


parte del espacio normal direccionable, y slo es accesible en
lectura y escritura a travs de dos registros, para los datos el
EEDATA que se encuentra en la posicin 0008h del banco de
registros RAM y para las direcciones el EEADR en la 0009h.
Para definir el modo de funcionamiento de esta memoria se
emplean dos registros especiales, el EECON1 en la direccin
0088h y el EECON2 en 0089h.

Registros que se utilizan con la EEPROM:


Registro EEDATA (08h): Registro de Datos,
lectura/escritura 8 bits

Registro EEADR (09h): Registro de Direccin, de 0h a


3Fh, 64 bytes

Registro EECON1 (88h): Registro de Control 1

Registro EECON2 (89h): Registro de Control 2 (no es un


registro fsico)

Esta memoria no emplea ningn recurso externo de


alimentacin. Puede grabarse desde un programador de PIC
al igual que el cdigo de programa.

La lectura de una posicin de la memoria se obtiene en el


registro EEDATA en el prximo ciclo de reloj, si bien podra
tardar algo mas.

La escritura es mucho mas lenta, tardandose del orden de


unos 8 ms. Esta se controla mediante un temporizador
interno.

Resumen de caractersticas:

Memoria de datos de 64 bytes.

Lectura rpida de un byte (en el tiempo de uno o varios


ciclos de instruccin).

Escritura de un byte en unos 8 ms.

Se genera una interrupcin cuando se completa la


escritura de la memoria.

1.000.000 de ciclos de borrado/escritura.

40 aos de retencin de datos.

Tecnologa de baja potencia y alta velocidad CMOS.


Cuando el dispositivo est protegido por cdigo, la CPU
puede continuar leyendo y escribiendo en la memoria
EEPROM, pero el programador del dispositivo ya no puede
acceder esta memoria.

DISPOSITIVOS LGICOS El
5.10
MICROPROGRAMABLES PIC16F84A

Uso de la EEPROM

A continuacin veremos a fondo cuales son los procesos


ms usuales de escritura y de lectura en la EEPROM.

Lectura de la memoria EEPROM


Para leer de la memoria EEPROM han de seguirse los
siguientes pasos:

Escritura de la direccin que hay que leer en el


registro EEADR.

Poner a 1 el bit RD del registro EECON, para habilitar la


lectura.

Lectura del dato ledo y espera a que termine la


operacin.

El dato est disponible en el registro EEDATA.

Veamos dos ejemplos prctico. El primero (LECTURA1)


presupone que el dato en EEDATA estar disponible
rpidamente, y el segundo (LECTURA2) espera hasta
confirmarlo:

LECTURA1 BCF STATUS,RP0 ; Selecciona banco 0


MOVLW MEM1 ; Direccin a leer de
MOVWF EEADR ; la EEPROM
BSF STATUS,RP0 ; Selecciona banco 1
BSF EECON1,RD ; Activar lectura
BCF STATUS,RP0 ; Selecciona banco 0
MOVF EEDATA,W ; W se carga con el valor
; ledo en eeprom
LECTURA2 BCF STATUS,RP0 ; Selecciona banco 0
MOVLW MEM1 ; Direccin a leer de
MOVWF EEADR ; la EEPROM
BSF STATUS,RP0 ; Selecciona banco 1
BSF EECON1,RD ; Activar lectura
ESPERA BTFSC EECON1,RD ; Espera final de lectura
GOTO ESPERA ; a que baje la bandera
BCF STATUS,RP0 ; Selecciona banco 0
MOVF EEDATA,W ; W se carga con el valor
; ledo en eeprom
La memoria EEPROM es bastante lenta, por lo cual es
importante esperar a que el ciclo de lectura termine, aunque
algunas veces se omita. Pero es an ms importante esta
espera en el ciclo de escritura, ya que la EEPROM puede
tardar en ser escrita hasta 10 ms.

Escritura de la memoria EEPROM


El proceso de escritura es an ms complejo ya que
deberemos hacer todo lo anterior y adems escribir un cdigo
especial de proteccin. Estos pasos los vemos en las
siguientes lneas:

Poner a 1 (si no lo estaba) el bit WREN del registro


EECON1 para habilitar la operacin de escritura.

Cargar en EEADR la direccin de la posicin a escribir.

Cargar en el registro EEDATA el valor a grabar.

Ejecutar la siguiente secuencia que inicia la escritura de


cada byte y adems sirve de proteccin frente a errores
eventuales. Esta secuencia siempre es la misma y ha de
ejecutarse siempre.
MOVLW 55H
MOVWF EECON2 ; Escribe 55h en EECON2
MOVWF AAH
MOVWF EECON2 ; Escribe AAh en EECON2
BSF EECON1,WR ; Coloca a 1 el bit de escritura

Esta ltima instruccin inicia el proceso de escritura.


Cuando se termina, el bit EEIF est a 1 y, si ha sido
habilitada la interrupcin de EEPROM haciendo uso del
bit EEIE del registro INTCON, esta interrupcin se
genera.
Mediante software es necesario poner a cero el bit EEIF.

DISPOSITIVOS LGICOS El
5.11
MICROPROGRAMABLES PIC16F84A

Veamos un ejemplo de escritura tpico que no utiliza


interrupciones:

ESCRITURA ; Establecer EEADR y EEDATA


MOVLW DIRMEN1
MOVWF EEADR ; Escribe la direccin en EEADR
MOVLW DATO1
MOVWF EEDATA ; Se escribe el dato en EEDATA
BSF STATUS,RP0 ; Selecciona el banco 1
BSF EECON1,WREN ; Permiso de escritura activado
;Comienzo de la secuencia de escritura
MOVLW 0x55
MOVWF EECON2 ; Se escribe el dato 55 h en
EECON2
MOVLW 0xAA
MOVWF EECON2 ; Se escribe AA h en EECON2
BSF EECON1,WR ; Comienza la escritura
BCF EECON1,WREN ; Permiso de escritura
desactivado
ESPERA BTFSC EECON1,WR ; Espera a que termine la
escritura
GOTO ESPERA
BCF STATUS,R0 ; Selecciona el banco 0
La escritura de cada byte no se iniciar si la secuencia de
introducir 55 y AA en EECON2, y activar el bit WR no se
sigue exactamente.

Considerndo lo anterior, es recomendable que durante la


secuencia de inicio de escritura se deshabiliten las
interrupciones, con el fin de evitar errores no deseados y
habilitarlas posteriormente si van a ser utilizadas.

Adicionalmente, el bit WREN de EECON1 debe ser


activado para habilitar la escritura. Para evitar errores,
tambin es recomendable que el bit WREN est desactivado
durante todo el programa excepto en el momento de la
escritura. Debemos tener en cuenta que este bit no se pone a
cero automticamente mediante hardware. Una vez iniciado
el ciclo de escritura, si ponemos a cero WREN, esto no
afectar a el ciclo de escritura iniciado. En este caso el
bit WRestar inhibido y no se podr poner a uno.

Despus del ciclo, el bit WR es puesto a cero por hardware


y el EEIF es puesto a uno (si EEIE lo est). Si EEIE, est
habilitado, EEIF debe ser puesto a cero por software.

Veamos un ejemplo de escritura tpico que utiliza


interrupciones:

ESCRITURA BCF STATUS,RP0 ; Selecciona el banco 0


; Establecer EEADR y EEDATA
MOVLW MEN1
MOVWF EEADR ; Escribe la direccin en EEADR
MOVLW DATO1
MOVWF EEDATA ; Se escribe el dato en EEDATA
BSF STATUS,RP0 ; Selecciona el banco 1
BSF EECON1,WREN ; Permiso de escritura activado
BCF INTCON, GIE ; Desabilita interrupciones.
;Comienzo de la secuencia de escritura
MOVLW 0x55
MOVWF EECON2 ; Se escribe el dato 55 h en
EECON2
MOVLW 0xAA
MOVWF EECON2 ; Se escribe AA h en EECON2
BSF EECON1,WR ; Comienza la escritura
BSF INTCON,GIE ; Habilita las interrupciones.
BCF EECON1,WREN ; Permiso de escritura
desactivado
BCF STATUS,R0 ; Selecciona el banco 0

Verificacin de la escritura
Dependiendo de la aplicacin, la experiencia en
programacin dice que los datos escritos en la EEPROM deben
ser verificados comparndolos con el dato que se acaba de
escribir. Esto debe usarse en aplicaciones en las que un bit de
la EEPROM sufre ciclos de lectura/escritura hasta rozar el
lmite de las especificaciones. Generalmente el fallo de
escritura en un bit de la EEPROM ser un bit que se escribe
como un 0 lgico pero devuelve un 1 debido a la prdida de
ese bit. La siguiente porcin de cdigo es un ejemplo de
verificacin del dato escrito:

BCF STATUS,RP0 ; Nos situamos en el banco 0


MOVF EEDATA,W ; Debemos estar en el banco 0
BSF STATUS,RP0 ; Cambiamos al banco 1
BSF EECON1,RD ; Leemos el dato que se guarda
en
BCF STATUS,RP0 ; EEDATA, y cambiamos a banco 0
; A continuacin se comprueba que los datos en W en
EEDATA son los mismos
SUBWF EEDATA,W ; Restamos ambos valores
BTFSS STATUS,Z ; Si la operacin es cero, son
iguales
GOTO ERR_ESCRIT ; Si no son iguales, saltamos a
ERR_ESCRIT
..... ; Si son iguales, seguimos con
el programa

Rutinas EEPROM
A continuacin se presentan dos rutinas para escribir y leer
en la EEPROM:

;**************************************************************
; EEPROM_W:
; Graba un byte en la EEPROM de datos. La direccin ser la contenida
; en EEADR y el dato se le supone previamente introducido en EEDATA
;
EEPROM_W
bsf STATUS,RP0 ;Selecciona banco 1
bsf EECON1,WREN ;Permiso de escritura
movlw b'01010101' ;Secuencia de escritura
movwf EECON2
movlw b'10101010'
movwf EECON2
bsf EECON1,WR ;Orden de escritura
bcf EECON1,WREN ;Desconecta permiso de escritura
ESPERA
btfss EECON1,EEIF ;Comprobar bandera de fin de escritura
goto ESPERA
bcf EECON1,EEIF ;Reponer flag de fin de escritura
bcf STATUS,RP0 ;Seleccin banco 0
return
;
;**************************************************************
; EEPROM_R:
; Lee un byte de la EEPROM. Se supone al registro EEADR cargado
; con la direccin a leer. En EEDATA aparecer el dato ledo.
;
EEPROM_R
bsf STATUS,RP0 ;Seleccin de banco 1
bsf EECON1,RD ;Orden de lectura
bcf STATUS,RP0 ;Seleccin de banco 0
return
;**************************************************************
Puertos de E/S

El PIC16F84 dispone de dos puertos digitales de E/S


paralelos de uso general denominados Puerto A y Puerto B.

Puerto A
El puerto A dispone de 5 lneas de la RA0 a la RA4, en la
que hay que distinguir la A4 o T0CKI (Timer 0 Clock Input)
que est compartida con la entrada para el Timer 0 (TMR0) a
travs de un trigger Schmitt y que cuando se configura como
salida es de drenador abierto, por lo que debe colocarse una
resistencia de polarizacin.

Diagrama de bloques de RA3:RA0 Diagrama de bloques de RA4

Puerto B
El puerto B dispone de 8 lneas de E/S que van desde la
RB0 a la RB7 (la lnea RB0 o INT es compartida con la entrada
de interrupcin externa). Adems, las lneas RB4 a RB7 puede
programarse una interrupcin por cambio de estado de
cualquiera de estas lneas.
Diagrama de bloques de RB7:RB4 Diagrama de bloques de RB3:RB0

DISPOSITIVOS LGICOS El
5.12
MICROPROGRAMABLES PIC16F84A

Cuando se produce una interrupcin por cambio de estado


de cualquiera de las lneas RB4 a RB7, para lo cual las lneas
deben estar adems programadas como entradas (ver
registro INTCON e Interrupciones) el valor de la patilla en
modo entrada es comparado con el valor almacenado en la
bscula durante la ltima lectura del Puerto B. Los cambios en
las patillas se detectan realizando una operacin OR para la
generacin de una interrupcin por cambio de estado. Esta
interrupcin puede despertar "wake up" al microcontrolador
del modo de reposo SLEEP. El usuario debe borrar la
interrupcin en la Rutina de Servicio de Interrupcin RSI de
una de las siguientes maneras:

Borrando la bandera bit 3 de INTCON (RBIE).

Leyendo o escribiendo el PORTB y luego borrando el bit


RBIF. Esto finaliza la condicin "mismacht" y permite que
se borre RBIF.
Una condicin "mismacht" puede producir que el bit RBIF
siga a "1". Leyendo el puerto B puede finalizar la condicin de
"mismacht" y permitiendo que el bit RBIF sea puesto a "0".

Adems, todas las lneas del Puerto B disponen de


resistencias internas de polarizacin programables "pull-up"
de alto valor. Cada una de las 8 resistencias pueden ser
activadas o deshabilitadas haciendo uso del bit RBPU del
registro especial OPTION. Estas resistencias se deshabilitan
automticamente si una lnea es programada como salida as
como durante el proceso de Power On Reset.

Configuracin de los puertos de Entrada/Salida


Cualquier lnea puede funcionar como entrada o como
salida. Sin embargo, si acta como entrada la informacin
que se introduce no se memoriza, por lo que la informacin
debe ser mantenida hasta que sea leda. Si la lnea acta
como salida, el bit que procede del bus de datos se guarda en
la bscula, con lo que la informacin que ofrece esta patita
permanece invariable hasta que se reescriba este bit.

Los bits de cada puerto se configuran mediante los bits


correspondientes de dos registros especiales de control :

Registro de Datos denominados PORTA PORTB: Se


pueden leer o escribir segn que el puerto
correspondiente se utilice como entrada o como salida.

Registro de Control denominado TRISA TRISB: En los


registros de Control se programa el sentido de
funcionamiento de cada una de las lneas de E/S.
Colocando un "0" en el correspondiente bit del registro
TRISA TRISB, la lnea queda programada como salida
mientras que colocando un "1" la lnea queda
programada como entrada. Por ejemplo, si ponemos un
0 en el bit 3 del registro TRISA la patilla RA3 ser una
salida y si ponemos un 1 en el bit 4 del registro TRISB
entonces la patilla RB4 ser una entrada.
Los Puertos A y B (PORTA y PORTB) se corresponden con
las posiciones 5 y 6 del rea de datos.

Cuando se produce un reset, todos los bits de los registros


TRIS pasan a tener el valor 1 y todas las lneas de E/S actan
como entrada por evidentes motivos de seguridad para evitar
daos irreparables. Todas las patillas de E/S que no se
empleen deben ser llevadas a +5v, regla de las entradas
CMOS, preferiblemente a travs de una resistencia para evitar
que si por error se configurasen como salidas puedan darse
problemas si presentan un estado bajo.

Para mas informacin, ver "Registro TRISA y TRISB (85h y


86h)" de "Registros del PIC16F84A" as como "Instrucciones y
puertos" de "Tcnicas de programacin".

DISPOSITIVOS LGICOS El
5.13
MICROPROGRAMABLES PIC16F84A

Limite de corriente para los puertos


Los puertos del microcontrolador PIC16F84 son el medio de
comunicacin con el mundo exterior, en ellos podremos
conectar los perifricos o circuitos necesarios como por
ejemplo los mdulos LCD, teclados matriciales, motores
elctricos, etc; pero estas conexiones no se podrn realizar
arbitrariamente. Existen unas reglas bsicas que debern
cumplirse para que el microcontrolador no sufra daos o se
destruya. Para ello es necesario conocer los lmites de
corriente que puede manejar el microcontrolador.

Como anteriormente hemos indicado los puertos A y B del


microcontrolador podrn ser programados como entradas
salidas indiferentemente. En el caso de que sean
programados como salida y presenten un nivel lgico alto
actuaran como "fuente" porque suministran corriente y
cuando presenten un nivel lgico bajo actuarn como
"sumidero" por que reciben corriente.

Disipacin de potencia total de 800 mW.

Mxima corriente de salida a VSS 150 mA.

Mxima corriente de salida de VDD 100 mA.

Si utilizamos todas las lneas del puerto "A" como


fuente, no deber exceder de 50 mA toda la corriente
que suministre este puerto.

Si utilizamos todas las lneas del puerto "A" como


sumidero, no deber exceder de 80 mA toda la corriente
que suministre este puerto.

Si utilizamos todas las lneas del puerto "B" como


fuente, no deber exceder de 100 mA toda la corriente
que suministre este puerto.

Si utilizamos todas las lneas del puerto "B" como


sumidero, no deber exceder de 150 mA toda la
corriente que suministre este puerto.

La mxima corriente que puede suministrar una sla


salida como fuente o sumidero es de 25 mA.

De todas maneras hay que tener en cuenta no superar la


disipacin de potencia mxima, que se calcula como sigue:

Pdis = VDD x (IDD - IOH) + {(VDD-VOH) x


IOH} + (VOL x IOL)

VOH suele ser VDD-0,7 v y VOL 0,6 v.

El consumo de corriente (IDD) es principalmente funcin


de la tensin de alimentacin y de la frecuencia. Otros
factores, como cambios en E/S, tipo de oscilador, temperatura
y otros tienen influencia en el consumo. La IDD para el
PIC16F84A-4 est entre 1,8 a 4.5 mA en configuracin de
oscilador RC y XT (FOSC=4 MHz, VDD=5,5V), con las patillas
como entradas y unidas a positivo.

En caso de que se necesiten utilizar perifricos que


manejen mayor cantidad de corriente de la especificada,
habr que aplicar un circuito adaptador como por ejemplo
buffers o transistores.

DISPOSITIVOS LGICOS El
5.14
MICROPROGRAMABLES PIC16F84A

En la siguiente figura vemos una configuracin tpica en la


que se utilizan buffers de corriente, que proporcionan en su
salida el mismo nivel lgico que la entrada pero pueden
controlar corrientes relativamente elevadas. En este caso se
utiliza el ULN2803, un circuito integrado que consiste en 8
buffers de potencia capaces de suministrar en su salida hasta
1 A, mucho ms de lo que es capaz de soportar un PIC:

Temporizador/Contador TMR0

El temporizador/contador TMR0 es un registro de 8 bits, es


decir, un particular tipo de registro cuyo contenido es
incrementado con una cadencia regular y programable
directamente por el hardware del PIC. Como es de 8 bits, el
mximo de la cuenta est en 255.

El TMR0 tiene las siguientes caractersticas:

Temporizador/Contador de 8 bits.

Divisor de 8 bits programable por software.

Seleccin de reloj interno y externo.

Interrupcin por desbordamiento.

Seleccin del flanco del reloj externo.

Este registro puede usarse para contar eventos externos


por medio de un pin de entrada especial (modo contador) o
para contar pulsos internos de reloj de frecuencia constante
(modo temporizador). Adems, en cualquiera de los dos
modos, se puede insertar un prescaler, es decir un divisor de
frecuencia programable que puede dividir por 2, 4, 8, 16, 32,
64, 128 o 256. Este divisor puede ser utilizado
alternativamente como prescaler o del TMR0 o como
postscaler del Watch Dog Timer, segn se lo programe.

En la prctica, a diferencia de los otros registros, el TMR0


no mantiene inalterado el valor que tiene memorizado, sino
que lo incrementa continuamente.

Si por ejemplo escribimos en l el valor 10, despus de un


tiempo igual a cuatro ciclos mquina, el contenido del registro
comienza a ser incrementado a 11, 12, 13 y as
sucesivamente con una cadencia constante y totalmente
independiente de la ejecucin del resto del programa.

DISPOSITIVOS LGICOS El
5.15
MICROPROGRAMABLES PIC16F84A
Una vez alcanzado el valor 255, el registro TMR0 es puesto
a cero automticamente comenzando entonces a contar
desde cero y no desde el valor originalmente cargado.

La frecuencia de conteo es directamente proporcional a la


frecuencia de reloj aplicada al PIC y puede ser modificada
programando adecuadamente algunos bits de configuracin.

El modo temporizador se selecciona colocando a 0 el bit


T0CS del registro OPTION. En este modo, el Timer0 se
incrementa con cada ciclo de instruccin (con el divisor
desactivado).

El modo contador se selecciona colocando a 1 el bit T0CS


del registro OPTION. En este modo, el contador se
incrementar con cada flanco de subida o de bajada del pin
RA4/T0CKI. El flanco se selecciona con el bit T0SE del registro
OPTION.

Se generar una interrupcin cuando el registro TMR0 se


desborda de FFh a 00h. Este desbordamiento se indicar el el
bit T0IF del registro INTCON.

En la siguiente figura est representado el esquema de


bloques internos del PIC que determinan el funcionamiento
del registro TMR0:
Fosc/4 y T0CKI representan las dos posibles fuentes de
seal de reloj, para el contador TMR0.

Fosc/4 es una seal generada internamente por el PIC


tomada del circuito de reloj y que es igual a la frecuencia del
oscilador dividida por cuatro.

T0CKI es una seal generada por un posible circuito


externo y aplicada al pin T0CKI correspondiente al pin 3 del
PIC16F84.

Los bloques T0CS y PSA son dos selectores de seal


(multiplexores) en cuya salida se presenta una de las dos
seales de entrada en funcin del valor de los bits T0CS y
PSA del registro OPTION.

El bloque PRESCALER Predivisor es un divisor


programable cuyo funcin es dividir la frecuencia de conteo,
interna externa.

DISPOSITIVOS LGICOS El
5.16
MICROPROGRAMABLES PIC16F84A

El Prescaler
El PRESCALER consiste en un divisor programable de 8 bits
a utilizar en el caso de que la frecuencia de conteo enviada al
contador TMR0 sea demasiado elevada para nuestros
propsitos. Se configura a travs de los bits PS0, PS1 y PS2
del registro OPTION.

La frecuencia Fosc/4 es una cuarta parte de la frecuencia


de reloj. Utilizando un cristal de 4Mhz tendremos una Fosc/4
igual a 1 MHz, con lo que la cadencia de conteo que se
obtiene provoca en TMR0 1 milln de incrementos por
segundo (1/1.000.000 seg. =1MHz), que para muchas
aplicaciones podra resultar demasiado elevada.
Con el uso del PRESCALER podemos dividir la frecuencia
Fosc/4 configurando oportunamente los bits PS0, PS1 y PS2
del registro OPTION segn la siguiente tabla:

PS PS PS DIVISO
FRECUENCIA DE SALIDA PREESCALER (Hz.)
2 1 0 R

0 0 0 2 500.000

0 0 1 4 250.000

0 1 0 8 125.000

0 1 1 16 62.500

1 0 0 32 31.250

1 0 1 64 15.625

1 1 0 128 7.812,5

1 1 1 256 3.906,25

Ejemplo prctico:Introducir un retardo igual a un


segundo utilizando el registro TMR0.

Debemos programar el bit T0CS a 0 para seleccionar como


fuente de conteo el reloj del PIC, el bit PSA tambin debe
estar a 0 para asignar el PRESCALER al registro TMR0 en
lugar de al Watch Dog Timer y los bits de configuracin del
PRESCALER a 100 para obtener una frecuencia de divisin
igual a 1:32. La frecuencia que obtendremos en TMR0 ser
igual a:

Fosc = 1Mhz / 32 = 31.250 Hz

Memorizamos en TMR0 el valor 6 de modo que el registro


TMR0 alcanza el cero despus de 250 cuentas (256 - 6 =
250) obteniendo as una frecuencia de paso por cero del
TMR0 igual a:
31.250 / 250 = 125 Hz

El siguiente paso ser memorizar en un registro de 8 bits


el valor 125 de tal modo que, decrementando este registro en
1 por cada paso por cero de TMR0, se obtenga una frecuencia
de pasos por cero del registro igual a:

125/125 = 1Hz (1 segundo).

En resumen se trata de controlar si TMR0 ha alcanzado el


valor cero, luego de reiniciarlo a 6 y decrementar el valor
contenido en un registro con valor 125. Cuando el registro
alcance tambin el valor cero, entonces habr trascurrido un
segundo.

DISPOSITIVOS LGICOS El
5.17
MICROPROGRAMABLES PIC16F84A

Encapsulado y marcado del PIC16F84A

El PIC16F84A puede presentarse en varios encapsulados:

Encapsulado PDIP tipo DIL ("Dual In Line" Doble En


Lnea) de 18 patillas, es el encapsulado tradicional,
grande y manejable.

Encapsulado SOIC de 18 patillas y SSOP de 20 patillas,


para montaje superficial SMD, una tecnologa de mayor
integracin que ocupa muy poco espacio, pero con un
proceso de soldadura ms difcil.

Marcado del encapsulado:


XXX... -XX X /XX XXX : Informacin especifica del
producto:

o XXX... : Dispositivo (PIC16F84A,PIC16LF84A y


PIC16F84AT,PIC16LF84AT):

F: Rango de VDD estndar

LF: Rango de VDD extendido, a 200KHz

T: Suministrados en carrete de cinta (slo


SOIC y SSOP)

o -XX : Rango de frecuencia

-04 = 4 MHz

-20 = 20 MHz

o X : Rango de temperatura:

Nada = 0oC a +70oC

I = -40oC a +85oC

o /XX : Tipo de encapsulado:

P = PDIP

SO = SOIC

SS = SSOP

o XXX : Patrn:

Nada = OTP y PIC sin ventana

Cdigo = Cdigo especifico QTP, SQTP y ROM

YY :Ao
WW :Semana

NNN :Cdigo alfanumrico para rastreo

Ejemplos:

PIC16F84A-04/P = Temp. comercial., PDIP, 4 MHz, VDD


normal.

PIC16LF84A-04I/SO = Temp. industrial, SOIC, 200 kHz,


VDD extendida.

PIC16F84A-20I/P 301= Temp. industrial, PDIP, 20 MHz,


VDD normal, QTP n 301.

Anda mungkin juga menyukai