You are on page 1of 17

Guía del pic 16f84

El pic que se va a utilizar para las prácticas realizadas va ha ser el 16f84. Este
pic es similar al 16c84, por tanto (aunque a veces se hable de éste) nos referimos al
16f84 a lo largo de toda la guía.

1. Encapsulado:

El 16f84 pertenece a la familia de la gama media y dentro de ella es de los más


pequeños: tan solo tiene 18 patillas. Tiene una capacidad de memoria de programa de
1K (palabras de 14 bits cada una) tipo FLASH y 64 bytes de EEPROM como memoria
auxiliar. Estas memorias son eléctricamente borrables, lo que permite grabar y borrar el
programa para realizar todas las pruebas pertinentes (soporta unos 1000 ciclos de
escritura/borrado). Este pic está fabricado con tecnología CMOS y el encapsulado (de
18 patillas) es el representado en la figura 1.1.

Figura 1.1. Patillaje del pic 16f84

A continuación se va a comentar brevemente la misión de cada patilla:

- Vdd: Patilla por la que se va a aplicar la tensión positiva de alimentación (4V


– 6V DC).

- Vss: Conectada a tierra o negativo de la alimentación.

- MCLR: Esta patilla va a ser activada a nivel bajo para resetear el pic.
También se va a utilizar durante la grabación de la memoria de programa para introducir
por ella la tensión Vpp (12V – 14V DC). El micropic trainer tiene un botón de reset
conectado al pic como se ve en la figura 1.2 (R1 = 100Ω y R = 4K7Ω ).
Figura 1.2. Circuito que permite producir un
reset al presionar un pulsador

- OSC1/CLKIN: Por ella se va a introducir la entrada del circuito oscilador


externo que va a proporcional la frecuencia de trabajo.

- OSC2/CLKOUT: Patilla auxiliar del circuito oscilador. Según la frecuencia


de trabajo del oscilador, se va a tener una u otra velocidad en la ejecución de cada
instrucción. En las prácticas realizadas, la frecuencia de trabajo es de 4 MHz, por tanto
el ciclo de instrucción va a ser de 1µ sg (4 periodos de reloj x 0,25µ sg = 1µ sg).
Todas las instrucciones se van a ejecutar en 1µ sg salvo las de salto que van ha tardar
2µ sg.
Los pic admiten cuatro tipos de circuito oscilador (RC, HS, XT y LP). En las
prácticas realizadas se a utilizado el XT (Figura 1.3).

Figura 1.3. Esquema del oscilador tipo XT

Este circuito utiliza un cristal de cuarzo que actúa como un oscilador que
proporciona la frecuencia de 4MHz antes citada. Los condensadores C1 y C2 están
comprendidos entre 15 – 33 pF. El micro’pic trainer los utiliza de 27 pF.

- RA0 – RA4: Son las 5 líneas de E/S digitales correspondientes a la puerta A.


La línea RA4 multiplexa el TOCKI. En este caso sirve para recibir una frecuencia
externa que alimente el temporizador interno TMR0.

- RB0 – RB7: Corresponden a las 8 líneas de E/S digitales de la puerta B. La


RB0 multiplexa el INT, que servirá de entrada a una petición externa de interrupción.

El consumo típico del pic es de 2mA aproximadamente funcionando en modo


normal. Cuando entramos en el modo llamado “reposo”, mediante la instrucción SLEEP
(ver apartado 5), pasa a consumir menos de 10 µ A.
2. Arquitectura interna:

La arquitectura del procesador sigue el modelo Harvard. En este, la CPU se


conecta de forma independiente y con buses distintos con la memoria de instrucciones y
con la de datos, permitiendo a esta acceder simultáneamente a las dos memorias. Se
aplica la técnica de segmentación en la ejecución de las instrucciones. Esta
segmentación permite al procesador realizar al mismo tiempo la ejecución de una
instrucción y la búsqueda del código de la siguiente. De esta forma se puede ejecutar
cada instrucción en un ciclo (un ciclo de instrucción equivale a cuatro ciclos de reloj).
Las instrucciones de salto ocupan dos ciclos al no conocer la dirección de la siguiente
instrucción hasta que no se haya completado la de bifurcación.
El formato de todas las instrucciones es de la misma longitud (14 bits en los de
gama media). Procesador RISC (Computador de Juego de Instrucciones Reducido). Los
modelos de la gama media disponen de un repertorio de 35 instrucciones. Cualquier
instrucción puede manejar cualquier elemento de la arquitectura como fuente o como
destino,es decir, todos los objetos del sistema (puertas de E/S, posiciones de memoria,
etc.) están implementados como registros.

