REPERTORIO DE INSTRUCCIONES

 

3.1 Características generales 

Habiendo escogido los diseñadores de PIC la filosofía RISC, su juego de instrucciones es reducido (33 instrucciones en la gama baja), siendo éstas, además, sencillas y rápidas, puesto que casi todas se ejecutan en un único ciclo de máquina (equivalente a 4 del reloj principal). Sus operandos son de gran flexibilidad, pudiendo actuar cualquier objeto como fuente y como destino. 

Posee tres tipos bien diferenciados de direccionamiento, estos son: 

1º Inmediato: El valor del dato está incluido en el propio código OP, junto a la instrucción. 

2º Directo: La dirección del dato está incluido en el propio código OP, junto a la instrucción. 

3º Indirecto: La dirección de la memoria de datos que guarda el operando está contenida en un registro. 

Nosotros nos centraremos en la gama media, que tiene 35 instrucciones. La mayoría son idénticas a las de la gama baja, si bien las diferencias serán convenientemente explicadas. 

3.2 Definiciones y abreviaturas 

Ante todo es conveniente que usted tenga clara la estructura interna del micro, puesto que las instrucciones la referencian, y puesto que en cualquier micro la comprensión de la nomenclatura de sus componentes es esencial. De este modo hemos creado la siguiente tabla para ayudarle a comprender las abreviaturas:

 

Abreviatura                                       Descripción

PC

 

 

 

 

TOS

 

WDT

 

W

 

F

 

 

 

D

 

 

 

Dest

 

TO

 

PD

 

b

 

 

k

 

 

 

 

x

 

 

 

label

 

[]

()

®

<>

Î

 

Z

 

 

C

 

 

DC

 

 

Itálicas

 

Contador de Programa que direcciona la memoria de instrucciones. Tiene un tamaño de 11 bits en la gama baja, de los cuales los 8 de menos peso configuran el registro PCL que ocupa el registro 0x02 del área de datos. 

Cima de la pila, con 2 niveles en la gama baja y 8 en la media

 Perro guardián (Watchdog)

 Registro W, similar al acumulador 

 Suele ser un campo de 5 bits (fffff) que contiene la dirección del banco de registros, que ocupa el banco 0 del área de datos. Direcciona uno de esos registros. 

 

Bit del código OP de la instrucción, que selecciona el destino. Si d=0, el destino es W, y si d=1 el destino es f. 

Destino (registro W o f) 

Bit “Time Out” del registro de estado

 Bit “Power Down” del registro de estado

Suele ser un campo de 3 bits (bbb) que determinan la posición de un bit dentro de un registro de 8 bits

Se trata, normalmente, de un campo de 8 bits (kkkkkkkk) que representa un dato inmediato. También puede constar de 9 bits en las instrucciones de salto que cargan al PC 

Valor indeterminado (puede ser un 0 o un 1). Para mantener la compatibilidad  con las herramientas software de Microchip conviene hacer x = 0

 Nombre de la etiqueta

 Opciones

Contenido

Se asigna a

Campo de bits de un registro

Pertenece al conjunto

 Señalizador de cero en W. Pertenece al registro de estado 

Señalizador de acarreo en el octavo bit del W. Pertenece al registro de estado

 Señaliza el acarreo en el 4 bit del W. Pertenece al registro de estado

 Términos definidos por el usuario

 

 

3.3 Repertorio de instrucciones de la gama media

ADDLW    Suma un literal

 

Sintaxis:     [label]  ADDLW  k

Operandos: 0 £ k £ 255

Operación: :    (W) + (k)Þ (W)

Flags afectados: C, DC, Z

Código OP:     11 111x kkkk kkkk

 

Descripción: Suma el contenido del registro W y k, guardando el resultado en W.

 

 

Ejemplo:           ADDLW 0xC2

 

   Antes: W =  0x17

   Después: W = 0xD9

ADDWF          W + F

 

Sintaxis:                    [label]  ADDWF f,d

Operandos: d Î [0,1], 0 £ f  £ 127

Operación:    (W) + (f) Þ (dest)

Flags afectados: C, DC, Z

