You are on page 1of 19

Microcontrolador PIC16F84

Set de instrucciones
Para entender mejor cada instruccin se explica a continuacin el significado
de algunos parmetros:
f: Registro al que afecta la instruccin
W: Acumulador (Working register)
b: Nmero de bit (hay instrucciones que afectan a un solo bit)
k: constante (un nmero)
d: seleccin de destino del resultado de la instruccin, puede ser "0" o "1", si es
"0" el resultado se guarda en el acumulador (W) y si es "1" se guyarda en el
registro f al que afecta la instruccin.
Instrucciones orientadas a registros:
ADDWF f,d Suma W y el registro f, el resultado lo guarda segn d (si d=0 se
guarda en W y si d=1 se guarda en f).
ANDWF f,d Realiza la operacin AND lgica entre W y f, el resultado lo guarda
segn d.
CLRF f Borra el registro f (pone todos sus bits a cero).
CLRW - Borra el acumulador.
COMF f,d Calcula el complementario del registro f (los bits que estan a "0" los
pone a "1" y viceversa. Resultado segn d.
DECF f,d Decrementa f en uno (le resta uno). Resultado segn d.
DECFSZ f,d Decrementa f y se salta la siguiente instruccin si el resultado es
cero. Resultado segn d.
INCF f,d Incrementa f en uno (le suma uno). Resultado segn d.
INCFSZ f,d Incrementa f y se salta la siguiente instruccin si el resultado es
cero (cuando se desborda un registro vuelve al valor 00h). Resultado segn d.
IORWF f,d Realiza la operacin lgica OR entre W y f. Resultado segn d.
MOVF f,d Mueve el contenido del registro f a W si d=0 (si d=1 lo vuelve a poner
en el mismo registro)

MOVWF f mueve el valor de W a f. Por ejemplo, si queremos copiar el valor del


registro "REG1" al registro "REG2" (ya veremos como ponerles nombres a los
registros) escribiremos:
MOVF REG1,0 ;mueve el valor de REG1 a W
MOVWF REG2 ;mueve el valor de W a REG2
Lo que va despus del ; son comentarios
NOP - No hace nada, solo pierde el tiempo durante un ciclo.
RLF f,d Rota el registro f hacia la izquierda a travs del bit CARRY (todos los
bits se mueven un lugar hacia la izquierda, el bit 7 de f pasa al CARRY y el bit
CARRY pasa al bit 0 de f). Resultado segn d.
RRF f,d Lo mismo que RLF pero hacia la derecha.
SUBWF f,d Resta f y W (f - W). Resultado segn d.
SWAPF f,d intercambia los 4 primeros bit de f por los otros cuatro. Resultado
segn d.
XORWF f,d Realiza la operacin lgica XOR (OR exclusiva) entre W y f.
Resultado segn d.
Instrucciones orientadas a bits:
BCF f,b Pone a "0" el bit b del registro f
BSF f,d Pone a "1" el bit b del registro f
BTFSC f,b Se salta la siguiente instruccin si el bit b del registro f es "0"
BTFSS f,b Se salta la siguiente instruccin si el bit b del registro f es "1"
Instrucciones orientadas a constantes y de control:
ADDLW k Le suma el valor k al acumulador (W).
ANDLW k Operacin lgica AND entre W y el valor k (resultado en W).
CALL k Llamada a subrutina cuyo inicio esta en la direccin k
CLRWDT - Borra el registro Watchdog
GOTO k Salta a la direccin k de programa.

IORLW k Operacin lgica OR entre W y el valor k (resultado en W)


MOVLW k carga el acumulador con el valor k. Por ejemplo, si queremos cargar
el valor 2Ah en el registro "REG1" escribiremos:
MOVLW 2AH ;carga el acumulador con el valor 2Ah
MOVWF REG1 ;mueve el valor de W a "REG1"

RETFIE - Instruccin para volver de la interrupcin


RETLW k carga el valor k en W y vuelve de la interrupcin
RETURN - vuelve de una subrutina.
SLEEP - El pic pasa a modo de Standby

Instrucciones para el ensamblador


Podemos usar para escribir los programas el bloc de notas de
Windows, una vez escrito se guarda con extensin .asm para
ensamblarlo con el MPASM.
Existen una serie de instrucciones que son para el ensamblador y nos
hacen la tarea de programacin mas sencilla y mas legible.
EQU: Un ejemplo de esto son las etiquetas, podemos poner un
nombre a un registro de memoria, esto se hace mediante la
instruccin EQU. Por ejemplo:
VARIABLE1 EQU 0CH
A partir de ahora en lugar de escribir 0CH podemos escribir
VARIABLE1. Con EQU tambin podemos poner nombre a constantes
de la misma forma.
#DEFINE: Otra instruccin para el ensamblador que usaremos ser la
instruccin #DEFINE. Es parecido a EQU, solo que aqu no ponemos
etiquetas a un registro, podemos ponerla a una instruccin entera, Por
ejemplo:

#DEFINE BANCO1 BSF STATUS,5


#DEFINE BANCO0 BCF STATUS,5
A partir de ahora, cuando escribamos BANCO1 se pondr a "1" el bit
de seleccin de banco y pasaremos al banco 1, al escribir BANCO0
pasaremos al banco 0
ORG: Indica al ensamblador la direccin (de memoria de programa)
donde se guardar la instruccin que vaya a continuacin. Por
ejemplo:
ORG 00H
CLRF VARIABLE1
La instruccin CLRF est en la direccin de memoria de programa
00H (ser la primera instruccin en ser ejecutada por el pic)
END: Se escribe al final del programa para indicar que ya ha acabado.
(es obligatorio, si no da error).
Etiquetas a direcciones de Programa: muy tiles para usar con
instrucciones CALL (Llamada a subrutina) o GOTO (Salto). Por
ejemplo:
.........
[Hay programa anterior]
.........
BTFSC VARIABLE1,0 ;Si el bit 0 de VARIABLE1 es "0" se salta la
siguiente instruccin
GOTO ESUNO ;Salta a ESUNO solo si el bit 0 de VARIABLE1 es "1"
BSF VARIABLE1,0 Si el bit 0 de VARIABLE1 es 0 se ejecuta esta
instruccin y el programa sigue por aqu
............
[Contina el programa]
............
ESUNO ;Etiqueta a una direccin de programa
BCF VARIABLE1,0 ;Si el bit 0 de VARIABLE1 es "1" se ejecuta esta
otra instruccin y el programa sigue por aqu
......

[Cuntina el programa]
......
Un poco de orden:
Es importante llevar un poco de orden a la hora de escribir el
programa, nos ayudar mucho:
Al principio van los EQU y los #DEFINE, despus comenzamos con el
programa.
El programa se escribe en cuatro columnas separadas por
tabuladores:
En la primera columna se ponen las etiquetas a direcciones de
programa
En la segunda columna se ponen las instrucciones (BSF, CLRF,
BTFSC... etc.)
En la tercera columna se ponen Los registros o parmetros a los que
afecta la instruccin.
En la cuarta columna se ponen los comentarios que creas pertinentes
(cuantos mas mejor) seguidos de un punto y coma.

Si buscamos en la carpeta donde instalamos el MPLAB (p.e. C:\Archivos de


programa\MPLAB) la ayuda llamada DEVICE.HLP, podemos encontrar un
listado completo de las instrucciones especiales que usa el MPLAB y que nos
permitirn mejorar nuestros listados, esta es una muestra. Adems, en las
hojas de datos de Microchip, vienen todas las instrucciones de estos chips,
quizs el lector piense, porqu me he tomado tantas molestias en plasmar aqu
tanta informacin que ya existe, la razn es que, no est en castellano
(espaol) o la que hay es muy tcnica y no est al alcance de mucha gente,
por otra parte, no creo que est dems que alguien la exponga desde otro
punto de vista.

NOTA.
1- La palabra Literal significa "NMERO" como el nmero 9 o 16h. El
nmero 16h es un nmero exadecimal y en valores decimales esto representa
el nmero: "veintids".
2- Destino de la instruccin segn el designador OP: Si el bit de cdigo OP de
la instruccin es 0, el destino es W y si es 1, el destino es el registro f, o sea,
se selecciona el destino donde se guarda el resultado de una operacin.
Nota2. Cuando una instruccin termina con W o F, el destino del
resultado ser el registro W o el propio archivo f, se define con el
designador '0' o '1' de la propia instruccin.
0=W
1=F
Por ej.: ADDWF 1F,0 el resultado es almacenado en el registro de
trabajo W.
ADDWF 1F,1 el resultado es almacenado en el mismo registro (F).
Seguidamente se hace una descripcin detallada de las instrucciones que,
son generales para todos los PIC's, adems de las particularidades de cada

instruccin, por orden alfabtico que, presentan para cada micro tanto para el
PIC16F84A como para el PIC12C508A.

NOTA. Se usaran algunos trminos extraos para acomodar (agilizar)


algunas expresiones anglosajonas.
Ej.: AND'ed para expresar la aplicacin de la operacin de producto
lgico (AND) entre dos trminos o
XOR'ed que se aplica a la operacin lgica OR exclusiva (XOR)
entre dos trminos.

El lector, deber diferenciar entre registro/[archivo] y contenido del


registro/[archivo].

ADDLW Esto significa: Agregar (sumar) el Literal al registro W


(acumulador o registro de trabajo) resultado en W.
ADDLW 00 al FF Un nmero fijo (llamado literal) es sumado al registro
W (registro de trabajo). El literal (nmero) puede estar comprendido entre el
00 y FF. En el registro STATUS se ven afectadas tres banderas (o flags) por
la orden ADDLW (Z, DC y C), ver debajo.
C Se pone a 1 si se produce un acarreo desde el bit de mayor
peso (desbordamiento).
DC Se pone a 1 si se genera un acarreo del bit 3 al bit 4.
Z Se pone a 1 si el resultado de la operacin es cero.
Esta instruccin no est disponible para el '508A. Si quiere usar esta
instruccin en el '508A o un programa en l la requiere/contiene, emplee las
3 instrucciones siguientes:
Por ejemplo en el F84:
ADDLW 80

; mueve 80h a W

Sustityala en el '508A por:


MOVWF 13h
MOVLW 80h
ADDWF 13h

; Mueve W a cualquier archivo


;poner 80h en W
;sumar el archivo 13h a W

ADDWF Esto significa: Suma aritmtica de W y un archivo (f).


ADDWF 00 a 1F,0 El resultado es almacenado en el registro de trabajo
W, debido al valor 0 en la instruccin.
ADDWF 00 a 1F,1 El resultado es almacenado en el mismo archivo,
debido al valor 1 del designador en la instruccin.
ADDWF (sumar) el contenido del registro W con el contenido de un
archivo. El resultado puede ser guardado en el registro W (designador = 0)
o emplazado en el archivo llamado (designador = 1). Con la orden ADDWF,

en el registro STATUS se ven afectados los bits: C (Carry), Z (Cero) y


el DC (Dgito Carry).
Si el resultado de una instruccin ADD rebasa FF, la bandera C (Carry) es
puesta a 1, si tiene cualquier otro valor es 0.
Si el resultado de una instruccin ADD es cero 0000 0000, la
bandera Z (Cero) se pone a 1 y 0 si tiene cualquier otro valor.
La suma se realiza en aritmtica binaria pura y sin signo. Si hay
un (desborde) acarreo del bit 7, es decir que el resultado es mayor de 255,
el bit C (bandera Carry) resulta 1, en caso contrario resulta 0. El PIC
supervisa si hay acarreo del bit 3, es decir que, la suma de los dos (nibbles)
mitades menos significativas (bits 0 a 3) resulta mayor de 15, el bit DC (digit
carry) se pone a 1, en caso contrario se pone a 0.
Por ejemplo: Si agregamos 21h a 3Ch, el resultado es 5Dh, esto no
afecta la bandera Carry, por lo que la bandera DC (dgito carry) ser puesta
a 1, pero si a 2Dh le agregamos 3Eh, el resultado es 6Bh, lo que desborda
el contador (6B>FF) por lo que la bandera C (Carry) ser puesta a 1.
Ejemplos :

banderas
1010 0010
+ 0100 1111 C DC Z
1111 0001 0 1
0

banderas
1101 0000
+ 0110 1111 C DC Z
0011 1111 1

ANDLW Esto significa: producto lgico AND del Literal con el


registro W. Ver tambin ANDWF.
ANDLW 00 a FF El objetivo de la operacin es, descubrir cuantos bits
de L y W, en binarios estn a 1. Si ambos bits son cero, el resultado es
cero y la instruccin usada en este caso es XOR. Esta instruccin hace
un AND lgico entre un nmero fijo (literal) y el contenido del registro W, el
resultado es colocado en el registro W. Con la ordenANDLW, en el
registro STATUS se ven afectados los bits: C (Carry), Z (Cero) y
el DC (Dgito Carry). El literal puede ir de 00 a FF.
La operacin AND puede decirse que se usa para enmascarar (separar o
quitar) los bits que nos interesen. Por ejemplo:
0Fh enmascarar (quita) los cuatro bits altos (nibble alto) y
F0h quitar los cuatro bits bajos (nibble bajo). Veamos como se usa:
Utilizacin del 0Fh: ANDLW 0x0F
Primer nmero:
1001 0011 [Nmero en W anterior a la
instruccin ANDLW]
Segundo nmero (0F): 0000 1111 [Nmero L Mscara]
Respuesta al AND:
0000 0011 [Al aplicar la funcin AND entre
ambos] (ANDed)
Utilizacin del F0h: ANDLW 0xF0

Primer nmero:
1001 0011 [Nmero en W anterior a la
instruccin ANDLW]
Segundo nmero (F0): 1111 0000 [Nmero L Mscara]
Respuesta al AND:
1001 0000 [Al aplicar la funcin AND entre
ambos] (ANDed)

ANDWF Esto significa: Operacin AND producto lgico de W con el


archivo f [ AND'ed entre W y f]. Ver tambin ANDLW.
ANDWF 00 a 1F, 0 El resultado se almacena en el registro W, por el
valor 0 en la instruccin.
ANDWF 00 a 1F, 1 El resultado se almacena en el archivo f, por el
valor en la instruccin.
Al registro W se le aplica el producto AND con un archivo f. Como dos
archivos juntos no se pueden operar (AND), un archivo debe ponerse en W
y se hace AND con el segundo archivo. Vase arriba para hacer
operaciones de enmascarar con la operacin AND. Con la
instruccin ANDWF, slo se afecta la bandera Z (cero). Si la respuesta es
cero, la bandera Z en el registro STATUS se pone a 1, si la respuesta es
distinta de cero, la bandera se pone a 0.

BCF Esto significa: Bit Clear File (pon a "0" o aclara el bit indicado (detrs
de la coma) en el archivo f ). Ver tambin BSF.
BCF 00 a 1F, bit Hay sobre 300 instrucciones (incluidas en los micros,
trabajando internamente) para esta orden. Hay 79 archivos en el
PIC16F84A, los 13 primeros archivos se llaman Registros de Funcin
Especial (SFR's), el resto (66) se llaman Archivos de Propsito General
(GPR's) del 0Ch a 4Fh. No afecta los bits de STATUS.
BCF se usa para limpiar [clear] un bit (pone a 0 el bit identificado en el
archivo f). Por ej.: BCF 06h,5 significa que el bit 5 del archivo 06 debe ser
puesto a "0" (aclarado), el resto de bits no se influyen. Ver figura de la
derecha. El archivo 6 contiene lneas de E/S comnmente se llaman I/O del
puerto.

BSF Esto significa: Bit Set File (poner a 1 el bit indicado, en el


archivo f). Ver tambin BCF.
BSF 00 a 1F, bit Hay casi 300 instrucciones para esta orden. Hay 79
archivos en el PIC16F84A, de las que los primeros 13 son los SFR's y los
siguientes 66 son los conocidos GPR's. Estos GPR's ocupan del 0Ch al 4Fh y
cada uno tiene 8 bits. BSF significa poner a 1 lgico el bit especifico en el
archivo f. No afecta los bits de STATUS.
Por ejemplo: BSF 06h,5 indica que el bit 5 del archivo 6 ser puesto a 1,
este archivo 6 contiene 8 lneas E/S, comnmente se llaman lneas I/O del

puerto. El resultado es la inversa a la instruccin anterior, el 0 se sustituye por


un 1.

BTFSC Esto significa: Bit Test, Skip if Clear ( Bit de Test, Salta si es "0").
BTFSC 00 a 1F, bit Hay casi 300 instrucciones para esta orden, para
cubrir los 79 archivos, cada uno con 8 bits. BTFSC significa, comprobar el
bit identificado en el registro llamado y si es 0 saltar una instruccin (no
ejecuta la instruccin que sigue). No afecta los bits de STATUS.
Se ve mejor con un ejemplo: BTFSC 06h,4 es la forma de comprobar si el
bit 4 en el archivo 6 es "0", si es cero, salta la prxima instruccin (pasar sin
ejecutar) y continuar con la posterior.
Etiqueta: BTFSC 06h,4
; comprueba si el bit 4 es 0
GOTO Etiqueta2 ; si no es 0, salta hasta Etiqueta2
CALL Dlay
; si es 0, llama a subrutina Dlay.

BTFSS Esto significa: Bit Test, Skip if Set (Bit de Test, Salta si es "1").
BTFSS 00 a 1F, bit Tambin hay casi 300 instrucciones para esta orden,
para cubrir los 79 (4Fh) archivos, cada uno con 8 bits. BTFSS significa,
comprobar el bit identificado en el registro llamado y salta la prxima
instruccin si es 1. No afecta los bits de STATUS.
En BTFSS 3,2 comprobamos el bit 2 del registro 3 y si dicho bit es 1, salta
la prxima instruccin, si no, continua con la siguiente.
Etiqueta: BTFSS 03h,2
GOTO Etiqueta2
CALL Dlay
a esta instruccin y sigue.

; comprueba si el bit 2 es 1
; si no, va a Etiqueta2
; si es 1, llama a subrutina Dlay para seguir. ; si es 1 viene

CALL Esto significa: Llamada incondicional a subrutina.


En un programa, esto se escribe como: CALL Salida o CALL Tono1, etc.
donde Salida o Tono1 son etiquetas. Un RETURN debera encontrarse al final
de la subrutina CALL para que el micro vuelva a la siguiente instruccin
despus de la instruccin CALL que la llam, de lo contrario se producir un
desborde de pila, con el consiguiente bloqueo del programa. No afecta los
bits de STATUS.

CALL Etiqueta Los programas deberan ser escritos de forma que las
pocas primeras instrucciones pongan al micro en
el Inicio de Programa Principal. El "Programa Principal" se localizar
fsicamente al final del listado y ste puede estar en el final de la memoria o a
mitad del camino, si el programa es aproximadamente 250 bytes de largo.
Despus de las primeras instrucciones que llevan al micro a: GOTO Inicio,
se colocan todas las subrutinas necesarias para el programa. Con una

orden CALL se llamar a las subrutinas y al final de cada subrutina debe


tener una instruccin RETURN. Una llamada remota puede hacer de
subrutina pero esta segunda subrutina no puede llamar otra subrutina.
Cada vez que se ejecuta una instruccin CALL, un valor de direccin es
colocado (empujado) en la Pila (Stack), entonces el micro sabe donde volver
despus de ejecutada la subrutina, la Pila slo puede tener 8 niveles de alto,
entonces es necesario llevar cuidado para no quedarse sin Pila (Stack). Ver
tambin GOTO, RETURN y RETLW.
Ejemplo:
Loop2: BTFSS 05,2 ;esta apretado el pulsador?
GOTO Loop2 ;No. Salta a Loop2
MOVLW 01
;S.
XORWF 06,1 ; encender el LED
CALL Delay
;Llamada a rutina de Retardo
GOTO Loop1 ; para ver LED encendido.
Delay: DECFSZ 1Bh,1
; Subrutina anidada de Retardo
GOTO Delay ; retardo exterior
DECFSZ 1Ch,1
; retardo interior
GOTO Delay
RETURN

CLRF Esto significa: Clear f [Limpia f] (poner a 0 los 8 bits del archivo f)
CLRF 00 a 1F El contenido de un archivo se pone a 0 (Clear) y el
bit Z del registro STATUS es puesto a 1, esto es, los ocho bits se ponen a
"0". Por esto hay que tener en cuenta el bit Z (cero, flag Z). Los 12 primeros
archivos son SRF's y los siguientes 68, del 07h al 4Fh son los
llamados GPR's.

CLRW Esto significa: Clear W (limpiar el registro de trabajo - llamado


acumulador en otros micros)
CLRW El registro W (de trabajo) es aclarado, todos los bits son puestos a
0. Cuando el W es puesto a 0, la bandera cero (flag Z) es puesta a 1, en otras
palabras la bandera Zdel registro STATUS es puesta a 1.
CLRWDT Esto significa: aClarado (puesta a 0) del Temporizador Perro
Guardin (El bit WDT = 0).
CLRWDT La instruccin repone (resetea) el Temporizador Perro
Guardin, esto tambin repone el preescaler del WDT y consume 2 ciclos
maquina. Ejemplo:
Operacin:
00h
0
1
1

WDT
WDT prescaler,
TO
PD

Afecta Status: TO, PD

COMF Esto significa: Complemento del archivo f.


COMF 00 a 1F,0 El resultado estar en W por el valor 0 detrs de la
coma.

COMF 00 a 1F,1 El resultado estar en f. El contenido f es


complementado (los 0's se cambian a 1's y los 1's a 0's).
DECF Esto significa: Decremento del archivo f .
DECF 00 a 1F,0 El resultado estar en W. El contenido del archivo f es
decrementado y puesto "W".
DECF 00 a 1F,1 Aqu, el resultado estar en f. El contenido del archivo "f"
es decrementado, significa que es deducido (tomado) 1 del archivo. Si el
archivo es 0000 0000 esto da la vuelta a 1111 1111 (255) afectando a la
bandera Z. Cuando el archivo es 0000 0001 y se ejecuta una instruccin
DECF, el archivo pasa a 0000 0000 y la bandera Z(cero) del STATUS se pone
a 1, en otro caso es 0.

DECFSZ Esto significa: DECrement f, Skip if Zero (Decrementa el


archivo f y salta si es 0).
DECFSZ 00 a 1F,0 El resultado estar en W.
DECFSZ 00 a 1F, 1 El resultado estar en f. La instruccin DECFSZ tiene
muchos empleos.
Un empleo importante est en una subrutina de retardo. En esta rutina la
instruccin DECFSZ crea un lazo en el que el micro es enviado a una
instruccin por encima-del-programa y se ejecutar un juego de instrucciones
una y otra vez, esta es una tctica de perdida de tiempo para crear un
retardo. No afecta al registro STATUS.
Cada vez que el micro llega a DECFSZ, el contenido del archivo es
decrementado y si el archivo no es cero, se ejecutar la siguiente instruccin
en el programa. La siguiente instruccin es normalmente GOTO y sta enva
de nuevo al micro por encima-del-programa. Por ej.:
ret: DECFSZ 0Ch,0
; Decrementa 0C y si es 0, salta una lnea
GOTO ret
; no es 0, ejecuta esta lnea
...
; si es 0, viene hasta aqu.
...
;sigue programa

GOTO Esto significa: Bifurcacin Incondicional.


GOTO k GOTO es la bifurcacin incondicional en la que el micro es
enviado a la direccin especificada. Esta instruccin carga simplemente la
constante k en el registro PC (contador de programa). Esta es la tpica
instruccin de salto incondicional a cualquier posicin de la memoria de
programa. 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. No afecta
al registro STATUS.
Tambin se usa $-n o $+n donde n es el nmero de lneas que ha de, volver
atrs o avanzar en el programa. Por ej.
ret DECFSZ 0Ch,0 ; decrementa 0Ch, si es 0 salta 1 instruccin
GOTO $-1
; No, vuelve 1 lnea atrs. No requiere etiqueta.
...
; Si, sigue programa

INCF Esto significa: Incrementar el archivo f.


INCF 00 a 1F,0 El resultado del incremento estar en W.
INCF 00 a 1F,1 El resultado estar en f. El contenido del archivo 'f' es
incrementado, esto simplemente significa que se agrega 1 al archivo, si el
archivo es 1111 1111 (255) esto da la vuelta a 0000 0000. Cuando el archivo
es FFh y se ejecuta la instruccin INCF, el archivo pasa a 0000 0000 y la
bandera Z (cero) es puesta a 1 en otro caso es 0.

INCFSZ Esto significa: INCrement f and Skip if 0 (Incrementar el archivo f


y salta si es 0).
INCFSZ 00 a 1F,0 El resultado estar en W.
INCFSZ 00 a 1F,1 El resultado estar en f. Normalmente la funcin de
decremento DECFSZ se usa para crear un retardo, pero tambin se puede
usar un INCFSZ. No afecta al registro STATUS.
Esto trabaja as: Si el contenido de un archivo es incrementado y el
resultado no es 0, entonces la siguiente instruccin es ejecutada con un
GOTO una direccin anterior y ejecutar otro INCFSZ. Eventualmente el
archivo ser 1111 1111 y el prximo incremento lo devolver a 0000 0000, el
resultado ser cero y la instruccin GOTO ser ignorada, ejecutndose la
siguiente instruccin.

IORLW Esto significa: Inclusive OR Literal con W.


IORLW 00 a FF El contenido del archivo W es sumado (lgico) [OR'ed]
con un nmero. El resultado es colocado en registro de trabajo W, el nmero
literal puede ser desde 00 a FF. Afecta al bit Z del registro STATUS.
Esto es simplemente una operacin OR (suma lgica) y el objeto de su
realizacin es cambiar dos o ms bits a "1", si un bit es ORed con 0, la
respuesta no se altera, si el bit es ORed con 1, el resultado es 1.
Ejemplo: Si el registro W
se carga con 1111 0000 (es una mscara de 4 bits altos F0h) y
un nmero como 0100 1110 (4Eh) es ORed con W,
el resultado es 1111 1110 (FEh).

IORWF Esto significa: Inclusive OR con el archivo f


IORWF 00 a 1F,0 El resultado estar en W.
IORWF 00 a 1F,1 El resultado estar en f. El contenido del registro W es
ORed con el archivo f, esto simplemente es una operacin "OR" y el objeto de
su realizacin es cambiar dos o ms bits a "1". Si un bit es ORed con 0, la
respuesta no se altera, si el bit es ORed con un 1 el resultado es 1. Afecta al
bit Z del registro STATUS.
Ejemplo: Si el registro W es cargado con 1111 0000 (F0h es una mscara de 4 bits altos)
y un
archivo con un nmero como 0100 1110 (4Rh) es ORed
con W, el resultado es 1111 1110 (FEh).

MOVF Esto significa: Mueve el contenido del archivo 00 a 1F dentro y


fuera del archivo o al W.
MOVF 00 a 1F,0 El contenido del archivo es movido al W. El resultado
estar en W.
MOVF 00 a 1F,1 El resultado estar en f. Para esta instruccin MOVF
00 a 1F,1 el contenido es movido fuera del archivo y devuelto a l otra vez,
pero no entra en W. Esto es una prueba til ya que la bandera Z (cero) del
STATUS se ve afectada. Si el contenido es cero, la bandera Z es puesta a
1, si el contenido es 1, la bandera Z es 0.
MOVFW Esta forma de instruccin, no es vlida (no se recomienda su
uso), a pesar de que el propio MPLAB la admita, significa mover el contenido
del archivo F, al registro de trabajo W. Cando se encuentre esta forma de
expresin, debe modificarse por:
MOVF f,W donde f es un registro entre 00 y FF. Tambin puede
usarse MOVF f,0 que viene a ser lo mismo.
MOVLW Esto significa: Mueve Literal a W.
MOVLW 00 a FF Un nmero f (Literal) es cargado en el registro W. El
Literal puede ser 00 a FF. No afecta al registro STATUS.

MOVWF Esto significa: Copia W al archivo llamado f.


MOVWF 00 a 1F Esta instruccin copia datos del registro W al
archivo f. No afecta al registro STATUS.

NOP Esto significa: Ninguna operacin. Es decir, el micro no realiza


ninguna operacin, slo consume el tiempo de 1 instruccin.

OPTION Esto significa: Carga registro OPTION. El contenido del


registro W es cargado en el registro OPTION.

RETFIE Esto significa: Cuando hay una interrupcin, RETURN con valor
de lo alto de la Pila y lo deja en el PC.
RETFIE Carga el PC con el valor que se encuentra en la parte superior
de la pila, asegurando as la vuelta de la interrupcin. Pone a 1 el bit GIE,
con el fin de autorizar o habilitar de nuevo que se tengan en cuenta las
interrupciones. TOS PC, 1 GIE. No afecta al registro STATUS.

RETLW Esto significa: RETURN con Literal en W.


RETLW 00 a FF El registro W es cargado con el valor del literal,
normalmente devuelve un dato procedente de una tabla. El Contador de
Programa (PC) es cargado de la cima de la pila (Stack), que corresponde
a la direccin de RETURN de programa. No afecta al registro STATUS.

RETURN Esto significa: Retorno de Subrutina. Esta instruccin est al


final de una rutina o subrutina. No afecta al registro STATUS.

RLF Esto significa: Rotar el archivo f a Izquierda con aCarreo (Carry).


RLF 00 a 1F,0 El resultado se almacena en W.
RLF 00 a 1F,1 Resultado se almacena en f. El contenido de un archivo, es
rotado un bit a la izquierda por la bandera Carry (acarreo), esto requiere de 9
desplazamientos para recuperar el valor original del archivo. Afecta al
bit C del STATUS.
El uso de: RLF.....Reg, Destino........; rota los bits de un registro un lugar la
izquierda.
Si Reg = b'00010110'
Despus de la instruccin: Reg = b'0010110C' donde C es el valor del bit
STATUS,C en el momento de ejecutarse la instruccin RLF.
Veamos en mas detalle, cmo trabaja la funcin RLF:
Un grupo de 8 bits es registro, o sea: Registro = B7 B6 B5 B4 B3 B2 B1
B0
Al aplicar la instruccin RLF.....Reg,F ocurre que: (STATUS,C <== B7)
<== B6 B5 B4 B3 B2 B1 B0 (C <== STATUS,C)
Esto significa que, todos los bits de Reg son rotados (desplazados) una
posicin hacia la izquierda. El espacio generado a la derecha de Reg es decir,
el bit0 (B0) del registro, es ocupado por el valor que tena en ese momento el
bit C del registro STATUS. A su vez, el Bit7 (B7) de Reg sale del Registro y se
rellena con el bit C del registro STATUS.
Repasemos otra vez. Reg = b'00001100' (Ch = .12) y STATUS,C = 0

Aplicamos; RLF Reg,F Entonces: Reg = b'00011000' (18h = .24) y


STATUS,C = 0
Podemos comprobar que antes de aplicar la RLF, Reg vala 12 en sistema
decimal. Despus de la instruccin RLF Reg vale 24. Hemos multiplicado a
Reg por dos, utilizando la instruccin RLF. Ahora, consideremos el siguiente
caso:
Reg = b'00001100' (Ch) y STATUS,C = 1
Aplicamos; RLF Reg,F Entonces: Reg = b'00011001' (19h = .25) y
STATUS,C = 0
En este caso, antes de la aplicacin de RLF Reg vala 12 en decimal y
despus de aplicar la instruccin Reg vale 25 en decimal, por qu ocurre este
error si hemos aplicado la misma instruccin al mismo registro Reg. Debemos
considerar el motivo.
El motivo radica en que el bit C del registro STATUS, antes de ejecutar la
instruccin RLF, vala 1, en el segundo caso y ocup el bit0 del
Reg al ejecutar la instruccin RLF. Por tanto, en este segundo caso, al hacer
RLF Reg,F equivale a hacer Reg * 2 + 1.
Precauciones a tener en cuenta para evitar incurrir en este error. Para
asegurarnos en una multiplicacin por dos, siempre limpiaremos el bit C del
STATUS antes de aplicar la instruccin RLF, asegurndonos as que el bit
STATUS,C no "corrompa" la operacin.
Ej.: BCF STATUS,C
;Limpiar STATUS,C para asegurar que no
"ensucia" la multiplicacin
RLF Registro,F
;y ahora, si. Rotar el Registro a la izquierda.
Se puede rotar ms veces a la izquierda, lo que en buena lgica es lo
mismo que hacer Reg * 2 * 2, etc.

RRF Esto significa: Rotar el archivo a la Derecha por Carry (aCarreo).


RRF 00 a 1F,0 En este caso el resultado se almacena en W.
RRF 00 a 1F,1 Y en este el resultado se almacena en f. El contenido de un
archivo es rotado un bit a la derecha por la bandera Carry (acarreo), esta
instruccin corrompe el registro al introducir el valor de C en el bit7, por tanto,
debemos usar una instruccin de aclarado del bit C antes de usar RRF, otro
modo de lograr esto, requiere de 9 desplazamientos para recuperar el valor
original del archivo.
La instruccin: RRF Reg,Destino
hacia la derecha.

; rota los bits de un registro un lugar

Veamos: Reg = b'00011000' (18h = .24)


Aplicamos: RRF Reg,F
y Reg = b'C0001100'

Donde C es el valor que tena el bit C de STATUS en el momento de


ejecutar la instruccin RRF. Veamos en detalle cmo trabaja la funcin RRF:
Sabemos que un grupo de 8 bits es registro, o sea: Registro = B7 B6 B5
B4 B3 B2 B1 B0
Al aplicar la instruccin: RRF.....Reg,F ocurre que: (STATUS,C ==> C)
B7 B6 B5 B4 B3 B2 B1 ==> (B0 ==> STATUS,C)
Esto significa que todos los bits de Reg son desplazados una posicin hacia
la derecha. El espacio generado a la izquierda de Reg, es decir, el bit7 (B7)
de registro, serocupado por el valor que tena en ese momento el bit C del
registro STATUS. A su vez, el Bit0 (B0) de Reg sale de Reg y rellena el bit C
del registro STATUS.
Supongamos que: Reg = b'00011000' (18h = .24) y STATUS,C = 0
Al aplicar: RRF Reg,F Reg = b'00001100' (Ch = .12) y STATUS,C = 0
Aqu, podemos comprobar que antes de aplicar la RRF, Reg vala 24 en
sistema decimal. Despus de la instruccin RRF Reg vale 12, por lo que
hemos dividido a Reg por dos, utilizando la instruccin RRF. Sin embargo,
veamos el caso en el que:
Reg = b'00011000' (18h = .24) y STATUS,C = 1
Al aplicar: RRF Reg,F

Reg = b'10001100' (8Ch = .140) y STATUS,C =

0
En este caso Reg, antes de la instruccin RRF vala 24 en sistema decimal.
Y despus de la instruccin RRF Reg vale 140. Este error ocurre por que el
bit C de STATUS, en este caso, antes de ejecutar la instruccin RRF vala 1,
el cual al ejecutar la instruccin RRF, ocup el bit7 del registro Reg.
Debemos considerar el motivo para evitar incurrir en este error, difcil de
depurar. Para asegurar una divisin por dos, limpiaremos el bit C del registro
STATUS antes de realizar cualquier instruccin RRF y asegurarnos que el bit
STATUS,C no "corrompa" la divisin.
Ej.: BCF STATUS,C
"corrompe" la divisin
RRF Registro,F

;Limpia STATUS,C para asegurar que no


;y ahora si. Rota el Registro a la derecha.

Por la misma lgica rotar dos veces a la derecha un registro equivale a decir
Registro / 2 / 2, lo que simplificado es Registro / 4, y as sucesivamente.

SLEEP Esto significa: SEELP (Dormir, bajo consumo). Pone a 0 el flag PD#
(Power Down) y el flag TO# (Timer Out) se pone a 1. O sea, el bit de estado
de energa-baja es aclarado, el bit de estado de interrupcin es puesto a 1, el
Temporizador Perro Guardin y su preescaler son aclarados (puestos a 0) y el

procesador es puesto en el modo Sleep (bajo consumo) con el oscilador


parado.
Para salir de este estado, es necesaria una de estas causas:
Provocar un Reset activando el MCLR.
Por desbordamiento del WDT (Watchdog) si quedo operativo en el modo
reposo.
Generando una interrupcin distinta a TMR0 ya que sta se desactiva con la
propia instruccin SLEEP.

SUBLW Esto significa: Restar W del Literal.


SUBLW 00 a FF EL registro W es restado (mtodo de complemento a 2)
del valor Literal, el resultado es colocado en el registro W.
Esta instruccin no est disponible en el juego de instrucciones del '508A,
usar estas 5 instrucciones, ejemplo: SUBLW 80h.
Sustituir por:
MOVWF 13h
;Mover W a cualquier archivo
MOVLW 80h
;Poner 80h en W
MOVWF 14h
;Mover W a cualquier archivo
MOVF 13h,0
;Mover 13h a W
SUBWF 14h,0
;Restar W del archivo 14h

SUBW F Esto significa: Restar W del archivo.


SUBWF 00 a 1F,0 El resultado estar en W.
SUBWF 00 a 1F,1 El resultado estar en f. Restar por el mtodo de
complemento a 2, el registro W del archivo (de 00 a 2F).

SWAPF Esto significa: Swap Nibbles (intercambio de bits) en el archivo f.


SWAPF 00 a 1F,0 El resultado estar en W.
SWAPF 00 a 1F,1 El resultado estar en f. Los nibbles (niveles)
superiores e inferiores de un archivo 00 a 1F son cambiados.

TRIS 06 o solamente TRIS Esto significa: Carga Registro TRIS. Ver


tambin OPTION 0DFh en la Biblioteca de Rutinas.
Esta instruccin carga a TRIS con el contenido de W, usamos TRIS 06 para
recordar que se est refirindose al PuertoB (determinando la naturaleza de
Entrada/Salida de cada una de las lneas) cuando el programa se transfiere a un
PIC F84.
Las dos instrucciones de configuracin (set-up) son:
MOVLW xxh
[GP3] debe ser 1).

;Cargar W con un valor literal (recordar que para el '508A el Bit3

TRIS 06

;Cargar TRIS con el valor de W.

Nota: El '508A slo tiene 6 lneas en el puerto y usa slo los 6 bits inferiores. Si
W es 0000 1000 todas las lneas son salida excepto GP3, ya que GP3 slo
puede ser ENTRADA.
Si se requiere usar la instruccin TRIS en un '508A, son necesarias las
siguientes 4 instrucciones:
BSF 03,5
MOVLW 08
MOVWF 06

;Seleccionar pagina 1
;Haga GP3 entrada
;Cargar el archivo TRIS (como estamos en page1, esto no es salida

BCF 03,5

;Seleccionar Page0

port 6)

XORLW Esto significa: Exclusivo OR Literal con W.


XORLW 00 a FF El contenido del registro de W es XOR'ed con un valor
literal (el contenido de W se hace un XOR lgico con el valor literal), el
resultado es colocado en el registro W.

XORWF Esto significa: Exclusivo OR W con el archivo f.


XORWF 00 a 1F,0 El resultado estar en W.
XORWF 00 a 1F,1 El resultado estar en f. Exclusivo OR del contenido
del registro W con un archivo (00 a 1F).
Con esto, damos por terminada la descripcin de las instrucciones para la
familia PIC. En prximos artculos pondremos en accin los conocimientos
adquiridos en este artculo, sin embargo personalmente recomiendo que se haga
una copia en papel para tener a mano en sus proyectos, esto le facilitar el
proceso de programacin ayudndole a recordar la funcin de las instrucciones y
ganar tiempo en sus proyectos.

You might also like