En la figura 2.1 aparece el diagrama de bloques del pic 16f84. Para analizar un
poco el funcionamiento del procesador, nos vamos a centrar en la ejecución de una
instrucción.

Figura 2.1. Arquitectura interna del PIC16F84

El contador de programa comienza la fase de búsqueda facilitando la dirección


de la memoria de instrucciones donde se ubica la instrucción. Su código binario de 14
bits se lee y se carga en el Registro de instrucciones (1), desde donde se transfiere al
decodificador y a la unidad de control (2). La ALU (3) es la encargada de realizar la
operación aritmético-lógica que implica la instrucción decodificada. Uno de los
operandos lo recibe del registro W (4) y el otro de un registro o de la propia instrucción.

En cuanto a la memoria de programa, el pic es capaz de contener 8.192


instrucciones de 14 bits cada una. Este mapa se divide en páginas de 2.048 posiciones.
Para direccionar 8K posiciones se necesitan 13 bits (longitud del contador de
programa). Sin embargo el pic solo tiene implementadas 1K posiciones, por lo que
ignora los 3 bits de más peso del PC (contador programa). La organización de la
memoria de programa es como indica la figura 2.2.

El vector de reset se almacena en la dirección 0000, mientras que el vector de


interrupción está en la 0004. La memoria de programa de usuario comienza en la
dirección 0005 y se extiende hasta la 03FF.

La pila es una zona aislada de las memorias de instrucciones y datos (Ver fig.
2.3). Tiene una estructura LIFO (Last In First Out) en la que el último valor guardado es
el primero que sale. Tiene ocho niveles de profundidad cada uno con 13 bits. La
instrucción CALL (Ver apartado 5) y las interrupciones originan la carga del contenido
del PC en el nivel superior de la pila. El contenido del nivel superior se saca de la pila al
ejecutar las instrucciones RETURN, RETLW y RETFIE.

Figura 2.3. Organización de la memoria de programa

3. Registros internos:

La memoria de datos del 16F84 dispone de dos zonas diferentes:

- Área EEPROM: de 64 bytes. En ella se pueden almacenar datos que no se


pierden al desconectar la alimentación.

- Área RAM estática o SRAM: en ella reside el banco de registros


específicos (SFR) y el banco de registros de propósito general (GPR). El primero tiene
24 posiciones de tamaño byte y el segundo 68.
La memoria RAM se halla dividida en dos bancos (banco 0 y banco 1) de 128
bytes cada uno. Las 12 primeras posiciones están reservadas al SFR, son los registros
encargados del control del procesador y sus recursos. Las direcciones comprendidas
entre 7H – 87H no son operativas. Los 68 registros del GPR se destinan a propósito
general y en realidad solo son operativos los 68 del banco 0 porque los del banco 1 se
mapean sobre el banco 0, es decir, cuando se apunta a uno del banco 1 se accede al
mismo pero en el banco 0.

A continuación, se describen los diferentes registros que se representan en la


figura 3.1.

Figura 3.1. Organización de los registros internos

- Registro de indirección (00): Este registro no tiene existencia física, por


tanto no se podrá leer. Si se intenta acceder a él, siempre se encontrará 00, y si se intenta
escribir se producirá un NOP, es decir, una instrucción que no hace nada. Este registro
se utiliza únicamente para realizar un direccionamiento indirecto; cuando se le hace
referencia se accede a la dirección de un banco especificada con los 7 bits de menos
peso del registro FSR. El bit de más peso del FSR junto con el IRP del registro
ESTADO se encarga de seleccionar el banco a acceder.

- Registro PCL (02): Son los 8 bits de menos peso del contador del programa
o PC. Como el PC debe tiene un tamaño de 13 bits, sus bits de mayor peso se llevan al
registro PCLATH (posiciones 0A-8A). Como muestra la figura 3.2, si el PC es destino
de una instrucción, el contenido de PCLATH se tiene en cuenta automáticamente; para
las instrucciones CALL y GOTO tiene lugar la misma operación (teniendo en cuenta
que el PC está ahora codificado con 11 bits en la propia instrucción).
Figura 3.2. Determinación de los bits de mayor peso del PC a través del
PCLATH. A la derecha, para instrucciones CALL y GOTO.