Código OP:      00  0111  dfff  ffff

 

Descripción: Suma el contenido del registro W y el registro f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.

 

Ejemplo:           ADDWF REG,0

 

   Antes: W =  0x17., REG = 0xC2

   Después: W = 0xD9, REG = 0xC2

ANDLW    W AND literal

 

Sintaxis:     [label]  ANDLW  k

Operandos: 0 £ k £ 255

Operación: :    (W) AND (k)Þ (W)

Flags afectados:   Z

Código OP:     11 1001 kkkk kkkk

 

Descripción: Realiza la operación lógica AND entre el contenido del registro W y k, guardando el resultado en W.

 

Ejemplo:           ADDLW 0xC2

 

   Antes: W =  0x17

   Después: W = 0xD9

ANDWF          W AND F

 

Sintaxis:      [label]  ANDWF f,d

Operandos: d Î [0,1], 0 £ f  £ 127

Operación:  (W) AND (f) Þ (dest)

Flags afectados:    Z

Código OP:     00  0101  dfff  ffff

 

Descripción: Realiza la operación lógica AND entre los registros W y f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.

Ejemplo: :           ANDWF REG,0

 

   Antes: W =  0x17., REG = 0xC2

   Después: W = 0x17, REG = 0x02

BCF        Borra un bit

 

Sintaxis:     [label]  BCF f,b

Operandos:  0 £ f £ 127, 0 £ b £ 7

Operación: :    0 Þ (f<b>)

Flags afectados: Ninguno

Código OP:     01 00bb bfff  ffff

 

Descripción: Borra el bit b del registro f

 

 

Ejemplo: :              BCF REG,7

 

   Antes: REG =  0xC7

   Después: REG = 0x47

BSF       Activa un bit

 

Sintaxis:      [label] BSF f,b

Operandos: 0 £ f  £ 127, , 0 £ b £ 7

Operación:  1 Þ (f<b>)

Flags afectados: Ninguno

Código OP:     01  01bb  bfff  ffff

 

Descripción: Activa el bit b del registro f

 

 

Ejemplo: :           BSF REG,7

 

   Antes: REG = 0x0A

   Después: REG = 0x8A

BTFSC   Test de bit y salto

 

Sintaxis:                    [label]  BTFSC f,d

Operandos: d Î [0,1],  0 £ f  £ 127

Operación:    Salto si  (f<b>) = 0

Flags afectados: Ninguno

Código OP:      01  10bb  bfff  ffff

 

Descripción: Si el bit b del registro f es 0, se salta una instrucción y se continúa con la ejecución. En caso de salto, ocupará dos ciclos de reloj.

 

Ejemplo:           BTFSC REG,6

                           GOTO NO_ES_0

           SI_ES_0  Instrucción

         NO_ES_0  Instrucción

BTFSS    Test de bit y salto

 

Sintaxis:                    [label]  BTFSS f,d

Operandos: d Î [0,1], 0 £ f  £ 127

Operación:    Salto si  (f<b>) = 1

Flags afectados: Ninguno

Código OP:      01  11bb  bfff  ffff

 

Descripción: Si el bit b del registro f es 1, se salta una instrucción y se continúa con la ejecución. En caso de salto, ocupará dos ciclos de reloj.

 

Ejemplo:           BTFSS REG,6

                           GOTO NO_ES_0

           SI_ES_0  Instrucción

         NO_ES_0  Instrucción

CALL     Salto a subrutina

 

Sintaxis:                    [label]  CALL k

Operandos:  0 £  k  £ 2047

Operación:    PC Þ Pila; k Þ PC

Flags afectados: Ninguno

Código OP:      10  0kkk  kkkk  kkkk

 

Descripción: Salto a una subrutina. La parte baja de k se carga en PCL, y la alta en PCLATCH. Ocupa 2 ciclos de reloj.

 

Ejemplo:ORIGEN CALL DESTINO

 

   Antes:  PC = ORIGEN

   Después: PC = DESTINO

 
Cuadro de texto:

 

CLRF      Borra un registro

 

Sintaxis:     [label]  CLRF f

