64672410-Apuntes-Pic

155
CURSO MICROCONTROLADOR PIC16F84 INDICE 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. TEMA 2: PROGRAMACIÓN EN ASM 2.1. Instrucciones ASM del PIC 16F84 2.1.1. De control y manejo de literales. 2.1.2. Orientadas a registros. 2.1.3. Orientadas a bits. 2.2 Modos de direccionamiento. 2.3. Técnicas de programación 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 MPLAB 3.2.1. Herramientas del MPLAB. 3.2.2. Funciones del MPLAB (menús). 3.2.3. Guía de uso del ensamblador MPASM (tutorial). Crear proyecto. Introducir código Ensamblado (compilar) Simulador: registros, Watch Window, break points.

Transcript of 64672410-Apuntes-Pic

  • CURSO MICROCONTROLADOR PIC16F84

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

    TEMA 2: PROGRAMACIN EN ASM 2.1. Instrucciones ASM del PIC 16F84 2.1.1. De control y manejo de literales. 2.1.2. Orientadas a registros. 2.1.3. Orientadas a bits. 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 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.

  • 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 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 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 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 PIC16F84

    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 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 DIVISOR Retardo (ms) . 0 0 0 1 18 0 0 1 2 36 0 1 0 4 72 0 1 1 8 144 1 0 0 16 288 1 0 1 32 576 1 1 0 64 1.152 1 1 1 128 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.

    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

    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 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 Descripcin Ciclos Banderas

    ADDWF f, d Add W and f 1 C, DC, Z

    ANDWF f, d AND W with f 1 Z

    CLRF f Clear f 1 Z

    CLRW - Clear W 1 Z

    COMF f, d Complement f 1 Z

    DECF f, d Decrement f 1 Z

    DECFSZ f, d Decrement f, Skip if 0 1(2) None

    INCF f, d Increment f 1 Z

    INCFSZ f, d Increment f, Skip if 0 1(2) None

    IORWF f, d Inclusive OR W with f 1 Z

    MOVF f, d Move f 1 Z

    MOVWF f Move W to f 1 None

    NOP - No Operation 1 None

    RLF f, d Rotate left f through carry 1 C

    RRF f, d Rotate right f through carry 1 C

    SUBWF f, d Subtract W from f 1 C, DC, Z

    SWAPF f, d Swap nibbles in f 1 None

    XORWF f, d Exclusive OR W with f 1 Z

  • Instrucciones orientadas a los bits

    Mnemnico Parmetros Descripcin Ciclos Banderas

    BCF f, b Bit Clear f 1 None

    BSF f, b Bit Set f 1 None

    BTFSC f, b Bit Test f, Skip if Clear 1 (2) None

    BTFSS f, b Bit Test f, Skip if Set 1 (2) None

    Operaciones con literales y de control

    Mnemnico Parmetros Descripcin NroCic. Banderas

    ADDLW k Add literal and W 1 C, DC, Z

    ANDLW k AND literal with W 1 Z

    CALL k Call subroutine 2

    CLRWDT - Clear Watchdog Timer 1 TO,PD

    GOTO k Go to address 2 None

    IORLW k Inclusive OR literal with W 1 Z

    MOVLW k Move literal to W 1 None

    RETFIE - Return from interrupt 2 None

    RETLW k Return with literal in W 2 None

    RETURN - Return from Subroutine 2 None

    SLEEP - Go into standby mode 1 TO,PD

    SUBLW k Subtract W from literal 1 C, DC, Z

    XORLW k Exclusive OR literal with W 1 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 Especiales

    Mnemnico Parmetros Descripcin Operacin Equivalente

    Banderas

    ADDCF f, d Add Carry to File BTFSC 3,0 INCF f,d Z

    ADDDCF f, d Add Digit Carry to File BTFSC 3,1 INCF f,d Z

    B K Branch GOTO k -

    BC K Branch on Carry BTFSC 3,0 GOTO k -

    BDC K Branch on Digit Carry BTFSC 3,1 -

  • GOTO k

    BNC K Branch on No Carry BTFSS 3,0 GOTO k -

    BNDC K Branch on No Digit Carry BTFSS 3,1 GOTO k -

    BNZ K Branch on No Zero BTFSS 3,2 GOTO k -

    BZ K Branch on Zero BTFSC 3,2 GOTO k -

    CLRC Clear Carry BCF 3,0 -

    CLRDC Clear Digit Carry BCF 3,1 -

    CLRZ Clear Zero BCF 3,2 -

    LCALL K Long CALL BSF/BCF 0A,3 BSF/BCF 0A,4 CALL k

    - - -

    LGOTO K Long GOTO BSF/BCF 0A,3 BSF/BCF 0A,4 GOTO k

    - - -

    MOVFW F Move File to W MOVF f,0 Z

    NEGF f, d Negate File COMF f,1 INCF f,d Z

    SETC Set Carry BSF 3,0 -

    SETDC Set Digit Carry BSF 3,1 -

    SETZ Set Zero BSF 3,2 -

    SKPC Skip on Carry BTFSS 3,0 -

    SKPDC Skip on Digit Carry BTFSS 3,1 -

    SKPNC Skip on No Carry BTFSC 3,0 -

    SKPNDC Skip on No Digit Carry BTFSC 3,1 -

    SKPNZ Skip on Non Zero BTFSC 3,2 -

    SKPZ Skip on Zero BTFSS 3,2 -

    SUBCF f,d Substract Carry from File BTFSC 3,0 DECF f,d Z

    SUBDCF f,d Substract Digit Carry from File BTFSC 3,1 DECF f,d

    Z

    TSTF f Test File MOVF f,1 Z

  • 2.1.1. DE CONTROL Y MANEJO DE LITERALES. INSTRUCCIN: ADDLW k (hex = 3E kk) Descripcin: Sumar al acumulador el valor k. Operacin: 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: ANDLW k (hex = 39 kk) Descripcin: Operacin lgica AND entre el acumulador W y el literal k Operacin: 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

    Ejemplo: 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: CALL k (hex = 2k kk) Descripcin: Llama a una subrutina en la direccin k. Operacin: 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.

    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: CLRWDT (hex = 00 64) Descripcin: Pone el temporizador WDT a cero. Operacin: 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.

    Ejemplo: Bucle CLRWDT * * * GOTO Bucle

    Registro STATUS: No modifica ningn bit de estado. INSTRUCCIN: GOTO k (hex = 28 kk) Descripcin: Salto incondicional a k. Operacin: Salto k Esta instruccin ejecuta un salto del programa a la direccin k. El

    parmetro k puede ser un valor numrico o una etiqueta. Ejemplo: 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: IORLW k (hex = 38 kk) Descripcin: Operacin lgica OR entre el acumulador W y el literal k Operacin: 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).

    Ejemplo: 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: MOVLW k (hex = 30 kk) Descripcin: Mover el literal k al acumulador. Operacin: W = k Esta instruccin asigna al acumulador W el valor del literal k

    (entre 0 y 255). Ejemplo: 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: OPTION (hex = 00 62) Descripcin: Guarda el valor del acumulador en el registro OPTION. Operacin: OPTION = W. Esta instruccin guarda en el registro especial OPTION el valor

    contenido en el acumulador W. Ejemplo: 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: RETFIE (hex = 00 09) Descripcin: Retorna de una interrupcin. Operacin: FIN INTERRUPCION. Esta instruccin devuelve el control al programa principal despus

    de ejecutarse una subrutina de gestin de interrupcin. Ejemplo: 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: RETLW (hex = 34 kk) Descripcin: Retorno de subrutina y carga literal k en el acumulador. Operacin: 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.

    Ejemplo: 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: RETURN (hex = 00 08) Descripcin: Retorno de subrutina. Operacin: 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).

    Ejemplo: CALL COMPARA ; llama a Compara. INSTRUCCION1 INSTRUCCION2 * * 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: SLEEP (hex = 00 63) Descripcin: En modo reposo.. Operacin: 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: SUBLW k (hex = 3C kk) Descripcin: Resta al literal k el valor del acumulador. Operacin: 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: TRIS f (hex = 00 6F) Descripcin: Guarda el acumulador en uno de los registros de TRIS. Operacin: 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.

    Ejemplo: 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: XORLW k (hex = 3A kk) Descripcin: Operacin lgica OR exclusivo entre el acumulador y el literal k Operacin: 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).

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

  • 2.1.2.ORIENTADAS A REGISTROS. INSTRUCCIN: ADDWF f,d (hex = 07 ff) Descripcin: Suma el acumulador y el registro f. Operacin: 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: ANDWF f,d (hex = 05 ff) Descripcin: Operacin lgica AND entre el acumulador y el registro f. Operacin: 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.

    Ejemplo: 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: CLRF f (hex = 01 8f) Descripcin: Pone a cero el registro f. Operacin: 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: CLRW (hex = 01 00) Descripcin: Pone el acumulador a cero. Operacin: W = 0 Esta instruccin pone a cero el valor contenido en el registro W

    (acumulador) Ejemplo: No es necesario

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

    es 0). INSTRUCCIN: COMF f,d (hex = 09 ff) Descripcin: Complementa el registro f. Operacin: 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: DECF f,d (hex = 03 ff) Descripcin: Decrementa en 1 el registro f. Operacin: 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: DECFSZ f,d (hex = 0B ff) Descripcin: Decrementa en 1 a f, y si f = 0 salta la siguiente instruccin. Operacin: 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.

    Ejemplo: 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: INCF f,d (hex = 0A ff) Descripcin: Incrementa en 1 el registro f. Operacin: 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: INCFSZ f,d (hex = 0F ff) Descripcin: Incrementa en 1 a f, y si f = 0 salta la siguiente instruccin Operacin: 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.

    Ejemplo: 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: IORWF f,d (hex = 04 ff) Descripcin: Operacin lgica OR inclusivo entre el acumulador y un registro Operacin: 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: MOVF f,d, (hex = 08 ff) Descripcin: Mueve el contenido de f al acumulador o al propio registro f. Operacin: 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: MOVWF f (hex = 00 8f) Descripcin: Mueve el contenido de W al registro f. Operacin: f = W. Esta instruccin copia el contenido del acumulador W en el

    registro direccionado por el parmetro f. Ejemplo: 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: NOP (hex = 00 00) Descripcin: No opera. Operacin: - - - - - - 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: RLF f,d (hex = 0D ff) Descripcin: Rota a la izquierda el registro f. Operacin: d =

  • INSTRUCCIN: RRF f,d (hex = 0C ff) Descripcin: Rota a la derecha el registro f. Operacin: 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:

    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: SUBWF f,d (hex = 02 ff) Descripcin: Resta el acumulador del registro f. Operacin: 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: SWAPF f,d (hex = 0E ff) Descripcin: Intercambia los 4 bits ms significativos con los 4 menos (nibbles) Operacin: 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: XORWF f,d (hex = 06 ff) Descripcin: Operacin lgica XOR entre el acumulador y f. Operacin: 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.

    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.

  • 2.1.3. ORIENTADAS A BITS. INSTRUCCIN: BCF f,b (hex = 1B ff) Descripcin: Pone a cero el bit b del registro f. Operacin: F(b) = 0 Esta instruccin pone a cero un bit que hayamos elegido de un

    registro determinado. Ejemplo: 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: BSF f,b (hex = 1B ff) Descripcin: Pone a uno el bit b del registro f. Operacin: F(b) = 1 Esta instruccin pone a uno un bit que hayamos elegido de un

    registro determinado. Ejemplo: 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: BTFSC f,b (hex = 1B ff) Descripcin: Comprueba un bit b del registro f y se salta la instruccin

    siguiente si vale 0. Operacin: 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.

    Ejemplo: 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: BTFSS f,b (hex = 1B ff) Descripcin: Comprueba un bit b del registro f y se salta la instruccin

    siguiente si vale 1. Operacin: 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.

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

    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)

    "7" "0" en ascii (16 bits)

    37h 30h 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 iorlw 30h ; convierte el nmero en ascii

  • movwf AsciiL ; el nmero queda salvado en la variable de salida movlw 0F0h ; dato para enmascarar parte baja andwf NumHex,1 ; se enmascara la parte baja del nmero hexa y queda all swapf NumHex,0 ; se invierten parte alta y baja iorlw 30h ; convierte el nmero en ascii movwf AsciiL ; 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 opcin2 equ 1 opcin3 equ 2 Uno de estos posibles valores llevarlo a W y en una parte del programa tratarlo as:

  • Decisin: ;sitio en donde la pregunta "?" tendra solucin addwf PCL,1 goto Accin1 goto Accin2 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 ...............................

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

    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 internas y equivale a cuatro ciclos del oscilador. Por tanto: Tciclo mq.= 4 * Tosc Tciclo mq = 4 / fosc 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 N de ciclos

    la carga de k en W 1 la carga de W en el contador 1 el decremento del contador mientras no llegue a cero k-1 el decremento del contador cuando llegue a cero 2 el salto a Loop 2 * (k-1)

    Total: 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 ;Tipo de procesador include "P16F84.INC" ;Definiciones de registros internos Contador equ 0x0c ;Contador interno Primera equ 0x10 ;Posicin inicial org 0x00 ;Vector de Reset Inicio movlw .15 ;Carga el acumulador con 15 (decimal) movwf Contador ;Carga el contador con 15 (decimal) movlw Primera movwf FSR ;Inicia puntero con direccin inicial movlw 0x26 ;Carga valor a almacenar Bucle movwf INDF ;Almacena valor en pos. indicada por FSR incf FSR,F ;Incrementa el puntero FSR decfsz Contador,F ;Decrementa contador hasta llegar a 0 goto Bucle ;Regresa a Bucle si Contador no es 0 end ;Fin del programa fuente EJEMPLO 2: ;Sumar dos valores (3 y 9) y guardar el resultado en la posicin 0x10 List p=16F84 ;Tipo de procesador include "P16F84.INC" ;Definiciones de registros internos Total equ 0x10 ;Define la posicin del resultado org 0x00 ;Vector de Reset Inicio movlw 0x03 ;Carga 1er. sumando en W addlw 0x09 ;Suma el 2 sumando movwf Total ;Guarda el resultado en el registro Total end ;Fin del programa fuente EJEMPLO 3: ;Tres valores A,B y C guardados ya en memoria. Aplicar la ecuacin: (A+B)-C List p=16F84 ;Tipo de procesador include "P16F84.INC" ;Definiciones de registros internos Dato_A equ 0x10 ;Define la posicin del dato A Dato_B equ 0x11 ;Define la posicin del dato B Dato_C equ 0x12 ;Define la posicin del dato C Resultado equ 0x13 ;Define la posicin del resultado org 0x00 ;Vector de Reset Inicio movf Dato_A,W ;Carga 1er.sumando

  • addwf Dat