apuntes pic

Upload: amador-vivar-recarte

Post on 08-Jul-2015

404 views

Category:

Documents


6 download

TRANSCRIPT

CURSO MICROCONTROLADOR PIC16F84INDICETEMA 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. PROGRAMACIN EN ASM 2.1. Instrucciones ASM del PIC 16F842.1.1. De control y manejo de literales. 2.1.2. Orientadas a registros. 2.1.3. Orientadas a bits.

TEMA 2:

2.2 Modos de direccionamiento. 2.3. Tcnicas de programacin en ASM. 2.4. Ejemplos de programas ASM. TEMA 3: ESCRITURA DE PROGRAMAS EN ASM 3.1. Uso del block de notas con Windows 3.2. Programa MPLAB3.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.

Hardware1.1 Arquitectura HarvardLa 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 el 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 Set de Instrucciones Reducido, o RISC (Reduced Instruccin Set Computer), el set de instrucciones y el bus de memoria de programa pueden disearse de tal manera que todas las instrucciones tengan una sola posicin de memoria de programa de longitud. 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 MEMORIAMEMORIA 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. REGISTROSORGANIZACION: 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 01 est 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 la 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.

Registros especiales del PIC16F84Los 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 disponibles.

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.

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 especfica, 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. Registro STATUS 7 6 5 4 3 2 1 0

IRP RP1 RP0 TO PD Z DC C El bit Z indica que el resultado de la ltima operacin fue CERO. El bit C indica acarreo del bit ms significativo (bit 7) del resultado de la ltima 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 ltima 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 detallar 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 (perro guardin), est relacionado con los mismos elementos que el bit anterior y su uso se detallar 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:

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.

1.4. TEMPORIZADOR/CONTADOR (TMP0, WDT Y SLEEP) 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. 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. 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. 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.

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

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:

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 mA, pero si utilizamos todas las lneas del puerto "A" programadas como salidas, no deber exceder 50mA para el puerto "A". El 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.

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 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 E/S 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 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.

FuncionamientoLas 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

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.

2.1. INSTRUCCIONES ASM DEL PIC16F84El 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 bytesMnemnico Parmetros DescripcinADDWF ANDWF CLRF CLRW COMF DECF DECFSZ INCF INCFSZ IORWF MOVF MOVWF NOP RLF RRF SUBWF SWAPF XORWFf, 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 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 Banderas1 1 1 1 1 1 1(2) 1 1(2) 1 1 1 1 1 1 1 1 1 C, DC, Z Z Z Z Z Z None Z None Z Z None None C C C, DC, Z None Z

Instrucciones orientadas a los bitsMnemnico Parmetros DescripcinBCF BSF BTFSC BTFSSf, b f, b f, b f, b Bit Clear f Bit Set f Bit Test f, Skip if Clear Bit Test f, Skip if Set

Ciclos Banderas1 1 1 (2) 1 (2) None None None None

Operaciones con literales y de controlMnemnico Parmetros DescripcinADDLW ANDLW CALL CLRWDT GOTO IORLW MOVLW RETFIE RETLW RETURN SLEEP SUBLW XORLWk k k k k k k k k Add literal and W AND literal with W Call subroutine Clear Watchdog Timer Go to address Inclusive OR literal with W Move literal to W Return from interrupt Return with literal in W Return from Subroutine Go into standby mode Subtract W from literal Exclusive OR literal with W

NroCic. Banderas1 1 2 1 2 1 1 2 2 2 1 1 1 TO,PD None Z None None None None TO,PD C, DC, Z Z C, DC, Z Z

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 EspecialesMnemnico Parmetros DescripcinADDCF ADDDCF B BC BDCf, d f, d K K K Add Carry to File Add Digit Carry to File Branch Branch on Carry Branch on Digit Carry

Operacin EquivalenteBTFSC INCF BTFSC INCF GOTO BTFSC GOTO BTFSC 3,0 f,d 3,1 f,d k 3,0 k 3,1

BanderasZ Z -

GOTO

