Professional Documents
Culture Documents
resultado en W.
ADDLW 00 al FF Un número fijo (llamado literal) es sumado al registro W (registro de trabajo). El
literal (número) 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 operación es cero.
Esta instrucción no está disponible para el '508A. Si quiere usar esta instrucción 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
Sustitúyala en el '508A por:
MOVWF 13h ; Mueve W a cualquier archivo
MOVLW 80h ;poner 80h en W
ADDWF 13h ;sumar el archivo 13h a W
ADDWF Esto significa: Suma aritmética 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
instrucción.
ADDWF 00 a 1F,1 El resultado es almacenado en el mismo archivo, debido al valor 1 del designador en
la instrucción.
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 (Dígito
Carry).
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 mitades (nibbles) 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.
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:
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.
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 instrucción corrompe el registro al introducir el valor de C en
el bit7, por tanto, debemos usar una instrucción 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 instrucción: RRF Reg,Destino ; rota los bits de un registro un lugar hacia la derecha.
Veamos: Reg = b'00011000' (18h = .24)
Aplicamos: RRF Reg,F y Reg = b'C0001100'
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:
Sabemos que un grupo de 8 bits es registro, o sea: Registro = B7 B6 B5 B4 B3 B2 B1 B0
Al aplicar la instrucción: 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 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.
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 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:
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 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.
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 interrupción distinta a TMR0 ya que ésta se desactiva con la propia instrucción
SLEEP.
SUBLW Esto significa: Restar W del Literal.
SUBLW 00 a FF EL registro W es restado (método de complemento a 2) del valor Literal, el resultado es
colocado en el registro W.
Esta instrucción 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 método 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 también OPTION 0DFh en la
Biblioteca de Rutinas.
Esta instrucción carga a TRIS con el contenido de W, usamos TRIS 06 para recordar que se está
refiriéndose al PuertoB (determinando la naturaleza de Entrada/Salida de cada una de las líneas) cuando
el programa se transfiere a un PIC F84.
Las dos instrucciones de configuración (set-up) son:
MOVLW xxh ;Cargar W con un valor literal (recordar que para el '508A el Bit3 [GP3] debe
ser 1).
TRIS 06 ;Cargar TRIS con el valor de W.
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.
Si se requiere usar la instrucción TRIS en un '508A, son necesarias las siguientes 4 instrucciones:
BSF 03,5 ;Seleccionar pagina 1
MOVLW 08 ;Haga GP3 entrada
MOVWF 06 ;Cargar el archivo TRIS (como estamos en page1, esto no es salida port 6)
BCF 03,5 ;Seleccionar Page0
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 lógico 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 descripción de las instrucciones para la familia PIC. En próximos
artículos pondremos en acción los conocimientos adquiridos en este artículo, sin embargo personalmente
recomiendo que se haga una copia en papel para tener a mano en sus proyectos, esto le facilitará el
proceso de programación ayudándole a recordar la función de las instrucciones y ganará tiempo en sus
proyectos.