- Registro STATUS (03): contiene un cierto número de bits de estado de la


unidad central. Se puede leer y escribir como cualquier otro registro. En la figura 3.3 se
puede ver la estructura de este registro; hay bits que no se pueden varia al indicar
stados del procesador, así al ejecutar la instrucción de borrar el registro, este se carga
con el valor 000uu1uu (u = se queda como estaba).

Figura 3.3. Estructura interna del registro estado

El bit 0 o C (Carry) es el bit de acarreo para las operaciones de suma y


sustracción. Se pone a 1 si se produce acarreo en el bit de mayor peso. También lo
utilizan las instrucciones de rotación.
El bit 1 o DC (Digit Carry) es el bit de acarreo de dígito. Funciona igual que el
anterior, pero haciendo referencia al 4º bit.
El bit 2 o Z (Zero) se pone a 1 si el resultado de una operación aritmética o
lógica es nulo.
El bit 3 o PD (Power down) se pone a 1 durante la conexión a la alimentación
del circuito o durante la ejecución de la instrucción CLRWDT. Se pone a 0 al ejecutar
SLEEP. Es de solo lectura.
El bit 4 o TO (Time out) se pone a 1 durante la conexión a alimentación o
durante la ejecución de una instrucción CLRWDT o SLEEP. Se pone a 0 cuando el
temporizador watchdog se desborda. También es de solo lectura.
Los bit 5 y 6 o RP0 y RP1 sirven para seleccionar las páginas de memoria de
programa. El 16F84 solo utiliza el RP0 al tener tan solo dos páginas; si RP0 = 1
selecciona pagina 1, si RP0 = 0 selecciona la pagina 0.
El bit 7 o IRP no se utiliza en nuestro caso, debe programarse como 0.

Los bits T0 y PD también nos sirven para determinar la causa de la producción


de un reset (ver tabla 3.1).

TO PD Condición de reset
1 1 Reset por alimentación
0 1 Desbordamiento del WDT en funcionamiento normal
0 0 Desbordamiento del WDT en estado de reposo
1 1 Activación del MCLR en funcionamiento normal
1 0 Activación MCLR en reposo
Tabla 3.1. Determinación del origen de un reset

- Registro INTCON (0B-8B): sirve para el control global de las interrupciones


y para indicar la procedencia de alguna de ellas. Las cuatro fuentes de interrupción
posibles en el 16F84 son: activación de la patilla RB0/INT, desbordamiento del
temporizador TMR0, cambio de estado en los pines RB4 a RB7 y el fin de una escritura
en la EEPROM de datos.

Figura 3.4. Registro INTCON

Cada bit del registro INTCON (Figura 3.4) tiene un significado concreto que es
el que sigue:

El bit 0 o RBIF (RB Interrupt Flag) se pone a 1 si hay un cambio de estado en


una de las líneas de RB4 a RB7 del puerto B.
El bit 1 o INTF (Interrupt Flag) se pone a 1 si hay una interrupción provocada
por la línea RB=/INT del puerto B.
El bit 2 o T0IF (Timer 0 Interrupt Flag) se pone a 1 si hay desbordamiento del
Timer 0.
El bit 3 o RBIE (RB Interrupt Enable) se pone a 1 para autorizar las
interrupciones provocadas por un cambio de estado en las líneas RB4 a RB7 del puerto
B.
El bit 4 o INTE (Interrupt Enable) se pone a 1 para autorizar las interrupciones
provocadas por la línea RB0/INT del puerto B.
Los bit 5 o bit T0IE (Timer 0 Interrupt Enable) se pone a 1 para autorizar las
interrupciones debidas al desbordamiento del temporizador 0.
El bit 6 o EEIE (EEPROM Interrupt Enable) se pone a 1 para autorizar las
interrupciones que proceden de la memoria EEPROM de datos.
El bit 7 o GIE (Global Interrupt Enable) se pone a 1 para autorizar todas las
interrupciones que no tengan sus bits a 0. Si este bit es 0, todas las interrupciones están
desactivadas aunque sus bits particulares sean 1 (Ver figura 3.5).