Operandos: 0 £ f  £ 127

Operación: :    0x00 Þ (f), 1 Þ Z

Flags afectados: Z

Código OP:     00 0001 1fff  ffff

 

Descripción: El registro f se carga con 0x00. El flag Z se activa.

 

 

Ejemplo: :           CLRF REG

 

   Antes: REG =  0x5A

   Después: REG = 0x00, Z = 1

CLRW Borra el registro W

 

Sintaxis:     [label]  CLRW

Operandos: Ninguno

Operación: :    0x00 Þ W, 1 Þ Z

Flags afectados: Z

Código OP:     00 0001 0xxx  xxxx

 

Descripción: El registro de trabajo W se carga con 0x00. El flag Z se activa.

 

Ejemplo: :           CLRW

 

   Antes: W =  0x5A

   Después: W = 0x00, Z = 1

CLRWDT    Borra el WDT

 

Sintaxis:      [label]  CLRWDT

Operandos: Ninguno

Operación: 0x00 Þ WDT, 1 Þ /TO

                                         1 Þ /PD

Flags afectados:    /TO, /PD

Código OP:     00  0000  0110  0100

Descripción: Esta instrucción borra tanto el WDT como su preescaler. Los bits /TO y /PD del registro de estado se ponen a 1.

 

Ejemplo: :           CLRWDT

   Después: Contador WDT = 0,      

                   Preescales WDT = 0,

                  /TO = 1, /PD = 1

COMF Complemento de f

 

Sintaxis:     [label]  COMF f,d

Operandos: d Î [0,1], 0 £ f  £ 127

Operación: :     (/ f), 1 Þ  (dest)

Flags afectados: Z

Código OP:     00 1001 dfff  ffff

 

Descripción: El registro f es complementado. El flag Z se activa si el resultado es 0. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f..

 

Ejemplo: :           COMF REG,0

 

   Antes: REG =  0x13

   Después: REG = 0x13, W = 0XEC

DECF    Decremento de f

 

Sintaxis:     [label]  DECF f,d

Operandos: d Î [0,1], 0 £ f  £ 127

Operación: :    (f ) – 1 Þ (dest)

Flags afectados:   Z

Código OP:     00 0011 dfff  ffff

 

Descripción: Decrementa en 1 el contenido de f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.

 

 

Ejemplo: :           DECF CONT,1

 

   Antes: CONT = 0x01, Z = 0

   Después: CONT = 0x00, Z = 1

DECFSZ Decremento y salto

 

Sintaxis:                    [label]  DECFSZ f,d

Operandos: d Î [0,1], 0 £ f  £ 127

Operación:   (f) -1 Þ d; Salto si R=0

Flags afectados: Ninguno

Código OP:      00  1011  dfff  ffff

 

Descripción: Decrementa el contenido del registro f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f. Si la resta es 0 salta la siguiente instrucción, en cuyo caso costaría 2 ciclos.

Ejemplo:           DECFSC REG,0

                           GOTO NO_ES_0

           SI_ES_0  Instrucción

  NO_ES_0  Salta instrucción anterior

 

GOTO    Salto incondicional

 

Sintaxis:                    [label]  GOTO k

Operandos:  0 £  k  £ 2047

Operación:    k Þ PC <8:0>

Flags afectados: Ninguno

Código OP:      10  1kkk  kkkk  kkkk

 

Descripción: Se trata de un salto incondicional. La parte baja de k se carga en PCL, y la alta en PCLATCH. Ocupa 2 ciclos de reloj.

 

Ejemplo: ORIGEN GOTO DESTINO

 

   Antes: PC = ORIGEN

   Después: PC = DESTINO

INCF    Decremento de f

 

Sintaxis:     [label]  INCF f,d

Operandos: d Î [0,1], 0 £ f  £ 127

Operación: :    (f ) + 1 Þ (dest)

Flags afectados:   Z

Código OP:     00 1010 dfff  ffff

 

Descripción: Incrementa en 1 el contenido de f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.

 

Ejemplo: :           INCF CONT,1

 

   Antes: CONT = 0xFF, Z = 0

   Después: CONT = 0x00, Z = 1