k 3,0 k 3,1 k 3,2 k 3,2 k 3,0 3,1 3,2 Z Z Z Z Z

BNC BNDC BNZ BZ CLRC CLRDC CLRZ LCALL LGOTO MOVFW NEGF SETC SETDC SETZ SKPC SKPDC SKPNC SKPNDC SKPNZ SKPZ SUBCF SUBDCF TSTF

K K K K

Branch on No Carry Branch on No Digit Carry Branch on No Zero Branch on Zero Clear Carry Clear Digit Carry Clear Zero

BTFSS GOTO BTFSS GOTO BTFSS GOTO BTFSC GOTO BCF BCF BCF

K

Long CALL

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

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

f,d f,d f

Substract Carry from File Substract Digit Carry from File Test File

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).

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 bits0 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. 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

Ejemplo:

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:

Ejemplo:

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. INSTRUCCIN 1 GOTO ABAJO INSTRUCCIN 3 INSTRUCCIN 4 INSTRUCCIN 5 ABAJO 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 bits0 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 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 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 * * COMPARA INSTRUCCIN R1 INSTRUCCIN R2 RETURN

Ejemplo:

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).

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:

XORLW k (hex = 3A kk) Operacin lgica OR exclusivo entre el acumulador y el literal k

W = W XOR kEsta 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:

Ejemplo:

Tenemos 4 posibles combinaciones entre dos bits0 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.

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 > 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).Explicacin de la operacin AND: 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. Si queremos poner a cero el registro TMR0, cuya direccin es 01H, tendramos que utilizar

Ejemplo:

CLRF 01HSi 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. 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 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.

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.

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 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:

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. Ejemplo: Si tenemos el registro VALOR = 00000001B y aplicamos la instruccin 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. 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.

d = 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. 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:

Ejemplo:

Tenemos 4 posibles combinaciones entre dos bits0 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.

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.

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.

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 ;prepara para repetir 8 veces movwf DATO ;(el registro DATO es el contador del bucle) movlw 1Ah ;apunta a la direccin 1Ah movwf FSR ;guarda en FSR la direccin 1Ah bucle clrf 0 ;borra una posicin de memoria (pone a cero) incf FSR ;apunta a la siguiente decfsz DATO ;si todava no borr todas (an no es cero) goto bucle ;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.

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

2.3 TECNICAS DE PROGRAMACIONSUBRUTINAS 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. 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.

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 0 en hexadecimal (8 bits) en ascii (16 bits) ascii en hexadecimal (16 bits)

"7" "0" 37h 30h

Transportndolo a un programa: ; posicin donde se almacena el nmero a convertir NumHex equ 0Ch ; posicin donde se almacena el resultado parte alta AsciiH equ 0Dh 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 iorlw 30h ; convierte el nmero en ascii

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

; 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 opcin2 opcin3 equ equ equ 0 1 2

Uno de estos posibles valores llevarlo a W y en una parte del programa tratarlo as:

Decisin: addwf goto goto goto

;sitio en donde la pregunta "?" tendra solucin PCL,1 Accin1 Accin2 Accin3

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 ; se realiza la verificacin de OPCION respecto a W btfsc STATUS,Z ; verificando la bandera Z goto Accin1 movlw Opcin2 xorwf OPCION,0 ; se realiza la verificacin de OPCION respecto a W btfsc STATUS,Z ; verificando la bandera Z goto Accin2 movlw Opcin3 xorwf OPCION,0 ; se realiza la verificacin de OPCION respecto a W btfsc STATUS,Z ; Verificando la bandera Z goto Accin3 Accin1: ............................... ; instrucciones correspondientes a la Accin 1 ...............................

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

; instrucciones correspondientes a la Accin 2

; instrucciones correspondientes a la Accin 3

; 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

TEMPORIZACIN: A veces se necesita realizar un retardo de tiempo cuando programamos. Los retardos de tiempo se pueden obtener mediante hardware o por medio de ciclos repetitivos basados en software. La precisin de los retardos generados por software depende en esencia del tipo de oscilador que se utilice como base de tiempo en el microcontrolador (la mayor precisin se obtiene de los cristales de cuarzo).