Figura 3.5. Lógica de control para interrupciones


- Puertas de E/S: el 16F84 solo dispone de dos puertas de entrada/salida. La
puerta A posee 5 líneas, RA0-RA4, y una de ellas soporta dos funciones multiplexadas.
Se trata de la RA4/T0CKI, que puede actuar como línea de E/S o como patilla de
entrada para los impulsos con que debe contar TMR0. La puerta B tiene 8 líneas, RB0-
RB7, y también tiene una con funciones multiplexadas, la RB0/INT, que sirve como
E/S y como patilla por la que se reciben los impulsos externos que provocan una
interrupción. Cada línea de E/S puede configurarse independientemente como entrada o
salida, según se ponga a 1 o 0, respectivamente, el bit asociado del registro de TRISA o
TRISB (direcciones 5 y 6 del banco 1 de la memoria de datos). Los registros
PUERTAA y PUERTAB guardan la información que entra o sale por la puerta
(direcciones 5 y 6 del banco 0). Al reinicializarse el pic todos los bits de los registros
TRIS quedan a 1, con lo que las líneas de las puertas quedan configuradas como
entradas; las resistencias pull-up que veremos más adelante, se desconectan al resetear.
Cada línea de salida puede suministrar una corriente máxima de 20 mA y si es entrada
puede absorber hasta 25 mA.

En la figura 3.6 se muestra la adaptación de las patillas RA4-RA0 a las señales


internas del procesador. Por ejemplo, cuando se saca un nivel lógico por una puerta A,
primero se deposita en la línea correspondiente del bus de datos y se activa la señal
WRITE, lo que origina el almacenamiento del nivel en la báscula de datos; para que
actúe como salida, la báscula de configuración debería contener un 0, por lo que la
puerta OR tendría un 0 en su salida y la AND también; estos valores producen la
conducción del PMOS superior y el bloqueo del NMOS; así, la patilla queda conectada
a Vdd y tiene nivel alto. Como la línea de salida está lacheada conserva su valor hasta
que no se reescriba en la báscula D.

Figura 3.6. Conexión electrónica de las patillas RA·-RA0.


A la derecha la patilla RA4

En la figura 3.7 se ve el esquema electrónico de conexionado para las patillas


RB7-RB0. A todas las líneas de esta puerta se le permite conectar una resistencia pull-
up de elevado valor con el positivo de la alimentación (se programa en el registro
OPTION). Las líneas RB7-RB4 pueden programarse para que generen una interrupción
si alguna de ellas cambia de valor (en ese caso se indicaría en el RBIF). Las líneas RB7
y RB6 también se utilizan para la grabación en serie de la memoria de programa (Ver
apartado 4).

Figura 3.7. A la izquierda el conexionado de las puertas RB7-RB4.


A la derecha para las puertas RB3-RB0.

- Temporizadores: el TMR0 es un temporizador/contador de 8 bits. Puede


utilizarse como contador, representado por los impulsos que se aplican a la patilla
RA4/T0CKI (de FF pasa a 00, activándose un señalizador o una interrupción), y como
temporizador, cargando un registro con un valor inicial (al desbordarse hará lo mismo
que el anterior). Para programarlo de una u otra forma se usa el registro OPTION que
veremos más adelante. El TMR0 puede ser leído y escrito (dirección 1, banco 0) en
cualquier momento al estar conectado al bus de datos. Cuando actúa como temporizador
se carga con el valor de los impulsos que se quiere temporizar, pero expresados en
complemento a 2; así, al llegar al número de impulsos deseado se desborda y activa el
señalizador TOIF y/o se produce la interrupción.
Otro temporizador importante es el perro guardián (WDT). Se trata de un
contador interno de 8 bits que origina un reset cuando se desborda. Su control de
tiempos es independiente del TMR0 y está basado en una red R-C interna, por lo que no
necesita ningún componente externo y continúa funcionando incluso cuando el reloj del
pic se para durante, por ejemplo, una instrucción SLEEP. Se programa desde el registro
OPTION. Se puede desactivar en la palabra de configuración (más adelante).
La temporización nominal del WDT es de 18 msg, pero puede llegar a 2,3
segundos utilizando el llamado divisor de frecuencia. Este divisor puede utilizarse con
el WDT o con el TMR0. Con el TMR0 actúa como Pre-divisor, es decir, los impulsos
pasan primero por el divisor y luego se aplican al TMR0. Con el WDT actúa como Post-
divisor.
Una fórmula práctica para calcular los tiempos a controlar con el TMR0 puede
ser esta:
Valor a cargar en TMR0 = Temporización / 4 * Toscilación * Rango del divisor