INCFSZ Incremento y salto

 

Sintaxis:                    [label]  INCFSZ f,d

Operandos: d Î [0,1], 0 £ f  £ 127

Operación:   (f) -1 Þ d; Salto si R=0

Flags afectados: Ninguno

Código OP:      00  1111  dfff  ffff

 

Descripción: Incrementa el contenido del registro f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f. Si la resta es 0 salta la siguiente instrucción, en cuyo caso costaría 2 ciclos.

 

Ejemplo:           INCFSC REG,0

                           GOTO NO_ES_0

          SI_ES_0  Instrucción

  NO_ES_0  Salta instrucción anterior

IORLW    W OR literal

 

Sintaxis:     [label]  IORLW  k

Operandos: 0 £ k £ 255

Operación: :    (W) OR (k)Þ (W)

Flags afectados:   Z

Código OP:     11 1000 kkkk kkkk

 

Descripción: Se realiza la operación lógica OR entre el contenido del registro W y k, guardando el resultado en W.

 

Ejemplo: :           IORLW 0x35

 

   Antes: W =  0x9A

   Después: W = 0xBF

IORWF                  W AND F

 

Sintaxis:      [label]  IORWF f,d

Operandos: d Î [0,1], 0 £ f  £ 127

Operación:  (W) OR (f) Þ (dest)

Flags afectados:    Z

Código OP:     00  0100  dfff  ffff

 

Descripción: Realiza la operación lógica OR entre los registros W y f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.

 

Ejemplo: :           IORWF REG,0

 

   Antes: W =  0x91, REG = 0x13

   Después: W = 0x93, REG = 0x13

 

MOVLW  Cargar literal en W

 

Sintaxis:                    [label]  MOVLW f

Operandos: 0 £ f  £ 255

Operación:      (k) Þ (W)

Flags afectados: Ninguno

Código OP:      11  00xx  kkkk  kkkk

 

Descripción: El literal k pasa al registro W.

 

 

 

Ejemplo:                 MOVLW 0x5A

 

     Después: REG = 0x4F, W = 0x5A

MOVF                Mover a f

 

Sintaxis:                    [label]  MOVF f,d

Operandos: d Î [0,1],  0 £ f  £ 127

Operación:      (f) Þ (dest)

Flags afectados: Z

Código OP:      00  1000  dfff  ffff

Descripción: El contenido del registro f se mueve al destino d. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f. Permite verificar el registro, puesto que afecta a Z.

 

Ejemplo:                  MOVF REG,0

 

                Después: W = REG

MOVWF             Mover a f

 

Sintaxis:                    [label]  MOVWF f

Operandos: 0 £ f  £ 127

Operación:      W Þ (f)

Flags afectados: Ninguno

Código OP:      00  0000  1fff  ffff

 

Descripción: El contenido del registro W pasa el registro f.

 

 

 

Ejemplo:                 MOVWF REG,0

 

          Antes: REG = 0xFF, W = 0x4F

      Después: REG = 0x4F, W = 0x4F

NOP                 No operar

 

Sintaxis:      [label]  NOP

Operandos: Ninguno

Operación: No operar

Flags afectados:    Ninguno

Código OP:     00  0000  0xx0  0000

 

Descripción: No realiza operación alguna. En realidad consume un ciclo de instrucción sin hacer nada.

 

 

Ejemplo: :           CLRWDT

 

   Después: Contador WDT = 0,      

                   Preescales WDT = 0,

                  /TO = 1, /PD = 1

RETFIE Retorno de  interrup.

 

Sintaxis:     [label]  RETFIE

Operandos: Ninguno

Operación: :   1 Þ GIE;  TOSÞPC

Flags afectados:   Ninguno

Código OP:     00 0000  0000  1001

 

Descripción: El PC se carga con el contenido de la cima de la pila (TOS): dirección de retorno. Consume 2 ciclos. Las interrupciones vuelven a ser habilitadas.

Ejemplo: :                           RETFIE

 

   Después: PC = dirección de retorno

                   GIE = 1

RETLW  Retorno, carga W

 