La velocidad a la que se ejecuta el cdigo (instrucciones) depende de la velocidad del oscilador y del nmero de ciclos de mquina ejecutados. Las instrucciones necesitan 1 2 ciclos de mquina para ser ejecutadas. Un ciclo de mquina es un tiempo utilizado por el microcontrolador para realizar sus operaciones Tciclo mq = 4 / fosc internas y equivale a cuatro ciclos del oscilador. Por tanto: Tciclo mq.= 4 * Tosc El nmero de ciclos de mquina utilizados por una instruccin para ser ejecutada depende de la misma. Las instrucciones que modifican el contador de programa necesitan dos (2) ciclos de mquina, mientras que todas las dems necesitan tan solo uno (1). El hecho de generar ciclos repetitivos por medio del programa y calcular el tiempo total de ejecucin nos puede ayudar a generar tiempos precisos.

Ciclo repetitivo de retardo El ciclo repetitivo de retardo de la figura se tomar un nmero de ciclos as: Operacin la carga de k en W la carga de W en el contador el decremento del contador mientras no llegue a cero el decremento del contador cuando llegue a cero el salto a Loop Total: N de ciclos 1 1 k-1 2 2 * (k-1) 3*k+1

Por cada instruccin agregada debe incluirse en la cuenta total el nmero de ciclos correspondiente a dicha instruccin. Trabajando a 4 Mhz y asumiendo que k se remplaza por el valor 15d en el ejemplo tendramos un tiempo igual a: Nmero de ciclos = (3*15) +1 = 46 ciclos de mquina, Tciclo mq.= 4 / 4 Mhz = 1 segundo, el tiempo total entonces ser de 46 segundos.

EJEMPLO 1: ;Almacenar el valor 26h en 15 posiciones contiguas de la memoria de datos, ;empezando desde la direccin 0x10 List p=16F84 include "P16F84.INC" Contador Primera equ equ 0x10 org Inicio movlw movwf movlw movwf movlw movwf incf decfsz goto end 0x0c ;Tipo de procesador ;Definiciones de registros internos ;Contador interno ;Posicin inicial ;Vector de Reset ;Carga el acumulador con 15 (decimal) ;Carga el contador con 15 (decimal) ;Inicia puntero con direccin inicial ;Carga valor a almacenar ;Almacena valor en pos. indicada por FSR ;Incrementa el puntero FSR ;Decrementa contador hasta llegar a 0 ;Regresa a Bucle si Contador no es 0 ;Fin del programa fuente

0x00 .15 Contador Primera FSR 0x26 INDF FSR,F Contador,F Bucle

Bucle

EJEMPLO 2: ;Sumar dos valores (3 y 9) y guardar el resultado en la posicin 0x10 List p=16F84 include "P16F84.INC" Total equ org Inicio 0x10 0x00 ;Tipo de procesador ;Definiciones de registros internos ;Define la posicin del resultado ;Vector de Reset ;Carga 1er. sumando en W ;Suma el 2 sumando ;Guarda el resultado en el registro Total ;Fin del programa fuente

movlw 0x03 addlw 0x09 movwf Total end

EJEMPLO 3: ;Tres valores A,B y C guardados ya en memoria. Aplicar la ecuacin: (A+B)-C

List p=16F84 include "P16F84.INC" Dato_A equ Dato_B equ Dato_C equ Resultado 0x10 0x11 0x12 equ org Inicio movf

;Tipo de procesador ;Definiciones de registros internos ;Define la posicin del dato A ;Define la posicin del dato B ;Define la posicin del dato C ;Define la posicin del resultado ;Vector de Reset ;Carga 1er.sumando

0x13 0x00

Dato_A,W

addwf movwf movf subwf end

Dato_B,W Resultado Dato_C,W Resultado,F

;Suma 2 sumando ;Almacena resultado parcial ;Carga sustraendo ;Resta del minuendo y almacena ;Fin del programa fuente

