Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tcnicasdeprogramacinenensambladorpic16f877arepertorio35instrucciones 141210153950 Conversion Gate02 PDF
Tcnicasdeprogramacinenensambladorpic16f877arepertorio35instrucciones 141210153950 Conversion Gate02 PDF
ADDLW ADDLW
ADD Literal to w
Operación w+k→w
Ciclos 1
ADD w to F
Operación w+f→d
Ciclos 1
ANDLW ANDLW
Operación w AND k → w
Ciclos 1
- - - - - X - -
EJEMPLO:
ANDLW 0x5F
Si antes de la instrucción. w = A3 h
Al ejecutarse:
w = 0101 1111 b AND 1010 0011 b = 0000 0011 b = 03 h
01011111b
10100011b
0000 0011 b
ANDWF ANDWF
AND w with F
Operación w AND f → d
0< f <127
Operadores
d [0,1]
Ciclos 1
- - - - - X - -
EJEMPLO:
ANDWF FSR,1
Si antes de la instrucción. w = 17 h = 0001 0111 b y FSR = C2 h = 1100 0010 h
Al ejecutarse:
w = 17 h = 0001 0111 b
Su amigable compañero el Barra Bas
FSR = 0001 0111 b AND 1100 0010 b = 0000 0010 b = 02 h
00010111b
11000010b
0000 0010 b
BCF BCF
Bit Clear F
Operación 0 → (f<b>)
0< f <127
Operadores
0<b<7
Ciclos 1
- - - - - - - -
EJEMPLO:
BCF FLAG_REG, 7
Si antes de la instrucción el registro:
FLAG_REG = C7 h = 1100 0111 b
Al ejecutarse la instrucción, el registro queda con el valor:
FLAG_REG = 47b = 0100 0111 b
BSF BSF
Bit Set F
Operación 1 → (f<b>)
0< f <127
Operadores
0<b<7
Ciclos 1
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -
EJEMPLO:
BSF FLAG_REG, 7
Si antes de la instrucción el registro tiene el valor:
FLAG_REG = 0A h = 0000 1010 b
Al ejecutarse la instrucción, el registro queda con el valor:
FLAG_REG = 8A h = 1000 1010 b
BTFSC BTFSC
Ciclos 1 (2)
- - - - - - - -
EJEMPLO:
INICIO BTFSC FLAG,1
ES_1 GOTO PROCESO
ES_0
Si antes de la instrucción. PC = dirección INICIO
Al ejecutarse:
if FLAG<1> = 0,
PC = dirección ES_0 y seguirá la ejecución del programa.
Su amigable compañero el Barra Bas
if FLAG<1> = 1,
PC = dirección ES_1 y el programa continuará en PROCESO
BTFSS BTFSS
Ciclos 1 (2)
- - - - - - - -
EJEMPLO:
INICIO BTFSS FLAG,1
ES_0 GOTO PROCESO
ES_1
Si antes de la instrucción. PC = dirección INICIO
Al ejecutarse:
if FLAG<1> = 0,
PC = dirección ES_0 y el programa continuará en PROCESO.
if FLAG<1> = 1,
PC = dirección ES_1 y seguirá la ejecución del programa.
CALL CALL
Subrutine Call
PC + 1 → TOS
Operación k → PC <10:0>
PCLATCH (<4:3>) → PC (<12,11>)
Operandos 0 = k = 2047
Ciclos 2
- - - - - - - -
EJEMPLO:
INICIO CALL SUB_1
Si antes de la instrucción:
PC = dirección INICIO
Al ejecutarse:
PC = dirección SUB_1
TOS = dirección INICIO +1
CLRF CLRF
Clear f
00 h → f
Operación
1→Z
Ciclos 1
- - - - - 1 - -
CLRW CLRW
Clear w
00 h → w
Operación
1→Z
Operadores No tiene
Ciclos 1
- - - - - 1 - -
Z Se pone a 1 si el resultado de la operación es cero
EJEMPLO
CLRW
Si antes de la instrucción. w= 5Ah
Al ejecutarse:
w = 00
flag Z = 1
CLRWDT CLRWDT
00 h → WDT
Operación 1 → T0#
1 → PD#
Operadores No tiene
Ciclos 1
- - - 1 1 - - -
T0# Se pone a 1 cuando se ejecuta la instrucción CLRWDT o SLEEP. Se pone a 0 si el
temporizador watchdog se desborda
PD# Se pone a 1 cuando se ejecuta la instrucción CLRWDT o SLEEP
EJEMPLO
CLRWDT
Si antes de ejecutarse la instrucción
WDT = ?
Al ejecutarse: WDT = 00 h
Preescaler WDT = 0
bit de estado T0 = 1
bit de estado PD = 1
COMF COMF
Complement f
Operación Complemento de f → d
Ciclos 1
- - - - - X - -
EJEMPLO:
COMF REG1,0
Si antes de la instrucción:
REG1 = 13 h como d= 0
Al ejecutarse:
REG1 = 13 h = 0001 0011 b
w = EC h = 1110 1100 b
flag Z = 0
00010011b
1110 1100 b
DECF DECF
Decrement f
Operación f-1→d
0< f <127
Operadores
d [0,1]
Ciclos 1
- - - - - X - -
EJEMPLO:
DECF CNT,1
Si antes de la instrucción:
CNT = 01 h
Z=0
Al ejecutarse:
CNT = 00 h
bit Z = 1
Decrement f , Skip if 0
0< f <127
Operadores
d [0.1]
Ciclos 1 (2)
- - - - - - - -
EJEMPLO:
INICIO DECFSZ CNT,1
GOTO LOOP
CONTINUAR
si antes de la instrucción:
PC = dirección INICIO
Al ejecutarse: CNT = CNT -1
Si CNT = 0 entonces PC = dirección CONTINUAR
Si CNT no = 0 entonces PC = dirección INICIO + 1
GOTO GOTO
Unconditional Branch
k → PC <10:0>
Operación
(PCLATH <4:3>) → (PC <12:11>)
Ciclos 2
- - - - - - - -
EJEMPLO:
GOTO SEGUIR
Al ejecutarse:
PC = dirección SEGUIR
INCF INCF
Increment f
Operación f+1→d
Ciclos 1
EJEMPLO:
INCF CNT,1
Si antes de la instrucción: Al ejecutarse:
CNT = FF h FF h + 1 h = 00 h
flag Z = 0 CNT = 00
flag Z = 1
Su amigable compañero el Barra Bas
INCFSZ INCFSZ
Increment f, SkIP if 0
Ciclos 1 (2)
- - - - - - - -
EJEMPLO:
INICIO INCFSZ CNT,1
GOTO SALTO
CONTINUAR
Si antes de la instrucción:
PC = dirección INICIO
Al ejecutarse: CNT = CNT+1
Si CNT = 0
Entonces PC = dirección CONTINUAR
Si CNT no = 0
Entonces PC = dirección INICIO + 1
IORLW IORLW
Operación w OR k → w
Ciclos 1
- - - - - X - -
EJEMPLO:
IORLW 0x35
Si antes de la instrucción:
w = 9A h
Al ejecutarse:
w = 1001 1010 b + 0011 0101 b = 1011 1111 b = BF h
10011010b
00110101b
1011 1111 b
IORWF IORWF
Inclusive OR w with f
Operación w OR f → d
Ciclos 1
- - - - - X - -
Z Se pone a 1 si el resultado de la operación es cero.
EJEMPLO:
IORWF RESUL,0
Si antes de la instrucción
RESUL = 13 h = 0001 0011 b
w = 91 h = 1001 0001 b
Al ejecutarse:
RESUL= 0001 0011 b OR 1001 0001 b = 1001 0011 b = 93 h
00010011
10010001b
1001 0011 b
MOVLW MOVLW
Move literal to w
Operación k→w
Ciclos 1
Registro de STATUS
- - - - - X - -
EJEMPLO:
MOVLW 0x5A
Al ejecutarse:
w = 5A h
Move f
Operación f→d
0 <f< 127
Operadores
d [0,1]
Ciclos 1
- - - - - X - -
EJEMPLO:
MOVF FSR,0
Al ejecutarse:
w = al valor del FSR
MOVWF MOVWF
Move w to f
Operación w→f
Ciclos 1
- - - - - - - -
EJEMPLO:
MOVWF OPCION
Si antes de la instrucción:
OPCION = FF h
w = 4F h
Al ejecutarse:
OPCION = 4F h
w = 4F h
NOP NOP
No operation
Operación no operación
Operadores No tiene
Ciclos 1
- - - - - - - -
EJEMPLO:
Si usamos un cristal de cuarzo de 4 Mhz en el oscilador, podremos obtener un retardo
igual a un microsegundo por cada instrucción NOP que insertemos en el código del
programa:
RETARDO NOP
NOP
NOP
RETURN
Cada vez que llamemos a la subrutina RETARDO, obtendremos 3 microsegundos de
demora.
TOS → PC
Operación
1 → GIE
Operadores No tiene
Ciclos 2
- - - - - - - -
EJEMPLO:
RETFIE
Al ejecutarse:
PC = TOS
GIE = 1
RETLW RETLW
k → w;
Operación
TOS → PC
Ciclos 2
- - - - - - - -
EJEMPLO:
MOVLW 0x07 ;Se carga 07 h en w
CALL TABLA ;Tabla de valores
... ;w contiene en valor recogido
...
TABLA ADDWF PC ;Se añade a PC el desplazamiento (offset) de w
RETLW k1 ;Nueva Tabla
RETLW k2
...
...
...
RETLW kn ;Fin de tabla
Al ejecutarse la instrucción w = toma el valor de k7
RETURN RETURN
Operación TOS → PC
Operadores No tiene
Ciclos 2
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -
EJEMPLO:
RETURN
Operación
0 <f< 127
Operadores
d [0,1]
Ciclos 1
Registro de STATUS
- - - - - - - X
EJEMPLOS:
Operación
0 <f< 127
Operadores
d [0,1]
Ciclos 1
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - X
EJEMPLOS:
Si tenemos el registro VALOR = 0000 0001 b y aplicamos la instrucción RRF VALOR,1
Entonces el resultado será VALOR = 0000 0000 b y el bit C = 1.
Si tenemos el registro VALOR = 1000 0000 b y aplicamos la instrucción RRF VALOR,1
El resultado será VALOR = 0100 0000 b y el bit C = 0.
Si antes de la instrucción, REG1 = 1110 0110 b y flag C = 1 y aplicamos la
instrucción RRF REG1,0, como d = 0 el resultado queda en w, al ejecutarse:
REG1 = 1110 0110 b
w = 0111 0011 b
flag C = 0
Sleep
00 h → WDT
0 → WDT prescaler
Operación
1 → TO#
0 → PD#
Operadores No tiene
Ciclos 1
Pone al circuito en modo Sleep (bajo consumo) con parada del oscilador.
Pone a 0 el flag PD# (Power Down) y el flag TO# (Timer Out) se pone a
1. Se puede salir de este estado por:
1. Activación de MCLR para provocar un Reset.
Descripción
2. Desbordamiento del watchdog si quedó operativo en el modo
reposo.
3. Generación de una interrupción que no sea TMR0 ya que ésta se
desactiva con la instrucción SLEEP.
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z# DC C
- - - 1 0 - - -
TO Se pone a 1 al ejecutar la instrucción SLEEP o CLRWDT
PD Se pone a 0 al ejecutar la instrucción SLEEP.
EJEMPLO:
SLEEP
SUBLW SUBLW
Operación k-w→w
Ciclos 1
Resta en complemento a dos del contenido del literal kel contenido del
Descripción
registro w, y almacena el resultado enw.
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X X X
Z Se pone a 1 si el resultado de la operación es cero
DC Se pone a 1 si se genera un acarreo del bit 3 al grupo de 4 bits superior
C Se pone a 1 si se genera un acarreo del bit de mayor peso.
EJEMPLO:
SUBLW 0x02 ;k - w → w, 02 h - w → w
a) Si antes de la instrucción w = 01 h y flag C = ? al ejecutarse:
02 h - 01 h = 01 h
w = 01 h
flag C = 1 ; el resultado es positivo
b) Si antes de la instrucción w = 02 h, flag C = ? y flag Z = ? al ejecutarse:
02 h - 02 h = 00 h
w = 00 h
flag C = 1
flag Z = 1 ;el resultado es cero
c) Si antes de la instrucción w = 03 h y flag C = ? al ejecutarse:
02 h - 03 h = -01 h = - 0000 0001 b
C1(0000 0001 b)=1111 1110 b; 1111 1110 b + 1 b = 1111 1111 b = FF h
w = FF h
flag C = 0 ; el resultado es negativo
SUBWF SUBWF
Subtract w from f
Operación f-w→d
Ciclos 1
- - - - - X X X
Z Se pone a 1 si el resultado de la operación es cero
DC Se pone a 1 si se genera un acarreo del bit 3 al grupo de 4 bits superior
C Se pone a 1 si se genera un acarreo del bit de mayor peso.
EJEMPLO:
SUBWF REG1,1 ;f - w → f, REG1 - w → REG1
a) Si antes de la instrucción, REG1 = 03 h, w = 02 h y flag C = ?, al ejecutarse:
03 h - 02h = 01 h
REG1 = 01h
w = 02 h
flag C = 1 ; el resultado es positivo
b) Si antes de la instrucción, REG1 = 02 h, w = 02 h y flag C = ?, al ejecutarse:
02 h - 02h = 00 h
REG1 = 00h
w = 02 h
flag C = 1
fal0 Z = 1 ; el resultado es cero
c) Si antes de la instrucción, REG1 = 01 h, w = 02 h y flag C = ?, al ejecutarse:
01 h - 02 h = -01 h = - 0000 0001 b
C1(0000 0001 b)=1111 1110 b; 1111 1110 b + 1 b = 1111 1111 b = FF h
REG1 = FF h
w = 02 h
flag C = 0 ; el resultado es negativo
SWAPF SWAPF
Swap Nibbles in f
(f<3:0>) → (d <7:4>)
Operación
(f<7:4>) → (d <3:0>)
Ciclos 1
Los cuatro bits de más peso del registro f se intercambian con los 4
Descripción bits de menos peso del mismo registro. Si d=0 el resultado se almacena
en w, si d=1el resultado se almacena en f.
Su amigable compañero el Barra Bas
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -
EJEMPLO:
SWAPF REG1,0
Si antes de la instrucción:
REG1 = A5 h = 1010 0101 h
Como d=0 el resultado se almacenará en w
Al ejecutarse la instrucción:
REG1 = A5 h = 1010 0101 b
w = 5A h = 0101 1010 b
XORLW XORLW
Operación w XOR k → w
Ciclos 1
- - - - - X - -
Z Se pone a 1 si el resultado de la última operación es cero.
EJEMPLO:
XORLW 0xAF
Si antes de la instrucción:
w = 1011 0101 b = B5 h
Al ejecutarse la instrucción:
w = 1011 0101 b → 1010 1111 b = 0001 1010 b = 1A h
1011 0101 b
1010 1111 b
0001 1010 b
Exclusive OR w with f
Operación w XOR f → d
Ciclos 1
- - - - - X - -
EJEMPLO:
XORWF REG1,1
Si antes de la instrucción:
REG1 = AF h = 1010 1111 b
w = B5 h = 1011 0101 b
Como d=1, el resultado se almacena en REG1
Al ejecutarse:
REG1 = 1010 1111 → 1011 0101 =0001 1010 = 1A h
w = B5 h
1010 1111
1011 0101
0001 1010
Operación w → OPTION
Operadores No tiene
Ciclos 1
- - - - - - - -
EJEMPLO:
MOVLW 10H ; carga el acumulador con el valor 10h.
OPTION ; carga el registro OPTION con el acumulador.
Esta instrucción existe para mantener la compatibilidad con los PIC producidos con
anterioridad, y como en el futuro podría dejar de implementarse, Microchip aconseja
realizar el ejemplo anterior de esta otra forma:
BSF STATUS,RP0 ; activa el banco 1.
MOVLW 10H ; carga el acumulador con 10h
MOVWF OPTION_REG ; carga OPTION con el acumulador.
TRIS TRIS
Operadores No tiene
Ciclos 1
- - - - - - - -
EJEMPLO:
MOVLW 16h ; carga el acumulador W con el valor 16h
TRIS PORTA ; carga el registro PORTA con el acumulador.
Esta instrucción existe para mantener la compatibilidad con los PIC producidos
anteriormente, y como en el futuro podría dejar de implementarse, Microchip aconseja
realizar el ejemplo anterior de esta otra forma (aunque ocupa más memoria...):
BSF STATUS,RP0 ; activa el banco 1.
MOVLW 16h ; carga el acumulador con el valor 16h
MOVWF TRISA ; carga el registro PORTA con W.
Si el resultado de una instrucción ADD rebasa FF, la bandera C (Carry) es puesta a 1, si tiene
cualquier otro valor es 0.
Si el resultado de una instrucción 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 aritmética 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 (dígito 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.
Su amigable compañero el Barra Bas
Ejemplos : banderas banderas
1010 0010 1101 0000
+ 0100 1111 C DC Z + 0110 1111 C DC Z
1111 0001 0 1 0 0011 1111 1 0 0
ANDLW Esto significa: producto lógico AND del Literal con el registro W. Ver
también ANDWF.
ANDLW ‘00 a FF’ El objetivo de la operación es, descubrir cuantos bits de L y W, en
binarios están a 1. Si ambos bits son cero, el resultado es cero y la instrucción usada en este
caso es XOR. Esta instrucción hace un AND lógico entre un número fijo (literal) y el contenido
del registro W, el resultado es colocado en el registro W. Con la orden ANDLW, en el
registro STATUS se ven afectados los bits: C (Carry), Z (Cero) y el DC (Dígito Carry). El literal
puede ir de 00 a FF.
La operación AND puede decirse que se usa para enmascarar (separar o quitar) los bits que
nos interesen. Por ejemplo:
ANDWF Esto significa: Operación AND producto lógico de W con el archivo f [ AND'ed entre
W y f]. Ver también ANDLW.
ANDWF (00 a FF), 0 El resultado se almacena en el registro W, por el valor 0 en la
instrucción.
ANDWF (00 a FF), 1 El resultado se almacena en el archivo f, por el valor en la instrucción.
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.
Véase arriba para hacer operaciones de enmascarar con la operación AND. Con la
instrucción ANDWF, sólo 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 (detrás de la coma) en el
archivo f ). Ver también BSF.
BCF (00 a FF), 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
Su amigable compañero el Barra Bas
llaman Registros de Función Especial (SFR's), el resto (66) se llaman Archivos de Propósito
General (GPR's) del 0Ch a 4Fh. No afecta los bits de STATUS.
BSF Esto significa: Bit Set File (poner a 1 el bit indicado, en el archivo f). Ver también BCF.
BSF ‘00 a FF’, bit Hay casi 300 instrucciones para esta orden. Hay 79 archivos en el
PIC16F84A, de las que los primeros 13 son losSFR'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 lógico 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 líneas E/S, comúnmente se llaman líneas I/O del puerto. El resultado es la inversa a
la instrucción 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 FF’, 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 instrucción (no ejecuta la instrucción que sigue). No afecta
los bits de STATUS.
BTFSS Esto significa: Bit Test, Skip if Set (Bit de Test, Salta si es "1").
BTFSS ‘00 a FF’, bit También 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 próxima instrucción 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 próxima
instrucción, si no, continua con la siguiente.
CALL Etiqueta Los programas deberían ser escritos de forma que las pocas primeras
instrucciones pongan al micro en el Inicio dePrograma Principal. El "Programa Principal" se
localizará físicamente 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.
Después 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 instrucción RETURN. Una llamada remota puede hacer de
subrutina pero esta segunda subrutina no puede llamar otra subrutina.
Cada vez que se ejecuta una instrucción CALL, un valor de dirección es colocado (empujado) en
la Pila (Stack), entonces el micro sabe donde volver después de ejecutada la subrutina, la Pila sólo
puede tener 8 niveles de alto, entonces es necesario llevar cuidado para no quedarse sin Pila
(Stack). Ver también 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.
CLRF Esto significa: Clear f [Limpia f] (poner a 0 los 8 bits del archivo f)
CLRF ‘00 a FF’ 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 Z del
registro STATUS es puesta a 1.
DECFSZ Esto significa: DECrement f, Skip if Zero (Decrementa el archivo f y salta si es 0).
DECFSZ (00 a FF),0 El resultado estará en W.
DECFSZ (00 a FF), 1 El resultado estará en f. La instrucción DECFSZ tiene muchos empleos.
Un empleo importante está en una subrutina de retardo. En esta rutina la
instrucción DECFSZ crea un lazo en el que el micro es enviado a una instrucción por encima-del-
programa y se ejecutará un juego de instrucciones una y otra vez, esta es una táctica 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 instrucción en el programa. La siguiente instrucción es
normalmente GOTO y ésta envía de nuevo al micro por encima-del-programa. Por ej.:
ret: DECFSZ 0Ch,0 ; Decrementa 0C y si es 0, salta una línea
GOTO ret ; no es 0, ejecuta esta línea
... ; si es 0, viene hasta aquí.
... ;sigue programa
INCFSZ Esto significa: INCrement f and Skip if 0 (Incrementar el archivo f y salta si es 0).
INCFSZ (00 a FF),0 El resultado estará en W.
INCFSZ (00 a FF),1 El resultado estará en f. Normalmente la función de decremento
DECFSZ se usa para crear un retardo, pero también se puede usar un INCFSZ. No afecta al
registro STATUS.
Ejemplo: Si el registro W
se carga con 1111 0000 (es una máscara de 4 bits altos F0h) y
un número como 0100 1110 (4Eh) es ORed con W,
el resultado es 1111 1110 (FEh).
Ejemplo: Si el registro W es cargado con 1111 0000 (F0h es una máscara de 4 bits altos) y un
archivo con un número 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 FF),0 El contenido del archivo es movido al W. El resultado estará en W.
MOVF (00 a FF),1 El resultado estará en f. Para esta instrucción 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.
NOP Esto significa: Ninguna operación. Es decir, el micro no realiza ninguna operación, sólo
consume el tiempo de 1 instrucción.
RETURN Esto significa: Retorno de Subrutina. Esta instrucción está al final de una rutina o
subrutina. No afecta al registro STATUS.
Si Reg = b'00010110'
Después de la instrucción: Reg = b'0010110C' donde C es el valor del bit STATUS,C en el
momento de ejecutarse la instrucción RLF.
Veamos en mas detalle, cómo trabaja la función RLF:
Un grupo de 8 bits es registro, o sea: Registro = B7 B6 B5 B4 B3 B2 B1 B0
Al aplicar la instrucción 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 posición hacia la
izquierda. El espacio generado a la derecha de Reg es decir, el bit0 (B0) del registro, es ocupado
por el valor que tenía 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.
Podemos comprobar que antes de aplicar la RLF, Reg valía 12 en sistema decimal. Después de
la instrucción RLF Reg vale 24. Hemos multiplicado a Reg por dos, utilizando la instrucción RLF.
Ahora, consideremos el siguiente caso:
En este caso, antes de la aplicación de RLF Reg valía 12 en decimal y después de aplicar la
instrucción Reg vale 25 en decimal, por qué ocurre este error si hemos aplicado la misma
instrucción al mismo registro Reg. Debemos considerar el motivo.
El motivo radica en que el bit C del registro STATUS, antes de ejecutar la instrucción RLF,
valía 1, en el segundo caso y ocupó el bit0 del
Reg al ejecutar la instrucción 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
multiplicación por dos, siempre limpiaremos el bit C del STATUS antes de aplicar la instrucción
RLF, asegurándonos así que el bit STATUS,C no "corrompa" la operación.
Ej.: BCF STATUS,C ;Limpiar STATUS,C para asegurar que no "ensucia" la multiplicación
RLF Registro,F ;y ahora, si. Rotar el Registro a la izquierda.
Se puede rotar más veces a la izquierda, lo que en buena lógica es lo mismo que hacer Reg *
2 * 2, etc.
La instrucción: RRF Reg,Destino ; rota los bits de un registro un lugar hacia la derecha.
Donde C es el valor que tenía el bit C de STATUS en el momento de ejecutar la instrucción RRF.
Veamos en detalle cómo trabaja la función RRF:
Esto significa que todos los bits de Reg son desplazados una posición hacia la derecha. El
espacio generado a la izquierda de Reg, es decir, el bit7 (B7) de registro, será ocupado por el valor
que tenía 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.
Aquí, podemos comprobar que antes de aplicar la RRF, Reg valía 24 en sistema decimal.
Después de la instrucción RRF Reg vale 12, por lo que hemos dividido a Reg por dos, utilizando la
instrucción RRF. Sin embargo, veamos el caso en el que:
En este caso Reg, antes de la instrucción RRF valía 24 en sistema decimal. Y después de la
instrucción RRF Reg vale 140. Este error ocurre por que el bit C de STATUS, en este caso, antes
de ejecutar la instrucción RRF valía 1, el cual al ejecutar la instrucción RRF, ocupó el bit7 del
registro Reg.
Debemos considerar el motivo para evitar incurrir en este error, difícil de depurar. Para asegurar
una división por dos, limpiaremos el bit C del registro STATUS antes de realizar cualquier
instrucción RRF y asegurarnos que el bit STATUS,C no "corrompa" la división.
Ej.: BCF STATUS,C ;Limpia STATUS,C para asegurar que no "corrompe" la división
RRF Registro,F ;y ahora si. Rota el Registro a la derecha.
Por la misma lógica 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 energía-baja es aclarado, el bit de
estado de interrupción es puesto a 1, el Temporizador Perro Guardián y su preescaler son
aclarados (puestos a 0) y el procesador es puesto en el modo Sleep (bajo consumo) con el
oscilador parado.
Nota: El '508A sólo tiene 6 líneas en el puerto y usa sólo los 6 bits inferiores. Si
W es 0000 1000 todas las líneas son salida excepto GP3, ya que GP3 sólo puede
ser ENTRADA.