You are on page 1of 11

REPERTORIO DE INSTRUCIONES

3.1 OPERADORES ARITMTICOS En los operandos de las instrucciones pueden aparecer expresiones matemticas cuyo valor numrico ser calculado por el programa ensamblador en el momento de ensamblar el programa fuente. Por ejemplo: movlw MensajeFin Mensajelnicio ;El ensamblador calcula automticamente la longitud ;del mensaje realizando una resta. ;Resto del programa. MensajeInicio ;(Aqu ira un mensaje de longitud desconocida). MensajeFin

3.2 EL REPERTORIO DE INSTRUCCIONES El repertorio del PIC16F84 est compuesto por 35 instrucciones que pueden ser agrupadas para su estudio en los siguientes grupos: Instrucciones de carga. Instrucciones aritmticas. Instrucciones lgicas. Instrucciones de bit. Instrucciones de salto. Instrucciones para manejo de subrutinas. Instrucciones especiales. Las principales caractersticas del repertorio de instrucciones del PIC16F84 son: Es un juego reducido de 35 instrucciones simples y rpidas. La mayora de las instrucciones se ejecutan en 4 ciclos de reloj, menos las de salto que requieren 8 ciclos. Las instrucciones son ortogonales. Casi todas las instrucciones pueden usar cualquier operando. Todas las instrucciones tienen la misma longitud, 14 bits y todos los datos son de 8 bits. Las instrucciones se pueden observar en la tabla 3-1.

3.3 INSTRUCCIONES DE CARGA Las instrucciones de transferencias de datos son tpicas de todos los procesadores y su misin es transferir el contenido un registro fuente (f) a un registro destino (d) o bien cargar el destino con una constante. En los microcontroladores PIC todos los datos residen en posiciones de la memoria de datos y en el registro de trabajo W. En la explicacin de estas instrucciones se emplea muchas veces una nomenclatura especial muy simple basada en parntesis y flechas. Con los parntesis se destaca que se trata del contenido de las posiciones de memoria y la flecha la direccin de la transferencia de los datos. Algunos ejemplos: (W) (PORTB): Significa el contenido del registro W se transfiere al puerto B. (2Bh) (W): Significa el contenido de la posicin 2Bh de RAM de datos se transfiere al registro de trabajo W. 2Bh (W): Significa el registro de trabajo se carga con el dato 2Bh. (Notar la ausencia de parntesis).

Guin de clase elaborado por Ing. Mario de Jess Martnez Snchez

Hay cinco instrucciones de carga propiamente dichas: 3.3.1 clrw (Clear W). El contenido del registro W se borra (se carga con b00000000) y el flag Z se activa a 1. Esta instruccin tambin se podra considerar como aritmtica. Ejemplo: Antes instruccin: Despus instruccin: clrw (W) = ? y Z = ? (W) = 0x00 y Z = 1. ;0 (W)

3.3.2 clrf f (Clear f). El contenido del registro f se borra (se carga con b00000000) y el flag Z se activa a uno. Esta instruccin tambin se podra considerar como aritmtica. Ejemplo: Antes instruccin: Despus instruccin: clrf FlagReg ;0 (FlagReg) = ? y Z = ? (FlagReg) = 0x00 y Z = 1. (FlagReg)

3.3.3 movlw k (Move Literal to W). El registro W se carga con el valor de los 8 bits de la constante k. Ningn flag del registro de estado es afectado. Ejemplo: Antes instruccin: Despus instruccin: movlw 0x5 (W) = ? (W) = 0x5A ; 5Ah (W)

3.3.4 movf f,d (Move f) El contenido del registro f se carga en el registro destino dependiendo del valor de d. Si d = 0 el destino es el registro W, si d = 1 el destino es el propio registro f. El flag Z del registro STATUS queda afectado: Z se activa a 1 si el resultado de la operacin es cero. Ejemplo 1: Antes instruccin: Despus instruccin: Ejemplo 2: Antes instruccin Despus instruccin: movf PORTA, 0 ; (PORTA) (W) (PORTA) = 0x1A, (W) = ? y Z = ? (PORTA) = 0x lA, (W) = 0x1A y Z = 0 movf .FSR, 1 ; (FSR) (FSR) (FSR) = 0x00, y Z = ? (FSR) = 0x00, y Z = 1 (el resultado de la operacin es 0).

3.3.5 movwf f (Move W to f). Carga el contenido del registro W al registro f. Ningn flag del registro de estado es afectado. Ejemplo: Antes instruccin: Despus instruccin: movwf PORTB ; (W) (PORTB) = ? y (W) = 0x4F. (PORTB) = 0x4F y (W) = 0x4F. (PORTB)

