Você está na página 1de 72

INDICE

TEMA 0: INTRODUCCIN TEMA 1: HARDWARE


1.1. Arquitectura Harvard. 1.2. Mapa de memoria. 1.3. Registros. 1.4. Temporizador / contador (TMP0, WDT y SLEEP). 1.5. Puertos de entrada / salida. 1.6. Interrupciones. 2.1. Instrucciones ASM del PIC 16F84

TEMA 2: PROGRAMACIN EN ASM

2.2 Modos de direccionamiento. 2.3. Tcnicas de programacin en ASM.

2.1.1. De control y manejo de literales. 2.1.2. Orientadas a registros. 2.1.3. Orientadas a bits.

TEMA 3: ESCRITURA DE PROGRAMAS EN ASM


3.1. Uso del block de notas con Windows 3.2. Programa MPLAB
3.2.1. Herramientas del MPLAB. 3.2.2. Funciones del MPLAB (mens). 3.2.3. Gua de uso del ensamblador MPASM (tutorial). Crear proyecto. Introducir cdigo Ensamblado (compilar) Simulador: registros, Watch Window, break points.

TEMA 0: INTRODUCCION
Con este curso lo nico que pretendo es poner la informacin que he reunido por medio de libros y pginas web sobre el PIC 16F84 de Microchip a disposicin de los dems, sobre todo para los compaeros y amigos de los foros de internet y el messenger ( a los cuales debo darles las gracias por los buenos y entretenidos ratos que pasamos sin ver la TV). ;-) La parte del curso dedicada al hardware no est desarrollada en profundidad, ya que no se trata de conocer su estructura de una forma muy exhaustiva, sino como una base para conocer mejor como programarlo. Para desarrollar esta especie de curso, he utilizado bsicamente estos dos textos: Microcontroladores PIC, la solucin en un chip (Edit. Paraninfo). Aplicaciones de los microcontroladores PIC de Microchip (Edit. McGraw Hill). Y muchas, muchas horas conectado a internet visitando decenas de pginas relacionadas con este tema. Por supuesto, este curso es totalmente gratis. No hace falta bajarse ningn crack para poder utilizarlo ni visitar pginas warez para conseguirlo (para muchas otras cosas si son necesarias esas pginas, eh?). Y es que el capitalismo ya no es lo que era... Y para finalizar quiero dedicar este trabajo a Loly (mi mujer). A pesar deque no he sido capaz de hacerle comprender por qu hago esto y tambin por las horas robadas a su compaa para investigar y divertirme por la red!

TEMA 1: HARDWARE
1.1 ARQUITECTURA HARVARD
La arquitectura tradicional de computadoras y microprocesadores est basada en la arquitectura Von Neumann, en la cual la unidad central de proceso (CPU), est conectada a una memoria nica donde se guardan las instrucciones del programa y los datos. El tamao de la unidad de datos o instrucciones est fijado por el ancho del bus que comunica la memoria con la CPU. As un microprocesador de 8 bits con un bus de 8 bits, tendr que manejar datos e instrucciones de una o ms unidades de 8 bits (bytes) de longitud. Si tiene que acceder a una instruccin o dato de ms de un byte de longitud, tendr que realizar ms de un acceso a la memoria, y al tener un nico bus hace que el microprocesador sea ms lento en su respuesta, ya que no puede buscar en memoria una nueva instruccin mientras no finalicen las transferencias de datos de la instruccin anterior. Resumiendo todo lo anterior, las principales limitaciones que nos encontramos con la arquitectura Von Neumann son: 1. La limitacin de la longitud de las instrucciones por el bus de datos, que hace que el microprocesador tenga que realizar varios accesos a memoria para buscar instrucciones complejas. 2. La limitacin de la velocidad de operacin a causa del bus nico para datos e instrucciones que no deja acceder simultneamente a unos y otras, lo cual impide superponer ambos tiempos de acceso.

Arquitectura Von Newmann

La arquitectura Harvard tiene la unidad central de proceso (CPU) conectada a dos memorias (una con las instrucciones y otra con los datos) por medio de dos buses diferentes. Una de las memorias contiene solamente las instrucciones del programa (Memoria de Programa), y la otra slo almacena datos (Memoria de Datos). Ambos buses son totalmente independientes y pueden ser de distintos anchos. Para un procesador de conjunto reducido de instrucciones, o RISC (Reduced Instruccin Set Computer), el conjunto de instrucciones y el bus de memoria de programa pueden

disearse de tal manera que todas las instrucciones solo ocupen una posicin (en longitud) en la memoria de programa. Adems, al ser los buses independientes, la CPU puede acceder a los datos para completar la ejecucin de una instruccin, y al mismo tiempo leer la siguiente instruccin a ejecutar. Ventajas de esta arquitectura: 1. El tamao de las instrucciones no esta relacionado con el de los datos, y por lo tanto puede ser optimizado para que cualquier instruccin ocupe una sola posicin de memoria de programa, logrando as mayor velocidad y menor longitud de programa. 2. El tiempo de acceso a las instrucciones puede superponerse con el de los datos, logrando una mayor velocidad en cada operacin. Una pequea desventaja de los procesadores con arquitectura Harvard, es que deben poseer instrucciones especiales para acceder a tablas de valores constantes que pueda ser necesario incluir en los programas, ya que estas tablas se encontraran fsicamente en la memoria de programa (por ejemplo en la EPROM de un microprocesador).

Arquitectura Harvard

El microcontrolador PIC 16F84 posee arquitectura Harvard, con una memoria de datos de 8 bits, y una memoria de programa de 14 bits.
Diagrama de bloques del microcontrolador PIC16F84

En la figura anterior vemos la arquitectura interna organizada en bloques interconectados, en donde se incluye la memoria RAM, la memoria EEPROM, los puertos de entrada y salida (I/O), etc.

1.2. MAPA DE MEMORIA


MEMORIA RAM: El microcontrolador PIC16F84 puede direccionar 128 posiciones diferentes de memoria RAM; pero Microchip Tecnologies solamente ha implementado 80 posiciones para este PIC. Esta memoria esta dividida en dos partes: La primera parte consta de 12 registros que sern utilizados por funciones especiales del microcontrolador. Comienza en la direccin 00h y termina en la 0Bh. La segunda parte consta de 68 registros de memoria RAM que sern utilizados para almacenar datos temporales requeridos por los programas. Comienza en la direccin 0Ch y termina en la posicin 4Fh

Este tipo de memoria (RAM), se caracteriza por perder los datos si se llegase a desconectar el microcontrolador o la tensin baja por debajo de los lmites mnimos. La memoria RAM as como algunos registros especiales son los mismos en los dos bancos del mapa de memoria del PIC.

MEMORIA DE PROGRAMA TIPO EEPROM:

Esta memoria tiene 1 K x 14 Bits de memoria tipo Flash. Esta memoria es la que utilizaremos para almacenar nuestro programa dentro del microcontrolador PIC16F84. El tipo de memoria utilizada en este microcontrolador, podr ser grabada o borrada elctricamente. La memoria tipo Flash tiene la caracterstica de poderse borrar en bloques completos y no podrn borrarse posiciones concretas o especficas. Este tipo de memoria no es voltil, es decir, no pierde los datos si se interrumpe la energa. En la siguiente imagen se muestra como est organizada la memoria dentro del microcontrolador.

La memoria del programa comienza en la posicin 000h y termina en la posicin 03FFh.


Nota: El contador de programa PC del microcontrolador PIC16F84 tiene una longitud de 13 Bits por lo que implica que podr direccionar cualquier posicin comprendida en un rango de los 8 K x 14; pero la empresa Microchip Tecnologies slamente ha implementado internamente 1 K que representa desde 000h hasta 03FFh. En el caso de que se direccione fuera de este rango, automticamente causar un solapamiento.

La memoria para almacenar el programa, tipo EEPROM (Electrical Erasable Programmable Read Only Memory), que puede ser reescrita, nos resultar perfecta para realizar pruebas y experimentos, adems de para la programacin on-board (actualizacin del programa interno de chip sin necesidad de retirarlo del circuito de prueba).

La memoria de programa siempre est direccionada desde el Contador de Programa (PC), mientras que la memoria de datos puede direccionarse directamente desde parte del cdigo OP de la instruccin o indirectamente a travs de un registro denominado FSR (Registro de Seleccin del Banco). Y aqu tenemos una vista exterior de los pins del PIC16F84:

El PIC16F84 esta dotado de un total de 18 pines distribuidos en dos filas paralelas de 9 pines cada una. Los pines marcados con AZUL representan las lneas de I/O disponibles para nuestras aplicaciones, los pines ROJO y NEGRO son los pines de alimentacin, los pines en VERDE estn reservados para el funcionamiento del PIC (MCLR para el reset y OSC1-2 para el reloj ).

1.3. REGISTROS
ORGANIZACION: La memoria interna de datos, tambin llamada archivo de registros (register file), esta dividida en dos grupos: Los registros especiales (8 registros). Los registros de propsito generales(72 registros).

Los registros especiales ocupan las 8 primeras posiciones que van desde la 00 a la 07, y los registros de propsito generales las posiciones que siguen, de la 08 a la 4F. Los registros especiales contienen la palabra de estado (STATUS), los registros de datos de los tres puertos de entrada salida (Puerto A, Puerto B, Puerto C), los 8 bits menos significativos del Program Counter (PC), el contador del Real Time Clock/Counter (RTCC) y un registro puntero llamado File Select Register (FSR). La posicin 00 no contiene ningn registro en especial y es utilizada en el mecanismo de direccionamiento indirecto. Los registros de propsito general se dividen en dos grupos: los registros de posicin fija (8 registros).

Los bancos de registros (64 registros).

Los primeros ocupan las 8 posiciones que van de la 08 a la 0F. Los bancos de registros consisten en hasta cuatro grupos o bancos de 16 registros cada uno, que se encuentran superpuestos en las direcciones que van de la 10 a la 4F. Se puede operar con un solo banco a la vez, el cual se selecciona mediante los bits 5 y 6 del File Select Register (FSR) Otros registros especiales: Las ocho primeras posiciones del rea de datos estn reservadas para alojar registros de propsito especial, quedando las restantes libres para contener los datos u operandos que se desee (registros de propsito general). El registro INDF que ocupa la posicin 0 no est implementando fsicamente y, como se ha explicado, se le referencia en el direccionamiento indirecto de datos aunque se utiliza el contenido de FSR. En la direccin esta el registro TMR0 (Temporizador) que puede ser ledo y escrito como cualquier otro registro. El PC ocupa la posicin 2 del rea de datos en donde se halla el registro PCL al que se aaden 3 bits auxiliares y se conectan con los dos niveles de la Pila en las instrucciones CALL y RETLW. El registro de Estado (STATUS) ocupa la posicin 3 y entre sus bits se encuentran los sealizadores C, DC y Z y los bits IRP, RP1 y RP0 que seleccionan la pgina en la memoria de programa. FRS se ubica en la direccin 4 y puede usarse para contener las direccin del dato en las instrucciones con direccionamiento indirecto y tambin para guardar operandos en sus 5 bits de menos peso. Los registros que ocupan las posiciones 5 y 6 soportan los Puertos A y B de E/S. Pueden ser ledos y escritos como cualquier otro registro y manejan los valores de los bits que entran y salen por los pines de E/S del microcontrolador. Los registros especiales (SFR o Special Function Registers) son una serie de registros usados por el PIC para funciones de control de funcionamiento del hardware, direccionamiento especial, etc. En la siguiente tabla estn los registros especiales disponibl

REGISTROS DE FUNCIONES ESPECIALES: Acumulador y registro W. Los siguientes grficos representan un diagrama simplificado de la arquitectura interna del camino de los datos en la CPU de los microcontroladores PIC y de los microprocesadores tradicionales. Observamos que la principal diferencia entre ambos se encuentra en la ubicacin del registro de trabajo, que para los PICs se denomina W (Working Register), y para los tradicionales es el Acumulador.

En los microcontroladores tradicionales todas las operaciones se realizan sobre el acumulador. La salida del acumulador esta conectada a una de las entradas de la Unidad Aritmtica y Lgica (ALU), y por lo tanto ste es siempre uno de los dos operandos de cualquier instruccin. Por convencin, las instrucciones de simple operando (borrar, incrementar, decrementar, complementar), actan sobre el acumulador. La salida de la ALU va solamente a la entrada del acumulador, por lo tanto el resultado de cualquier operacin siempre quedara en el acumulador. Para operar sobre un dato de memoria, despus de realizar la operacin tendremos que mover siempre el acumulador a la memoria con una instruccin adicional. En los microcontroladores PIC, la salida de la ALU va al registro W y tambin a la memoria de datos, por lo tanto el resultado puede guardarse en cualquiera de los dos destinos. En las instrucciones de doble operando, uno de los dos datos siempre debe estar en el registro W, como ocurra en el modelo tradicional con el acumulador. En las instrucciones de simple operando el dato en este caso se toma de la memoria (tambin por convencin). La gran ventaja de esta arquitectura es que permite un gran ahorro de instrucciones ya que el resultado de cualquier instruccin que opere con la memoria (sea de simple o doble operando), puede dejarse en la misma posicin de memoria o en el registro W, segn se seleccione con un bit de la misma instruccin. Las operaciones con constantes provenientes de la memoria de programa (literales) se realizan slo sobre el registro W. En la memoria de datos de los PICs se encuentran ubicados casi todos los registros de control del microprocesador y sus perifricos autocontenidos, y tambin las posiciones de memoria de usos generales.

10