EJEMPLO 4: ;Comparar dos nmeros A y B. Si A=B, el resultado es 0. Si A > B, el resultado ;es A-B. Si A < B el resultado es A+B. Al salir de esta rutina tendremos el ;valor en el registro Resultado. ; ;Hay que destacar que, al no haber instrucciones de comparacin, esta se realiza ;mediante restas. List p=16F84 include "P16F84.INC" Dato_A equ Dato_B equ Resultado 0x10 0x11 equ org Inicio movf ;Tipo de procesador ;Definiciones de registros internos

0x12 0x00

;Variable del dato A ;Variable del dato B ;Variable para el resultado ;Vector de Reset ;Carga el dato B ;Resta/compara con dato A ;Son iguales (Z=1)?? ;Si, entonces salta a A_igual_B ;No. A mayor que B (C=0)?? ;Si, entonces salta a A_mayor_B ;No, A es menor que B ;Suma a ms B ;Guarda el resultado

Dato_B,W subwf Dato_A,W btfsc STATUS,Z goto A_igual_B btfsc STATUS,C goto A_mayor_B movf addwf movwf goto Dato_A,W Dato_B,W Resultado Salida

A_menor_B

A_mayor_B

movwf Resultado goto Salida clrf end Resultado

;Guarda el resultado

A_igual_B Salida EJEMPLO 5:

;Pone a 0 el resultado ;Fin del programa fuente

;Sumar dos nmeros A y B, de 16 bits cada uno. ; List p=16F84 include "P16F84.INC" Dato_A_L Dato_A_H Dato_B_L Dato_B_H Resultado_L Resultado_H equ equ equ equ equ equ org 0x10 0x11 0x12 0x13 0x14 0x15 0x00 ;Tipo de procesador ;Definiciones de registros internos ;Define la posicin del dato A (bajo) ;Define la posicin del dato A (alto) ;Define la posicin del dato B (bajo) ;Define la posicin del dato B (alto) ;Define la posicin del resultado (bajo) ;Define la posicin del resultado (alto) ;Vector de Reset

Inicio

movf addwf movwf movf btfsc addlw addwf movwf end

Dato_A_L,W Dato_B_L,W Resultado_L Dato_A_H,W STATUS,C 1 Dato_B_H,W Resultado_H

;Carga menos peso del dato A ;Suma menos peso del dato B ;Almacena el resultado ;Carga ms peso del dato A ;Hubo acarreo anterior ?? ;Si, suma 1 al acumulador ;Suma ms peso del dato B ;Guarda el resultado ;Fin del programa fuente

EJEMPLO 6: ;Restar dos nmeros, A y B, de 16 bits cada uno. ;Aunque este ejercicio es similar al anterior, se debe apreciar que, el contenido del acumulador acta ;como sustraendo y el operando, como minuendo. ;Igualmente hay que apreciar que el flag CARRY se debe interpretar de forma inversa a como se hace con ;la suma (a "0" hay desbordamiento). List p=16F84 include "P16F84.INC" Dato_A_L Dato_A_H Dato_B_L Dato_B_H Resultado_L Resultado_H equ equ equ equ equ equ org Inicio movf subwf movwf movf btfss addlw subwf movwf end 0x10 0x11 0x12 0x13 0x14 0x15 0x00 Dato_B_L,W Dato_A_L,W Resultado_L Dato_B_H,W STATUS,C 1 Dato_A_H,W Resultado_H ;Tipo de procesador ;Definiciones de registros internos ;Define la posicin del dato A (bajo) ;Define la posicin del dato A (alto) ;Define la posicin del dato B (bajo) ;Define la posicin del dato B (alto) ;Define la posicin del resultado (bajo) ;Define la posicin del resultado (alto) ;Vector de Reset ;Carga menos peso del dato B (sustraendo) ;Resta menos peso del dato A (minuendo) ;Almacena el resultado ;Carga ms peso del dato B (sustraendo) ;Hubo acarreo (CARRY = 0) anterior ?? ;Si, aade 1 al acumulador (sustraendo) ;Resta ms peso del dato A (minuendo) ;Guarda el resultado ;Fin del programa fuente