Guin de clase elaborado por Ing. Mario de Jess Martnez Snchez

NEMONICO clrf f clrw movf f,d movlw k movwf f bcf f,b bsf f,b addlw k addwf f,d decf f,d incf f,d sublw k subwf f,d andlw k andwf f,d comf f,d iorlw k iorwf f,d rlf f,d rrf f,d swapf f,d xorlw k xorwf f,d btfsc f,b btfss f,b decfsz f,d incfsz f,d goto k call k retfie retlw k return clrwdt nop sleep

DESCRIPCIN 00 (f) 00 (W) (f) (destino) k (W) (W) (f)

CDIGO DE OPERACIN

FLAGS AFECTADOS Z Z Z Ninguno Ninguno Ninguno Ninguno C, DC, Z C, DC, Z Z Z C, DC, Z C, DC, Z Z Z Z Z Z C C Ninguno Z Z Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno Ninguno /TO, /PD Ninguno /TO, /PD

Instrucciones de CARGA 00 0001 1fff ffff 00 0001 0xxx xxxx 00 1000 dfff ffff 11 00xx kkkk kkkk 00 0000 1fff ffff Instrucciones de BIT Pone a 0 el bit b del reg. f 01 00bb bfff ffff Pone a 1 el bit b del reg. f 01 01bb bfff ffff Instrucciones ARITMTICAS (W) + k (W) 11 111x kkkk kkkk (W) + (f) (destino) 00 0111 dfff ffff (f) 1 (destino) 00 0011 dfff ffff (f) + 1 (destino) 00 1010 dfff ffff k (W) W 11 110x kkkk kkkk (f) (W) (destino) 00 0010 dfff ffff Instrucciones LGICAS (W) AND k (W) 11 1001 kkkk kkkk (W) AND (f) (destino) 00 0101 dfff ffff (/f) (destino) 00 1001 dfff ffff (W) OR k (W) 11 1000 kkkk kkkk (W) OR (f) (destino) 00 0100 dfff ffff Rota (f) a izquierda del Carry (destino) 00 1101 dfff ffff Rota (f) a derecha del Carry (destino) 00 1100 dfff ffff Intercambia los nibbles de f (destino) 00 1110 dfff ffff (W) XOR k (W) 11 1010 kkkk kkkk (W) XOR (f) (destino) 00 0110 dfff ffff Instrucciones de SALTO Salta si el bit b del f es 0 01 10bb bfff ffff Salta si el bit b del f es 1 01 11bb bfff ffff (f) 1 (destino) y salta si es 0 00 1011 dfff ffff (f) + 1 (destino) y salta si es 0 00 1111 dfff ffff Salta a la direccin k 10 1kkk kkkk kkkk Instrucciones de manejo de SUBRUTINAS Llamada a subrutina 10 0kkk kkkk kkkk Retorno de una interrupcin 00 0000 0000 1001 Retorno con un literal en W 11 01xx kkkk kkkk Retorno de una subrutina 00 0000 0000 1000 Instrucciones de ESPECIALES Borra Timer del Watchdog 00 0000 0110 0100 No operacin 00 0000 0xx0 0000 Entra en modo de bajo consumo 00 0000 0110 0011 Tabla 3- 1: Repertorio de instrucciones del P1C16F84.

Guin de clase elaborado por Ing. Mario de Jess Martnez Snchez

3.4 INSTRUCCIONES DE BIT Estas instrucciones ponen a nivel lgico 0 1 un determinado bit de un registro de la memoria de datos. 3.4.1 bcf f,b (Bit Clear f). Pone a cero el bit b del registro f. Ejemplo: Antes instruccin: Despus instruccin: bcf FlagReg, 7 ;0 (FlagReg) = b11000111. (FlagReg) = b0l000l 11. (FlagReg,7)

3.4.2 bsf f,b (Bit Set f). Pone a uno el bit b del registro f. Ejemplo: Antes instruccin: Despus instruccin: bsf FlagReg,7 ;1 (FlagReg) = b0l000l 11. (FlagReg) = b11000111. (FlagReg,7)

3.5 INSTRUCCIN GOTO K En casi todos los programas se usa la instruccin de salto incondicional goto k (Unconditional Branch) que produce un salto a la direccin del programa indicada por k. La constante literal k es la direccin de destino del salto, es decir, la nueva direccin de memoria de programa a partir de la cual comenzarn a leerse las instrucciones despus de ejecutar la instruccin goto. As pues, esta instruccin simplemente carga la constante k en el contador de programa (PC). Ejemplo: Antes instruccin: Despus instruccin: goto Bucle ; Bucle 3 (PC) (PC) = ? (PC) = Direccin apuntada por la etiqueta Bucle.