Contador de Programa. Este registro, normalmente denominado PC, es equivalente al de todos los microprocesadores y contiene la direccin de la prxima instruccin a ejecutar. Se incrementa automticamente al ejecutar cada instruccin, de manera que la secuencia natural de ejecucin del programa es lineal, una instruccin despus de la otra. Algunas instrucciones (que llamaremos de control) cambian el contenido del PC alterando la secuencia lineal de ejecucin. Dentro de estas instrucciones se encuentran GOTO y CALL que permiten cargar en forma directa un valor constante en el PC haciendo que el programa salte a cualquier posicin de la memoria. Otras instrucciones de control son los SKIP o saltos condicionales, que producen un incremento adicional del PC si se cumple una condicin especifica, haciendo que el programa salte, sin ejecutar, la instruccin siguiente. El PC es un registro de 13 bits en el 16F84, lo que permite direccionar 8.192 posiciones de memoria de programa, pero que internamente solamente podr direccionar 1.024.. A diferencia de la mayora de los microprocesadores convencionales, el PC es tambin accesible al programador como registro de memoria interna de datos, en la posicin 02. Es decir que cualquier instruccin comn que opere sobre registros puede ser utilizada para alterar el PC y desviar la ejecucin del programa.

Stack: En los microcontroladores PIC el stack es una memoria interna dedicada, de tamao limitado, separada de las memorias de datos y de programa, inaccesible al programador, y organizada en forma de pila, que es utilizada solamente, y en forma automtica, para guardar las direcciones de retorno de subrutinas e interrupciones. Cada posicin es de 11 bits y permite guardar una copia completa del PC. Como en toda memoria tipo pila, a los datos se accede de forma LIFO (Last In First Out) de manera que el ltimo en entrar es el primero en salir. El tamao del stack en los 16F84 es de 8 posiciones. El stack y el puntero interno que lo direcciona, son invisibles para el programador, solo se accede a ellos automticamente para guardar o rescatar las direcciones de programa cuando se ejecutan las instrucciones de llamada o retorno de subrutinas, cuando se produce una interrupcin o cuando se ejecuta una instruccin de retorno de ella.

Palabra de Estado del Procesador (STATUS): La palabra de estado del procesador contiene los tres bits de estado de la ALU (C, DC y Z), y otros 5 bits que se incluyeron en este registro.

11

Registro STATUS

IRP RP1 RP0 TO PD Z DC C

El bit Z indica que el resultado de la ultima operacin fue CERO. El bit C indica acarreo del bit ms significativo (bit 7) del resultado de la ultima operacin de suma. En el caso de la resta se comporta a la inversa, C resulta 1 si no hubo pedido de prstamo. El bit DC (digit carry) indica acarreo del cuarto bit (bit 3) del resultado de la ultima operacin de suma o resta, con un comportamiento anlogo al del bit C, y es til para operar en BCD (para sumar o restar nmeros en cdigo BCD empaquetado). El bit C es usado adems en las operaciones de rotacin derecha o izquierda como un paso intermedio entre el bit 0 y el bit 7. El bit PD (POWER DOWN) sirve para detectar si la alimentacin fue apagada y encendida nuevamente, tiene que ver con la secuencia de inicializacin, el watch dog timer y la instruccin sleep, y su uso se detallara en la seccin referida al modo POWER DOWN. El bit TO (TIME-OUT) sirve para detectar si una condicin de reset fue producida por el watch dog timer, esta relacionado con los mismos elementos que el bit anterior y su uso se detallara en la seccin referida al WATCH DOG TIMER. Los bits de seleccin de pagina RP0/RP1/IRP se utilizan en las instrucciones de salto GOTO y CALL, Manipulando el bit nmero 5 (RP0) del registro STATUS podremos indicar al microcontrolador si queremos trabajar en el banco "0" o en el "1". La operacin normal del microcontrolador se efecta en el banco "0". Pero cuando nos cambiamos del banco "0" al banco "1" es para efectuar ciertos cambios que definen como estarn configurados los puertos del microcontrolador. En la siguiente imagen vemos la asignacin que tienen cada uno de los ocho bits del registro STATUS:

12

Si observamos de nuevo la tabla de registros del PIC16F84 vemos que existen algunas diferencias entre el banco "0" y el banco "1". Los registros denominados OPTION, TRISA, TRISB, EECON1 y EECON2 no existen en el banco 0. Si necesitamos acceder al registro TRISA, que solamente se encuentra en el banco "1", obligatoriamente habr que cambiarse del banco 0 al banco 1 por medio de las instrucciones del microcontrolador. Y tendremos que acceder al banco 1 solamente para utilizar los registros que no se encuentran en el banco 0. Una vez utilizados esos registros ( y modificados si fuese necesario), regresaremos al banco 0 para que el microcontrolador siga con su tarea asignada en la memoria del programa. En el caso de los registros OPTION y TRISA y B no ser necesario realizar el cambio de banco, ya que tenemos dos instrucciones que podremos utilizar para hacerlo, a pesar de que Microchip recomienda no usarlas para mantener la compatibilidad con el juego de instrucciones del microprocesador 16CXX.

13

EL REGISTRO CONTADOR TMR0:


El registro TMR0 es un contador de 8 bits, es decir un particular tipo de registro cuyo contenido es incrementado con una cadencia regular y programable directamente por el hardware del PIC. Este registro puede usarse para contar eventos externos por medio de un pin de entrada especial (modo contador) o para contar pulsos internos de reloj de frecuencia constante (modo timer). Adems, en cualquiera de los dos modos, se puede insertar un prescaler, es decir un divisor de frecuencia programable que puede dividir por 2, 4, 8, 16, 32, 64, 128 o 256. Este divisor puede ser utilizado alternativamente como prescaler del TMR0 o como postscaler del Watch Dog Timer, segn se lo programe.

En la prctica, a diferencia de los otros registros, el TMR0 no mantiene inalterado el valor que tiene memorizado, sino que lo incrementa continuamente. Si por ejemplo escribimos en l el valor 10, despus de un tiempo igual a cuatro ciclos de maquina, el contenido del registro comienza a ser incrementado a 11, 12, 13 y as sucesivamente con una cadencia constante y totalmente independiente de la ejecucin del resto del programa.

14

Una vez alcanzado el valor 255, el registro TMR0 es puesto a cero automticamente comenzando entonces a contar desde cero y no desde el valor originalmente cargado. La frecuencia de conteo es directamente proporcional a la frecuencia de reloj aplicada al chip y puede ser modificada programando adecuadamente algunos bits de configuracin. En la figura siguiente est representada la cadena de bloques internos del PIC que determinan el funcionamiento del registro TMR0.

Los bloques Fosc/4 y T0CKI, mostrados en azul, representan las dos posibles fuentes de seal de reloj, para el contador TMR0. Fosc/4 es una seal generada internamente por el PIC tomada del circuito de reloj y que es igual a la frecuencia del oscilador dividida por cuatro. T0CKI es una seal generada por un posible circuito externo y aplicada al pin T0CKI correspondiente al pin 3 del PIC16F84. Los bloques T0CS y PSA mostrados en verde son dos conmutadores de seal en cuya salida se presenta una de las dos seales de entrada en funcin del valor de los bits T0CS y PSA del registro OPTION. El bloque PRESCALER es un divisor programable cuyo funcionamiento veremos ms en detalle. A continuacin veremos como es posible dividir posteriormente la frecuencia de conteo, interna externa, activando el PRESCALER. EL PRESCALER: El PRESCALER consiste en un divisor programable de 8 bits a utilizar en el caso de que la frecuencia de conteo enviada al contador TMR0 sea demasiado elevada para nuestros propsitos. Se configura a travs de los bits PS0, PS1 y PS2 del registro OPTION. La frecuencia Fosc/4 es una cuarta parte de la frecuencia de reloj. Utilizando un cristal de 4Mhz tendremos una Fosc/4 igual a 1 MHz. Tal frecuencia es enviada directamente al registro TMR0 sin sufrir ningn cambio. La cadencia de conteo que se obtiene es por lo tanto igual a 1 milln de incrementos por segundo del valor presente en TMR0, que para muchas aplicaciones podra resultar demasiado elevada.

15

Con el uso del PRESCALER podemos dividir posteriormente la frecuencia Fosc/4 configurando oportunamente los bits PS0, PS1 y PS2 del registro OPTION segn la siguiente tabla. PS2 PS1 PS0 DIVISOR FREC. SALIDA PREESCALER (Mhz.) 0 0 0 2 500.000 0 0 1 4 250.000 0 1 0 8 125.000 0 1 1 16 62.500 1 0 0 32 31.250 1 0 1 64 15.625 1 1 0 128 7.813 1 1 1 256 3.906

Ejemplo prctico: introducir un retardo igual a un segundo utilizando el registro TMR0. Debemos programar el bit T0CS a 0 para seleccionar como fuente de conteo el reloj del PIC, el bit PSA a 0 para asignar el PRESCALER al registro TMR0 en lugar de al Watch Dog Timer (del que trataremos ms adelante) y los bits de configuracin del PRESCALER a 100 para obtener una frecuencia de divisin igual a 1:32. La frecuencia que obtendremos en TMR0 ser igual a: Fosc = 1Mhz / 32 = 31.250 Hz Memorizamos en TMR0 el valor 6 de modo que el registro TMR0 alcanza el cero despus de 250 cuentas (256 - 6 = 250) obteniendo as una frecuencia de paso por cero del TMR0 igual a: 31.250 / 250 = 125 Hz El siguiente paso ser memorizar en un registro de 8 bits el valor 125 de tal modo que, decrementando este registro en 1 por cada paso por cero de TMR0, se obtenga una frecuencia de pasos por cero del registro igual a:
125/125 = 1Hz (1 segundo).

En resumen: se trata de controlar si TMR0 ha alcanzado el cero, luego de reinicializarlo a 6 y decrementar el valor contenido en un registro con valor 125. Cuando el registro alcance tambin el valor cero, entonces habr trascurrido un segundo.

16

FUNCIONAMIENTO DEL POWER DOWN MODE: El Power Down Mode o Sleep Mode, es un estado particular de funcionamiento del PiC, utilizado para reducir el consumo de corriente en los momentos que no realiza ninguna tarea o est a la espera de un suceso externo. Si tomamos como ejemplo un control remoto para TV, veremos que la mayor parte del tiempo el micro permanece a la espera de la presin de alguna tecla. Apenas oprimida, efecta una breve transmisin y queda nuevamente a la espera de la presin de otra tecla. El tiempo de uso efectivo de la CPU del micro est por tanto, limitado a unos pocos milisegundos necesarios para efectuar la transmisin mientras que durante varias horas no efecta ninguna tarea particular (en el caso de utilizar la tcnica secaremote, en la que se hace un uso ms intensivo del mando, ocurre todo lo contrario!). Para no consumir intilmente la energa de las bateras, es posible apagar varios de los circuitos del micro y reencenderlos slo en correspondencia con algn suceso externo. Veamos como. La instruccin SLEEP La instruccin SLEEP es utilizada para colocar el PIC en Power Down Mode y reducir la corriente absorbida, que pasar de unos 2 mA (a 5 volt y el clock en 4MHz) a unos 2uA, o sea, unas 1000 veces menos. Para entrar en Power Down Mode basta insertar la instruccin SLEEP en cualquier parte del programa. Cualquier instruccin siguiente a SLEEP no ser efectuada por el PIC el cual finalizar en este punto la ejecucin, apagar los circuitos internos, excepto aquellos necesarios para mantener el estado de los puertos de I/O y aquellos que lo sacarn de esa condicin, los cuales comentaremos a continuacin. Para despertar al PIC se utilizan diversas tcnicas: 1. Reset del PIC llevando a cero el pin 4 (MCLR). 2. Timeout del Watch Dog Timer (si est habilitado). 3. Verificacin de una interrupcin (interrupcin desde el pin RB0/INT, cambio de estado en el puerto B, finalizacin de la escritura sobre la EEPROM). En los dos primeros casos, el PIC es reseteado y la ejecucin es retomada en la situacin 0 de memoria. En el tercer caso, el PIC se comporta como en el caso de una interrupcin normal, siguiendo primeramente el Interrupt handler, retomando la ejecucin despus de la instruccin SLEEP. Para que el PIC sea despertado por una interupt deben ser habilitados los flag del registro INTCON.

17

EL WATCH DOG TIMER (WDT): El Watch Dog Timer (que podra traducirse como temporizador perro guardin) es un oscilador interno al PIC, pero completamente independiente del resto de la circuitera, cuya funcin es eliminar eventuales bloqueos de la CPU del PIC y resetearlo para que retome la ejecucin normal del programa. Para poder eliminar un eventual bloqueo de la CPU durante la ejecucin del programa principal, se inserta en l una instruccin especial: CLRWDT (CleaR Watch Dog Timer) La cual pone a cero en intervalos regulares el WDT, no permitindole llegar al final de su temporizacin. Si la CPU no realiza esta instruccin antes del trmino de la temporizacin, entonces, se asume que el programa se ha bloqueado por algn motivo y se efecta el reset de la CPU. El periodo mnimo alcanzado el cual la CPU es reseteada es de unos 18 ms (depende de la temperatura y de la tensin de alimentacin). Es posible, sin embargo, asignar el prescaler al WDT a fin de obtener retardos mayores (hasta unos 2,3 segundos). Para habilitar el WDT debemos, en la fase de programacin, habilitar el flag WDTE de la palabra de configuracin. La modalidad de activacin de este flag, depende del programador usado. Asignacin del prescaler al WDT Actuando sobre el bit PSA del registro OPTION_REG es posible asignar el prescaler al WDT para obtener tiempos de intervencin mayores. El bit PSA va seteado a uno con la instruccin: BSF OPTION_REG,PSA En caso contrario, el prescaler ser asignado al TIMER 0. Obviamente, asignando el prescaler al WDT, no ser posible usarlo con el TIMER 0 y viceversa. Segn los valores de los bits PS0, PS1 y PS2 del OPTION_REG podremos obtener distintos intervalos de retardo. La eleccin correcta deber ser hecha teniendo en cuenta el mximo retardo que logramos obtener en nuestro programa tras la ejecucin de dos instrucciones CLRWDT sucesivas. En la tabla siguiente vemos los retardos, segn los valores de PS0, PS1 y PS2: PS2 PS1 PS0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 DIVISOR 1 2 4 8 16 32 64 128 Retardo (ms) 18 36 72 144 288 576 1.152 2.304