Sintaxis:     [label]  RETLW  k

Operandos: 0 £ k £ 255

Operación: :   (k)Þ (W);  TOSÞPC

Flags afectados:   Ninguno

Código OP:     11 01xx kkkk kkkk

 

Descripción: El registro W se carga con la constante k. El PC se carga con el contenido de la cima de la pila (TOS): dirección de retorno. Consume 2 ciclos.

Ejemplo: :           RETLW 0x37

 

   Después: PC = dirección de retorno

                   W = 0x37

RETURN Retorno de rutina

 

Sintaxis:     [label]  RETURN

Operandos: Ninguno

Operación: :   TOS Þ PC

Flags afectados:   Ninguno

Código OP:     00 0000  0000  1000

 

Descripción: El PC se carga con el contenido de la cima de la pila (TOS): dirección de retorno. Consume 2 ciclos.

 

Ejemplo: :                          RETURN

 

   Después: PC = dirección de retorno

RLF    Rota f a la izquierda

 

Sintaxis:                    [label]  RLF f,d

Operandos: d Î [0,1],  0 £ f  £ 127

Operación:  Rotación a la izquierda

Flags afectados: C

Código OP:      00  1101  dfff  ffff

 

Descripción: El contenido de f se rota a la izquierda. El bit de menos peso de f pasa al carry (C), y el carry se coloca en el de mayor peso. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.

 

Ejemplo:                  RRF REG,0

 

  Antes: REG = 1110 0110,   C = 0

  Después: REG = 1110 0110,

      W =  1100 1100, C = 1

RRF      Rota f a la derecha

 

Sintaxis:                    [label]  RRF f,d

Operandos: d Î [0,1],  0 £ f  £ 127

Operación:  Rotación a la derecha

Flags afectados: C

Código OP:      00  1100  dfff  ffff

 

Descripción: El contenido de f se rota a la derecha. El bit de menos peso de f pasa al carry (C), y el carry se coloca en el de mayor peso. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.

 

Ejemplo:                  RRF REG,0

 

  Antes: REG = 1110 0110,   C = 1

  Después: REG = 1110 0110,

      W =  01110 0011, C = 0

SLEEP Modo bajo consumo

 

Sintaxis:      [label]  SLEEP

Operandos: Ninguno

Operación: 0x00ÞWDT, 1 Þ / TO

     0 Þ WDT Preescaler, 0 Þ / PD

Flags afectados:    / PD, / TO

Código OP:     00  0000  0110  0011

 

Descripción: El bit de energía se pone a 0, y a 1 el de descanso. El WDT y su preescaler se borran. El micro para el oscilador, llendo al modo “durmiente”.

 

Ejemplo: :                            SLEEP

 

                   Preescales WDT = 0,

                  /TO = 1, /PD = 1

SUBLW  Resta Literal - W

 

Sintaxis:                    [label]  SUBLW  k

Operandos:  0 £ k £ 255

Operación:     ( k ) - (W) Þ (W)

Flags afectados: Z, C, DC

Código OP:      11  110x  kkkk  kkkk

Descripción: Mediante el método del complemento a dos el contenido de W es restado al literal. El resultado se almacena en W.

 

 

Ejemplos:                  SUBLW   0x02

 

Antes:W=1,C=?. Después: W=1, C=1

Antes:W=2,C=?. Después: W=0, C=1

Antes:W=3,C=?.Después:W=FF,C=0

                  (El resultado es negativo)

SUBWF            Resta f – W

 

Sintaxis:                    [label]  SUBWF f,d

Operandos: d Î [0,1],  0 £ f  £ 127

Operación:      ( f ) – (W )Þ  (dest)

Flags afectados: C, DC, Z

Código OP:      00  0010  dfff  ffff

Descripción: Mediante el método del complemento a dos el contenido de W es restado al de f. . Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.

 

Ejemplos:                SUBWF REG,1

Antes: REG = 0x03, W = 0x02, C = ?

Después:REG=0x01, W = 0x4F, C=1

Antes: REG = 0x02, W = 0x02, C = ?

Después:REG=0x00, W =0x02, C= 1