A veces se utiliza el carcter de control dlar ($) para sealar que el salto se produce a la misma posicin de programa donde se encuentra situado en ese momento. As por ejemplo, las dos prximas instrucciones son equivalentes: AquiMismo goto AquiMismo goto $

3.6 CONFIGURAR LAS LNEAS DE LOS PUERTOS Al conectar por primera vez el PIC16F84 el bit RP0 del registro STATUS se carga automticamente con 0, con lo que se permite el acceso a las posiciones del Banco 0 de la memoria de datos. Para configurar las lneas de los puertos hay que acceder a los registros TRISA y TRISB que se hallan en el Banco 1 y cargar en ellos los valores adecuados. Por ello previamente hay que acceder al Banco 1 poniendo a 1 el bit RP0 del registro STATUS. Una vez configurados los puertos, habr que volver a poner a 0 el bit RP0 del registro STATUS para poder leer la informacin introducida por las lneas que funcionan como entradas o para poder enviar al exterior los bits colocados sobre las lneas de salida, cuyos valores se hallan en las posiciones 5 y 6 del Banco 0, que son las direcciones del Puerto A y Puerto B respectivamente (figura 2-1) A continuacin se muestra un ejemplo, donde el Puerto A se configura como entrada y el Puerto B se configura como salida. Este programa ejemplo se puede aplicar al circuito de la figura 3-1.

Guin de clase elaborado por Ing. Mario de Jess Martnez Snchez

Figura 3- 1: Circuito para comprobar el programa Ensam3_1.asm


;************************************** Ensam3_1.asm ************************************ ; ; Por el Puerto B se obtiene el dato de las cinco lneas del Puerto A al que est conectado ; un array de interruptores. Por ejemplo, si por el Puerto A se introduce "---11001", por ; el Puerto B aparecer "xxx11001" (el valor de las tres lneas superiores no importa). ; ZONA DE DATOS ********************************************************************** __CONFIG _WDT_OFF & _PWRTE_ON & _XT_OSC ; Configuracin para el ; grabador. LIST P=16F84A ; Procesador. INCLUDE <P16F84A.INC> ; Definicin de los operandos utilizados. ; ZONA DE CDIGOS ******************************************************************** ORG Inicio bsf clrf movlw movwf bcf Principal movf movwf goto END 0 STATUS,RP0 TRISB b'11111111' TRISA STATUS,RP0 PORTA,W PORTB Principal ; ; ; ; El programa comienza en la direccin 0 de memoria de programa. Pone a 1 el bit 5 del STATUS. Acceso al Banco 1. Las lneas del Puerto B se configuran como salidas. _CP_OFF &

; Las lneas del Puerto A se configuran como entradas. ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0. ; Lee el Puerto A. ; El contenido de W se visualiza por el Puerto B. ; Crea un bucle cerrado. ; Fin del programa.

Los registros TRISA y TRISB ocupan las posiciones 5 y 6 del Banco 1. Los puertos PORTA y PORTB ocupan las posiciones 5 y 6 del Banco 0 (figura 2-1), por tanto, el programa anterior se puede modificar como sigue:

Guin de clase elaborado por Ing. Mario de Jess Martnez Snchez

;************************************** Ensam3_1.asm ************************************ ; (Principio igual que el anterior) Inicio bsf clrf movlw movwf bcf Principal STATUS,RP0 PORTB b'11111111' PORTA STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1. ; Las lneas del Puerto B se configuran como salidas. ; Las lneas del Puerto A se configuran como entradas. ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.

(Continua igual que el anterior)

Segn la tabla 3-1 el cdigo mquina para la instruccin clrf f es 00 0001 1fff ffff, es decir, slo se toman los siete bits bajos de la direccin del registro f. Como la direccin del TRISB es 86h (bl000 0ll0) y la del PORTB es 06h (b0000 0ll0) sus siete bits ms bajos son idnticos y, por tanto, las instrucciones cfrf TRISB y clrf PORTB tienen exactamente el mismo cdigo mquina que es el 00 0001 1000 0110 (186h). Lo mismo se puede decir para las instrucciones movwf TRISA y movwf PORTA que tienen el cdigo mquina 00 0000 1000 0101 (085h). En el momento de la definicin del puerto como salida, el contenido de sus latches internos pasan al exterior, en caso de que sea importante que este sea cero el programa debe aadir una instruccin c1rf PORTB al principio:
;************************************** Ensam3_1.asm ************************************ ; (Principio igual que el anterior) Inicio clrf bsf clrf movlw movwf bcf Principal PORTB STATUS,RP0 PORTB b'11111111' PORTA STATUS,RP0 ; Inicializa el puerto para que las lneas vayan a nivel bajo ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1. ; Las lneas del Puerto B se configuran como salidas. ; Las lneas del Puerto A se configuran como entradas. ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.