- Registro OPTION (dirección 81): la misión principal de este registro es


controlar el TMR0 y el divisor de frecuencia. Ocupa la dirección 81H de la memoria de
datos (equivale a la dirección 1 del banco 1). En la figura 3.8 se puede ver la estructura
de este registro.
Figura 3.8. Distribución de los bits del registro OPTION

Los bits 0, 1 y 2 o PS0, PS1 y PS2 son los encargados de definir el valor con el
que actúa el divisor de frecuencia. En la tabla 3.2 se pueden ver los distintos valores que
puede tomar el divisor.

PS2 PS1 PS0 División del TMR0 División del WDT


0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
1 0 0 1:32 1:16
1 0 1 1:64 1:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128
Tabla 3.2. Programación de los bits PS2, PS1 y PS0

El bit 3 o PSA (Prescaler assignment) asigna el divisor de frecuencia al WDT


(1) o al TMR0 (0).
El bit 4 o RTE (Timer 0 signal edge) hace que el TMR0 se incremente cada
flanco ascendente (0) o descendente (1).
El bit 5 o RTS (Timer 0 signal source) a 0 indica que el temporizador utilizará
el reloj interno. Si está a 1 utilizará la señal aplicada en la patilla RA0/T0CKI.
El bit 6 o INTEDG (Interrupt edge) define el sentido del flanco que provocará
una interrupción a través de la patilla RB0/INT. Un 1 activa un flanco de subida y un 0
de bajada.
El bit 7 o RBPU (RB pull up enable) activa las resistencias pull-up (0) o las
desactiva (1).

- La palabra de configuración: se trata de una posición reservada de la


memoria de programa (2007H) y accesible únicamente durante la grabación del pic.

Figura 3.9. Distribución de los bits de la palabra de configuración

Los bits CP son bits de protección de la memoria de código. A 1 indican que no


está protegida, a 0 el programa no se puede leer ni sobreescribir. A 0 también evita que
pueda accederse a la EEPROM de datos, borrándose esta si el bit es modificado (si pasa
de 0 a 1).
El bit PWRTE activa (con un 0) el temporizador llamado “power-up”, que
retrasa en 72 msg la puesta en marcha al conectar la alimentación, garantizándose así la
estabilidad de la tensión aplicada.
El bit WDTE activa (1) o desactiva (0) el perro guardián.
Los bits FOSC1-FOSC0 seleccionan el oscilador utilizado: RC (11), HS (10),
XT (01) y LP (00).
Las posiciones de memoria 2000H-2003H también están reservadas para las
llamadas palabras de configuración (ID). En estas solo se usan los 4 bits de menos peso
para grabar números de serie, códigos de identificación, numeraciones secuenciales, etc.

- Memoria EEPROM de datos: el pic tiene 64 bytes de memoria donde se


pueden almacenar datos y variables que interesa que no se pierdan cuando se desconecta
la alimentación al sistema. En el registro EEADR (dirección 9 del banco 0) se carga la
dirección a acceder de la EEPROM de datos. En el registro EEDATA (dirección 8 del
banco 0) se depositan los datos que se leen o se escriben. El EECON1 (dirección 8 del
banco 1) tiene la misión de controlar las operaciones en la EEPROM (Figura 3.10).

Figura 3.10. Distribución de los bits del registro EECON1

El bit RD se pone a 1 cuando se va a realizar un ciclo de lectura de la EEPROM.


Luego pasa a cero automáticamente.
El bit WR se pone a 1 cuando se va a realizar un ciclo de escritura de la
EEPROM. Luego pasa a cero automáticamente.
El bit WREN da permiso para escribir cuando está a 1 y prohibe la escritura a 0.
El bit WRERR se pone a 1 cuando una operación de escritura ha terminado
prematuramente y a 0 cuando ha finalizado correctamente.
El bit EEIF se pone a 1 si la operación de escritura se completa con éxito y a 0
si no se ha completado.

Un ciclo de escritura tiene una duración de 10 msg. El registro EECON2 no está


