DESCRIPCIÓN DE LAS INSTRUCCIONES Todas las instrucciones del PIC cumplen las siguientes condiciones: Las instrucciones son simples y rápidas. Todas tienen un tiempo de ejecución de un ciclo de instrucción (cuatro ciclos de reloj) a excepción de las de salto que tienen un tiempo de ejecución de dos ciclos de instrucción. Las instrucciones son ortogonales. Casi todas las instrucciones tienen una longitud de 14 bits y los datos una longitud de 1 byte. 1 JUEGO DE INSTRUCCIONES El juego de instrucciones de la CPU está compuesto por 35 instrucciones. En los 14 bits que forman las instrucciones máquina del PIC se incluyen el código de operación propiamente dicho y los operandos en caso de que estos existan. Todas las instrucciones son de un ciclo, excepto las de salto que duran dos ciclos. Las instrucciones pueden ser: Instrucciones que manejan registros. Instrucciones que manejan bits. Instrucciones de salto o “brinco”. Instrucciones que manejan operandos inmediatos. Instrucciones especiales y de control. 2 1 JUEGO DE INSTRUCCIONES La nomenclatura que utilizan estas instrucciones es la siguiente: En las instrucciones orientadas a manejo registros, “f” representa un registro y “d” representa el destino. Si d es “0” el resultado de la operación se sitúa en el registro de trabajo W, mientras que si d es “1” el resultado se sitúa en el mismo registro “f”. En las instrucciones orientadas a bits, “b” representa en binario la posición (0-7) del bit dentro del byte, “f” representa el byte o registro. (EL bit 0 es el bit de menor peso). En las instrucciones con literales y de control, “k” representa la constante o literal que según los casos puede ser de 8 u 11 bits. “x” corresponde con un valor indeterminado que puede ser 0 o 1. 3 JUEGO DE INSTRUCCIONES El ensamblador, para expresar números en distintas bases numéricas, utiliza los siguientes formatos Base Hexadecimal Decimal Binario Representación 0x0a ó h’0a’ ó 0a ó 0ah d’10’ b’00001010’ 4 2 DESCRIPCIÓN DE LAS INSTRUCCIONES ADDLW [ ADDLW k] 1 Añade el contenido del registro W al literal k y almacena el resultado en W. Ejemplo: ADDLW 0x15 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 3º al 4º bit. Z --- Se pone a 1 si el resultado de la operación es cero. 5 DESCRIPCIÓN DE LAS INSTRUCCIONES ADDWF [ADDWF f,d] 2 Añade el contenido del registro W al contenido del registro “f”, y almacena el resultado en W si d = 0, y en el registro “f” si d = 1. Ejemplo: ADDWF FSR,0 Si antes de la instrucción: W = 17h y FSR = C2 como d = 0 Al ejecutarse: W = 17h + C2h = D9h FSR = C2h 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 3º al 4º bit. Z --- Se pone a 1 si el resultado de la operación es cero. 6 3 DESCRIPCIÓN DE LAS INSTRUCCIONES ANDLW [ANDLW k] 3 Efectúa la operación AND lógica entre el contenido del registro W y el literal k, y almacena el resultado en W. Ejemplo: ANDLW 0x5F Si antes de la instrucción: W = A3h Al ejecutarse la instrucción: W = 0101 1111 b AND 1010 0011 b = 0000 0011 b = 03h Puede verse afectado el bit Z 7 DESCRIPCIÓN DE LAS INSTRUCCIONES ANDWF [ANDWF f,d] 4 Efectúa la operación AND lógica entre el contenido del registro W y el contenido del registro “f”, y almacena el resultado en W si d = 0, y en “f” si d=1. Ejemplo: ANDWF FSR,1 Si antes de la instrucción: W = 17h = 0001 0111 b FSR = C2h = 1100 0010 b Al ejecutarse: W = 17h = 0001 0111 b FSR = 0001 0111 b AND 1100 0010 b = 0000 0010 b = 02h Z - Se pone a 1 si el resultado de la operación es cero 8 4 DESCRIPCIÓN DE LAS INSTRUCCIONES BCF [BCF f,d] 5 Pone a cero el bit número “b” del registro “f”. Ejemplo: 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 el valor: FLAG_REG = 47h = 0100 1111 b 9 DESCRIPCIÓN DE LAS INSTRUCCIONES BSF [BSF f,d] 6 Pone a 1 el bit “b” del registro “f”. Ejemplo: BSF FLAG _REG,7 Si antes de la instrucción el registro tiene el valor: FLAG_REG = 0Ah = 0000 1010 b Al ejecutarse la instrucción, el registro queda con el valor: FLAG_REG = 8Ah = 1000 1010 b 10 5 DESCRIPCIÓN DE LAS INSTRUCCIONES BTFSC [BTFSC f,b] 7 Si el bit “b” del registro “f” es 0, se salta la siguiente instrucción, no se ejecuta, y se continúa con la ejecución del programa. Cuando se produce este salto, son necesarios dos ciclos. Ejemplo: LEER BTFSC GOTO BCF PORTA,2 LEER MEMO,7 Si el bit “2” del registro PORTA es “1”, entraremos en un bucle, repitiendo la instrucción BTFSC constantemente. Si el bit “2” del registro PORTA es “0”, no se ejecuta la instrucción GOTO (ir a) y se realizará el borrado del bit “7” del registro MEMO, continuando con el programa 11 DESCRIPCIÓN DE LAS INSTRUCCIONES BTFSS [BTFSS f,b] 8 Si el bit “b” del registro “f” es 1, se salta la siguiente instrucción, no se ejecuta, y se continúa con la ejecución del programa. Cuando se produce este salto, son necesarios dos ciclos. Ejemplo: LEER BTFSS GOTO BCF PORTA,2 LEER MEMO,7 Si el bit 2 del registro PORTA es 0, entramos en un bucle, repitiendo la instrucción BTFSS continuamente. Si el bit 2 del registro PORTA es 1, no se ejecuta la instrucción GOTO (ir a LEER) y se realiza el borrado del bit 7 del registro MEMO, continuando con el programa. 12 6 DESCRIPCIÓN DE LAS INSTRUCCIONES CALL [CALL k] 9 Salto a subrutina. La dirección de retorno se guarda en la pila (PC + 1). El literal k de 11 bits forma la dirección de salto y se carga en los bits B0 al B10 del PC. Los bits B11 y B12 se cargan con los bits B3 y B4 del registro PCLATH. Ejemplo: DIR CALL DIREC Si antes de la instrucción: PC = dirección DIR Al ejecutarse: PC = dirección DIREC TOS = dirección DIR + 1 13 DESCRIPCIÓN DE LAS INSTRUCCIONES CLRF [CLRF f] 10 Pone a cero el contenido del registro “f” y pone a 1 el bit Z del registro STATUS. Ejemplo: CLRF MEMO Antes de la instrucción: MEMO = 0x83 = b’1000 0011’ Después de la instrucción: MEMO = 0x00 = b’0000 0000’ 14 7 DESCRIPCIÓN DE LAS INSTRUCCIONES CLRW [CLRW] 11 Pone a cero el contenido del W y pone a uno el bit Z del registro STATUS. Ejemplo CLRW Antes de la instrucción: W = 0x6D Después de la instrucción: W = 0x00 15 DESCRIPCIÓN DE LAS INSTRUCCIONES CLRWDT [CLRWDT] 12 Pone a cero el contenido del WDT como su preescaler. Los bits TO y PD del registro STATUS se ponen a uno. Ejemplo: CLRWDT Antes de la instrucción: WDT = 0x7F Después de la instrucción: WDT = 0x00, Preescaler = 0, TO = 1, PD = 1 16 8 DESCRIPCIÓN DE LAS INSTRUCCIONES COMF [COMF f,d] 13 Realiza el complemento del contenido del registro “f” bit a bit. El resultado se almacena en el registro “f” si d = 1 y o en el registro W si d = 0, en este caso “f” no varía. Z = 1 si el resultado es cero. Ejemplo COMF CTDOR,1 Antes de la instrucción: W = 0xxx = b’xxxx xxxx’ CTDOR = 0x99 = b’1001 1001’ Después de la instrucción: W = 0x66 = b’0110 0110’ CTDOR = 0x99 = b’1001 1001’ 17 DESCRIPCIÓN DE LAS INSTRUCCIONES DECF [DECF f,d] 14 Se decrementa en una unidad el contenido de “f”, y almacena el resultado en W si d = 0 o en el registro “f” si d = 1. Si el destino es W el contenido del registro “f” no varía. Si el resultado de la operación es cero el bit Z se pone a uno. Ejemplo 1.DECF CTDOR,1 Antes de la instrucción: CTDOR = 0x99 = D’153’ Z=0 Después de la instrucción: CTDOR = 0x98 = D’152’ Z=0 18 9 DESCRIPCIÓN DE LAS INSTRUCCIONES Ejemplo 2.- DECF CTDOR,0 Antes de la instrucción: W = 0xxx = D’xxx’ CTDOT = 0x01 = D’001’ Z=0 Después de la instrucción: W = 0x00 = D’000’ CTDOR = 0x01 = D’ 001’ Z=1 19 DESCRIPCIÓN DE LAS INSTRUCCIONES DECFSZ [DECFSZ f,d] 15 Se decrementa en una unidad el contenido de “f” y almacena el resultado en W si d = 0 o en el registro “f” si d = 1. Si el destino es W el contenido del registro “f” no varía. Si el resultado de la operación es cero, se ignora la siguiente instrucción. Cuando se produce este salto, son necesarios dos ciclos. Ejemplo: VER DECFSZ CTDOR,1 GOTO VER DECF MEMO,1 Se decrementa el valor de CTDOR, sustituyendo el valor anterior por el actual. Si el valor del registro CTDOR no es cero, se ejecutará la instrucción GOTO (ir a VER), repitiendo este bucle hasta que el valor del CTDOR valga cero. En este momento se producirá el salto de la instrucción GOTO, ejecutando la siguiente a esta. 20 10 DESCRIPCIÓN DE LAS INSTRUCCIONES GOTO [GOTO k] 16 Salto incondicional. Normalmente se utiliza para llamar a la subrutina situada en la dirección a la que se carga el PC. El literal k de 11 bits forma la dirección de salto y se carga en los bits B0-B10 del PC. Los bits B11 y B12 del PC se cargan con los bits B3 y B4 del registro PCLATH. Ejemplo: DIR GOTO DEREC Si antes de la instrucción: PC = dirección DIR Al ejecutarse: PC = dirección DIREC 21 DESCRIPCIÓN DE LAS INSTRUCCIONES INCF [INCF f,d] 17 Se incrementa el contenido del registro “f” en una unidad y almacena el resultado en W si d = 0 y en el registro “f” si d = 1. Si el destino es W, el contenido del registro “f” no varía. Ejemplo 1.INCF CTDOR,0 Antes de la instrucción: W = 0x6C = D’108’ CTDOR = 0x19 = D’25’ Z=0 Después de la instrucción: W = 0x1A = D’26’ CTDOR = 0x19 = D’25 Z=0 22 11 DESCRIPCIÓN DE LAS INSTRUCCIONES Ejemplo 2.INCF CTDOR,1 Antes de la instrucción: W = 0x6C = D’108’ CTDOR = 0xFF = D’255’ Z=0 Después de la instrucción: W = 0x6C = D’108’ CTDOR = 0x00 = D’0’ Z=1 23 DESCRIPCIÓN DE LAS INSTRUCCIONES INCFSZ [INCFSZ f,d] 18 Se incrementa el contenido del registro “f” en una unidad, y almacena el resultado en W si d = 0 y en “f” si d = 1. Si el destino es W, el contenido del registro “f” no varía. Si el resultado de la operación es cero, se ignora la siguiente instrucción. Cuando se produce este salto, son necesarios dos ciclos. Ejemplo.VER INCFSZ GOTO DECF CTDOR,1 VER MEMO,1 Se incrementa el valor de CTDOR, sustituyendo el valor anterior por el actual. Si el valor del registro CTDOR no es cero, se ejecutará la instrucción GOTO (ir a VER), repitiendo este bucle hasta que el valor de CTDOR se cero. En este momento se producirá el salto de la instrucción GOTO, ejecutando la siguiente a esta. 24 12 DESCRIPCIÓN DE LAS INSTRUCCIONES IORLW [IORLW k] 19 Realiza la operación lógica OR entre el contenido del registro W y el literal k. El resultado se almacena en W. Ejemplo.IORLW 0xB6 Antes de la instrucción: W = 0xC0 = b’1100 0000’ L = 0xB6 = b’ 1011 0110’ Después de la instrucción: W = 0xF6 = b’1111 0110’ Z=1 25 DESCRIPCIÓN DE LAS INSTRUCCIONES IORWF [IORWF f,d] 20 Realiza la operación lógica OR entre el contenido del registro W y el contenido del registro “f”, y almacena el resultado en W si d = 0 y en el registro “f” si d = 1. Ejemplo.IORWF TEMP,0 Antes de la instrucción: W = 0x91 = b’1001 0001’ TEMP = 0x13 = b’0001 0011’ Después de la instrucción: W = 0x93 = b’1001 0011’ TEMP = 0x13 = b’0001 0011’ Z=1 26 13 DESCRIPCIÓN DE LAS INSTRUCCIONES MOVF [MOVF f,d] 21 Mueve el contenido del registro “f” al registro destino, dependiendo del valor de d. El registro destino será W si d = 0 y será “f” si d = 1. Esta instrucción permite comprobar el valor de “f”, ya que Z queda afectado. Ejemplo.MOVF CONTA,0 Antes de la instrucción: W = 0x46 CONTA = 0x13 Después de la instrucción: W = 0x13 CONTA = 0x13 27 DESCRIPCIÓN DE LAS INSTRUCCIONES MOVLW [MOVLW k] 22 Mueve el valor literal k al registro W. Ejemplo: MOVLW 0x44 Antes de la instrucción: W = 0x3C L = 0x44 Después de la instrucción: W = 0x44 28 14 DESCRIPCIÓN DE LAS INSTRUCCIONES MOVWF [MOVWF f] 23 Mueve el contenido del registro W al registro “f”. Ejemplo: MOVWF NUM Antes de la instrucción: W = 0x3F NUM = 0x10 Después de la instrucción: W = 0x3F NUM = 0x3F 29 DESCRIPCIÓN DE LAS INSTRUCCIONES NOP [NOP] 24 No realiza ninguna operación. Se consume un ciclo de instrucción sin hacer nada. Ejemplo ----------------------NOP ----------- 30 15 DESCRIPCIÓN DE LAS INSTRUCCIONES RETFIE [RETFIE] 25 Carga el PC con el valor que se encuentra en la parte alta de la pila, asegurando así la vuelta de la interrupción. Pone a uno el bit GIE del registro INTCON, con el fin de autorizar de nuevo que se tengan en cuenta las interrupciones. Ejemplo: RETFIE Después de la instrucción: PC = TOS Bit GIE = 1 31 DESCRIPCIÓN DE LAS INSTRUCCIONES RETLW [RETLW k] 26 Se mueve el valor del literal k al W, después se carga en el PC el valor que se encuentra en la parte alta de la pila, efectuando así un retorno de subrutina. Ejemplo: TAB CALL TAB ; En W está el valor de offset de la tabla. ----------------ADDWF PC ; Se carga en PC el valor de offset, inicio ; de la tabla. RETLW k1 ; Primer valor de la tabla (offset + 1). RETLW k2 ; Siguiente valor (offset + 2). RETLW k3 ; (offset + 3). --------------RETLW kn ; Último valor de la tabla (offset + n). Antes de la instrucción: W = 0x06 (valor de offset) Después de la instrucción: W = valor de la tabla correspondiente a k7 32 16 DESCRIPCIÓN DE LAS INSTRUCCIONES RETURN [RETURN] 27 Carga el PC con el valor que se encuentra en la parte alta de la pila, asegurando así la vuelta de la subrutina. Ejemplo: RETURN Después de la instrucción: PC = TOS 33 DESCRIPCIÓN DE LAS INSTRUCCIONES RLF [RLF f,d] 28 Rotación de un bit hacia la izquierda del contenido del registro “f”, pasando por el bit de acarreo C, y almacena el resultado en W si d = 0 y en “f” si d=1 C B7 B6 Registro “f” B5 B4 B3 B2 B1 B0 Ejemplo: RLF TEMP,0 Antes de la instrucción: W = 0x2F = b’0011 1111’ TEMP = 0xC5 = b’1100 0101’ C=0 Después de la instrucción: W = 0x8A = b’ 1000 1010’ TEMP = 0xC5 = b’ 1100 0101’ C=1 34 17 DESCRIPCIÓN DE LAS INSTRUCCIONES RRF [RRF f,d] 29 Rotación de un bit hacia la derecha del contenido del registro “f”, pasando por el bit de acarreo C, y almacena el resultado en W so d = 0 y en el registro “f” si d = 1. Registro “f” C B7 B6 B5 B4 B3 B2 B1 B0 Ejemplo: RRF TEMP,0 Antes de la instrucción: W = 0x2F = b’0011 1111’ TEMP = 0xC5 = b’1100 0101’ C=0 Después de la instrucción: W = 0x62 = b’0110 0010’ TEMP = 0xC5 = b’ 1100 0101’ C=1 35 DESCRIPCIÓN DE LAS INSTRUCCIONES SLEEP [SLEEP] 30 Pone en modo SLEEP (bajo consumo) al microcontrolador. En este modo el oscilador principal deja de funcionar. Pone a uno el bit TO (Timer Out) y a cero el bit PD (Power Down). Ejemplo: ----------SLEEP ----------------------- 36 18 DESCRIPCIÓN DE LAS INSTRUCCIONES SUBLW [SUBLW k] 31 Resta, por el método de complemento a dos, al literal k el contenido de W ( k – W), y almacena el resultado en W. El bit Z se pone a uno si el resultado de la operación es cero. El DC se pone a uno si se produce un acarreo del 3er bit al grupo de los cuatro bits de mayor peso. El bit C se pone a uno si se produce acarreo en el bit de mayor peso. Ejemplo 1: SUBLW 0x07 Antes de la instrucción: W = 0x02 = D’2’ Después de la instrucción: W = 0x05 = D’5’ C = 1 ; El resultado es positivo. Z = 0 ; El resultado no es cero 37 DESCRIPCIÓN DE LAS INSTRUCCIONES Ejemplo 2: SUBLW 0x02 Antes de la instrucción: W = 0x02 = D’2’ Después de la instrucción: W = 0x00 = D’0’ C = 1 ; El resultado es positivo. Z = 1 ; El resultado es cero. Ejemplo 3: SUBLW 0x02 Antes de la instrucción: W = 0x03 = D’3’ Después de la instrucción: W = 0xFF = D’255’ C = 0 ; El resultado es negativo. Z = 0 ; El resultado no es cero 38 19 DESCRIPCIÓN DE LAS INSTRUCCIONES SUBWF [SUBWF f,d] 32 Resta, por el método de complemento a dos, el contenido del registro “f” con el contenido del registro W, y almacena el resultado en W si d = 0 y en “f” si d = 1. El bit Z se pone a uno si el resultado de la operación es cero. El DC se pone a uno si se produce acarreo del 3er bit al grupo de los cuatro bits de mayor peso. El bit C se pone a uno si se produce un acarreo del bit de mayor peso. Ejemplo 1: SUBWF VALOR,1 Antes de la instrucción: W = 0x02 = D’2’ VALOR = 0x07 = D’7’ Después de la instrucción: W = 0x02 = D’2’ VALOR = 0x05 = D’5’ C = 1 ; Resultado positivo Z = 0 ; Resultado no es cero 39 DESCRIPCIÓN DE LAS INSTRUCCIONES Ejemplo 2: SUBWF VALOR,1 Antes de la instrucción: W = 0x02 = D’2’ VALOR = 0x02 = D’2’ Después de la instrucción: W = 0x02 = D’2’ VALOR = 0x00 = D’0’ C = 1 ; Resultado positivo. Z = 1 ; Resultado es cero. Ejemplo 3: SUBWF VALOR,1 Antes de la instrucción: W = 0x02 = D’2’ VALOR = 0x01 = D’1’ Después de la instrucción: W = 0x02 = D’2’ VALOR = 0xFF = D’255’ C = 0 ; El resultado es negativo. Z = 0 ; El resultado no es cero. 40 20 DESCRIPCIÓN DE LAS INSTRUCCIONES SWAPF [SWAPF f,d] 33 Intercambio de los cuatro bits de mayor peso por los cuatro bits de menor peso del mismo registro. El registro destino será W si d = 0 i será “f” si d=1. Ejemplo: SWAPF REG,0 Antes de la instrucción: REG = 0x69 = b’0110 1001’ Después de la instrucción: W = 0x96 = b’1001 0110’ REG = 0x69 = b’0110 1001’ 41 DESCRIPCIÓN DE LAS INSTRUCCIONES XORLW [XORLW k] 34 Realiza la operación lógica OR – EXCLUSIVA bit a bit, entre el contenido del registro W y el literal k, y almacena el resultado en W. El bit Z se pone a uno si el resultado es cero. Ejemplo: XORLW 0x84 Antes de la instrucción: W = 0xBC = b’1011 1100’ L = 0x84 = b’1000 0100’ Después de la instrucción: W = 0x38 = b’0011 1000’ 42 21 DESCRIPCIÓN DE LAS INSTRUCCIONES XORWF [XORWF f,d] 35 Realiza la operación lógica OR – EXCLUSIVA bit a bit entre el contenido del registro W y el contenido del registro “f”, y almacena el resultado en W si d=0, o en el registro “f” si d = 1. El bit Z se pone a uno si el resultado de la operación es cero. Ejemplo: XORWF REG,1 Antes de la instrucción: W = 0xB5 = b’1011 0101’ REG = 0xAF = b’1010 1111’ Después de la instrucción: W = 0xB5 = b’1011 0101’ REG = 0x1A = b’0001 1010’ 43 22