(Continua igual que el anterior)

3.7 DIRECTIVAS Para poder ensamblar un programa automticamente el ensamblador necesita informacin en forma de directivas, que son comandos insertados en el programa que controla el proceso de ensamblado. No son parte del repertorio de instrucciones del microprocesador y, por lo tanto, no tienen traduccin al cdigo mquina del microcontrolador, por lo que tambin se les llama pseudoinstrucciones. MPASM es el programa ensamblador del PIC16F84 ms utilizado, tiene ms de 50 directivas que se explican en detalle en su men help y en la gua MPASM USERS GUIDE que se puede obtener gratuitamente en la pgina Web del fabricante www.microchip.com. Algunas de estas directivas deben ser utilizadas obligatoriamente en todos los programas, pero la mayora son opcionales y sirven para facilitar el desarrollo y la realizacin del programa. Las directivas del ensamblador suelen escribirse en la segunda columna y en maysculas, aunque no es obligatorio. Las ms utilizadas son: 3.7.1 END (End Program Biock). Indica el fin del programa. Es la nica directiva obligatoria. Al ensamblar un programa, el programa ensamblador debe saber dnde tiene que detener el proceso, para eso est la directiva END, la cual debe estar en la ltima lnea del programa y explcitamente le indica al ensamblador el fin de aqul. Todas las lneas posteriores a la lnea en la que se encuentra esta directiva son ignoradas y no se ensamblan. Ejemplo:
Inicio bsf END STATUS,RP0 ; Comienza el programa ejecutable.

; Fin del programa.

Guin de clase elaborado por Ing. Mario de Jess Martnez Snchez

3.7.2 EQU Su sintaxis es: <label> EQU <expr> Es una directiva de asignacin. El valor de <expr> es asignado a la etiqueta <label>. Usualmente las asignaciones con EQU van al principio del programa (antes de las instrucciones). Siempre que el nombre aparece en el programa es sustituido por el valor numrico de la expresin que se le haya asignado. Ejemplo:
ValorCarga EQU d147 ;Asigna el valor numrico de 147 a la etiqueta ValorCarga.

Generalmente la etiqueta es un nombre que describe el valor de manera ms significativa para el programador. Suele utilizarse para definir constantes y direcciones de memoria. As, es ms fcil recordar ValorCarga que su valor 147, o en el caso de una direccin de memoria PORTA que 0x05.

3.7.3 ORG (Set Program Origin). Su sintaxis es: <label> EQU <expr> Esta directiva indica al programa ensamblador la direccin en memoria de programa a partir de la cual deben ensamblarse las instrucciones del cdigo fuente. Es decir, la direccin de la memoria de programa donde se van a almacenar esas instrucciones es la fijada por la <expr> de la directiva. Ejemplo:
ORG 0x04 ;Los cdigos mquinas correspondientes a las instrucciones que aparecen en las lneas ;siguientes, deben ser ensamblados en la memoria de programa a partir de la direccin 4.

Si las instrucciones de un programa comienzan a escribirse sin indicar ORG, el ensamblador toma por defecto ORG 0x00. Cuando las distintas secciones de un programa deben colocarse en diferentes reas de memoria se usa una directiva ORG antes de cada parte del programa para especificar la direccin inicial u origen de esa porcin del programa. Es decir, en un programa pueden aparecer varios ORG dependiendo de las necesidades. En el ejemplo del archivo Ensam3_1.asm se aprecia la utilizacin de otras tres directivas: 3.7.4 CONFIG En el programa Ensam3_1.asm aparece como:
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

Esta directiva indica la configuracin elegida para el proceso de grabacin del microcontrolador. En este caso: No hay proteccin de cdigo (_CP_OFF). No se habilita el Watchdog (_WDT_OFF). Se habilita el reset mediante Power-Up Timer (_PWRTE_ON). Se utiliza el oscilador por cristal de cuarzo. (_XT._OSC). Es importante resaltar que _ _CONFIG se inicia con dos subrayados (guin bajo), no con uno. Este error es muy frecuente en los primeros programas. 3.7.5 LIST P=16F84A Indica el tipo de procesador utilizado. 3.7.6 INCLUDE <P16F84A.INC> Indica el archivo donde se localizan las etiquetas que nombran a los diferentes registros y el valor que le corresponde a cada uno, es decir, en el archivo Pl6F84A.INC se muestra como hay que nombrar a todos los registros propios del microcontrolador. Este archivo se localiza en el directorio principal del programa ensamblador y su contenido es el siguiente:

Guin de clase elaborado por Ing. Mario de Jess Martnez Snchez

LIST ; P16F84A.INC Standard Header File, Version 2.00 Technology, Inc. NOLIST

Microchip

; This header file defines configurations, registers, and other useful bits of ; information for the PIC16F84 microcontroller. These names are taken to match ; the data sheets as closely as possible. ; Note that the processor must be selected before this file is ; included. The processor may be selected the following ways: ; ; ; ; ; 1. Command line switch: C:\ MPASM MYFILE.ASM /PIC16F84A 2. LIST directive in the source file LIST P=PIC16F84A 3. Processor Type entry in the MPASM full-screen interface

;======================================================================== == ; ; Revision History ; ;======================================================================== == ;Rev: ;1.00 Date: Reason:

2/15/99 Initial Release

;======================================================================== == ; ; Verify Processor ; ;======================================================================== == IFNDEF __16F84A MESSG "Processor-header file mismatch. processor." ENDIF

Verify selected

;======================================================================== == ; ; Register Definitions ; ;======================================================================== == W F EQU EQU H'0000' H'0001'

Guin de clase elaborado por Ing. Mario de Jess Martnez Snchez

;----- Register Files----------------------------------------------------INDF TMR0 PCL STATUS FSR PORTA PORTB EEDATA EEADR PCLATH INTCON OPTION_REG TRISA TRISB EECON1 EECON2 EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU H'0000' H'0001' H'0002' H'0003' H'0004' H'0005' H'0006' H'0008' H'0009' H'000A' H'000B' H'0081' H'0085' H'0086' H'0088' H'0089'

;----- STATUS Bits ------------------------------------------------------IRP RP1 RP0 NOT_TO NOT_PD Z DC C EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- INTCON Bits ------------------------------------------------------GIE EEIE T0IE INTE RBIE T0IF INTF RBIF EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

;----- OPTION_REG Bits --------------------------------------------------NOT_RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 EQU EQU EQU EQU EQU EQU EQU EQU H'0007' H'0006' H'0005' H'0004' H'0003' H'0002' H'0001' H'0000'

Guin de clase elaborado por Ing. Mario de Jess Martnez Snchez

;----- EECON1 Bits ------------------------------------------------------EEIF WRERR WREN WR RD EQU EQU EQU EQU EQU H'0004' H'0003' H'0002' H'0001' H'0000'

;======================================================================== == ; ; RAM Definition ; ;======================================================================== == __MAXRAM H'CF' __BADRAM H'07', H'50'-H'7F', H'87' ;======================================================================== == ; ; Configuration Bits ; ;======================================================================== == _CP_ON _CP_OFF _PWRTE_ON _PWRTE_OFF _WDT_ON _WDT_OFF _LP_OSC _XT_OSC _HS_OSC _RC_OSC LIST 3.10 PRCTICAS DE LABORATORIO El circuito para comprobar el correcto funcionamiento de los programas ser el entrenador bsico para aprendizaje del PIC16F84A, representado en el esquema de la figura 1-2, que ya fue presentado en la primera gua. Respetando el procedimiento descrito en la gua 2: disear, ensamblar, simular y grabar el microcontrolador y comprobar los siguientes programas. Visualizar los archivos resultantes *.hex y *.lst de cada uno de los programas. Ejercicio3_1.asm: Por los LEDs conectados al puerto B se visualiza el valor de una constante, por ejemplo el nmero binario b01010101. Ejercicio3_2.asm: Los LEDs conectados al nibble bajo del Puerto B se apagarn y los del nibble alto se encendern. EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU H'000F' H'3FFF' H'3FF7' H'3FFF' H'3FFF' H'3FFB' H'3FFC' H'3FFD' H'3FFE' H'3FFF'

10

Guin de clase elaborado por Ing. Mario de Jess Martnez Snchez

Ejercicio3_3.asm: Por el Puerto B se obtiene el dato de las cinco lneas del Puerto A al que est conectado un array de interruptores. Por ejemplo, si por el Puerto A se introduce ---11001, por el Puerto B aparecer xxx11001 (no importa el valor de los tres bits ms altos del Puerto B, ver esquema de la figura 1-2). En la entrada: Un interruptor cerrado representa un 0 lgico. Un interruptor abierto representa un 1 lgico. En la salida: Un LED apagado representa un 0 lgico. Un LED encendido representa un 1 lgico.

11

Guin de clase elaborado por Ing. Mario de Jess Martnez Snchez

You might also like