implementado físicamente y se usa únicamente como dispositivo de seguridad durante
la escritura en la EEPROM.

Para leer la EEPROM basta con colocar la dirección a leer en EEADR y poner a
1 el bit RD. El dato leído estará disponible en el registro EEDATA.

Para escribir en la EEPRON se sigue una secuencia de instrucciones en las que


interviene el EECON2. Este registro solo asume funciones de seguridad, cargándose
con dos valores concretos: 55H y AAH. El ciclo de escritura comienza cargando en
EEADR la dirección de la posición a escribir, en el registro EEDATA el valor a grabar
y activado el bit WR. Al acabar la escritura, el bit WR se pone a 0 automáticamente y el
señalizador EEIF a 1 (habrá que ponerlo a 0 para volver a escribir). Para verificar la
correcta escritura, se resta el valor contenido en EEDATA con el dato escrito y se
comprueba que el bit Z pase a valer 1.

4. Programación:

La programación en serie del pic requiere 5 líneas, dos de las cuales se


destinan a soportar el reloj de la transmisión (RB6) y los bits de datos serie (RB7),
mientras que las otras tres soportan Vdd, tierra y la tensión de programación.
El pic pasa al modo de programación/verificación poniendo a nivel bajo las
líneas RB6 y RB7 y aplicando la tensión de programación Vpp (12V – 14V). A partir de
ese momento por RB6 se transmiten los impulsos de reloj y por RB7 los bits de datos.

Figura 4.1. Esquema de conexionado de un 16F84 para


su grabación del programa en serie

5. Instrucciones del pic:

Como ya se ha visto, los pic responden a la arquitectura RISC. Esta arquitectura


contiene pocas instrucciones (35 en nuestro caso) simples y rápidas (la mayoría se
ejecutan en un ciclo de instrucción); las instrucciones son ortogonales (las instrucciones
pueden usar cualquier operando) y tienen una longitud constante (14 bits).

En la tabla 5.1, podemos ver las 35 instrucciones diferentes que se pueden usar
en la programación del pic 16F84. En la columna de sintaxis aparecen las siguientes
letras:

- f: es el registro de la dirección (7 bits).

- d: si vale 1, el resultado de la instrucción se almacena en f. Si vale 0, va al


acumulador (W).

- b: indica el numero de un bit dentro de un registro.

- k: es un valor inmediato (8 bits).

- x: indica que es un valor indeterminado.

En las últimas dos columnas, se indica el formato de la instrucción (14 bits) y


los señalizadores que activa esta (Bits). Para localizar mejor las instrucciones, se ha
separado la tabla para distribuir las instrucciones según su función (si manejan bits,
registros, etc). La columna C indican la duración en ciclos de instrucción (en nuestro
caso un ciclo dura 1 microsegundo) que tarda en ejecutarse una instrucción.

INSTRUCCIONES QUE MANEJAN REGISTROS