18

1.5. PUERTOS DE ENTRADA/SALIDA (I/O).


Los microprocesadores PIC16F84 tienen 2 puertos de entrada/salida paralelos de usos generales denominados Puerto A y Puerto B. El Puerto A es de 4 bits y el Puerto B es de 8 bits. Los puertos del microcontrolador PIC16F84 son el medio de comunicacin con el mundo exterior, en ellos podremos conectar los perifricos o circuitos necesarios como por ejemplo los mdulos LCD, motores elctricos, etc; pero estas conexiones no se podrn realizar arbitrariamente. Existen unas reglas bsicas que debern cumplirse para que el microcontrolador no sufra daos o se destruya. Para ello es necesario conocer los limites de corriente que puede manejar el microcontrolador. LIMITE DE CORRIENTE PARA LOS PUERTOS "A" Y "B". Los puertos "A" y "B" del microcontrolador podrn ser programados como entradas y salidas indiferentemente. Para el caso de que sean programados como salida se denominan "Modo Fuente" por que suministran corriente y cuando son programados como entrada se denominan "Modo Sumidero" por que reciben corriente. La mxima corriente que puede suministrar una lnea programada como salida es de 20 mili-amperios, pero si utilizamos toda las lneas del puerto "A" programadas como salida, no deber exceder de 50mA para todo el puerto "A". Para el caso del puerto "B" no deber exceder de 100 mA. Si las programamos como entradas (Sumidero), la corriente mxima que puede manejar una sola lnea es de 25 mA. Para el caso del puerto "A" programado con todas sus lneas como entrada, la mxima es de 80 mA. En el caso del puerto "B" es de 150 mA. En caso de querer utilizar perifricos que manejen mayor cantidad de corriente de la especificada, habr que aplicar un circuito acoplador como por ejemplo los buffers, transistores que se encarguen de controlar la corriente, etc. Identificacin de los Pines utilizados para los puertos de entrada y salida. En la imagen siguiente se podr observar claramente que el microcontrolador tiene dos puertos denominados "A" y "B". El puerto "A" tiene 5 lneas disponibles (RA0, RA1, RA2, RA3, RA4) y el puerto "B" tiene 8 lneas disponibles (RB0, RB1, RB2, RB3, RB4, RB5, RB6, RB7). Ambos Puertos suman un total de 13 lneas que podrn ser programadas independientemente como entradas o como salidas. Estas son las lneas que estarn destinadas a comunicar el microcontrolador con el mundo exterior, como por ejemplo motores, diodos luminosos "Leds", mdulos LCD, teclados matriciales, etc.

19

Tambin hay que hacer mencin a que el Pin nmero 3 perteneciente al puerto "A" (RA4) tambin tiene otra nomenclatura denominada "TOCKI", lo cual quiere decir que esta lnea se puede programar como entrada, salida y temporizador/contador. Configuracin de los puertos de Entrada/Salida. Los bits de cada puerto se configuran mediante los bits correspondientes de un registro de control asociado que recibe el nombre de TRIS. En realidad cada puerto soporta dos registros: 1. El registro de datos, al que se denomina Puerto A o B (PortA o PortB). 2 El registro de control TRISA o TRISB, con el que se programa el sentido (Entrada o Salida) de las lneas de cada puerto. Los Puertos A y B se corresponden con las posiciones 5 y 6 del rea de datos. Cada uno de sus bits puede programarse como una lnea de Entrada o de Salida, segn se ponga un 1 un 0 en el bit del registro de control TRIS correspondiente. Un 1 en el bit "x" del registro TRISA pone en alta impedancia (Entrada) la lnea asociada "x" del Puerto A. Si en el bit "x" de TRISA hubiese un 0, el contenido del biestable de datos correspondiente del Puerto A pasara a la patita de E/S externa. Cualquier lnea puede funcionar como Entrada o como Salida. Sin embargo, si acta como Entrada, la informacin que se introduce desde el exterior no se memoriza o graba, pasa simplemente por un dispositivo triestado por lo cual el valor de dicha informacin debe mantenerse hasta que sea leda. La lectura se realiza en "tiempo real". Cuando una patita de E/S funciona como salida, el bit que proviene del bus de datos se guarda en el biestable del dato con lo cual la informacin que ofrece esta patita permanece invariable hasta que se reescriba otro bit. Para configurar la patita como Entrada, hay que cargar un 1 en el biestable de control de E/S mientras que hay que cargar un 0 si se desea que sea Salida. Cada lnea de E/S de los puertos se programa de forma independiente y puede ser Entrada o Salida. Cuando se produce un reset, todos los bits de los registros TRIS pasan a tener el valor 1 y todas las lneas de E/S actan como Entrada por evidentes motivos de seguridad para evitar daos irreparables. Los puertos que contienen entradas y salidas necesitan una atencin especial al escribir el programa. Instrucciones como bsf y bcf comienzan leyendo el valor del puerto y cargndolo en el registro W; all ejecutan la puesta a 1 a 0 del bit seleccionado y, luego, depositan el registro W en el puerto. Tambin hay que tener en cuenta las modificaciones que se produzcan en las patitas que son entrada y pasan a salida, pues pueden estar presentes datos antiguos en el registro de salida del puerto al ser memorizados. Hay que prestar mucha atencin a las operaciones que, tras una lectura de un puerto. sigue una escritura de la misma. Se debe dejar pasar un tiempo determinado para que se

20

estabilice el voltaje de las patitas. Insertando entre la lectura y la escritura una instruccin NOP o cualquier otra que no implique a los puertos, se eliminan estos errores potenciales.

1.6. INTERRUPCIONES.
El sistema de interrupciones consiste en un mecanismo por el cual un evento interno o externo, asncrono respecto del programa, puede interrumpir la ejecucin de ste produciendo automticamente un salto a una subrutina de atencin, de manera que pueda atender inmediatamente el evento, y retomar luego la ejecucin del programa exactamente en donde estaba en el momento de ser interrumpido. Este mecanismo es muy til por ejemplo para el manejo de timers o rutinas que deben repetirse peridicamente (refresh de display, antirebote de teclado, etc.), deteccin de pulsos externos, recepcin de datos, etc.

Funcionamiento
Las interrupciones se comportan casi exactamente igual que las subrutinas. Desde el punto de vista del control del programa, al producirse una interrupcin se produce el mismo efecto que ocurrira si el programa tuviese un CALL 0004h en el punto en que se produjo la interrupcin. En uno de los registros de control del sistema de interrupciones existe un bit de habilitacin general de interrupciones GIE, que debe ser programado en 1 para que las interrupciones puedan actuar. Al producirse una interrupcin, este bit se borra automticamente para evitar nuevas interrupciones. La instruccin RETFIE que se utiliza al final de la rutina de interrupcin, es idntica a un retorno de subrutina, salvo que adems coloca en uno automticamente el bit GIE volviendo a habilitar las interrupciones. Dentro de la rutina de interrupcin, el programa deber probar el estado de los flags de interrupcin de cada una de las fuentes habilitadas, para detectar cual fue la que caus la interrupcin y as decidir que accin tomar.

Lgica de interrupciones para los controladores PIC16F8X

21

Fuentes.
La seal que produce la interrupcin es en realidad una sola, que resulta de la combinacin de todas las fuentes posibles y de los bits de habilitacin. Existen dos grupos de fuentes, unas que se habilitan con solo colocar en uno el bit GIE, y otras que adems necesitan que este puesto a uno el bit PEIE. Adems, cada fuente de interrupciones tiene su respectivo bit de habilitacin individual. Las fuentes de interrupcin varan con cada versin, y pueden ser por ejemplo: Interrupcin externa por pin RB0/INT. Desborde del Timer 0 (TMR0). Cambio en el estado de los bits 4 a 7 del puerto B. Desborde del timer 1. Desborde del timer 2. Interrupcin del capture/compare 1. Interrupcin del capture/compare 2. transmisin o recepcin de un carcter por la interface serie sincrnica. transmisin o recepcin de un carcter por la interface serie asincrnica. Fin de conversin A/D. Lectura/escritura del puerto paralelo de comunicacin con otros microprocesadores. Escritura de EEPROM finalizada.

22

TEMA 2: PROGRAMACIN EN ASM


2.1. INSTRUCCIONES ASM DEL PIC16F84
El microcontrolador PIC 16F84 tiene un total de 37 instrucciones de una sola palabra, y adems otras 28 instrucciones especiales que se corresponden con combinaciones de 2 3 instrucciones simples. Las instrucciones tienen letras relacionadas (parmetros) y que tienen una interpretacin diferenciada. La letra W es el registro ms importante que tiene el PIC y se le denomina ACUMULADOR, ya que las operaciones pasan a travs de l. La letra k es un literal (valor numrico) que puede contener cualquier valor asignado por el programador entre 0 y 255 (es el mximo que se puede representar con un byte). La letra f es cualquier nombre dado a un registro. La letra d indica en que lugar se almacenar el resultado de la instruccin (en el acumulador W o en el registro f). Si d = 0, el resultado se almacenar en W. Si d = 1, el resultado se almacenar en f.

Instrucciones orientadas a los bytes


Mnemnico Parmetros f, d f, d f f, d f, d f, d f, d f, d f, d f, d f f, d f, d f, d f, d f, d Descripcin Add W and f AND W with f Clear f Clear W Complement f Decrement f Decrement f, Skip if 0 Increment f Increment f, Skip if 0 Inclusive OR W with f Move f Move W to f No Operation Rotate left f through carry Rotate right f through carry Subtract W from f Swap nibbles in f Exclusive OR W with f Ciclos 1 1 1 1 1 1 1(2) 1 1(2) 1 1 1 1 1 1 1 1 1 Banderas C, DC, Z Z Z Z Z Z None Z None Z Z None None C C C, DC, Z None Z

ADDWF ANDWF CLRF CLRW COMF DECF DECFSZ INCF INCFSZ IORWF MOVF MOVWF NOP RLF RRF SUBWF SWAPF XORWF

23

Instrucciones orientadas a los bits


Mnemnico Parmetros f, b f, b f, b f, b Descripcin Bit Clear f Bit Set f Bit Test f, Skip if Clear Bit Test f, Skip if Set Ciclos Banderas 1 1 1 (2) 1 (2) None None None None

BCF BSF BTFSC BTFSS

Operaciones con literales y de control


Mnemnico Parmetros k k k Descripcin Add literal and W AND literal with W Call subroutine NroCic. Banderas 1 1 2 C, DC, Z Z

ADDLW ANDLW CALL

Clear Watchdog Timer 1 TO,PD CLRWDT k Go to address 2 None GOTO k Inclusive OR literal with W 1 Z IORLW k Move literal to W 1 None MOVLW Return from interrupt 2 None RETFIE k Return with literal in W 2 None RETLW Return from Subroutine 2 None RETURN Go into standby mode 1 TO,PD SLEEP k Subtract W from literal 1 C, DC, Z SUBLW k Exclusive OR literal with W 1 Z XORLW Las instrucciones TRIS y OPTION recomienda Microchip no utilizarlas, para mantener la compatibilidad con el PIC16CXX. Aunque eso no significa que tengamos que hacer caso y no usarlas.

Instrucciones Especiales
Mnemnico Parmetros f, d f, d K K K K K K K Descripcin Add Carry to File Add Digit Carry to File Branch Branch on Carry Branch on Digit Carry Branch on No Carry Branch on No Digit Carry Branch on No Zero Branch on Zero Clear Carry Clear Digit Carry Operacin Equivalente BTFSC INCF BTFSC INCF GOTO BTFSC GOTO BTFSC GOTO BTFSS GOTO BTFSS GOTO BTFSS GOTO BTFSC GOTO BCF BCF 3,0 f,d 3,1 f,d k 3,0 k 3,1 k 3,0 k 3,1 k 3,2 k 3,2 k 3,0 3,1 Banderas Z Z -

ADDCF ADDDCF B BC BDC BNC BNDC BNZ BZ CLRC CLRDC

24

CLRZ LCALL LGOTO MOVFW NEGF SETC SETDC SETZ SKPC SKPDC SKPNC SKPNDC SKPNZ SKPZ SUBCF SUBDCF TSTF
f,d f,d f K

Clear Zero Long CALL

BCF

3,2

Z Z Z Z Z

BSF/BCF 0A,3 BSF/BCF 0A,4 CALL k BSF/BCF 0A,3 BSF/BCF 0A,4 GOTO k MOVF COMF INCF BSF BSF BSF f,0 f,1 f,d 3,0 3,1 3,2

K F f, d

Long GOTO Move File to W Negate File Set Carry Set Digit Carry Set Zero Skip on Carry Skip on Digit Carry Skip on No Carry Skip on No Digit Carry Skip on Non Zero Skip on Zero Substract Carry from File Substract Digit Carry from File Test File

BTFSS 3,0 BTFSS 3,1 BTFSC 3,0 BTFSC 3,1 BTFSC 3,2 BTFSS 3,2 BTFSC 3,0 DECF f,d BTFSC 3,1 DECF f,d MOVF f,1