Antes: REG= 0x01, W= 0x02, C= ?

Después:REG=0xFF, W=0x02, C= 0

                          (Resultado negativo)

SWAPF    Intercambio de f

 

Sintaxis:     [label]  SWAPF f,d

Operandos: d Î [0,1], 0 £ f  £ 127

Operación: :   (f <3: 0>)Û (f <7:4>)

Flags afectados:   Ninguno

Código OP:     00 1110 dfff  ffff

 

Descripción: Los 4 bits de más peso y los 4 de menos son intercambiados. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.

 

Ejemplo: :           SWAPF REG,0

 

   Antes: REG = 0xA5

   Después: REG = 0xA5, W = 0x5A

XORLW    W OR literal

 

Sintaxis:     [label]  XORLW  k

Operandos: 0 £ k £ 255

Operación: :    (W) XOR (k)Þ (W)

Flags afectados:   Z

Código OP:     11 1010 kkkk kkkk

 

Descripción: Se realiza la operación lógica XOR entre el contenido del registro W y k, guardando el resultado en W.

 

Ejemplo: :           XORLW 0xAF

 

   Antes: W =  0xB5

   Después: W = 0x1A

XORWF                W AND F

 

Sintaxis:      [label]  XORWF f,d

Operandos: d Î [0,1], 0 £ f  £ 127

Operación:  (W) XOR (f) Þ (dest)

Flags afectados:    Z

Código OP:     00  0110  dfff  ffff

 

Descripción: Realiza la operación lógica XOR entre los registros W y f. Si d es 0, el resultado se almacena en W, si d es 1 se almacena en f.

 

Ejemplo: :           XORWF REG,0

 

   Antes: W =  0xB5, REG = 0xAF

   Después: W = 0xB5, REG = 0x1A



 

 

3.4 Instrucciones de la gama baja


La gama baja carece de 4 de las instrucciones de la gama media. Estas son ADDLW, RETFIE, RETURN y SUBLW. En cambio, y puesto que los registros OPTION y TRIS no son accesibles, se añaden las dos siguientes:

OPTION Carga del reg. option

 

Sintaxis:      [label]  OPTION

Operandos: Ninguno

Operación: (W) Þ  OPTION

Flags afectados:    Ninguno

Código OP:      0000  0000  0010

 

Descripción: El contenido del registro W se carga en el registro OPTION, registro de sólo lectura en el que se configura el funcionamiento del preescaler y el TMR0.

  

Ejemplo: :                            OPTION

     Antes: W= 0x06, OPTION = 0x37

 Después: W= 0x06, OPTION = 0x06

TRIS    Carga del registro TRIS

 

Sintaxis:      [label]  TRIS f

Operandos:   5  £ f  £  7

Operación: (W)Þ Registro TRIF<f>

Flags afectados:    Ninguno

Código OP:    0000  0000  0fff

 

Descripción: El contenido del registro W se carga en el registro TRISA, TRISB o TRISC, según el valor de f. Estos registros de sólo lectura configuran las patillas de un puerto como de entrada o salida.

 

Ejemplo: :                   TRIS PORTA

     Antes: W=0xA5, TRISA=0x56

Después: W=0xA5, TRISA=0xA5


 

Observe que el código OP de las instrucciones de la gama baja sólo ocupan 12 bits, no correspondiéndose, por tanto, con el de la gama media. 

Otras diferencias fundamentales entre ambas gamas son, por ejemplo, que en la baja el vector de reset (la primera línea que se ejecuta tras un reset) es la última de la memoria correspondiente, mientras que en la media es la 0x00. El vector de interrupción (situado en la 0x04) no existe en la gama baja. 

En la gama baja se necesita emplear los bits PA2-PA0 como parte alta de la dirección de programa en las instrucciones CALL y GOTO. 

Las páginas de la gama baja son más pequeñas, y se deben revisar todas las escrituras de los registros OPTION, ESTADO y FSR en la conversión del código. 

Por tanto, fácilmente comprobamos que el código entre ambas gamas no es 100% compatible.

Hosting by WebRing.
Navigation by WebRing.