SINTAXIS OPERACIÓN C FORMATO (14 bits) Bits
ADDWF f, d W+f 1 00 0111 dfff ffff C,DC,Z
ANDWF f, d W AND f 1 00 0101 dfff ffff Z
CLRF f Borra f 1 00 0001 1fff ffff Z
CLRW Borra W 1 00 0001 0xxx xxxx Z
COMF f, d Invierte f 1 00 1001 dfff ffff Z
DECF f, d Decrementa f 1 00 0011 dfff ffff Z
INCF f, d Incrementa f 1 00 1010 dfff ffff Z
IORWF f, d W OR f 1 00 0100 dfff ffff Z
MOVF f, d Mueve f 1 00 1000 dfff ffff Z
MOVWF f Mueve W y f 1 00 0000 1fff ffff
NOP No operación 1 00 0000 0xx0 0000
RLF f, d Rota f a la izquierda 1 00 1101 dfff ffff C
RRF f, d Rota f a la derecha 1 00 1100 dfff ffff C
SUBWF f, d F–W 1 00 0010 dfff ffff C,DC,Z
SWAPF f, d Intercambia bits 1 00 1110 dfff ffff
XORWF f, d W XOR f 1 00 0110 dfff ffff Z
INSTRUCCIONES QUE MANEJAN BITS
SINTAXIS OPERACIÓN C FORMATO (14 bits) Bits
BCF f, b Borra bit b de f 1 01 00bb bfff ffff
BSF f, b Pone a 1 bit b de f 1 01 01bb bfff ffff
INSTRUCCIONES DE BRINCO
SINTAXIS OPERACIÓN C FORMATO (14 bits) Bits
BTFSC f, d Explora bit d de f y salta si es 0 1,2 01 10bb bfff ffff
BTFSS f, d Explora bit d de f y salta si es 1 1,2 01 11bb bfff ffff
DECFSZ f, d Decrementa f y si es 0 salta 1,2 00 1011 dfff ffff
INCFSZ f, d Incrementa f y si es 1 salta 1,2 00 1111 dfff ffff
INSTRUCCIONES QUE MANEJAN OPERANDOS INMEDIATOS
SINTAXIS OPERACIÓN C FORMATO (14 bits) Bits
ADDLW k W+k 1 11 111x kkkk kkkk C,DC,Z
ANDLW k W AND k 1 11 1001 kkkk kkkk Z
IORLW k W OR k 1 11 1000 kkkk kkkk Z
MOVLW k Mueve a W el valor k 1 11 00xx kkkk kkkk
SUBLW k k–W 1 11 110x kkkk kkkk C,DC,Z
XORLW k W XOR k 1 11 1010 kkkk kkkk
INSTRUCCIONES DE CONTROL Y ESPECIALES
SINTAXIS OPERACIÓN C FORMATO (14 bits) Bits
CALL k Llamada a subrutina 2 10 0kkk kkkk kkkk TO,PD
CLRWDT Borra o refresca el perro guardián 1 00 0000 0110 0100
GOTO k Salto incondicional a k 2 10 1kkk kkkk kkkk
RETFIE Retorno de interrupción 2 00 0000 0000 1001
RETLW k Retorno de subrutina y W=k 2 11 01xx kkkk kkkk
RETURN Retorno de subrutina 2 00 0000 0000 1000
SLEEP Pasa al modo de reposo 1 00 0000 0110 0011 TO,PD

Tabla 5.1. Juego de instrucciones del PIC16F84

Por último vamos ha ver más detenidamente el funcionamiento de las


instrucciones representadas en la tabla anterior.

- ADDLW k: añade el contenido de W al literal k y almacena el resultado en


W. Esta instrucción activa los bits C, DC y Z del registro de estado. Se ejecuta en un
ciclo de instrucción (todas se ejecutan en el mismo tiempo a menos que se especifique
otro valor).

- ADDWF f, d: añade el contenido de W al de f, y almacena el resultado en W


si d=0, y en f si d=1. Activa los mismos señalizadores que la anterior.

- ANDLW k: efectúa un AND lógico entre el contenido de W y el literal


k, y almacena el resultado en W. Si el resultado es nulo, activa el bit Z.

- ANDWF f, d: efectúa un AND lógico entre el contenido de W y el de f y


coloca el resultado en W (d=0) o en f (d=1).

- BCF f,b: pone a cero el bit número b de f.

- BSF f,b: pone a uno el bit número b de f.

- BTFSC f, d: si el bit número b de f es nulo, la instrucción que sigue a ésta se


ignora y se trata como un nop. En este caso (solo en este caso), la instrucción precisa de
dos ciclos para ejecutarse.

- BTFSC f, d: si el bit número b de f es 1, la instrucción que sigue a ésta se


ignora y se trata como un nop. En este caso (solo en este caso), la instrucción precisa de
dos ciclos para ejecutarse.

- CALL k: salvaguarda la dirección de vuelta en la pila y después llama a la


subrutina situada en la dirección cargada en el PC. Los pasos que sigue para su
ejecución son: PC + 1  pila, k  PC (0 – 10), PCLATH (3,4)  PC (11,12)

- CLRF f: pone el contenido de f a cero y activa el bit Z.

- CLRW: pone el registro W a cero y activa el bit Z.

- CLRWDT: pone a cero el registro contador del temporizador watchdog


(WDT), así como el predivisor. Pone a 1 los bits TO y PD.

- COMF f, d: hace el complementario de f bit a bit. El resultado se almacena


de nuevo en f si d=1 y en W si d=0 (en este caso, f no varía). Si el resultado es nulo,
activa Z.
- DECF f, d: decrementa el contenido de f en una unidad. El resultado lo
almacena de nuevo en f (d=1) o en W (d=0), no variando f en este último caso. También
activa Z si el resultado es nulo.