2.1.1. DE CONTROL Y MANEJO DE LITERALES. INSTRUCCIN: Descripcin: Operacin: ADDLW k (hex = 3E kk) Sumar al acumulador el valor k. W=W+k Esta instruccin suma un valor de un literal al contenido del registro W y lo guarda en W. Ejemplo: MOVLW 3 ; carga el acumulador W con el valor 3. ADDLW 1 ; suma 1 al acumulador. Al final el acumulador tendr el valor 4. Registro STATUS: Modifica los bits Z, DC y C. Z vale 1 si el resultado de la operacin es 0. DC vale 1 si el resultado de la operacin es un nmero superior a 15. C vale 1 si el resultado de la operacin es positivo o el bit 7 del registro que contiene el resultado vale 0. En caso contrario C vale 0 (resultado negativo).

25

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

ANDLW k (hex = 39 kk) Operacin lgica AND entre el acumulador W y el literal k W = W AND k Esta instruccin realiza una operacin lgica AND entre el contenido de W y k. El resultado se guarda siempre en el acumulador W Si cargamos el acumulador con el binario 10101010B y hacemos un AND con el binario 11110000B, nos quedar el resultado de la operacin en el acumulador W. MOVLW 10101010B ANDLW 11110000B El resultado de la operacin queda en W = 10100000B.

Explicacin de la operacin AND: Tenemos 4 posibles combinaciones entre dos bits 0 AND 0 = 0 0 AND 1 = 0 1 AND 0 = 0 1 AND 1 = 1 Vemos que solamente en el caso de que ambos bits sean 1, el resultado ser 1. Esta instruccin compara dos bytes, bit a bit. Registro STATUS: Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0.

INSTRUCCIN: Descripcin: Operacin:

CALL k (hex = 2k kk) Llama a una subrutina en la direccin k. CALL k...RETURN PC+1. Esta instruccin llama a un grupo de instrucciones (subrutina) que comienzan en la direccin k, donde k puede ser un valor numrico o una etiqueta. Siempre termina con la instruccin de retorno (RETURN o RETLW). Definicin de subrutina: son un grupo de instrucciones que forman un programa dentro del programa principal y que se ejecutan cuando las llama el programa principal. Utilidad: sirven para utilizarlas varias veces en cualquier parte del programa, sin necesidad de tener que copiar las mismas instrucciones, con el consiguiente ahorro de memoria. Funcionamiento: cuando un programa ejecuta una instruccin CALL, guarda en el stack el valor del registro PC+1 (PC = Program Counter) de manera que al regresar de la subrutina contina con la instruccin siguiente recuperndola del stack, ejecutando la instruccin de retorno RETURN o RETLW. Limitaciones: en el PIC16F84 tenemos disponibles 8 niveles de stack, por lo que el nmero mximo de CALL reentrantes (instrucciones CALL que contengan otra instruccin CALL) queda limitado a 8.

26

Ejemplo:

PRINCIPAL: etiqueta que identifica una direccin de memoria. RETARDO: etiqueta que identifica el comienzo de una subrutina. BUCLE: etiqueta que identifica una direccin de memoria. PRINCIPAL CALL RETARDO BTFSC PORTB, RB0 GOTO PRINCIPAL * * * RETARDO CLRF CONTADOR BUCLE DECFSZ CONTADOR, 1 GOTO BUCLE RETURN

En este listado vemos que la subrutina RETARDO salta a un grupo de instrucciones que forman un bucle y cuando ste termina regresa para seguir con la instruccin siguiente al salto (BTFSC...). Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

CLRWDT (hex = 00 64) Pone el temporizador WDT a cero. WDT = 0 Esta instruccin se utiliza cuando programamos el PIC con la opcin Watch Dog habilitada. Para evitar el reset del PIC, el programa debe contener cclicamente la instruccin CLRWDT para ponerlo a cero. Si no se pone a cero a tiempo, el WDT interpretar que se ha bloqueado el programa y ejecutar un reset para desbloquearlo. Bucle CLRWDT * * * GOTO Bucle

Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

GOTO k (hex = 28 kk) Salto incondicional a k. Salto k Esta instruccin ejecuta un salto del programa a la direccin k. El parmetro k puede ser un valor numrico o una etiqueta.

27

Ejemplo:

ABAJO

INSTRUCCIN 1 GOTO ABAJO INSTRUCCIN 3 INSTRUCCIN 4 INSTRUCCIN 5 INSTRUCCIN 6

Primero se ejecuta la instruccin 1, despus GOTO y contina con la instruccin 6 saltndose las instrucciones 3, 4 y 5. Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

IORLW k (hex = 38 kk) Operacin lgica OR entre el acumulador W y el literal k W = W OR k Esta instruccin realiza un OR inclusivo entre el contenido del acumulador W y el literal k. El resultado se guarda siempre en el acumulador (k es un valor, no un registro). Si cargamos el acumulador con el binario 11110000B y k= 00001111B, nos quedar el resultado de la operacin en el acumulador W. MOVLW 11110000B IORLW 00001111B El resultado de la operacin queda en W = 11111111B.

Explicacin de la operacin OR: Tenemos 4 posibles combinaciones entre dos bits 0 OR 0 = 0 0 OR 1 = 1 1 OR 0 = 1 1 OR 1 = 1 Vemos que solamente en el caso de que ambos bits sean 0, el resultado ser 0. Esta instruccin compara dos bytes, bit a bit. Registro STATUS: Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0.

INSTRUCCIN: Descripcin: Operacin: Ejemplo:

MOVLW k (hex = 30 kk) Mover el literal k al acumulador. W=k Esta instruccin asigna al acumulador W el valor del literal k (entre 0 y 255). Si tenemos el acumulador a cero o con cualquier valor, y queremos que contenga el que le asignemos nosotros directamente

28

entonces usaremos esta instruccin: W = 0. Valor a asignar = 100. Instruccin: MOVLW 100 El acumulador valdr 100 (W = 100). Con distinto valor de partida del acumulador: W = 225. MOVLW 100 El acumulador valdr 100 (W = 100). Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin: Ejemplo:

OPTION (hex = 00 62) Guarda el valor del acumulador en el registro OPTION. OPTION = W. Esta instruccin guarda en el registro especial OPTION el valor contenido en el acumulador W. MOVLW 10H ; carga el acumulador con el valor 10H. OPTION ; carga el registro OPTION con el acumulador. Esta instruccin existe para mantener la compatibilidad con los PIC producidos con anterioridad, y como en el futuro podra dejar de implementarse, Microchip aconseja realizar el ejemplo anterior de esta otra forma: BSF STATUS, RP0 ; activa el banco 1. MOVLW 10H ; carga el acumulador con 10H. MOVWF OPTION_REG ; carga OPTION con el acumulador.

Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin: Ejemplo:

RETFIE (hex = 00 09) Retorna de una interrupcin. FIN INTERRUPCION. Esta instruccin devuelve el control al programa principal despus de ejecutarse una subrutina de gestin de interrupcin. ORG 00H BUCLE GOTO BUCLE ; bucle infinito. ORG 04H; vector de interrupcin. RETFIE ; retorna de la interrupcin Este cdigo de programa ejecuta un bucle infinito. Si habilitamos una de las interrupciones del 16F84, en cuanto sta se produzca pasar el control al programa situado en la direccin 04H y la

29

instruccin RETFIE regresa de la interrupcin. Al ejecutarse una interrupcin, el bit GIE del registro INTCON se pone a 0 y as evita que otra interrupcin se produzca mientras ya est con una en marcha. Con la instruccin RETFIE ponemos de nuevo el bit GIE a 1 para as atender de nuevo a futuras interrupciones. Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

RETLW (hex = 34 kk) Retorno de subrutina y carga literal k en el acumulador. RETORNO con W = k. Esta instruccin retorna de una subrutina al programa principal, cargando el acumulador W con el literal k. Es la ltima instruccin que forma una subrutina (al igual que RETURN). Y para qu me sirve regresar de una subrutina con un determinado literal en el acumulador? Nos ser muy til al programar con TABLAS. CALL SUBRUT1 ; llama a Subrut1. MOVWF DATO 1 ; carga W en Dato1. CALL SUBRUT2 ; llama a Subrut2. MOVWF DATO2 ; carga W en Dato2. * * SUBRUT1 RETLW 0A ; carga W = 0A y retorna. SUBRUT2 RETLW 0B ; carga W = 0B y retorna.

Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

RETURN (hex = 00 08) Retorno de subrutina. RETORNO. Esta instruccin retorna de una subrutina al programa principal en la instruccin siguiente a la llamada de la subrutina, tomando el valor almacenado en el stack para continuar. Es la ltima instruccin que forma una subrutina (al igual que RETLW). CALL COMPARA ; llama a Compara. INSTRUCCION1 INSTRUCCION2 * *

Ejemplo:

30

COMPARA INSTRUCCIN R1 INSTRUCCIN R2 RETURN Aqu llamamos a la subrutina COMPARA, se ejecutan las instrucciones R1 y R2 y con el RETURN regresa a la instruccin siguiente al CALL y ejecuta las instrucciones 1, 2 y sigue con el programa. Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

SLEEP (hex = 00 63) En modo reposo.. EN ESPERA. Esta instruccin detiene la ejecucin del programa y deja el PIC en modo suspendido. No ejecuta ninguna instruccin hasta que sea nuevamente reinicializado (reset). Durante este modo, el contador del Watch Dog (WDT) sigue trabajando, y si lo tenemos activado el PIC se resetear por este medio. El consumo de energa es mnimo.

Ejemplo: Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

SUBLW k (hex = 3C kk) Resta al literal k el valor del acumulador. W=k-W Esta instruccin resta al literal k el valor almacenado en el acumulador W y el resultado se guarda en el acumulador. Ejemplo: MOVLW 10 ; carga el acumulador W con el valor 10. SUBLW 15 ; resta a 15 el valor del acumulador. Al final el acumulador tendr el valor W = 5. Registro STATUS: Modifica los bits Z, DC y C. Z vale 1 si el resultado de la operacin es 0. DC vale 1 si el resultado de la operacin es un nmero superior a 15. C vale 1 si el resultado de la operacin es positivo o el bit 7 del registro que contiene el resultado vale 0. En caso contrario C vale 0 (resultado negativo).

31

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

TRIS f (hex = 00 6F) Guarda el acumulador en uno de los registros de TRIS. TRIS de f = W. Esta instruccin guarda el valor del acumulador W en uno de los registros especiales de TRIS que indicamos en el parmetro f. Los registros TRIS determinan el funcionamiento como entrada y salida de las lneas I/O del PIC. MOVLW 16H ; carga el acumulador W con el valor 16H. TRIS PORTA ; carga el registro PORTA con el acumulador.

Esta instruccin existe para mantener la compatibilidad con los PIC producidos anteriormente,y como en el futuro podra dejar de implementarse, Microchip aconseja realizar el ejemplo anterior de esta otra forma (aunque ocupa ms memoria...): BSF STATUS, RP0 ; activa el banco 1. MOVLW 16H ; carga el acumulador con el valor 16H MOVWF TRISA ; carga el registro PORTA con W. Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

XORLW k (hex = 3A kk) Operacin lgica OR exclusivo entre el acumulador y el literal k W = W XOR k Esta instruccin realiza un OR exclusivo entre el contenido del acumulador W y el valor del literal k. El resultado se guarda siempre en el acumulador (k es un literal, no un registro). Si cargamos el acumulador con el binario 11110000B y hacemos un XOR con el binario 10101010B, nos quedar el resultado de la operacin en el acumulador W. MOVLW 11110000B XORLW 10101010B El resultado de la operacin queda en W = 01011010B.

Explicacin de la operacin XOR: Tenemos 4 posibles combinaciones entre dos bits 0 XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0 Vemos que si ambos bits son iguales el resultado ser 0. Y si ambos son diferentes, el resultado ser 1. Esta instruccin compara dos bytes, bit a bit. Registro STATUS: Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0.

32

2.1.2.ORIENTADAS A REGISTROS.

INSTRUCCIN: Descripcin: Operacin:

ADDWF f,d (hex = 07 ff) Suma el acumulador y el registro f. d = W + f (d puede ser W f). Esta instruccin suma el contenido del acumulador con el registro f, y el resultado se guarda dependiendo del valor de d. Si d = 0, se guarda en W. Si d = 1, se guarda en f. Si no se pone nada, el valor por defecto es 1 y se guarda en f. Tambin se puede indicar directamente W f. Ejemplo: Si tomamos como valores iniciales W = 5 y DATO = 10. 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. Registro STATUS: Modifica los bits Z, DC y C. Z vale 1 si el resultado de la operacin es 0. DC vale 1 si el resultado de la operacin es un nmero superior a 15. C vale 1 si el resultado de la operacin es positivo o el bit 7 del registro que contiene el resultado vale 0. En caso contrario C vale 0 (resultado negativo).

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

ANDWF f,d (hex = 05 ff) Operacin lgica AND entre el acumulador y el registro f. d = W AND f (d puede ser W o f). Esta instruccin realiza una operacin lgica AND entre el contenido del acumulador W y el registro f. El resultado se guarda segn sea el valor de d. Si d = 0, se guarda en W. Si d = 1, se guarda en f. Si no se pone nada, el valor por defecto es 1 y se guarda en f. Tambin se puede indicar directamente W f. Si queremos extraer los 4 bits menos significativos de un registro, podremos utilizar una mscara para obtenerlos. Usamos el valor 00001111B para realizar la operacin ADN y as obtenerlos (para los 4 bits ms significativos utilizaramos el valor 11110000B). Cargamos el valor del cual queremos extraer los 4 bits menos significativos en f (f = 10101010B). Cargamos el acumulador con la mscara (W = 00001111B). ANDWF f,W El resultado queda guardado en el acumulador (W = 00001010B).

33

