JUEGO DE INSTRUCCIONES
de los PIC
Juego Reducido de Instrucciones (RISC) de los PIC.
Como se indica es un juego reducido de instrucciones sólo son 35, así que, no nos resultará demasiado complicado manejar estas pocas instrucciones, aunque es cierto que no es necesario retener en la memoria qué hace cada una, esto resultaría una extrema labor para cualquiera de nosotros y no es esto lo que se pretende, se trata de disponer de una referencia a la que acudir, en caso de dudas y continuar con nuestro trabajo que es la programación. Para lograr cierta soltura a la hora de programar, es muy conveniente realizar cuantas más practicas mejor, sólo con la practica se puede lograr la agilidad en cualquier disciplina.
Una forma de familiarizarse con las instrucciones que aquí se describen, es utilizar las librerías de rutinas y tratar de comprender el motivo por el que se ha usado cierta instrucción y no otra que se nos haya ocurrido. Por cierto, es interesante usar las rutinas que se entregan y procurar adaptarlas a las características y circunstancias que nos convengan en cada aplicación, el motivo es que estas rutinas sabemos que funcionan por lo tanto será mejor aprovechar un trabajo hecho y comprobado frente al riesgo de la aventura. Y sin más preámbulos empecemos con las instrucciones.
Términos resaltados en Rojo indican que no tienen correspondencia con el '508A.
NOTACIÓN PARA NÚMEROS
Siempre dependerá de la herramienta en uso, normalmente se usa lo que sigue:
Decimal : '100D' ó .100
Hexadecimal : '64H' ó 0x64 ó 64h
Octal : '144O' o 144O
Binario : '01101100b'
ASCII : 'C'
NOTACIÓN PARA REGISTROS Y LITERALES
w : Registro W, es el registro de trabajo, similar al acumulador.
f : Campo de 5 bits (fffff),contiene la dirección del banco de registros, que ocupa el banco 0 del área de datos.
Direcciona uno de esos registros.
k : Representa una constante de 8 bits.
d : Bit del código OP de la instrucción. Si d=0, el destino es W, y si d=1 el destino es f. O sea, en la instrucción
se selecciona el destino donde se guarda el resultado de la operación.
b : Determina la posición de un bit dentro de un registro de 8 bits, (o sea, tomará valores entre 0 y 7)
FLAGS
Los Flags o banderas son marcadores, representados por bits dentro del registro STATUS, y son resaltados en la tabla siguiente:
Z : Flag (bandera) Zero, se pone a 1 cuando una operación lógica o aritmética da 0 (cero) como resultado. En cualquier otro caso se pone a 0.
C : Flag (bandera) Carry, se pone a 1 cuando la operación que le afecta sobrepasa el nivel de representación del procesador, en nuestro caso
es de 8 BIT's, de esta manera si sumamos a 11111111b un 00000011b el resultado sería 00000010b mas 1 y el Bit Carry pasaría a 1 para
advertir de esta circunstancia. En otras palabras, cuando se rebasa la cuenta de 255 y pasa por 0 en la cuenta el Bit Carry se pone a 1.
DC : Flag carry del nibble inferior, este se comporta igual que el Bit Carry, solo que el límite de representación son los 4 bits
inferiores, de esta manera si tenemos 00001111b (0Fh) y sumamos 00000111b (07h), el resultado será 00010110b y el Bit DC se
pone a 1, el Bit Carry estará a 0 al no superarse los 8 bits y el Bit Z a 0 al ser el número diferente de 0.
Procure entender y no le queden dudas respecto a los FLAGS, éstos conceptos son esenciales, no obstante ya se aclararán en la medida que vaya avanzando en los artículos que siguen. Sobre todo se recomienda que revise los estados de los registros mediante herramientas como MPASM, cuando lea el artículo sobre el uso de esta herramienta que de uso libre, se aclararán las posibles dudas.
NIBBLES
Todos los registros del F84 y el ' 508A comprenden 8 "celdas" en las que se coloca un 'cero' o un 'uno'. Las ocho celdas se separan en dos grupos llamados Nibbles (niveles), uno superiores de 4 celdas (Nibble Alto) y otro inferiores de 4 celdas (Nibble Bajo).
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
ADDLW
ADD Literal to W
ADDWF
ADD W to F
ADDLW k
ADDWF f,d
1 / 1
W + k -> WW + k -> W
W AND f -> W si d=0
1/1
W + f -> f si d=1
W + f -> W si d=0
C Se pone a 1 si se produce un acarreo desde el bit de mayor peso.
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.
Añade el contenido de W al contenido de k y almacena el resultado en W.
Atención: Esta operación no existe en los PIB12C5XX.
ADDLW 0x15h Si antes de la instrucción:
W = 10h = 0001 0000 b
Al ejecutarse la instrucción: W = 10h + 15h = 25h
W = 0001 0000 b + 0001 0101 b = 0010 0101 b
C Se pone a 1 si se produce un acarreo desde el bit de mayor peso.
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.
Añade el contenido de W al contenido de f y almacena el resultado en W si d=0 y en f si d=1.
ADDWF FSR.0
Si antes de la instrucción: W = 17h y FSR = C2h como d=0
Al ejecutarse: W = 17h + C2h = D9h FSR = C2h
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
ANDLW
AND Literal and W
ANDWF
AND W with F
ANDLW k
[Etiqueta] ANDWF f,d
1/1
W AND k -> W
1/1
f entre 0 y 127 b entre 0 y 7
W AND f -> f si d=1
W AND f -> W si d=0
Z Se pone a 1 si el resultado de la operación es cero.
Ejecuta un AND lógico entre el contenido de W y el literal k y lo almacena en W.
ANDLW 0x5F
Si antes de la instrucción W = A3h
Al ejecutarse: W = 0101 1111 b AND 1010 0011 b =
= 0000 0011b = 03h
Efectúa la operación AND lógico entre el contenido del W y el contenido de f y almacena el resultado en W. Si d = 0 o en f si d =1. Z Se pone a 1 si el resultado de la operación es 0.
ANDWF FSR,1
Si antes de la instrucción.
W = 17h = 0001 0111 b y FSR = C2h = 1100 0010 b
Al ejecutarse: W = 17h = 0001 0111 b
FSR = 0001 0111 b AND 1100 0010 b = 0000 0010 b = 02h
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
BCF
Bit Clear F
BSF
Bit Set F
[Etiqueta] BCF f,b
[Etiqueta] BSF f,b
f entre 0 y 127 b entre 0 y 7
0 -> b(f)
1/1
f entre 0 y127 b entre 0 y 7
1 -> b(f)
1/1
Pone a 0 el bit b del archivo f
BCF FLAG_REG,7
Si antes de la instrucción el registro:
FLAG_REG = C7h = 1100 0111 b
Al ejecutarse la instrucción, el registro queda con valor:
FLAG_REG = 47h = 0100 0111b
Pone a 1 el bit b del archivo f
Si antes de la instrucción el registro tiene el valor:
FLAG_REG = 0Ah = 0000 1010b
Al ejecutarse la instrucción, el registro queda con valor:
FLAG_REG = 8Ah = 1000 1010 b
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
BTFSC
Bit Test, Skip If Clear
BTFSS
Bit Test, Skip If Set
[Etiqueta] BTFSC f,b
[Etiqueta] BTFSS f,b
1/1 o 2
f entre 0 y 127 b entre 0 y 7
Salta (Skip) si b(f)=0
1/1 o 2
f entre 0 y 127 b entre 0 y 7
Salta (Skip) si b(f)=1
Si el bit número b del registro f es cero, la instrucción que sigue a ésta se ignora (Skip) y se trata como un NOP. En este caso y sólo en este caso, la instrucción BTFSC precisa de dos ciclos para ejecutarse.
Aqui BTFSC FLAG,1
FALSE GOTO Process_Code TRUE.
Si antes de la instrucción : PC = dirección Aqui
Al ejecutarse: if FLAG <1> = 0, PC = dirección TRUE
if FLAG <1> = 1, PC = dirección FALSE
Si el bit número b del registro f es 1, la instrucción que sigue a ésta se ignora (Skip) y se trata como un NOP. En este caso y sólo en este caso, la instrucción BTFSS precisa de dos ciclos para ejecutarse.
Aqui BTFSS FLAG,1
FALSE GOTO Process_Code TRUE.
Si antes de la instrucción : PC = dirección Aqui
Al ejecutarse: if FLAG <1> = 0, PC = dirección FALSE
if FLAG <1> = 1, PC = dirección TRUE
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
CALL
Subrutina CALL
CLRF
Clear f with f
[Etiqueta] CALL k
[Etiqueta] CLRF f
1/2
k entre 0 y 2047
Para los 16c5X: PC + 1 -> Pila, k -> PC(0-7),0 ->PC(8)
PA2 a PA0 -> PC(9-11)
Para los 16c64, 71, 74, 84
PC +1 -> Pila, k -> PC(0-10), PCLATH(3,4) -> PC(11,12)
1/1
f entre 0 y 127
00h -> f
1 -> Z
Guarda la dirección de vuelta en la Pila y después llama a la subrutina situada en la dirección cargada en el PC.
Atención: El modo de cálculo de la dirección difiere según la familia PIC utilizada. También hay que posicionar bien PA2, PA1, PA0 (16c5X) o el registro PCLATH (en los demás PIC), antes de ejecutar la instrucción CALL.
Aqui CALL THERE
Si antes de la instrucción: PC = dirección Aqui
Al ejecutarse: PC = dirección (THERE)
TOS = dirección (Aqui + 1)
Pone el contenido del registro f a cero y activa el bit [Flag]Z.
Z se pone a 1 si el resultado de la operación es 0.
CLRF REG
Si antes de la instrucción. REG =5Ah
Al ejecutarse REG = 00h Flag Z = 1
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
CLRW
Clear register W
CLRWDT
Clear Watchdog Timer
[Etiqueta] CLRW
[Etiqueta] CLRWDT
1/1
00 -> W
1 -> Z
1/1
00 -> WDT y 0 -> predivisor del temporizador.
Los bits TO# y PD# del registro State se ponen a 1.
Pone el registro W a 00h y pone a 1 el bit [flag] Z, si el resultado de la operación 0.
CLRW
Si antes de la instrucción. W = 5Ah
Al ejecutarse: W = 00h
flag Z = 1
Pone a 00h el registro WDT contador del temporizador Watchdog, así como el predivisor.
TO# y PD# se ponen a 1 cuando se ejecuta la instrucción CLRWDT o SLEEP.
TO# se pone a 0 si el temporizador Watchdog se desborda.
CLRWDT
Si antes de ejecutarse la instrucción: WDT = ?
Al ejecutarse: WDT = 00h Preescaler WDT = 0
bit de estado TO = 1
bit de estado PD = 1
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
COMF
Complement F
DECF
Decrement F to F
[Etiqueta] COMF f,d
[Etiqueta] DECF f,d
1/1
si d = 1 ~f -> f f entre 0 y 127
si d = 0 ~f -> W
1/1
f - 1 -> f si d = 1 f entre 0 y 127
f - 1 -> W si d = 0
Complementa el contenido del registro f bir a bit. El resultado lo almacena de nuevo en f si d = 1 (borra lo anterior) o en W si d = 0 (f no varía).
Z se pone a 1 si el resultado de la operación es 0.
COMF REG1,0
Si antes de la instrucción: REG1 = 13h como d = 0
Al ejecutarse: REG1 = 13h = 0001 0011 b
W = ECh = 1110 1100 b flag Z = 0
Decrementa el contenido del registro f en una unidad. El resultado se guarda en W si d=0 (f no varía) o en f si d=1.
Z Se pone a 1 si el resultado de la operación es 0.
DECF CNT,1
Si antes de la instrucción: CNT = 01h Z = 0
Al ejecutarse: CNT = 00h
bit [flag] Z = 1
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
DECFSZ
Decrement F, Skip If Zero
GOTO
Salto Incondicional with F
[Etiqueta] DECFSZ f, d
GOTO k
1,1 (2)
f - 1 -> f si d=1 ; f entre 0 y 127
salta si d= 0 ; f - 1 -> W
1/2
En el caso de los 16c5X:
k -> PC(0-8), PA2 PA1, PA0 -> PC(9-11)
En el caso de los 16c64,71,74 y 84:
k -> PC(0-10), PCLATH(3,4) -> PC(11,12)
Decrementa el contenido del registro f en una unidad. El resultado se guarda en W si d=0 (f no varia) y en f si d=1
Si el resultado es nulo, se ignora la siguiente instrucción y en ese caso la instrucción dura dos ciclos.
AQUI DECFSZ CNT,1
GOTO LOOP CONTINUE;
Si antes de la instrucción: PC = dirección AQUI
Al ejecutarse: CNT = CNT -1
Si CNT = 0 entonces PC = dirección CONTINUE
Si CNT no = 0 entonces PC = dirección AQUI + 1
Llama la subrutina situada en la dirección cargada en el registro PC
Atención: El modo de cálculo de la dirección difiere según la familia de PIC utilizada. También hay que posicionar correctamente PA2, PA1, PA0 (16c5X) o la parte baja de k, se carga en PCL y la alta en PCLATH (en los demás PIC) antes de ejecutar la instrucción GOTO. Se trata de un salto incondicional.
- Ocupa 2 ciclos de reloj. Ejemplo: GOTO retardo1
Antes: PC = Origen
Después: PC = Destino (retardo1)
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
INCF
Incremento F
INCFSZ
Incrementa F, Skip (salta) if Zero
INCF f, d
INCFSZ f, d
1/1
f + 1 -> f si d=1
f + 1 -> W si d=0
1/1(2)
d = [0,1], f entre 0 y 127
f + 1 -> f si d=1
f + 1 -> W si d=0
En ambos casos: Salta si f + 1 = 0
Incrementa en 1 el contenido de f. El resultado se almacena de nuevo en f, si d=1, o en W si d=0 (en este caso f no varía)
Incrementa el contenido de f en una unidad. El resultado se guarda de nuevo en f si d=1, o si d=0 en W (en este caso f no varia). Si el resultado es nulo, salta la siguiente instrucción y en este caso, esta instrucción dura dos ciclos
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
IORLW
Inclusive OR Literal con W
IORWF
Inclusive OR W With f
IORLW k
IORWF f, d
1/1
W OR k -> W k entre 0 y 255
1/1
W OR f -> f si d=1 f entre 0 y 127
W OR f -> W si d=0
Efectúa un OR lógico inclusivo entre el contenido de W y el literal k y almacena el resultado en W
IORLW 0x35 = 00110101
Antes: W = 0x9Ah = 10011010
Después: W = 0xBFh = 10111111
Efectúa un OR lógico inclusivo entre el contenido de W y el contenido de f y almacena el resultado en f, si d=1 o en W si d=0
IORWF Reg,0
Antes: W=0x91, Reg=0x13
Después: W=0x93, Reg=0x13
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
MOVF
MOVE F
MOVLW
Move Literal to W with F
MOVF f,d
MOVLW f
1/1
f -> f si d=1 f entre 0 y 127
f -> W si d=0
1/1
k -> W f entre 0 y 127
Pone el contenido de f en f, si d=1 o f en W
si d=0 ; Pone Z a 1 si operación = 0
Atención: El desplazamiento de f en f que parecería inútil, permite comprobar el contenido de f con respecto a cero ya que esta instrucción afecta sobre el bit Z
MOVF Reg,0
Después: W = al valor del Reg
Carga W con el literal k
MOVLW 0x5A
Después: Reg = 0x4F, W = 0x5A
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
MOVWF
Move W to F
NOP
No Operation
MOVWF W,f
NOP
1/1
W -> f f entre 0 y 127
1/1
Ninguna
Carga f con el contenido de W
MOVWF Reg,0
Antes: Reg = 0xFF, W = 0x4F
Después: Reg =0x4F , W = 0x4F
Consume un ciclo de maquina y ocupa un lugar en la memoria de programa. Se usa para hacer retardos.
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
OPTION
Load Option Register
RETFIE
Return From Interrupt
OPTION
RETFIE
1/1
W -> OPTION
1/2
Pila -> PC, 1 -> GIE
Carga el registro OPTION con el contenido de W.
Atención: Esta instrucción no debe utilizarse en otros chips que no sean los PIC 16c5x. Sin embargo, es correctamente interpretada por los chips 16c64, 71, 74, 84 con el fin de asegurar una compatibilidad ascendente.
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
Atención: Esta interrupción dura dos ciclos. Esta instrucción no existe para los PIC 16c5X. TOS = top of stack
RETFIE
Al ejecutarse: PC = TOS
GIE = 1
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
RETLW
Return with Literal in W
RETURN
Return from Subroutine with F
RETLW
RETURN
1/2
K --> (W); TOS --> PC
1/2
Pila -> PC
Carga el registro W con el literal k y después carga el PC con el valor de la parte superior de la PILA, efectuando así, un retorno de subrutina.
Carga el PC con el valor que se encuentra en la parte superior de la pila, efectuando así una vuelta a la subrutina. Se trata de la instrucción RETLW simplificada
Atención: Esta instrucción dura dos ciclos. Esta instrucción no existe en los PIC 12c5XX, usar RETLW
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
RLF
Rotate Left F through Carry
RRF
Rotate Right F through Carry
RLF f,d
RRF f, d
1/1
ver descripción
1/1
ver descripción
Rotación de un bit a la izquierda del contenido de f, pasando por el bit de acarreo C. Si d=1 el resultado se almacena en f si d=0 el resultado se almacena en W
RLF Reg1,0 ; d = 0 result. en W
antes: Reg1=1110 0110b ; flag C = 0
después: W =1110 0110b ; flag C = 1
Rotación de un bit a la derecha del contenido de f, pasando por el bit de acarreo C. Si d=1 el resultado se introduce en f, si d=0 el resultado se amacena en W
RRF Reg1,0 ; d = 0 result. en W
antes: Reg1=1110 0110b ; flag C = 1
después: W =1110 0110b ; flag C = 0
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
SLEEP
Sleep
SUBLW
Substract W from Literal
SLEEP
SUBWF f, d
1/1
0 -> PD, 1 -> TO, 00 -> WDT, 0 -> Predivisor del WDT
1/1
k - W -> W
Pone el circuito en bajo consumo con parada del oscilador. Pone a 0 el flag PD y el TO se pone a 1.
Nota: Puede salir de este estado por:
1. Activar MCLR para provocar Reset.
2. Desbordamiento de WDG si operativo
3. Generar interrupción diferente a TMR0.
Sustrae el contenido de W del literal k y almacena el resultado en W. La sustracción se realiza en complemento a dos
Atención: Esta instrucción no existe en los Pic 12c5XX
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
SUBWF
Substract W from F
SWAPF
Swap F to F
SUBWF f, d
SWAPF f, d
1/1
f - W -> f si d=1
f - W -> W si d=0
1/1
f(0-3) -> f(4-7) y f(4-7) -> f(0-3)
Resultado -> f si d=1
Resultado -> W si d=0
Sustrae el contenido de W del contenido de f, y almacena el resultado en W si d=0 y en f si d=1. La sustracción se realiza en complemento a dos
Intercambia los cuatro bit de mayor peso por los cuatro de menor peso de f, y almacena el resultado en W si d=0, y en f si d=1
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
TRIS
Load TRIS Register
XORLW
Exclusive OR Literal With W
TRIS f
XORLW k
1/1
W -> registro TRIS del puerto f
1/1
W OR (Exclusivo) k -> W
Carga el contenido de W en el registro TRIS del puerto f.
Atención: Esta instrucción no debe utilizarse en otros circuitos que no sean los Pic 16c5X. No obstante, es correctamente interpretada por los circuitos 16c64, 71, 74, 84, con el fin de asegurar una compatibilidad ascendente
Efectúa un OR lógico exclusivo entre el contenido de W y el contenido del Literal K y almacena el resultado en W
Instrucción
Sintaxis
Codificación
Palabra/Ciclos
Operación
Bit de Estado
Bandera
Descripción
Ejemplo
XORWF
Exclusive Or W with F
XORWF f,d
1/1
W OR (Exclusivo) f -> f si d=1
W OR (Exclusivo) f -> W si d=0
OR Exclusiva W con f resultado en f ej. XORWF 0C,1