| |
Instrucciones orientadas a los bytes
Mnemónico |
Parámetros |
Descripción |
Ciclos |
Banderas |
ADDWF |
f, d |
Add W and f |
1 |
C, DC, Z |
ANDWF |
f, d |
AND W with f |
1 |
Z |
CLRF |
f |
Clear f |
1 |
Z |
CLRW |
- |
Clear W |
1 |
Z |
COMF |
f, d |
Complement f |
1 |
Z |
DECF |
f, d |
Decrement f |
1 |
Z |
DECFSZ |
f, d |
Decrement f, Skip if 0 |
1(2) |
None |
INCF |
f, d |
Increment f |
1 |
Z |
INCFSZ |
f, d |
Increment f, Skip if 0 |
1(2) |
None |
IORWF |
f, d |
Inclusive OR W with f |
1 |
Z |
MOVF |
f, d |
Move f |
1 |
Z |
MOVWF |
f |
Move W to f |
1 |
None |
NOP |
- |
No Operation |
1 |
None |
RLF |
f, d |
Rotate left f through carry |
1 |
C |
RRF |
f, d |
Rotate right f through carry |
1 |
C |
SUBWF |
f, d |
Subtract W from f |
1 |
C, DC, Z |
SWAPF |
f, d |
Swap nibbles in f |
1 |
None |
XORWF |
f, d |
Exclusive OR W with f |
1 |
Z |
Instrucciones orientadas a los bits
Mnemónico |
Parámetros |
Descripción |
Ciclos |
Banderas |
BCF |
f, b |
Bit Clear f |
1 |
None |
BSF |
f, b |
Bit Set f |
1 |
None |
BTFSC |
f, b |
Bit Test f, Skip if Clear |
1 (2) |
None |
BTFSS |
f, b |
Bit Test f, Skip if Set |
1 (2) |
None |
Operaciones con literales y de control
Mnemónico |
Parámetros |
Descripción |
NroCic. |
Banderas |
ADDLW |
k |
Add literal and W |
1 |
C, DC, Z |
ANDLW |
k |
AND literal with W |
1 |
Z |
CALL |
k |
Call subroutine |
2 |
|
CLRWDT |
- |
Clear Watchdog Timer |
1 |
TO,PD |
GOTO |
k |
Go to address |
2 |
None |
IORLW |
k |
Inclusive OR literal with W |
1 |
Z |
MOVLW |
k |
Move literal to W |
1 |
None |
RETFIE |
- |
Return from interrupt |
2 |
None |
RETLW |
k |
Return with literal in W |
2 |
None |
RETURN |
- |
Return from Subroutine |
2 |
None |
SLEEP |
- |
Go into standby mode |
1 |
TO,PD |
SUBLW |
k |
Subtract W from literal |
1 |
C, DC, Z |
XORLW |
k |
Exclusive OR literal with W |
1 |
Z |
LAS INTRUCCIONES DEL PIC 16F84
Introducción
Ya llegamos a la parte más interesante e importante del manejo de un microcontrolador: las instrucciones. Nuestro microcontrolador, como ya sabemos, pertenece a la gama media y es de tipo RISC; esto quiere decir que tiene un juego de instrucciones reducido, en concreto de 35. Estas 35 instrucciones o nemónicos (del inglés mnemonics(os recuerda a la película ;) ?) y a su vez proveniente del juego de palabras: Nem On Icks) serán la base de funcionamiento del PIC. Al igual que los bits de los registros, será imposible aprendernos todas y a la vez su funcionamiento, pero a la hora de codificar nuestros programas deberemos tenerlas en cuenta. Así, cuando tengamos dudas sobre su uso, esta guía será la chuleta ideal para recordarlo ;p.
Las instrucciones fundamentalmente se dividen en tres tipos. Esta división viene dada por el tipo de datos con los que trabajan:
-
Instrucciones orientadas a los bytes (byte-oriented operations)
-
Instrucciones orientadas a los bits (bit-oriented operations)
-
Operaciones con literales y de control (literal and control operations)
Aparte de estas instrucciones, hay otro tipo de instrucciones usadas para simplificar la tarea de programar, y q generalmente están formadas por dos instrucciones básicas. Estas no las trataremos a fondo, pero las veremos en un resumen después de comprender el funcionamiento de las 35 instrucciones básicas.
En los tres apartados siguientes veremos todos los datos que se pueden dar acerca de una función. Algunos de ellos son irrelevantes y no son nuestro objetivo. En cambio otros, como la acción, la sintaxis, el funcionamiento, la operación, el comportamiento del registro STATUS y los ejemplos, son imprescindibles para comprender su funcionamiento.
INSTRUCCIONES ORIENTADAS AL MANEJO DE BYTES (REGISTROS)
ADDWF
Acción |
Suma el contenido del acumulador y el registro dado, y el resultado lo guarda en d |
Sintaxis |
ADDWF f,d |
Funcionamiento |
Add W to file register (Añade W al registro) |
Hexadecimal |
07 ff |
Bits (OPCODE) |
00 0111 dfff ffff |
Operación |
d = W + f (d puede ser W ó f). |
Descripción |
Esta instrucción suma el contenido de un registro específico al contenido de W donde f puede ser un registro cualquiera con un determinado valor. |
Comentarios |
Aunque ya conocemos el funcionamiento del bit d, lo repetiré de nuevo para el resto de instrucciones:
-
Si vale 1, el resultado se guarda en el registro f
-
Si vale 0, el resultado se guarda en el acumulador W |
Registro STATUS |
Modifica los bits Z, DC y C.
- Z vale 1 si el resultado de la operación es 0.
- DC vale 1 si el resultado de la operación es un número superior a 15.
- C vale 1 si el resultado de la operación es positivo o el bit 7 del registro que contiene el resultado vale 0. En caso contrario C vale 0 (resultado negativo).
|
Ejemplo |
Tomamos como valores iniciales W = 5 y DATO = 10, donde dato es un registro cualquiera.
ADDWF DATO ; DATO = 15 y W = 5.
ADDWF DATO, 1 ; DATO = 15 y W = 5.
ADDWF DATO, 0 ; W = 15 y DATO = 10.
ADDWF DATO, W ; W = 15 y DATO = 10. |
Ciclos de máquina |
1 |
ANDWF
Acción |
Realiza la operación AND entre un registro y W |
Sintaxis |
ANDWF f,d |
Funcionamiento |
AND W with f |
Hexadecimal |
05 ff |
Bits (OPCODE) |
00 0101 dfff ffff |
Operación |
d = W AND f (d puede ser W o f). |
Descripción |
Esta instrucción realiza la operación lógica AND entre el acumulador y el registro f. el resultado se guarda dependiendo del valor de d. Si este se omite, el valor por defecto es 1 y se guarda en f |
Comentarios |
La operación AND es una de las operaciones básicas del álgebra de Boole. Esta viene descrita en el apartado de electrónica digital. Para comprender de nuevo cual es su comportamiento, recojo en la siguiente tabla los valores de la tabla de verdad de esta operación.
ENTRADA |
SALIDA |
f |
W |
S |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
La operación lógica es:
S = f · W
Esta instrucción realiza esta operación para cada uno de los 8 bits de los dos registros, dos a dos, guardando el resultado en el registro correspondiente. |
Registro STATUS |
Modifica el bit Z.
- Z vale 1 si el resultado de la operación es 0.
|
Ejemplo 1 |
Supongamos que W= 00001111 y f = 11110000 antes de ejecutar la instrucción ANDWF f,d
ENTRADA |
RESULTADO |
|
W |
f |
W · f |
Bit 7 |
0 |
1 |
0 |
Bit 6 |
0 |
1 |
0 |
Bit 5 |
0 |
1 |
0 |
Bit 4 |
0 |
1 |
0 |
Bit 3 |
1 |
0 |
0 |
Bit 2 |
1 |
0 |
0 |
Bit 1 |
1 |
0 |
0 |
Bit 0 |
1 |
0 |
0 |
|
Ejemplo 2 |
Ahora en nuestro segundo ejemplo tenemos que W = 01110011 y f = 00101001 antes de ejecutar la instrucción ANDWF f,d tenemos:
ENTRADA |
RESULTADO |
|
W |
f |
W · f |
Bit 7 |
0 |
0 |
0 |
Bit 6 |
1 |
0 |
0 |
Bit 5 |
1 |
1 |
1 |
Bit 4 |
1 |
0 |
0 |
Bit 3 |
0 |
1 |
0 |
Bit 2 |
0 |
0 |
0 |
Bit 1 |
1 |
0 |
0 |
Bit 0 |
1 |
1 |
1 |
|
Ciclos de máquina |
1 |
INSTRUCCIONES ORIENTADAS AL MANEJO DE BYTES (REGISTROS)
CLRF
Acción |
Borra un registro |
Sintaxis |
CLRF f |
Funcionamiento |
Clear file register |
Hexadecimal |
01 8f |
Bits (OPCODE) |
00 0001 1fff ffff |
Operación |
F = 0 |
Descripción |
Esta instrucción borra un registro específico, poniendo sus bits a cero |
Comentarios |
Ninguno |
Registro STATUS |
Modifica el bit Z y lo pone a 1 (ya que el resultado de la operación es 0). |
Ejemplo |
Tenemos un registro que se llama dato y que vale 3F. Ponemos:
CLRF dato
Ahora dato vale 00 |
Ciclos de máquina |
1 |
CLRW
Acción |
Borra el acumulador |
Sintaxis |
CLRW |
Funcionamiento |
Clear W |
Hexadecimal |
01 8f |
Bits (OPCODE) |
00 0001 0xxx xxxx |
Operación |
W = 0 |
Descripción |
Esta instrucción borra el registro W solamente |
Comentarios |
Donde pone xxx
en la instrucción en hexadecimal, significa que noo importa qué valor puede contener |
Registro STATUS |
Modifica el bit Z y lo pone a 1 (ya que el resultado de la operación es 0). |
Ejemplo |
Tenemos el acumulador cargado con el valor 3F. Ponemos:
CLRF dato
Ahora W vale 00 |
Ciclos de máquina |
1 |
COMF
Acción |
Complementa el registro F |
Sintaxis |
COMF f,d |
Funcionamiento |
Complement f |
Hexadecimal |
09 ff |
Bits (OPCODE) |
00 1001 dfff ffff |
Operación |
d = NOT f (d puede ser W ó f). |
Descripción |
Esta instrucción complementa un registro, es decir, los ceros los convierte en unos, y los unos en ceros. |
Comentarios |
ninguno |
Registro STATUS |
Modifica el bit Z.
- Z vale 1 si el resultado de la operación es 0.
|
Ejemplo |
Supongamos que tenemos un registro fdenominado regist = 00111011; cuando es aplicada la instrucción tenemos que los 0 cambian a valores 1 y los valores 1 cambian a 0 obteniéndose un registro invertido. El resultado será regist = 11000100. |
Ciclos de máquina |
1 |
DECF
Acción |
Decrementa el registro f |
Sintaxis |
DECF f,d |
Funcionamiento |
Decrement f |
Hexadecimal |
03 ff |
Bits (OPCODE) |
00 0011 dfff ffff |
Operación |
d = f 1 (d puede ser W ó f). |
Descripción |
Esta instrucción decrementa en una sola unidad el registro "f". |
Comentarios |
ninguno |
Registro STATUS |
Modifica el bit Z.
- Z vale 1 si el resultado de la operación es 0.
|
Ejemplo |
Nuestro registro se llama regist = 5; cuando se aplica la instrucción DECF f,0 el resultado será W=4.
Por el contrario, si aplicamos la instrucción DECF f,1 el resultado será regist = 4. |
Ciclos de máquina |
1 |
DECFSZ
Acción |
Decrementa el registro f, y si el resultado es cero, se salta una instrucción. |
Sintaxis |
DECFSZ f,d |
Funcionamiento |
Decrement f, skip if 0 |
Hexadecimal |
0B ff |
Bits (OPCODE) |
00 1011 dfff ffff |
Operación |
d = f 1, si d = 0 SALTA (d puede ser W ó f). |
Descripción |
Esta instrucción decrementa el contenido del registro direccionado por el parámetro f, y si el resultado es 0 salta la instrucción siguiente. Si no, sigue con su curso habitual |
Comentarios |
Aquí nos enfrentamos ante la primera instrucción que plantea una condición, y que modifica el curso del PC. |
Registro STATUS |
No modifica ningún bit de estado |
Ejemplo |
DECFSZ VALOR, W
INSTRUCCION 1
INSTRUCCIÓN 2
Si el contenido del registro VALOR al decrementarlo es igual a 0, se guarda el resultado en el acumulador y sigue con la INSTRUCCION2, saltándose la INSTRUCCION1.
Si el resultado que guardamos en W no es 0, sigue con la INSTRUCCION1 y después con la INSTRUCCION2 (no se salta la inmediata siguiente). |
Ciclos de máquina |
1 (2) Si tiene que saltar ocupa dos ciclos |
INCF
Acción |
Suma una unidad al registro f |
Sintaxis |
INCF f,d |
Funcionamiento |
Increment f |
Hexadecimal |
0A ff |
Bits (OPCODE) |
00 1010 dfff ffff |
Operación |
d = f + 1 (d puede ser W ó f). |
Descripción |
Esta instrucción incrementa en una sola unidad el registro "f". |
Comentarios |
Ninguno |
Registro STATUS |
Modifica el bit Z.
- Z vale 1 si el resultado de la operación es 0.
|
Ejemplo |
Si tenemos un registro llamado DIA = 7.
Aplicando la instrucción
INCF DIA, 0, tendremos W = 8 y DIA = 7.
Si aplicamos esta otra
INCF DIA, 1, tendremos DIA = 8. |
Ciclos de máquina |
1 |
INCFSZ
Acción |
Incrementa en 1 a f, y si f= 0 salta la siguiente instrucción |
Sintaxis |
INCFSZ f,d |
Funcionamiento |
Increment f, Skip if 0 |
Hexadecimal |
0F ff |
Bits (OPCODE) |
00 1111 dfff ffff |
Operación |
d = f + 1, si d = 0 SALTA (d puede ser W ó f). |
Descripción |
Esta instrucción incrementa en una sola unidad el registro "f", en la cual si el resultado d es igual a cero, entonces salta la instrucción siguiente. |
Comentarios |
Ninguno |
Registro STATUS |
No modifica ningún bit de estado. |
Ejemplo |
Ejecutamos las siguiente sinstrucciones:
INCFSZ VALOR, W ; el resultado se almacenará en W
INSTRUCCION 1 ; salta aquí si W≠0
INSTRUCCIÓN 2 ; salta aquí si W=0
Si el contenido del registro VALOR es igual a 0 al incrementarlo en una unidad, se guarda el resultado en el acumulador y sigue con la INSTRUCCION2, saltándose la INSTRUCCION1.
Si el resultado que guardamos en W no es 0, sigue con la INSTRUCCION1 y después con la INSTRUCCION2 (no se salta la inmediata siguiente). |
Ciclos de máquina |
1 (2) Si tiene que saltar ocupa dos ciclos |
IORWF
Acción |
Operación lógica OR entre el acumulador y un registro |
Sintaxis |
IORWF f,d |
Funcionamiento |
Inclusive Or W with F |
Hexadecimal |
04 ff |
Bits (OPCODE) |
00 0100 dfff ffff |
Operación |
d = W OR f (d puede ser W ó f). |
Descripción |
Esta instrucción realiza una operación lógica OR inclusivo entre el acumulador W y el registro direccionado por el parámetro f. El parámetro d determina donde se almacenará el resultado de la operación. Si no se pone nada, el valor por defecto es 1 y se guarda en f. |
Comentarios |
La operación OR inclusivo suele llamarse OR a secas, pero se pone así para diferenciarla de la Suma Exclusiva que veremos más adelante. La tabla de verdad de la suma lógica es la que sigue:
ENTRADA |
SALIDA |
f |
W |
S |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
La operación lógica que describe esta instrucción es esta:
F + W = S
Se puede ver que basta con que uno de los dos registros tenga un uno para que la salida sea un uno también. |
Registro STATUS |
Modifica el bit Z.
- Z vale 1 si el resultado de la operación es 0.
|
Ejemplo 1 |
Supongamos que W= 00001111 y f = 11110000 antes de ejecutar la instrucción IORWF f,d, y después obtenemos:
ENTRADA |
RESULTADO |
|
W |
f |
W + f |
Bit 7 |
0 |
1 |
1 |
Bit 6 |
0 |
1 |
1 |
Bit 5 |
0 |
1 |
1 |
Bit 4 |
0 |
1 |
1 |
Bit 3 |
1 |
0 |
1 |
Bit 2 |
1 |
0 |
1 |
Bit 1 |
1 |
0 |
1 |
Bit 0 |
1 |
0 |
1 |
|
Ejemplo 2 |
En este segundo ejemplo tenemos que W = 01110011 y f = 00101001, antes de ejecutar la instrucción IORWF f,d, y después obtenemos que:
ENTRADA |
RESULTADO |
|
W |
f |
W + f |
Bit 7 |
0 |
0 |
0 |
Bit 6 |
1 |
0 |
1 |
Bit 5 |
1 |
1 |
1 |
Bit 4 |
1 |
0 |
1 |
Bit 3 |
0 |
1 |
1 |
Bit 2 |
0 |
0 |
0 |
Bit 1 |
1 |
0 |
1 |
Bit 0 |
1 |
1 |
1 |
Al igual que el caso anterior, el microcontrolador compara bit a bit los dos registros, dos a dos, obteniendo el resultado expresado en W + f |
Ciclos de máquina |
1 |
MOVF
Acción |
Mueve el contenido de un registro al acumulador o al propio registro |
Sintaxis |
MOVF f,d |
Funcionamiento |
Move f |
Hexadecimal |
08 ff |
Bits (OPCODE) |
00 1000 dfff ffff |
Operación |
d = f (d puede ser W ó f). |
Descripción |
Esta instrucción mueve el contenido del registro f en el mismo registro f o en W. D determina el destino del resultado. Si no se pone nada, el valor por defecto es 1 y se guarda en f. |
Comentarios |
Se suele usar para mover datos al acumulador. El hecho de que se pueda mover sobre sí mismo no es otro que para mirar el resultado en el registro STATUS (no es ninguna tontería ;)) |
Registro STATUS |
Modifica el bit Z.
- Z vale 1 si el resultado de la operación es 0.
|
Ejemplo |
Tenemos el registro EDAD = 38
MOVF EDAD, 0 ; hace que W = 38.
MOVF EDAD, 1 ; hace que EDAD = 38.
MOVF EDAD, W ; hace que W = 38.
MOVF EDAD ; hace que EDAD = 38. |
Ciclos de máquina |
1 |
MOVWF
Acción |
Mueve el acumulador al registro f |
Sintaxis |
MOVWF f |
Funcionamiento |
Move W to f |
Hexadecimal |
00 ff |
Bits (OPCODE) |
00 0000 1fff ffff |
Operación |
f = W |
Descripción |
Esta instrucción copia el contenido del acumulador W en el registro direccionado por el parámetro f. |
Comentarios |
No existe el parámetro d (lógico, o no? En este caso no se puede copiar el acumulador sobre sí mismo :p ) |
Registro STATUS |
No modifica ningún bit de estado. |
Ejemplo |
Si queremos escribir el valor 10H en el registro TMR0, que está situado en la dirección 01h, tendremos que cargar primero el valor en el acumulador y después copiarlo al registro.
MOVWF 10H ; cargar el valor 10H en el acumulador.
MOVWF 01H ; copia el acumulador en la dirección 01H.
O escrito de otra manera:
MOVWF 10H ; cargar el valor 10H en el acumulador.
MOVWF TMR0 ; copia el acumulador en el registro TMR0. |
Ciclos de máquina |
1 |
NOP
Acción |
No opera |
Sintaxis |
NOP |
Funcionamiento |
No Operation |
Hexadecimal |
00 00 |
Bits (OPCODE) |
00 0000 0xx0 0000 |
Operación |
Ninguna |
Descripción |
Esta instrucción no reliza ninguna ejecución, pero sirve para gastar un ciclo de máquina, equivalente a 4 de reloj |
Comentarios |
Ninguno |
Registro STATUS |
No modifica ningún bit de estado. |
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. |
Ciclos de máquina |
1 |
RLF
Acción |
Rota a la izquierda el registro f |
Sintaxis |
RLF f,d |
Funcionamiento |
Rotate Left through Carry f |
Hexadecimal |
0D ff |
Bits (OPCODE) |
00 1101 dfff ffff |
Operación |
d = << 1 (d puede ser W ó f). |
Descripción |
Esta instrucción rota a la izquierda todos los bits del registro direccionado por el parámetro fpasando por el bit CARRY del registro STATUS (desde los bits menos significativos a los más significativos).
Es como si multiplicáramos por dos el contenido del registro.
Veamos el registro fde forma gráfica:
El bit D7 pasa al CARRY del registro STATUS, el contenido del CARRY pasa al D0, el D0 al D1, etc. |
Comentarios |
Ninguno |
Registro STATUS |
Modifica el bit C (CARRY). |
Ejemplo |
Tenemos el registro VALOR = 00000001 y aplicamos la instrucción
RLF VALOR
Entonces el resultado será VALOR = 00000010 y el bit C = 0.
Si tenemos el registro VALOR = 10000000 y aplicamos la instrucción
RLF VALOR
El resultado será VALOR = 00000000 y el bit C = 1. |
Ciclos de máquina |
1 |
RRF
Acción |
Rota a la derecha el registro f |
Sintaxis |
RRF f,d |
Funcionamiento |
Rotate Right through Carry f |
Hexadecimal |
0C ff |
Bits (OPCODE) |
00 1100 dfff ffff |
Operación |
d = f >> 1 (d puede ser W ó f). |
Descripción |
Esta instrucción rota a la derecha todos los bits del registro direccionado por el parámetro fpasando por el bit CARRY del registro STATUS (desde los bits más significativos a los menos significativos).
Es como si dividiéramos por dos el contenido del registro.
Veamos el registro fde forma gráfica:
El bit C del registro STATUS pasa al D7, el D0 pasa al bit C, el D1 al D0, etc.
El bit d determina el destino del resultado. Si no se pone nada, el valor por defecto es 1 y se guarda en f. |
Comentarios |
Ninguno |
Registro STATUS |
Modifica el bit C (CARRY). |
Ejemplo |
Si tenemos el registro VALOR = 00000001 y aplicamos la instrucción
RRF VALOR
Entonces el resultado será VALOR = 00000000 y el bit C = 1.
Si tenemos el registro VALOR = 10000000 y aplicamos la instrucción
RRF VALOR
El resultado será VALOR = 01000000 y el bit C = 0. |
Ciclos de máquina |
1 |
SUBWF
Acción |
Resta el contenido del registro W el registro f |
Sintaxis |
SUBWF f,d |
Funcionamiento |
Subtract W from f |
Hexadecimal |
02 ff |
Bits (OPCODE) |
00 0010 dfff ffff |
Operación |
d = f W (d puede ser W ó f). |
Descripción |
Esta instrucción resta el valor contenido en el acumulador W del valor contenido en el registro direccionado por el parámetro f. El parámetro ddetermina el destino. Si no se pone nada el valor por defecto será 1 y se almacenará en f. |
Comentarios |
Ninguno |
Registro STATUS |
Modifica los bits Z, DC y C.
- Z vale 1 si el resultado de la operación es 0.
- DC vale 1 si el resultado de la operación es un número superior a 15.
C vale 1 si el resultado de la operación es positivo o el bit 7 del registro que contiene el resultado vale 0. En caso contrario C vale 0 (resultado negativo). |
Ejemplo |
Según sean los valores de W y el registro DATO, si aplicamos
SUBWF DATO
obtendremos diferentes resultados en el bit CARRY.
Si DATO = 3 y W = 2; el resultado será DATO = 1 y C = 1.
Si DATO = 2 y W = 2; el resultado será DATO = 0 y C = 1.
Si DATO = 1 y W = 2; el resultado será DATO = FFH y C = 0.
Vemos que C = 1 porque el resultado es positivo y C = 0 cuando el resultado es negativo. |
Ciclos de máquina |
1 |
SWAPF
Acción |
Invierte los dos nibbles que forman un byte dentro de un registro |
Sintaxis |
SWAPF f,d |
Funcionamiento |
Swap nibbles in f |
Hexadecimal |
0E ff |
Bits (OPCODE) |
00 1110 dfff ffff |
Operación |
f = 0123 SWAP 4567 de f |
Descripción |
Esta instrucción intercambia el valor de los 4 bits más significativos (D7-D4) contenidos en el registro f, con los 4 bits menos significativos (D3-D0) del mismo. El parámetro d determina el destino. Si no se pone nada, el valor por defecto es 1 y se guarda en f. |
Comentarios |
Ninguno |
Registro STATUS |
No modifica ningún bit de estado. |
Ejemplo |
Tenemos VALOR = 00001111 y W = 00000000. Aplicamos la instrucción SWAPF
SWAPF VALOR ; VALOR = 11110000B y W = 00000000B.
SWAPF VALOR, W ; VALOR = 00001111B y W = 11110000B.
Con la primera instrucción modificamos el valor del registro DATO, y en la segunda instrucción modificamos el valor del acumulador sin que varíe el registro DATO |
Ciclos de máquina |
1 |
XORWF
Acción |
Operación lógica OR-Exclusiva |
Sintaxis |
XORWF f,d |
Funcionamiento |
Exclusive OR W with f |
Hexadecimal |
06 ff |
Bits (OPCODE) |
00 0110 dfff ffff |
Operación |
d = W OR f |
Descripción |
Esta instrucción efectúa la operación lógica XOR (OR exclusivo) entre el valor contenido en el acumulador W y el valor contenido en el registro direccionado por el parámetro f. El parámetro d determina el destino. Si no se pone nada el valor por defecto es 1 y se guarda en f |
Comentarios |
Al igual que las otras operaciones lógicas, la suma exclusiva está tratada en el capítulo de electrónica digital. No obstante expongo las tablas de verdad correspondientes a esta operación
ENTRADA |
SALIDA |
f |
W |
S |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
La salida únicamente se podrá a nivel alto cuando las dos entradas sean distintas. Esto es útil cuando tenemos una suma lógica en la que 1 + 1 es 10 y nos llevamos 1.
Esta operación algebraicamente se expresa así:
S = f + W
|
Registro STATUS |
Modifica el bit Z.
Z vale 1 si el resultado de la operación es 0. |
Ejemplo 1 |
Tenemos dos registros que se corresponden con los siguientes valores W= 00001111 y f = 11110000 antes de ejecutar la instrucción XORWF f,d. Una vez ejecutada obtenemos la siguiente tabla de verdad sobre los dos registros:
ENTRADA |
RESULTADO |
|
W |
f |
W + f |
Bit 7 |
0 |
1 |
1 |
Bit 6 |
0 |
1 |
1 |
Bit 5 |
0 |
1 |
1 |
Bit 4 |
0 |
1 |
1 |
Bit 3 |
1 |
0 |
1 |
Bit 2 |
1 |
0 |
1 |
Bit 1 |
1 |
0 |
1 |
Bit 0 |
1 |
0 |
1 |
El PIC compara dos a dos los bits de los registros |
Ejemplo 2 |
Ahora W = 01110011 y f = 00101001 antes de ejecutar la instrucción XORWF f,d y después obtenemos:
ENTRADA |
RESULTADO |
|
W |
f |
W + f |
Bit 7 |
0 |
0 |
0 |
Bit 6 |
1 |
0 |
1 |
Bit 5 |
1 |
1 |
1 |
Bit 4 |
1 |
0 |
1 |
Bit 3 |
0 |
1 |
1 |
Bit 2 |
0 |
0 |
0 |
Bit 1 |
1 |
0 |
1 |
Bit 0 |
1 |
1 |
0 |
|
Ciclos de máquina |
1 |
INSTRUCCIONES ORIENTADAS AL MANEJO DE BITS
BCF
Acción |
Pone a cero el bit b del registro f |
Sintaxis |
BCF f,b |
Funcionamiento |
Bit Clear f |
Hexadecimal |
1b ff |
Bits |
01 00bb bfff ffff |
Operación |
F(b) = 0 |
Descripción |
Esta instrucción pone a cero un bit que hayamos elegido de un registro determinado. |
Comentarios |
No debemos olvidar que en la numeración de los bits también se tiene en cuenta el 0. Si tratamos con un registro especial, podemos poner el nombre del bit correspondiente. |
Registro STATUS |
No modifica ningún bit de estado. |
Ejemplo |
BCF PORTA, RA4 ; pone a 0 el bit RA4 del registro PORTA
BCF PORTA, 4 ; igual, si no conocemos en nombre del bit
Si en el PORTA tenemos como valor inicial 11111111, después de aplicar el ejemplo anterior, PORTA = 11101111. |
Ciclos de máquina |
1 |
BSF
Acción |
Pone a uno el bit b del registro f |
Sintaxis |
BSF f,b |
Funcionamiento |
Bit Set f |
Hexadecimal |
1b ff |
Bits (OPCODE) |
01 01bb bfff ffff |
Operación |
F(b) = 1 |
Descripción |
Esta instrucción pone a uno un bit que hayamos elegido de un registro determinado. |
Comentarios |
Ninguno |
Registro STATUS |
No modifica ningún bit de estado. |
Ejemplo |
BSF PORTA, RA0 ; pone a 1 el bit RA0 del registro PORTA
BSF PORTA, 0 ; igual, si no conocemos en nombre del bit
Si en el PORTA tenemos como valor inicial 00000000, después de aplicar el ejemplo anterior, PORTA = 00000001. |
Ciclos de máquina |
1 |
BTFSC
Acción |
Comprueba un bit b del registro f, y salta la instrucción siguiente si este es cero |
Sintaxis |
BTFSC f,b |
Funcionamiento |
Bit Test, Skip if Clear |
Hexadecimal |
1b ff |
Bits (OPCODE) |
01 10bb bfff ffff |
Operación |
F(b) = 0? SI, salta una instrucción |
Descripción |
Esta instrucción comprueba el valor del bit b en el registro f, y si b = 0 entonces se salta la siguiente instrucción. Si b = 1 no salta y sigue con su ejecución normal. |
Comentarios |
Ninguno |
Registro STATUS |
No modifica ningún bit de estado |
Ejemplo |
BTFSC PORTA, 2
INSTRUCCIÓN 1
INSTRUCCIÓN 2
Si en PORTA tenemos como valor inicial 11111011, el programa continúa con la instrucción 2, saltándose la instrucción 1
Si en PORTA tenemos el valor 00000100, el programa sigue con la instrucción 1 y después la instrucción 2 |
Ciclos de máquina |
1 (2) Si tiene que saltar ocupa dos ciclos |
BTFSS
Acción |
Comprueba un bit b del registro f, y salta la instrucción siguiente si este es uno |
Sintaxis |
BTFSC f,b |
Funcionamiento |
Bit Test, Skip if Set |
Hexadecimal |
1b ff |
Bits (OPCODE) |
01 11bb bfff ffff |
Operación |
F(b) = 1? SI, salta una instrucción |
Descripción |
Esta instrucción comprueba el valor del bit b en el registro f, y si b = 1 entonces se salta la siguiente instrucción. Si b = 0 no salta y sigue con su ejecución normal. |
Comentarios |
Ninguno |
Registro STATUS |
No modifica ningún bit de estado |
Ejemplo |
BTFSS PORTB, 7
INSTRUCCIÓN 1
INSTRUCCIÓN 2
Si en PORTB tenemos como valor inicial 10000000, el programa continúa con la instrucción 2, saltándose la instrucción 1. Si tenemos el valor 01111111, el programa sigue con la instrucción 1 y después la instrucción 2. |
Ciclos de máquina |
1 (2) Si tiene que saltar ocupa dos ciclos |
OPERACIONES CON LITERALES Y DE CONTROL
ADDLW
Acción |
Suma a W un literal |
| |