Explicacin de la operacin AND: Tenemos 4 posibles combinaciones entre dos bits 0 AND 0 = 0 0 AND 1 = 0 1 AND 0 = 0 1 AND 1 = 1 Vemos que solamente en el caso de que ambos bits sean 1, el resultado ser 1. Esta instruccin compara dos bytes, bit a bit. Registro STATUS: Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0.

INSTRUCCIN: Descripcin: Operacin:

CLRF f (hex = 01 8f) Pone a cero el registro f. F = 0. Esta instruccin pone a cero el valor contenido en el registro direccionado por el parmetro f. Puede decirse que borra el registro f. Ejemplo: Si queremos poner a cero el registro TMR0, cuya direccin es 01H, tendramos que utilizar CLRF 01H Si hemos incluido al inicio del cdigo fuente el fichero PIC16F84.INC, podemos utilizar el nombre simblico de dicho registro: CLRF TMR0 Registro STATUS: Modifica el bit Z y lo pone a 1 (ya que el resultado de la operacin es 0).

INSTRUCCIN: Descripcin: Operacin: Ejemplo:

CLRW (hex = 01 00) Pone el acumulador a cero. W=0 Esta instruccin pone a cero el valor contenido en el registro W (acumulador) No es necesario

Registro STATUS: Modifica el bit Z y lo pone a 1 (ya que el resultado de la operacin es 0).

INSTRUCCIN: Descripcin: Operacin:

COMF f,d (hex = 09 ff) Complementa el registro f. d = NOT f (d puede ser W f). Esta instruccin efecta el complemento del valor contenido en el registro direccionado por el parmetro f.

34

La operacin de complementar consiste en invertir los bits: poner los ceros a unos y los unos a ceros. El parmetro d determina el destino del valor obtenido. Si d = W, el resultado se almacena en el acumulador. Si d = f, el resultado se almacena en el propio registro f. Ejemplo: Si tenemos en PORTA el valor 00001111B, al ejecutar: COMF PORTA El resultado ser PORTA = 11110000B. Si aplicamos para el mismo valor inicial, la instruccin: COMF PORTA, W El resultado ser W = 11110000B y PORTA = 00001111B. Registro STATUS: Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0.

INSTRUCCIN: Descripcin: Operacin:

DECF f,d (hex = 03 ff) Decrementa en 1 el registro f. d = f 1 (d puede ser W f). Esta instruccin decrementa en uno el contenido del registro direccionado por el parmetro f. El parmetro d determina el destino del valor obtenido. Si d = W, el resultado se almacena en el acumulador. Si d = f, el resultado se almacena en el propio registro f. Ejemplo: Si tenemos un registro DIA = 7. Aplicando la instruccin DECF DIA, 0, tendremos W = 6 y DIA = 7. Si aplicamos esta otra DECF DIA, 1, tendremos DIA = 6. Registro STATUS: Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0.

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

DECFSZ f,d (hex = 0B ff) Decrementa en 1 a f, y si f = 0 salta la siguiente instruccin. d = f 1, si d = 0 SALTA (d puede ser W f). Esta instruccin decrementa el contenido del registro direccionado por el parmetro f, y si el resultado es 0 se salta la instruccin siguiente. El parmetro d determina el destino del valor obtenido. Si d = W, el resultado se almacena en el acumulador. Si d = f, el resultado se almacena en el propio registro f. DECFSZ VALOR, W INSTRUCCION 1 INSTRUCCIN 2 Si el contenido del registro VALOR al decrementarlo en 1 es

35

igual a 0, se guarda el resultado en el acumulador y sigue con la INSTRUCCION2, saltndose la INSTRUCCION1. Si el resultado que guardamos en W no es 0, sigue con la INSTRUCCION1 y despus con la INSTRUCCION2 (no se salta la inmediata siguiente). Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

INCF f,d (hex = 0A ff) Incrementa en 1 el registro f. d = f + 1 (d puede ser W f). Esta instruccin incrementa en uno el contenido del registro direccionado por el parmetro f. El parmetro d determina el destino del valor obtenido. Si d = W, el resultado se almacena en el acumulador. Si d = f, el resultado se almacena en el propio registro f. Ejemplo: Si tenemos un registro DIA = 7. Aplicando la instruccin INCF DIA, 0, tendremos W = 8 y DIA = 7. Si aplicamos esta otra INCF DIA, 1, tendremos DIA = 8. Registro STATUS: Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0.

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

INCFSZ f,d (hex = 0F ff) Incrementa en 1 a f, y si f = 0 salta la siguiente instruccin d = f + 1, si d = 0 SALTA (d puede ser W f). Esta instruccin incrementa en uno el contenido del registro direccionado por el parmetro f, y si el resultado es 0 se salta la instruccin siguiente. El parmetro d determina el destino del valor obtenido. Si d = W, el resultado se almacena en el acumulador. Si d = f, el resultado se almacena en el propio registro f. INCFSZ VALOR, W INSTRUCCION 1 INSTRUCCIN 2

Si el contenido del registro VALOR al incrementarlo en 1 es igual a 0, se guarda el resultado en el acumulador y sigue con la INSTRUCCION2, saltndose la INSTRUCCION1. Si el resultado que guardamos en W no es 0, sigue con la INSTRUCCION1 y despus con la INSTRUCCION2 (no se salta la inmediata siguiente). Registro STATUS: No modifica ningn bit de estado.

36

INSTRUCCIN: Descripcin: Operacin:

IORWF f,d (hex = 04 ff) Operacin lgica OR inclusivo entre el acumulador y un registro d = W OR f (d puede ser W f). Esta instruccin realiza una operacin lgica OR inclusivo entre el acumulador W y el registro direccionado por el parmetro f. El parmetro d determina donde se almacenar el resultado de la operacin. Si d = 0, se guarda en W. Si d = 1, se guarda en f. Si no se pone nada, el valor por defecto es 1 y se guarda en f. Tambin se puede indicar directamente W f. Ejemplo: Si asignamos los valores W = 10101010B y f = 01010101B. IORWF f ; W = 10101010B y f = 11111111B. IORWF f, 1; W = 10101010B y f = 11111111B. IORWF f, 0; f = 01010101B y W = 11111111B. IORWF f, W; f = 01010101B y W = 11111111B. Registro STATUS: Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0.

INSTRUCCIN: Descripcin: Operacin:

MOVF f,d, (hex = 08 ff) Mueve el contenido de f al acumulador o al propio registro f. d = f (d puede ser W f). Esta instruccin copia el contenido del registro direccionado por el parmetro f en el acumulador W o en el mismo registro f. El parmetro d determina el destino. Si d = 0, se guarda en W. Si d = 1, se guarda en f. Si no se pone nada, el valor por defecto es 1 y se guarda en f. Tambin se puede indicar directamente W f.

El motivo para copiar el contenido de un registro sobre si mismo, no es otro que poder comprobar en el registro STATUS el estado del bit Z. Ejemplo: Si 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. Registro STATUS: Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0.

37

INSTRUCCIN: Descripcin: Operacin: Ejemplo:

MOVWF f (hex = 00 8f) Mueve el contenido de W al registro f. f = W. Esta instruccin copia el contenido del acumulador W en el registro direccionado por el parmetro f. Si queremos escribir el valor 10H en el registro TMR0, que est situado en la direccin 01H, tendremos que cargar primero el valor en el acumulador y despus copiarlo al registro. MOVWF 10H ; cargar el valor 10H en el acumulador. MOVWF 01H ; copia el acumulador en la direccin 01H.

Con los registros utilizados por el PIC para funciones especficas, es habitual no escribir directamente su direccin, sino el nombre simblico definido en el fichero PIC16F84.INC. En el ejemplo anterior nos quedara as: MOVWF 10H ; cargar el valor 10H en el acumulador. MOVWF TMR0 ; copia el acumulador en el registro TMR0. Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

NOP (hex = 00 00) No opera. -----Esta instruccin no realiza ninguna funcin especfica, pero consume 4 ciclos de reloj completos. Es til para insertar un retardo igual a un ciclo de mquina. Ejemplo: Utilizando un cristal de cuarzo de 4 Mhz. en el oscilador, podremos obtener un retardo igual a un microsegundo por cada instruccin NOP que insertemos en el cdigo del programa: RETARDO NOP NOP NOP RETURN Cada vez que llamemos a la subrutina RETARDO, obtendremos 3 microsegundos de demora. Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

RLF f,d (hex = 0D ff) Rota a la izquierda el registro f. d = << 1 (d puede ser W f). Esta instruccin rota a la izquierda todos los bits del registro direccionado en el parmetro f pasando por el bit CARRY del registro STATUS (o si se prefiere, desde los bits menos

38

significativos a los ms significativos). Es como si multiplicramos por dos el contenido del registro. Veamos el registro f de forma grfica:

El D7 pasa al CARRY del registro STATUS, el contenido del CARRY pasa al D0, el D0 al D1, etc. El parmetro d determina el destino. Si d = 0, se guarda en W. Si d = 1, se guarda en f. Si no se pone nada, el valor por defecto es 1 y se guarda en f. Tambin se puede indicar directamente W f. Ejemplo: Si tenemos el registro VALOR = 00000001B y aplicamos la instruccin RLF VALOR el resultado ser VALOR = 00000010B y el bit C = 0. Si tenemos el registro VALOR = 10000000B y aplicamos la instruccin RLF VALOR El resultado ser VALOR = 00000000B y el bit C = 1. Registro STATUS: Modifica el bit C (CARRY).

INSTRUCCIN: Descripcin: Operacin:

RRF f,d (hex = 0C ff) Rota a la derecha el registro f. d = f >> 1 (d puede ser W f). Esta instruccin rota a la derecha todos los bits del registro direccionado en el parmetro f pasando por el bit CARRY del registro STATUS (o si se prefiere, desde los bits ms significativos a los menos significativos). Es como si dividiramos por dos el contenido del registro. Veamos el registro f de forma grfica:

Ejemplo:

El bit C del registro STATUS pasa al D7, el D0 pasa al bit C, el D1 al D0, etc. El parmetro d determina el destino. Si d = 0, se guarda en W. Si d = 1, se guarda en f. Si no se pone nada, el valor por defecto es 1 y se guarda en f. Tambin se puede indicar directamente W f. Si tenemos el registro VALOR = 00000001B y aplicamos la instruccin

39

RRF VALOR el resultado ser VALOR = 00000000B y el bit C = 1. Si tenemos el registro VALOR = 10000000B y aplicamos la instruccin RRF VALOR El resultado ser VALOR = 01000000B y el bit C = 0. Registro STATUS: Modifica el bit C (CARRY).

INSTRUCCIN: Descripcin: Operacin:

SUBWF f,d (hex = 02 ff) Resta el acumulador del registro f. d = f W (d puede ser W f). Esta instruccin resta el valor contenido en el acumulador W del valor contenido en el registro direccionado por el parmetro f. El parmetro d determina el destino. Si d = 0, se guarda en W. Si d = 1, se guarda en f. Si no se pone nada, el valor por defecto es 1 y se guarda en f. Tambin se puede indicar directamente W f. Ejemplo: Segn 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. Registro STATUS: Modifica los bits Z, DC y C. Z vale 1 si el resultado de la operacin es 0. DC vale 1 si el resultado de la operacin es un nmero superior a 15. C vale 1 si el resultado de la operacin es positivo o el bit 7 del registro que contiene el resultado vale 0. En caso contrario C vale 0 (resultado negativo).

INSTRUCCIN: Descripcin: Operacin:

SWAPF f,d (hex = 0E ff) Intercambia los 4 bits ms significativos con los 4 menos (nibbles) f = 0123 SWAP 4567 de f. Esta instruccin intercambia el valor de los 4 bits ms significativos (D7-D4) contenidos en el registro direccionado por el parmetro f, con los 4 bits menos significativos (D3-D0) del mismo. El parmetro d determina el destino. Si d = 0, se guarda en W. Si d = 1, se guarda en f. Si no se pone nada, el valor por defecto es 1 y se guarda en f.

40

Tambin se puede indicar directamente W f. Ejemplo: Si tenemos VALOR = 00001111B y W = 00000000B, al aplicar SWAPF VALOR ; VALOR = 11110000B y W = 00000000B. SWAPF VALOR, W; VALOR = 00001111B y W = 11110000B. Con la primera instruccin modificamos el valor del registro DATO, y en la segunda instruccin modificamos el valor del acumulador sin que vare el registro DATO . Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

XORWF f,d (hex = 06 ff) Operacin lgica XOR entre el acumulador y f. Dd = f XOR W (d puede ser W f). Esta instruccin efecta la operacin lgica XOR (OR exclusivo) entre el valor contenido en el acumulador W y el valor contenido en el registro direccionado por el parmetro f. El parmetro d determina el destino. Si d = 0, se guarda en W. Si d = 1, se guarda en f. Si no se pone nada, el valor por defecto es 1 y se guarda en f. Tambin se puede indicar directamente W f. Ejemplo: Si tenemos el registro VALOR = 11110000B y W = 11111111B, al aplicar la instruccin XORWF VALOR ; hace VALOR = 00001111B y W no vara. XORWF VALOR, W ; hace W = 00001111B y VALOR no vara. Explicacin de la operacin XOR: Tenemos 4 posibles combinaciones entre dos bits 0 XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0 Vemos que si ambos bits son iguales el resultado ser 0. Y si ambos son diferentes, el resultado ser 1. Esta instruccin compara dos bytes, bit a bit. Esto nos sirve para comparar dos valores y comprobar si son iguales o no. Supongamos que tenemos el registro NUMERO y queremos comprobar si es igual a 26H. Tendramos que efectuar las siguientes instrucciones: MOVLW 26H; carga el acumulador con el valor a comparar. XORWF NUMERO, W ; compara el acumulador con NUMERO. BTFSS STATUS, Z ; salta la instruccin siguiente si XOR = 0. GOTO DISTINTO ; salta a DISTINTO si XOR no es 0. GOTO IGUAL ; salta a IGUAL. Registro STATUS: Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0.