- DECFSZ f, d: decrementa el contenido de f en una unidad. El resultado se


almacena según el valor de d. Si el resultado es nulo, se ignora la siguiente instrucción
y, en ese caso, esta instrucción dura dos ciclos.

- GOTO k: llama a la subrutina situada en la dirección cargada en el PC. La


ejecución de la instrucción sería: k  PC (0-10), PCLATH (3,4)  PC (11,12)

- INCF f, d: incrementa el contenido de f en una unidad. El resultado se


almacena de nuevo en f o W (en este caso f no varía). Activa Z si el resultado es nulo.

- INCFSZ f, d: incrementa el contenido de f en una unidad. El resultado se


almacena en f (d=1) o W (d=0 y f no varía). Si el resultado es nulo, se ignora la
siguiente instrucción y, en este caso, esta instrucción dura dos ciclos.

- IORLW k: efectúa un OR lógico inclusivo entre el contenido de W y el


literal k, y almacena el resultado en W. Si la operación da cero, se activa el bit Z.

- IORWF f, d: efectúa un OR lógico inclusivo entre el contenido de W y el


contenido de f, y almacena el resultado en W (d=0) o en f. Si la operación da cero, se
activa el bit Z.

- MOVF f, d: desplaza el contenido de f a f si d=1 ó a W si d=0. El


desplazamiento de f a f permite comprobar el contenido de f con respecto a cero, ya que
esta instrucción actúa sobre el bit Z.

- MOVLW k: carga W con el literal k.

- MOVWF f: carga f con el contenido de W.

- NOP: sólo consume tiempo de máquina, un ciclo en este caso.

- RETFIE: carga el PC con el valor que se encuentra en la parte superior de la


pila, asegurando así la vuelta de la interrupción. Pone a 1 el bit GIE con el fin de
autorizar de nuevo que se tengan en cuenta las interrupciones.

- RETLW k: carga W con el literal k, y después carga el PC con el valor que


se encuentra en la parte superior de la pila, efectuando así un retorno de subrutina.

- RETURN: carga el PC con el valor que se encuentra en la parte superior de la


pila, efectuando así una vuelta de subrutina. Es como la anterior pero simplificada.

- RLF f, d: rotación de un bit a la izquierda del contenido de f, pasando por el


bit de acarreo C (ver figura 5.1). Si d=1 el resultado se almacena en f, si es 0 se
almacena en W.
Figura 5.1. Desplazamiento a la izquierda

- RRF f, d: rotación de un bit a la derecha del contenido de f, pasando por el


bit de acarreo C (es como en la figura 5.1 pero con las flechas hacia la derecha). Si d=1
el resultado se almacena en f, si es 0 se almacena en W.

- SUBLW k: sustrae el contenido de W del literal k (k – W) y almacena el


resultado en W. La sustracción se realiza en complemento a dos.

- SUBWF f, d: sustrae el contenido de W del contenido de f (f – W) y


almacena el resultado en W o f (según valor de d). La sustracción se realiza en
complemento a 2. Tanto esta como la anterior activan los bits C, DC, y Z según el caso.

- SWAPF f, d: intercambia los cuatro bits de mayor peso con los cuatro de
menor peso de f y almacena el resultado en f o W (según d).

- XORLW k: efectúa un OR lógico exclusivo entre el contenido de W y el


literal k, y almacena el resultado en W.

- XORLW f, d: efectúa un OR lógico exclusivo entre el contenido de W y el


contenido de f, y almacena el resultado en f o W (según d). Tanto esta como la anterior
activa el bit Z si se da el caso.

- SLEEP: pone el circuito en modo SLEEP y para el oscilador. El procesador


queda congelado, no ejecutando instrucciones y manteniendo el mismo valor en la
puertas de E/S. Pone a cero el WDT (aunque sigue funcionando), el predivisor y PD;
también pone a 1 el bit TO. Para que el micro salga del modo SLEEP, se tiene que dar
una de estas situaciones: que la patilla MCLR se active externamente (reset), que se
desborde el WDT(en caso de que estuviera activado al entrar en el modo reposo) y que
se de una interrupción (como TMR0 está desactivado, solo podrá producirse una de los
otros tipos).

You might also like