EJEMPLO 7: OPERACIONES LOGICAS EN PROGRAMACION En programacin a veces nos encontramos con la necesidad de comparar valores para tomar decisiones. A este tipo de decisiones les llamamos operaciones lgicas y las que nos podemos encontrar son: A igual a B A distinto de B A igual o mayor que B A mayor que B A menor o igual a A menor que B

Todas estas operaciones tienen solucin en programacin utilizando instrucciones de ensamblador y las posibilidades que nos da el Registro de Estado. El Registro de Estado (ya lo hemos visto antes) ocupa la posicin 0x03 del Banco 0 y 0x83 del Banco 1. Sus 8 bit son: bit 7 IRP Selecciona bancos para direccionamiento indirecto. bit 6 RP1 Seleccin pgina de memoria de programa. bit 5 RP0 Seleccin pgina de memoria de programa. bit 4 TMR0 Timer. bit 3 PD Power Down. bit 2 Z Zero 1 Si el resultado de una operacin es 0. 0 Si el resultado de una operacin es distinto de 0. bit 1 DC Acarreo en el 4 bit de menos peso. bit 0 C Acarreo en el 8 bit 1 acarreo en la suma y no en al resta. 0 acarreo en la resta y no en la suma. De todos estos registros vamos a utilizar el bit 2 y el bit 0. La "bandera" es el "bit de un registro que se pone a 0 o a 1 cuando se ejecuta un determinado tipo de instrucccin". Para este tipo de operaciones la carga de la bandera es normalmente automtica. Es recomendable comprobar el estado de la bandera antes de realizar la instruccin para tener la certeza de su estado posterior. Como vamos a comparar 2 valores, a estos los llamaremos A y B y al Registro de Trabajo le llamaremos W (acumulador).

Operacion A=B movf A,W subwf B,W btfsc Status,Z ;Carga W con magnitud A ;Resta a B el registro W ;Comprueba el bit 2 si es 0 salta. Pero como Z=1 porque ;resultado de la operacin =0 no salta y va a la ;siguiente instruccin que es goto goto donde_sea

Operacion AB movf A,W subwf B,W btfsc Status,C goto donde_sea ;Carga A en W ;Resta a B el Registro de Trabajo W (o sea A) ;Comprueba el bit C del registro Estado y como C = 0 no ;hay saltoResumiendo: Logica Nemotecnico A=B btfsc Operacion Bandera A->W (B-A) Z=1A>B AW (B-A) B-> W (A-B)C=0 C=0EJEMPLO 8: Operaciones Entrada / Salida Objetivos: Verificar el modo en el que se debe programar el sentido de los puertos. Realizar las entradas por puerto mediante la lectura de interruptores. Escribir sobre un puerto de salida.Procedimiento: En el proceso de utilizacin de un puerto debe tenerse en cuenta como primera instancia la programacin del sentido en que dicho puerto va a utilizarse. Una vez encendido el microcontrolador todos y cada uno de los puertos quedan programados como entrada, entonces tan solo deben programarse los que se quieren utilizar como salida. El programa debe entonces en un bucle infinito leer el nivel lgico que colocan los switch y pasar este resultado al puerto A complementando el estado de la informacin puesto que de acuerdo a la disposicin de los LEDs un estado bajo en el puerto enciende el LED correspondiente y un estado alto en el puerto, apaga el LED. Programa: status optionr trisa porta trisb portb equ equ equ equ equ equ 03h 81h 85h 05h 86h 06h;Inicio: bsf clrf movlw movwf bcf bcf Loop comf movwf goto endstatus,5 trisa 0Fh trisb optionr,7 status,5 portb,0 porta Loop;se pasa al banco 1 de RAM ;se programa el puerto A como salida ;dato para la programacin del puerto B ;parte alta como salida y baja como entrada ;se habilitan resistencias de Pull Up ;se pasa al banco 0 de RAM ;lee puerto B, compl. valor y resultado a W ;se pasa el resultado de W al puerto A ;ejecuta un ciclo infinitoEJEMPLO 9:;****************************