41

2.1.3. ORIENTADAS A BITS.

INSTRUCCIN: Descripcin: Operacin: Ejemplo:

BCF f,b (hex = 1B ff) Pone a cero el bit b del registro f. F(b) = 0 Esta instruccin pone a cero un bit que hayamos elegido de un registro determinado. 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 11111111B, despus de aplicar el ejemplo anterior, PORTA = 11101111B. Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin: Ejemplo:

BSF f,b (hex = 1B ff) Pone a uno el bit b del registro f. F(b) = 1 Esta instruccin pone a uno un bit que hayamos elegido de un registro determinado. 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 00000000B, despus de aplicar el ejemplo anterior, PORTA = 00000001B. Registro STATUS: No modifica ningn bit de estado.

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

BTFSC f,b (hex = 1B ff) Comprueba un bit b del registro f y se salta la instruccin siguiente si vale 0. F(b) = 0 ? SI, salta una instruccin Esta instruccin comprueba el valor del bit b en el registro f, y si b = 0 entonces se salta la siguiente instruccin. Si b = 1 no salta y sigue con su ejecucin normal. BTFSC PORTA, 2 INSTRUCCIN 1 INSTRUCCIN 2

Si en PORTA tenemos como valor inicial 11111011B, el programa contina con la instruccin 2, saltndose la instruccin 1 Si en PORTA tenemos el valor 00000100B, el programa sigue con la instruccin 1 y despus la instruccin 2. Registro STATUS: No modifica ningn bit de estado.

42

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

BTFSS f,b (hex = 1B ff) Comprueba un bit b del registro f y se salta la instruccin siguiente si vale 1. F(b) = 1 ? SI, salta una instruccin. Esta instruccin comprueba el valor del bit b en el registro f, y si b = 1 entonces se salta la siguiente instruccin. Si b = 0 no salta y sigue con su ejecucin normal. BTFSS PORTB, 7 INSTRUCCIN 1 INSTRUCCIN 2

Si en PORTB tenemos como valor inicial 10000000B, el programa contina con la instruccin 2, saltndose la instruccin 1. Si en PORTB tenemos el valor 01111111B, el programa sigue con la instruccin 1 y despus la instruccin 2. Registro STATUS: No modifica ningn bit de estado.

43

2.2 MODOS DE DIRECCIONAMIENTO


Direccionamiento directo: la memoria de datos (RAM). La memoria interna se direcciona en forma directa por medio de los 8 bits f contenidos en las instrucciones que operan sobre registros. De esta manera se puede direccionar cualquier posicin desde la 00 a la FF. En los microcontroladores que tengan ms de un banco, antes de acceder a alguna variable que se encuentre en la zona de los bancos de registros, el programador deber asegurarse de haber programado los bits de seleccin de banco en el registro FSR. Direccionamiento indirecto: el registro FSR. El registro FSR sirve como puntero para direccionamiento indirecto adems de servir para seleccionar el banco activo. La posicin 00 del mapa de RAM es la llamada direccin indirecta. Si en cualquier instruccin se opera con la direccin 00, en realidad se estar operando con la direccin a donde apunte el contenido del FSR. Por ejemplo si el FSR contiene el valor 1Ah, una instruccin que opere sobre la direccin 0, en realidad lo har sobre la direccin 1Ah. Puede decirse que la posicin 1Ah de memoria fue direccionada en forma indirecta a travs del puntero FSR. Ejemplo : ; Este programa borra 8 posiciones de memoria a partir de la direccin 1A FSR equ 04 ;(definicin del puntero FSR) ;............................................................................................. movlw 8 movwf DATO movlw 1Ah movwf FSR bucle clrf 0 incf FSR decfsz DATO goto bucle ;prepara para repetir 8 veces ;(el registro DATO es el contador del bucle) ;apunta a la direccin 1Ah ;guarda en FSR la direccin 1Ah ;borra una posicin de memoria (pone a cero) ;apunta a la siguiente ;si todava no borr todas (an no es cero) ;salta a bucle (sigue borrando)

El direccionamiento indirecto es muy til para procesar posiciones consecutivas de memoria (como en el ejemplo) o para el direccionamiento de datos en subrutinas. Direccionamiento inmediato: El dato utilizado por la instruccin se codifica al mismo tiempo que la propia instruccin. En este caso, al dato se le denomina literal.

44

Direccionamiento relativo: No existe este modo de direccionamiento en los microprocesadores PIC.

2.3 TECNICAS DE PROGRAMACION


SUBRUTINAS Y LLAMADAS: La mayora de los microcontroladores incluyen en su repertorio de instrucciones algunas que permiten saltar a una rutina y, cuando se completa su ejecucin, retornar al programa principal. El empleo de subrutinas aporta muchas ventajas entre las que se destacan las siguientes: 1. Se pueden escribir como subrutinas secciones de cdigo y ser empleadas en muchos programas ( por ejemplo, la subrutina de exploracin de un teclado ). 2. Dan a los programas un carcter modular, es decir, se pueden codificar diferentes mdulos para utilizarlos en cualquier programa. 3. Se reduce notablemente el tiempo de programacin y la deteccin de errores, utilizando repetidamente una subrutina. 4. El cdigo es ms fcil de interpretar, dado que las instrucciones de las subrutinas no aparecen en el programa principal, slo figuran las llamadas (CALL). LAS INSTRUCCIONES CALL Y RETURN: La instruccin CALL (llamada a subrutina) consigue que la ejecucin del programa contine en la direccin donde se encuentra la subrutina a la que hace referencia. Es similar a GOTO pero coloca en la pila la direccin de la siguiente instruccin que se debe ejecutar despus de terminar con la subrutina. La subrutina finaliza con la instruccin RETURN (retorno de la subrutina) que retoma la direccin guardada en la pila y la coloca en el contador del programa PC continuando el flujo de control con la instruccin que sigue a CALL. En la familia PIC de gama media la pila tiene ocho niveles de memoria del tipo LIFO (ltimo en entrar, primero en salir). Si se produce la llamada a una subrutina durante la ejecucin de otra subrutina, la direccin de retorno de esta segunda es colocada en la cima de la pila sobre la direccin anterior. Esta segunda direccin es la primera en salir de la pila mediante la instruccin RETURN. Con la pila de ocho niveles, una subrutina puede llamar a otra y sta, a su vez, llamar a otra hasta un mximo de ocho.

45

CONSULTA A TABLAS: En muchas ocasiones es necesario para un programador efectuar una coincidencia entre alguna cantidad de valores conocidos y un nmero desconocido que se tiene como ndice. Por ejemplo: basados en el contenido de una posicin de memoria RAM (ndice) se puede obtener de una serie consecutiva de datos almacenados en memoria de programa (a los datos "conocidos" almacenados se le denomina tabla), el dato desplazado n posiciones hacia delante desde el comienzo de la tabla. El nmero n corresponde al contenido de la posicin de memoria RAM ndice. Programa ejemplo: offset equ 0Ch ; posicin de memoria RAM w equ 0 ; destino W f equ 1 ; destino F ................ ................ ................ movf offset,w ; tomamos a W el nmero n utilizado como ndice call tabla ; posicin en donde se encuentra la serie de datos ; en este sitio luego del retorno de la subrutina se tiene en W el dato ; ledo de la tabla ................ ................ ................ tabla addwf PCL,f ; se suma al PC el W obteniendo como resultado un salto indexado retlw 30h ; s W sumado al PCL es 0 se retorna en esta posicin, W=30h retlw 31h ; s W sumado al PCL es 1 se retorna en esta posicin, W=31h retlw 32h ; s W sumado al PCL es 2 se retorna en esta posicin, W=32h retlw 33h ; s W sumado al PCL es 3 se retorna en esta posicin, W=33h retlw 34h ; s W sumado al PCL es 4 se retorna en esta posicin, W=34h retlw 35h ; s W sumado al PCL es 5 se retorna en esta posicin, W=35h ; ... Para terminar, despus de observar el ejemplo anterior, debemos tener en cuenta que antes de llamar a la subrutina tabla, se debe cargar en el registro de trabajo W el valor del ndice y una vez se retorne de dicha subrutina, es en este mismo registro de trabajo en donde se obtiene el resultado de la consulta a la tabla (vemos que la sucesin de instrucciones retlw k se encuentra en memoria de programa).

CONVERSIN A ASCII: El conjunto de caracteres ASCII (American Standard Code for Information Interchange) es el cdigo de representacin en hexadecimal del alfabeto, los nmeros del 0 al 9, los principales smbolos de puntuacin y algunos caracteres de control.

46

Conjunto de carcteres ASCII

Como vemos en la tabla anterior, podemos dividir a cada carcter representado en hexadecimal como una parte alta de 3 bits (Most significant carcter = nmeros del 0 al 7) y una parte baja de 4 bits (Least significant carcter = nmeros del 0 al F). En total, la representacin la hacemos con 7 bits. De los problemas usuales en la programacin est el convertir un nmero hexadecimal representado en 8 bits a dos caracteres ASCII los cuales sean la representacin de dicho nmero para permitir su visualizacin en pantallas LCD, monitores, impresoras, etc. Ejemplo: Para representar el nmero hexadecimal 70h que en binario es 01110000b como los dos caracteres ASCII "7" y "0", grficamente:

7 "7" 37h

0 "0" 30h

en hexadecimal (8 bits) en ascii (16 bits) ascii en hexadecimal (16 bits)

Transportndolo a un programa: NumHex equ 0Ch ; posicin donde se almacena el nmero a convertir AsciiH equ 0Dh ; posicin donde se almacena el resultado parte alta AsciiL equ 0Eh ; posicin donde se almacena el resultado parte baja ....................... ....................... movlw 0Fh ; dato para enmascarar parte alta andwf NumHex,0 ; se enmascara la parte alta del nmero hexa y pasa a W

47

iorlw 30h movwf AsciiL movlw 0F0h andwf NumHex,1 swapf NumHex,0 iorlw 30h movwf AsciiL ..................... .....................

; convierte el nmero en ascii ; el nmero queda salvado en la variable de salida ; dato para enmascarar parte baja ; se enmascara la parte baja del nmero hexa y queda all ; se invierten parte alta y baja ; convierte el nmero en ascii ; el nmero queda salvado en la variable de salida.

El ejemplo anterior funciona de forma correcta siempre y cuando los nibbles del nmero hexadecimal a convertir estn en el rango de 0 a 9. Habr que realizarse un tratamiento adicional a stos si se encuentran en el rango de Ah a Fh.

RAMIFICACIN MLTIPLE. Cuando se tiene que solucionar un diagrama de flujo como el de la figura, en el cual tenemos tres posibles respuestas a una pregunta, se plantean las soluciones aqu presentadas.

Tres posibilidades para una pregunta.

Una de las formas de solucionar en un programa este problema es:

Solucin 1. Determinando para la opcin 1, la opcin 2 y la opcin 3 un valor consecutivo como: opcin1 equ 0

48

opcin2 opcin3

equ equ

1 2

Uno de estos posibles valores llevarlo a W y en una parte del programa tratarlo as: Decisin: addwf goto goto goto PCL,1 Accin1 Accin2 Accin3 ;sitio en donde la pregunta "?" tendra solucin

Accin1: ............................... ............................... ............................... goto encuentro Accin2: ............................... ............................... ............................... goto encuentro Accin3: ............................... ............................... ............................... encuentro: ............................... ...............................

;instrucciones correspondientes a la Accin 1

;instrucciones correspondientes a la Accin 2

;instrucciones correspondientes a la Accin 3 ;sitio de encuentro luego de una de las acciones ;continuacin del programa

Solucin 2. Otra forma posible es comparando uno por uno los valores de las diferentes opciones almacenadas en memoria RAM en una variable llamada OPCION movlw Opcin1 xorwf OPCION,0 btfsc STATUS,Z goto Accin1 movlw Opcin2 xorwf OPCION,0 btfsc STATUS,Z goto Accin2 movlw Opcin3 xorwf OPCION,0 ; se realiza la verificacin de OPCION respecto a W ; verificando la bandera Z ; se realiza la verificacin de OPCION respecto a W ; verificando la bandera Z ; se realiza la verificacin de OPCION respecto a W

49

btfsc STATUS,Z ; Verificando la bandera Z goto Accin3 Accin1: ............................... ; instrucciones correspondientes a la Accin 1 ............................... ............................... goto encuentro Accin2: ............................... ; instrucciones correspondientes a la Accin 2 ............................... ............................... goto encuentro Accin3: ............................... ; instrucciones correspondientes a la Accin 3 ............................... ............................... encuentro: ; sitio de encuentro luego de una de las acciones ............................... ; continuacin del programa ............................... Aunque este ltimo mtodo es ms largo que el anterior, es vlido cuando los valores de las diferentes opciones no son consecutivos entre si.

ARITMTICA: Dentro de los microcontroladores PIC se cuenta con instrucciones aritmticas tales como: ADDWF y ADDLW para efectuar operaciones de suma. SUBWF y SUBWF para efectuar operaciones de resta. RLF para realizar multiplicaciones por 2. RRF para realizar divisiones entre 2. Hasta este punto podramos ver el conjunto de instrucciones un poco limitado. Sin embargo, utilizando tcnicas avanzadas de programacin podemos obtener operaciones ms complejas. Podemos obtener varias rutinas matemticas generales de los PIC 16CXX y 17CXX en estas direcciones: http://www.iespana.es/portosin/MATEMATICAS16CXX http://www.iespana.es/portosin/MATEMATICAS17CXX

50

TEMA 3: ESCRITURA DE PROGRAMAS EN ASM.


El ensamblado de un programa traduce las instrucciones que se han escrito utilizando los mnemnicos del lenguaje maquina (CALL, etc.), a cdigo binario ejecutable por el microcontrolador. La secuencia de mnemnicos se llama listado o cdigo fuente del programa, mientras que el cdigo binario se llama objeto o ejecutable. Una vez que el programa se ha escrito y ensamblado (compilado no existe para el lenguaje ensamblador, solo se compilan los lenguajes de alto nivel como el C) ya tenemos un binario ejecutable.

Estructura de un programa tpico: Los programas desarrollados para el microprocesador PIC constan bsicamente de esta estructura:

Definir el Microcontrolador a usar: En esta directiva se especifica el tipo de microcontrolador que ser utilizado; esto se logra utilizando LIST = PIC16F84. Establecer las constantes a utilizar: Las constantes son tiles para referenciar direcciones de memoria, posiciones de los bits y valores que no cambiarn a lo largo de todo el programa. Esto se logra utilizando la directiva "EQU". Si se desea por ejemplo establecer un valor a una constante, sera CONST EQU 1, con lo cual le asigna el valor de "1" al registro CONST. Reservar los espacios en memoria de las variables: Se utiliza para reservar espacios en memorias para las variables utilizadas en el programa. Se logra utilizando la directiva denominada "RES". Muy til cuando un registro cambia su valor durante la ejecucin del programa. Configurar los puertos: Es necesario establecer si los bits de cada puerto sern utilizados como entrada o como salida. Para ello utilizamos los registros especiales TRISA y TRISB. Desarrollar el Programa: Es el verdadero corazn del trabajo que se realiza, puesto que aqu se desarrollan las rutinas que sern ejecutadas por el microcontrolador.

51

En la imagen anterior, tenemos un pequeo programa como ejemplo, para el microcontrolador PIC16F84 en la cual vemos las zonas en diferentes colores. El color amarillo representa la definicin del microcontrolador, el color verde representa el establecimiento de las constantes, el color celeste representa la reserva de Memoria, el color rojo es donde realmente comienza el programa en s y representa la configuracin de los puertos y el cuerpo del programa.

3.2. PROGRAMA MPLAB.


EL MPLAB es un Entorno de Desarrollo Integrado (Integrated Development Environment, IDE) que funciona bajo Windows, mediante el cual podemos desarrollar aplicaciones para los microcontroladores de las familias PIC 16/17. EL MPLAB nos permite escribir, depurar y optimizar los programas diseados para utilizar con dichos microprocesadores. De nada nos servira saber programar si finalmente no podemos hacerlo por carecer de las herramientas necesarias para ello. Por eso es importante conocer el funcionamiento del MPLAB. Con el MPLAB podemos:

52

Depurar programas fuente. Detectar errores automticamente en programas fuente para editarlos. Depurar programas utilizando puntos de corte (breakpoints) mediante valores de los registros internos. Observar el flujo del programa con el simulador MPLAB -SIM, seguirlo en tiempo real utilizando el emulador PICMASTER. Realizar medidas de tiempo utilizando un cronmetro. Ver variables en las ventanas de observacin. Encontrar respuestas, utilizando la ayuda en lnea del MPLAB.

Este entorno funciona como un contenedor, es decir, las diferentes opciones que contiene estn asociadas a programas independientes que se ejecutarn cuando sean seleccionados los diferentes modos dentro del MPLAB. Podemos definir un ensamblador (por ejemplo en C), un emulador o un grabador diferente a los que tiene por defecto, quedando de esta forma integrado al entorno. En el organigrama que veremos a continuacin tenemos las distintas fases de implementacin que deberemos seguir para completar con xito la programacin del microprocesador.
INICIO

ESCRITURA DEL CDIGO FUENTE

Se har en formato de texto DOS o ASCII con cualquier editor, como, por ejemplo, el EDIT. Tambin es posible usar el entorno WIN95-98 respetando este formato de grabacin. Nosotros emplearemos el MPLAB como editor. Para el lenguaje ensamblador emplearemos el MPASM, habiendo tambin herramientas para trabajar en C. Nosotros lo elegiremos por defecto como ensamblador en el MPLAB. La herramienta de simulacin en DOS es MPSIM, pero el entorno grfico MPLAB tiene su propio sistema, que utilizaremos.

ENSAMBLADO

SIMULACIN

ERRORES? Cada grabador tiene su software especfico, y es posible encontrar mltiples circuitos y programas en Internet. Microchip vende sus propios equipos, as como micros programados de fbrica.

GRABACIN DEL CONTROLADOR

FIN

53

3.2.3 GUIA DE USO DEL ENSAMBLADOR MPASM (TUTORIAL)


Este tutorial esta basado en el propio tutorial de Microchip que est en su pgina web en formato PDF.

CONFIGURANDO EL MPLAB:

Si ya tenemos instalado el MPLAB, lo primero que tenemos que hacer es configurarlo para el uso que vamos a hacer de l, si es editor solamente o simulador. Al poner simulador se entiende que es para programar, depurar, etc. As que nos vamos al men OPTION y abrimos DEVELOPMENT MODE, y nos aparece la siguiente ventana, lo cual configuraremos solamente la solapa TOOLS dejando el resto por defecto. En la ventana hemos seleccionado el PIC16F84,y en el modo SIMULATOR.

Pulsamos en el botn OK o APPLY, y vemos que en la barra de estado o STATUS BAR (en la parte baja de la ventana del MPLAB) cambia el chip para el PIC16F84 y en modo simulador (SIM).

54

CREAR UN PROYECTO NUEVO:

El simulador o debuger para poder funcionar, utiliza el archivo *.HEX generado a partir de una compilacin o ensamblado del cdigo fuente. Adems este mismo archivo generado (*.HEX) es el que se usa para grabar el PIC. El ensamblador produce otros ficheros aparte del *.HEX para otros usos que veremos luego. En este tutorial (basado en el de Microchip) el fichero generado se llamar tutor84.hex. Seleccionamos FILE - NEW del men FILE y nos saldr la siguiente pantalla de dialogo:

Veremos que tambin se abre una ventana en blanco, que es donde introduciremos nuestro cdigo. En la ventana anterior pinchamos en YES y as comenzaremos a crear nuestro proyecto nuevo. Nos abrir la siguiente ventana para que escribamos el nombre del proyecto, y el directorio donde lo guardaremos. Lo llamaremos TUTOR84 y lo guardaremos en alguna carpeta que tengamos dentro del MPLAB, por ejemplo una que llamaremos "propios", o en otro directorio diferente si as lo queremos nosotros.

55

Como vemos, la extensin *.PJT corresponde a proyectos. Guardamos entonces nuestro proyecto asignndole antes un nombre, y automticamente se abre el siguiente cuadro de EDICION DE PROYECTO.

Tanto el simulador como el programador o el emulador trabajan a partir del archivo *.HEX generado por el IDE del MPLAB, por el ensamblado, compilado y/o encadenado (linkeado) del cdigo fuente. Diferentes tips de herramientas generan el archivo *.HEX, y estas herramientas son parte de cada proyecto. El proyecto nos da la flexibilidad de poder utilizar diversas herramientas para crear el ejecutable *.HEX. En la pantalla de EDICION DEL PROYECTO vemos que por defecto, el proyecto nos asign el mismo nombre para el fichero ejecutable tutor84.hex. As mismo, tambin tenemos el MPLAB SIM 16F84 que es lo que habamos seteado anteriormente en el men OPTION, al igual que la suite de lenguajes (en este caso Microchip). Si seleccionamos dentro de la ventana Projects Files tutor84.hex nos habilitara el botn NODE PROPERTIES. Este botn nos sirve para configurar y decirle al MPLAB IDE cmo crear el fichero *.HEX. Lo pulsamos y nos abre el siguiente cuadro:

56

Como vemos, aparece en la esquina superior derecha el lenguaje utilizado; a la izquierda el nombre del fichero a crear, que por defecto nos sale tutor84.hex. Todas las filas y columnas dentro del cuadro, son switchs o llaves en las cuales marcamos nuestras preferencias. Por ejemplo la numeracin utilizada (HEX) si queremos utilizar macros, etc. Esto se traduce en una lnea de comandos que podemos visualizar en la parte inferior de la pantalla, en Command Line. Por ahora, hay que marcarlo como vemos en la ventana de muestra. Pinchamos en el botn OK y volvemos a la ventana anterior.

57

Hacemos click en ADD NODE y nos aparece la siguiente ventana:

En la misma debemos guardar dentro del mismo directorio del proyecto nuestro archivo fuente que se llamar tutor84.asm. Le damos ACEPTAR y volvemos otra vez al cuadro anterior:

58

Como vemos, se ha aadido el nodo tutor84.asm en forma dependiente de tutor84.hex. Apretamos OK y volvemos al escritorio en donde tendremos abierta una ventana en donde introduciremos nuestro cdigo, pero an sin titulo. Para ello seleccionaremos en el men EDIT SAVE AS y le daremos el nombre del nodo que hemos configurado tutor84.asm.

Como podemos apreciar ahora la barra de titulo de la ventana de cdigo a cambiado de nombre de untitled a tutor84.asm. Podemos ver que siempre colocaremos el mismo nombre en el proyecto y en el cdigo fuente. Esto es porque no estamos trabajando con un linker que nos permite incorporar o linkear distintos archivos con distintos nombres.

59

Entonces al trabajar con un archivo nico debemos nombrarlo igual que el proyecto al cual pertenece, adems de guardarlo en el mismo directorio.

INTRODUCIR CODIGO ASM:

En la ventana que tenemos abierta empezaremos a introducir el cdigo de nuestro programa. Escribimos lo siguiente:

Algunas consideraciones: Este es el programa que utilizaremos en este tutorial, y como se puede ver consta de varias columnas, las cuales significan lo mismo que en otros lenguajes de programacin (ya hemos explicado esto en un tema anterior). La primera de la izquierda son las famosas etiquetas que pueden tener cualquier nombre y sirven para referenciar direcciones a llamar o bifurcar/saltar. El programa cuenta con 4 etiquetas c1, reset, start y loop. Podemos cambiarles los nombres por cualquier otro que se nos ocurra, siempre que tambin lo hagamos en la instruccin que llama a dichas etiquetas. En la segunda columna tenemos las instrucciones: goto, movlw, etc. En la tercera el operando, registro o llamada: c1, f, start, etc. Y por ltimo en la cuarta, siempre despus de un PUNTO Y COMA, los comentarios, que sirven nada ms (y nada menos) que para ayudar a la memoria del programador o facilitar la comprensin del cdigo por otra persona ajena al propio programador. No tienen utilidad alguna en el ensamblado, pero si mucha para los programadores.

60

Para escribir el cdigo utilizamos la tecla TAB para desplazarse entre columnas. Por ejemplo: la primera lnea la escribiremos =c1 TAB equ TAB0 0x0c TAB ; Set temp ... Ntese que la etiqueta c1 est en la misma lnea y por ejemplo reset no. Esto no importa, slo que la etiqueta apunte a la lnea en cuestin o por encima, siempre y cuando la primera lnea a ejecutarse despus de la etique sea a la que hace referencia. Por descontado, en el cdigo que tecleamos para practicar con este ejemplo no hace falta escribir el campo de comentarios.

Este programa lo que hace es cargar un registro cualquiera de uso general, el cual se denomin c1, con un valor X que en el ejemplo es 9. Luego lo incrementamos de 1 en 1 hasta que se desborde (recordemos que son registros de 8 bits, y se desbordar cuando llegue a FF o 255 y volver a 00) y vuelva a 0. Cuando esto ocurra, el programa cargar nuevamente el registro con el valor 9 y repetir lo mismo. Por ltimo, recordar que en los cuadros seleccionables del nodo tenamos marcado CASE SENSITIVE lo cual quiere decir que escribiremos el cdigo de una nica forma; o maysculas o minsculas, o haremos referencia a etiquetas iguales. Lo que significa que start no es lo mismo que Start. Y guardamos los cambios en el men EDIT SAVE.

ENSAMBLADO (COMPILAR):

Nuevamente haremos mencin a que no vamos a compilar sino ensamblar, porque recordaremos que solamente se compila desde lenguajes de alto nivel. Accedemos al men PROJECT - BUILD ALL. Hacemos build all y nos sale la ventana de compilacin dicindonos que hemos tenido un error. Cmo puede ser que nos hayamos equivocado? Veamos que nos dice la ventana:

Pero no hay problema. El fallo es debido a que hemos introducido a propsito un error en el cdigo: es en el ltimo goto, donde pone "goto bug".

61

Hemos hecho referencia a una etiqueta (bug) que no existe. Para corregir dicho error, hacemos doble click con el puntero del ratn sobre el error dentro de esta ltima ventana llamada "Build Results" y nos lleva a la ventana de cdigo colocndose el cursor sobre el error. Cambiamos la etiqueta "bug" por "start", y ensamblamos nuevamente (build all). Nos aparecer nuevamente la ventana de resultados dicindonos que ahora tenemos todo correcto (lo que no quiere decir que funcione correctamente, que no es lo mismo). Recordemos que no hace falta salvar los cambios en el cdigo cuando cambiamos "bug" por "start" ya que cuando ensamblamos se guardan automticamente los cambios. Veremos la siguiente ventana:

Ya se ha creado el archivo *.HEX que es el que se graba en el PIC. Si nos fijamos en el directorio donde hemos guardado el proyecto, veremos el archivo. En estos momentos ya podramos utilizar este archivo para grabarlo en el PIC, pero antes necesitamos saber si funciona bien el programa, as que tendremos que simular antes para comprobarlo. Como dato respecto al ensamblado o compilado, cada vez que nos aparezca la ventana en la que nos indique que hemos tenido algn error (uno o ms), siempre hay que comprobar el primero, porque el resto de los errores pueden producirse por culpa del primero, as que solucionando ste podran desaparecer el resto o al menos alguno de ellos.

SIMULACIN: Ahora lleg el momento de simular, depurar o debuguear . Si tenemos el proyecto cerrado, nos vamos al men project y seleccionamos open project, y elegimos tutor84. Recordar que si queremos guardar el proyecto, nos vamos al men project y despus close project. Es la nica forma de cerrarlo. No es suficiente con cerrar la ventana de cdigo para cerrar el proyecto, eso lo podremos observar cuando la cerremos y se siga viendo en la barra de ttulo el proyecto. La primera vez que guardamos o cerramos el proyecto, nos preguntar si queremos guardar los cambios hechos, y estos cambios incluyen hasta las posiciones de las ventanas de cdigo, etc. en el rea de trabajo. Y as cuando lo abramos la prxima vez, nos aparecern

62

las ventanas y dems partes integrantes del mismo, en las mismas posiciones donde estaban antes de guardarlo. Una vez abierto el proyecto, y viendo la ventana de cdigo, nos vamos al men DEBUG RUN - RESET para inicializar el sistema. Una vez inicializado, vemos que estamos parados en la primera instruccin que va a ejecutar el PIC. La lnea que aparece resaltada es la que se va a ejecutar, NO que ya est ejecutada. Para volver a simular o regresar al punto de partida, de nuevo pulsaremos RESET. Una vez parados sobre la primera instruccin a ejecutar (lo que tenemos arriba son directivas para el ensamblador y no forman parte del cdigo asm) nos vamos al men DEBUG RUN - STEP o desde el acceso directo que tenemos en el botn que tiene el dibujo de dos pies. Este es el botn para ejecutar paso a paso. A la derecha hay otro igual pero con una lnea entre los dos pies. Esta funcin se llama STEP OVER y sirve para ejecutar paso a paso igual que el anterior, pero si encuentra algn CALL lo ejecuta todo de golpe como si de una sola lnea se tratara. Tambin puedes acceder a STEP a travs de la tecla F7. Vemos que hemos ido a START dado que la primer instruccin es GOTO START. En este comando no veremos programacin, sino en forma bsica la simulacin o depuracin. Si observamos la barra de status, veremos como ha cambiado el valor del Program Counter (PC) a 0x04. Si seguimos presionando F7 repetidamente, podremos observar como se ejecuta el proceso paso a paso. Para hacer que funcione a tiempo real (tiempo real para el programa de simulacin, no la velocidad real del pic durante la simulacin). Nos vamos nuevamente al men DEBUG RUN - RUN o pulsamos el botn del semforo verde o F9, y veremos como la barra de estado cambia su color a amarillo. Esto nos indica que el programa esta funcionando en tiempo real (lgicamente no veremos la lnea negra de simulacin cambiar de posicin por cada instruccin que ejecuta ya que no nos dara tiempo a verlo). Para detener el proceso apretamos el semforo rojo, o F5. Se detendr donde estaba ejecutndose en el momento de pulsar el semforo o la tecla F5. Tambin tenemos la funcin ANIMATE que no es nada ms que un AUTO STEP. La podemos seleccionar en el men DEBUG RUN - ANIMATE o control F9, y veremos en forma automtica como se ejecutan las lneas. Lo detenemos tambin con F5.

OTRAS VENTANAS DE LA SIMULACIN: Realmente de poco nos sirve ver esa lnea subir y bajar, si no nos muestra ninguna informacin sobre los registros, etc. Para eso tendremos que ir al men WINDOWS SPECIAL FUNCTION REGISTER y nos abrir la ventana de registros especiales o especficos del PIC16F84 que ya est configurado en DEVELOPMENT MODE.

63

En esta ventana veremos todos los registros especiales del micro. Tambin veremos que cuando cambian de valor, cambian de color azul a rojo. Y donde esta el registro de uso general que lo hemos denominado c1 en el programa? Si queremos ver absolutamente todos los registros tenemos que ir al men WINDOWS FILE REGISTER. As se abrir una ventana en hexadecimal que no entendemos. Sobre la barra de titulo de esta nueva ventana, vemos que a la izquierda del titulo hay un icono que son tres hojas superpuestas. Si pinchamos con el puntero del ratn encima, nos desplegar un men, en donde elegiremos "Symbolic Display" y veremos la ventana siguiente:

Aqu vemos todos los registros del micro, tanto los especiales como los de uso general, incluso los que hemos renombrado como el caso de "c1". Hasta aqu todo correcto. Pero Qu pasa si tenemos un programa ms grande que el actual y con ms registros? El poder ver esta ventana se nos hara muy complicado.

64

Para buscar una solucion a esto, tenemos otra ventana especial llamada "Watch Window" y que se guardar con nuestro proyecto.

WATCH WINDOW: Cerramos todas las ventanas que hemos abierto escepto la de cdigo y seleccionamos en men window - watch window - new watch window. Nos aparecer una ventana en blanco y al mismo tiempo sobre esta ltima, la ventana Add Watch Symbol, ya que no tenemos todava ningn smbolo cargado. Escribimos en el cuadro de dilogo el registro que queremos ver (en este caso sera c1):

Pinchamos en el botn Add. Tal y como est ahora lo veremos por defecto en hexadecimal. Si queremos verlo en otro formato (decimal, binario, ...), antes de presionar Add pulsamos en Properties y seleccionamos el que nosotros queramos. Y para finalizar con la pantalla de aadir smbolos pinchamos en Close. Ahora ya tenemos nuestra ventana con los registros que realmente nos interesa ver. Podemos agregar ms registros presionando la barra de titulo, sobre el icono y despus Add, o Edit si queremos editarla, etc.

De esta forma nos ser ms fcil seguir a un registro en particular. Con el programa tecleado antes, veremos como se incrementa y luego se desborda c1 volviendo nuevamente a 00000000. Para agregar o editar registros accedemos a travs del icono de la barra de ttulo de la ventana watch window o a travs del men window - watch window - xxx en donde nos

65

mostrar add active watch, edit active...etc, haciendo referencia a active porque podemos tener ms de una ventana watch window. Si queremos guardar la ventana de watch window para no tener que construirla nuevamente cada vez que queramos utilizarla, lo haremos con save watch window. Pero si cerramos el proyecto, nos preguntar si queremos guardar los cambios. Le respondemos que si y entonces se guardar automticamente la ventana con el nombre por defecto watch_1.wdt.

BREAK POINTS O PUNTOS DE PARADA: Los breakpoints sirven para detener el procesador en el punto del programa donde le indiquemos. Para ello nos situamos en la ventana de cdigo, y colocamos el cursor sobre la instruccin MOVLW 0x09 y una vez all pinchamos con el botn derecho del ratn y se nos abre el men contextual, donde elegimos Break Point(s). Veremos que la lnea cambia de color (a rojo), indicndonos que tenemos un break point en dicha lnea.

Tendremos que asegurarnos que en la barra de estado (la que tenemos en la parte de abajo) en donde dice Bk est en ON. Si est en OFF nunca se detendr en ningn break point. Para cambiarlo hacemos doble click ah mismo y se cambiar de un estado a otro. Tambin podremos hacerlo en el men option - development mode y pinchamos en la solapa Break Point y marcamos la casilla Global Break Enable. Hacemos de nuevo un reset del sistema, presionamos F9 y veremos como se detiene cada vez que llegue al break point. Tambin tenemos muchas otras opciones, como por ejemplo RUN TO HERE, que hace que se ejecute el cdigo hasta all sin necesidad de colocar un break point. Los Break Points se pueden colocar en la ventana de cdigo, en window - Program Memory (es el buffer que habamos mencionado antes) o en window - Absolute Listing. Source Files: si vamos al men window - Project Window se nos abrir una ventana en donde nos muestra todos los archivos que forman parte del proyecto. Haciendo click en ellos nos abrir el editor del mismo.

MPASM, EL ENSAMBLADOR DE MICROCHIP:

66

El ensamblador de Microchip es el MPASM, el cual forma parte constituyente del IDE. Veremos las directivas del mismo, los controles, etc. Con el MPASM procederemos a ensamblar un programa que hayamos creado o editado con el MPLAB. Este nos permite escribir el cdigo y ensamblarlo para producir como salida un fichero *.HEX que nos servir para grabarlo en el PIC o utilizarlo por el simulador o emulador. Pero tenemos distintas configuraciones del MPASM para producir diferentes resultados: Podemos utilizarlo, como el caso del tutorial, para generar un fichero "ejecutable" *.HEX a partir de un solo cdigo "ABSOLUTO" como lo era el pequeo programa del tutorial. Podemos generar un archivo ejecutable *.HEX a partir de la unin de distintos cdigos objeto y otros mdulos separados, ensamblados y/o precompilados. En este caso la herramienta que dispone el MPASM para unir esos mdulos se llama MPLINK o linker. Genera mdulos objeto para ser ensamblados con otros mdulos y as producir un nico archivo ejecutable. Crear libreras con el MPLIB (una coleccin de cdigos objeto listos para ser usados y que se almacenan todos juntos en un nico archivo con extensin *.LIB).

Es conveniente aprender a utilizar el linkeador, dado que hay mucho cdigo objeto en Internet para bajar e incluir en nuestros proyectos. Configuracin y uso:

67

En la pantalla anterior vemos el botn Browse que utilizaremos para localizar e indicar al MPASM el archivo que queremos ensamblar, y con las opciones que podemos seleccionar en ella: Formato de salida del archivo *.HEX. Si queremos que nos muestre todos los mensajes, o slo los de error. El formato de salida del archivo *.HEX. Archivos y listados que generar. Tipo de procesador, etc...

Una vez tengamos todas las opciones seleccionadas, pulsamos el botn de Assemble y nos aparecer la siguiente pantalla:

Aqu nos muestra los errores, advertencias (warnings), mensajes y lneas ensambladas. Si no hemos tenido ninguno, podemos proceder a grabar el pic o simular el programa. Si hemos tenido errores, vamos a editar el archivo *.ERR generado por el MPASM con el propio editor del MPLAB o con cualquier otro editor de texto, y que nos mostrar las lneas en donde tenemos los errores.

Lenguaje de DIRECTIVAS: Insisto en que las instrucciones de los PIC' s son nicas y no hay ms que las que hemos visto anteriormente. No confundir las propias instrucciones de los PIC' s con las directivas del ensamblador. Las famosas directivas son solo eso, directivas para el ensamblador, le dicen cmo hacer tal cosa o tal otra, y solo nos sirve para realizar las cosas ms rpido, y as ayudarnos en la

68

tarea de programacin. Tenemos muchos tipos de directivas, las cuales se escriben dentro del cdigo fuente. Por eso no hay que confundir las directivas con las instrucciones del PIC. Los tipos de directivas son: Directivas de control. Directivas de datos. Directivas de listado. Directivas de macros. Directivas de ficheros objeto.

Las directivas de control, permiten un ensamblado CONDICIONAL. Las directivas de datos, son todas aquellas que permiten la manipulacin simblica y posicionamiento en memoria. Las directivas de listado permiten todo el control sobre la paginacin o listado del programa, as como su formato. La directivas de macros, permiten todas las gestiones de las macros. Las directivas de fichero objeto, slo se utilizan para la creacin de ficheros objeto o reubicables/reusables para luego enlazar con el MPLINK.

69

70

71

Aunque hay muchas directivas, vale la pena conocerlas para as ahorrarnos tiempo al programar. Veamos las que tienen mayor uso: ORG: Le indica al ensamblador dnde comienza el programa, y as lo graba a partir de la posicin que especificamos aqu. #DEFINE: Muy til. Define un nombre para algn registro, pin, etc. Por ejemplo, #DEFINE SALIDA PORTA,3 sirve para no tener necesidad de recordar cual era el pin de salida, sino que slo lo mencionaremos como SALIDA. Podemos ponerlo a 0 con la instruccin BCF SALIDA en vez de hacer BCF PORTA,3 o BCF RA3. END: Indica al MPASM que ha terminado el programa. EQU: Define una constante con una etiqueta. La constante puede ser un registro o un valor numrico. #INCLUDE: Con esta directiva empezamos casi todos los programas. Como el ensamblador no sabe que microprocesador estamos utilizando en nuestro cdigo, Microchip ha creado una serie de archivos con extensin *.INC donde se definen todos los registros y datos respecto del procesador que estemos utilizando. En dicho archivo se define que la direccin 0x05 se llama PORTA, y por eso no tendremos que recordar la direccin, simplemente escribir en nuestro cdigo CLRF PORTA directamente. Lgicamente, si en nuestro cdigo definimos que PORTA ahora se llama R2D2, lo tendremos que llamar R2D2. Por eso al principio del cdigo ponemos #INCLUDE P16F84.INC si es que estamos trabajando con el PIC16F84. Todos los archivos *.INC se encuentran en el directorio de instalacin del MPLAB. Tambin sirve esta directiva para incluir libreras de rutinas, algo as como las DLL' s del x86. MACRO: Para crear una macro. Por ejemplo: NUEVO CLRF BSF ENDM Hemos creado una macro llamada NUEVO. Ahora cada vez que pongamos la palabra NUEVO (en la segunda columna cuando queramos llamar a la macro), en realidad lo que har el MPASM es reemplazar la palabra NUEVO por CLRF PORTA.......etc. hasta el final de la macro que termina con la directiva ENDMacro (ENDM). Muy til tambin!. MACRO PORTA PORTB,2

72

Você também pode gostar