Está en la página 1de 36

PIC 16F84 una gua para el aprendizaje

1 Arquitectura Von Newmann y Harvard 2 Mapa de memoria 3 Registros 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 4 Puertos de Entrada y Salida 5 Interrupciones 6 Instrucciones assembler del 16F84 6 Instrucciones de control y manejo de literales 6 Instrucciones orientadas a bits 6 Instrucciones orientadas a registros 7 Modos de direccionamiento 8 Tcnicas de programacin 1, 2, 3, 4

1 Arquitectura Von Newmann


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 Harvard
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 est 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). La arquitectura harvard funciona de la siguiente manera

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.

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

3 Registros 01
ORGANIZACIN La memoria interna de datos, tambin llamada archivo de registros (register file), esta dividida en dos grupos: Los registros especiales (8 registros). Los registros de propsito generales(72 registros). Los registros especiales ocupan las 8 primeras posiciones que van desde la 00 a la 07, y los registros de propsito generales las posiciones que siguen, de la 08 a la 4F. Los registros especiales contienen la palabra de estado (STATUS), los registros de datos de los tres puertos de entrada salida (Puerto A, Puerto B, Puerto C), los 8 bits menos significativos del Program Counter (PC), el contador del Real Time Clock/Counter (RTCC) y un registro puntero llamado File Select Register (FSR). La posicin 00 no contiene ningn registro en especial y es utilizada en el mecanismo de direccionamiento indirecto. Los registros de propsito general se dividen en dos grupos: Los registros de posicin fija (8 registros). Los bancos de registros (64 registros). Los primeros ocupan las 8 posiciones que van de la 08 a la 0F. Los bancos de registros consisten en hasta cuatro grupos o bancos de 16 registros cada uno, que se encuentran superpuestos en las direcciones que van de la 10 a la 4F. Se puede operar con un solo banco a la vez, el cual se selecciona mediante los bits 5 y 6 del File Select Register (FSR). OTROS REGISTROS ESPECIALES

Las ocho primeras posiciones del rea de datos estn reservadas para alojar registros de propsito especial, quedando las restantes libres para contener los datos u operandos que se desee (registros de propsito general). El registro INDF que ocupa la posicin 0 no est implementando fsicamente y, como se ha explicado, se le referencia en el direccionamiento indirecto de datos aunque se utiliza el contenido de FSR. En la direccin esta el registro TMR0 (Temporizador) que puede ser ledo y escrito como cualquier otro registro. El PC ocupa la posicin 2 del rea de datos en donde se halla el registro PCL al que se aaden 3 bits auxiliares y se conectan con los dos niveles de la Pila en las instrucciones CALL y RETLW. El registro de Estado (STATUS) ocupa la posicin 3 y entre sus bits se encuentran los sealizadores C, DC y Z y los bits IRP, RP1 y RP0 que seleccionan la pgina en la memoria de programa. FRS se ubica en la direccin 4 y puede usarse para contener las direccin del dato en las instrucciones con direccionamiento indirecto y tambin para guardar operandos en sus 5 bits de menos peso. Los registros que ocupan las posiciones 5 y 6 soportan los Puertos A y B de E/S. Pueden ser ledos y escritos como cualquier otro registro y manejan los valores de los bits que entran y salen por los pines de E/S del microcontrolador.

Registros 02
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 03

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.

Registros 04
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 1024. 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.

Registros 05
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.

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 detallara en la seccin referida al modo POWER DOWN. El bit TO (TIME-OUT) sirve para detectar si una condicin de reset fue producida por el watch dog timer, esta relacionado con los mismos elementos

que el bit anterior y su uso se detallara en la seccin referida al WATCH DOG TIMER. Los bits de seleccin de pagina RP0/RP1/IRP se utilizan en las instrucciones de salto GOTO y CALL, Manipulando el bit nmero 5 (RP0) del registro STATUS podremos indicar al microcontrolador si queremos trabajar en el banco 0 o en el 1. La operacin normal del microcontrolador se efecta en el banco 0. Pero cuando nos cambiamos del banco 0 al banco 1 es para efectuar ciertos cambios que definen como estarn configurados los puertos del microcontrolador.

Registros 06
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.

Registros 07
TIMER 0 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.

Registros 08
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.

Registros 09
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: 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.

Registros 10
Funcionamiento del modo de bajo consumo (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. 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: Reset del PIC llevando a cero el pin 4 (MCLR). Timeout del Watch Dog Timer (si est habilitado). 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.

Registros 11
WATCH DOG TIMER El Watch Dog Timer (que podra traducirse como temporizador perro guardin) es un oscilador interno al PIC, pero completamente independiente del resto de la circuitera, cuya funcin es eliminar eventuales bloqueos de la CPU del PIC y resetearlo para que retome la ejecucin normal del programa. Para poder eliminar un eventual bloqueo de la CPU durante la ejecucin del programa principal, se inserta en l una instruccin especial: CLRWDT (CleaR Watch Dog Timer)

La cual pone a cero en intervalos regulares el WDT, no permitindole llegar al final de su temporizacin. Si la CPU no realiza esta instruccin antes del trmino de la temporizacin, entonces, se asume que el programa se ha bloqueado por algn motivo y se efecta el reset de la CPU. El periodo mnimo alcanzado el cual la CPU es reseteada es de unos 18 ms (depende de la temperatura y de la tensin de alimentacin). Es posible, sin embargo, asignar el prescaler al WDT a fin de obtener retardos mayores (hasta unos 2,3 segundos). Para habilitar el WDT debemos, en la fase de programacin, habilitar el flag WDTE de la palabra de configuracin. La modalidad de activacin de este flag, depende del programador usado. Asignacin del prescaler al WDT Actuando sobre el bit PSA del registro OPTION_REG es posible asignar el prescaler al WDT para obtener tiempos de intervencin mayores. El bit PSA va seteado a uno con la instruccin: bsf OPTION REG,PSA

En caso contrario, el prescaler ser asignado al TIMER 0. Obviamente, asignando el prescaler al WDT, no ser posible usarlo con el TIMER 0 y viceversa. Segn los valores de los bits PS0, PS1 y PS2 del OPTION_REG podremos obtener distintos intervalos de retardo. La eleccin correcta deber ser hecha teniendo en cuenta el mximo retardo que logramos obtener en nuestro programa tras la ejecucin de dos instrucciones CLRWDT sucesivas. En la tabla siguiente vemos los retardos, segn los valores de PS0, PS1 y PS2:

4 Puertos de Entrada y Salida


Los microprocesadores PIC16F84 tienen 2 puertos de entrada/salida paralelos de usos generales denominados Puerto A y Puerto B. El Puerto A es de 4 bits y el Puerto B es de 8 bits.

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

CONFIGURACIN DE LOS PUERTOS DE ENTRADA/SALIDA Los bits de cada puerto se configuran mediante los bits correspondientes de un registro de control asociado que recibe el nombre de TRIS. En realidad cada puerto soporta dos registros: 1. El registro de datos, al que se denomina Puerto A o B (PortA o PortB).

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

5 Interrupciones
El sistema de interrupciones consiste en un mecanismo por el cual un evento interno o externo, asncrono respecto del programa, puede interrum 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. pir 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.

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.

6 Instrucciones assembler del 16F84


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 orientada a los bytes

6 Instrucciones 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. MOVLW 3 ; carga el acumulador W con el valor 3. ADDLW 1 ; suma 1 al acumulador. Al final el acumulador tendr el valor 4. 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). ANDLW k (hex = 39 kk) Operacin lgica AND entre el acumulador W y el literal k W = W AND k Esta instruccin realiza una operacin lgica AND entre el contenido de W y k. El resultado se guarda siempre en el acumulador W Si cargamos el acumulador con el binario 10101010B y hacemos un AND con el binario 11110000B, nos quedar el resultado de la operacin en el acumulador W. MOVLW 10101010B ANDLW 11110000B El resultado de la operacin queda en W = 10100000B. Explicacin de la operacin AND: Tenemos 4 posibles combinaciones entre dos bits 0 AND 0 = 0 0 AND 1 = 0 1 AND 0 = 0 1 AND 1 = 1 Vemos que solamente en el caso de que ambos bits sean 1, el resultado ser 1. Esta instruccin compara dos bytes, bit a bit. Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0. CALL k (hex = 2k kk)

Ejemplo:

Registro STATUS:

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN:

Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN:

Llama a una subrutina en la direccin k. CALL kRETURN 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 instruccinCALL, 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 destack, 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 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). No modifica ningn bit de estado. 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 No modifica ningn bit de estado. GOTO k (hex = 28 kk)

Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN:

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. No modifica ningn bit de estado. IORLW k (hex = 38 kk) Operacin lgica OR entre el acumulador W y el literal k W = W OR k Esta instruccin realiza un OR inclusivo entre el contenido del acumulador W y el literal k. El resultado se guarda siempre en el acumulador (k es un valor, no un registro). Si cargamos el acumulador con el binario 11110000B y k= 00001111B, nos quedar el resultado de la operacin en el acumulador W. MOVLW 11110000B IORLW 00001111B El resultado de la operacin queda en W = 11111111B. Explicacin de la operacin OR: Tenemos 4 posibles combinaciones entre dos bits 0 OR 0 = 0 0 OR 1 = 1 1 OR 0 = 1 1 OR 1 = 1 Vemos que solamente en el caso de que ambos bits sean 0, el resultado ser 0. Esta instruccin compara dos bytes, bit a bit. Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0. 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). No modifica ningn bit de estado. OPTION (hex = 00 62)

Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin:

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. No modifica ningn bit de estado. 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. No modifica ningn bit de estado. 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 queRETURN). 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. No modifica ningn bit de estado. RETURN (hex = 00 08) Retorno de subrutina.

Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: 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 queRETLW). 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. No modifica ningn bit de estado. 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. No modifica ningn bit de estado. SUBLW k (hex = 3C kk) Resta al literal k el valor del acumulador. W=kW Esta instruccin resta al literal k el valor almacenado en elacumulador W y el resultado se guarda en el acumulador. 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. 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). 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.

Ejemplo: Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS:

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS:

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. No modifica ningn bit de estado. XORLW k (hex = 3A kk) Operacin lgica OR exclusivo entre el acumulador y el literal k W = W XOR k Esta instruccin realiza un OR exclusivo entre el contenido delacumulador W y el valor del literal k. El resultado se guarda siempre en el acumulador (k es un literal, no un registro). Si cargamos el acumulador con el binario 11110000B y hacemos un XOR con el binario 10101010B, nos quedar el resultado de la operacin en el acumulador W. MOVLW 11110000B XORLW 10101010B El resultado de la operacin queda en W = 01011010B. Explicacin de la operacin XOR: Tenemos 4 posibles combinaciones entre dos bits 0 XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0 Vemos que si ambos bits son iguales el resultado ser 0. Y si ambos son diferentes, el resultado ser 1. Esta instruccin compara dos bytes, bit a bit. Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0.

6 Instrucciones orientadas a bits INSTRUCCIN:


Descripcin: Operacin:

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. No modifica ningn bit de estado. 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.

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

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. No modifica ningn bit de estado. 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. No modifica ningn bit de estado. 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. No modifica ningn bit de estado.

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS:

6 Instrucciones orientadas a registros


INSTRUCCIN: Descripcin: ADDWF f,d (hex = 07 ff) Suma el acumulador y el registro f.

Operacin:

Ejemplo:

Registro STATUS:

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: 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. 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. 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). 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: 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. Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0. CLRF f (hex = 01 8f) Pone a cero el registro f. F = 0. Esta instruccin pone a cero el valor contenido en el registro

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo: Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

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 CLRF 01H Si hemos incluido al inicio del cdigo fuente el ficheroPIC16F84.INC, podemos utilizar el nombre simblico de dicho registro: CLRF TMR0 Modifica el bit Z y lo pone a 1 (ya que el resultado de la operacin es 0). 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 Modifica el bit Z y lo pone a 1 (ya que el resultado de la operacin es 0). 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. 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. Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0. 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. 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. Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0. 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).

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

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). No modifica ningn bit de estado. 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. 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. Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0. 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). No modifica ningn bit de estado. 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).

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN:

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. 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. Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0. 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. 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. Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0. 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. No modifica ningn bit de estado. NOP (hex = 00 00)

Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

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. Utilizando un cristal de cuarzo de 4 Mhz. en el oscilador, podremos obtener un retardo igual a un microsegundo por cada instruccinNOP 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. No modifica ningn bit de estado. RLF f,d (hex = 0D ff) Rota a la izquierda el registro f. d = << 1 (d puede ser W f). Esta instruccin rota a la izquierda todos los bits del registro direccionado en el parmetro f pasando por el bit CARRY del registro STATUS (o si se prefiere, desde los bits menos significativos a los ms significativos). Es como si multiplicramos por dos el contenido del registro. El D7 pasa al CARRY del registro STATUS, el contenido delCARRY pasa al D0, el D0 al D1, etc. El parmetro d determina el destino. Si d = 0, se guarda en W. Si d = 1, se guarda en f. Si no se pone nada, el valor por defecto es 1 y se guarda en f. Tambin se puede indicar directamente W f. Si tenemos el registro VALOR = 00000001B y aplicamos la instruccin RLF VALOR el resultado ser VALOR = 00000010B y el bit C = 0. Si tenemos el registro VALOR = 10000000B y aplicamos la instruccin RLF VALOR El resultado ser VALOR = 00000000B y el bit C = 1. Modifica el bit C (CARRY). RRF f,d (hex = 0C ff) Rota a la derecha el registro f. d = f >> 1 (d puede ser W f). Esta instruccin rota a la derecha todos los bits del registro direccionado en el parmetro f pasando por el bit CARRY del registro STATUS (o si se prefiere, desde los bits ms significativos a los menos significativos). Es como si dividiramos por dos el contenido del registro. El bit C del registro STATUS pasa al D7, el D0 pasa al bit C, el D1 al D0, etc. El parmetro d determina el destino. Si d = 0, se guarda en W. Si d = 1, se guarda en f. Si no se pone nada, el valor por defecto es 1 y se guarda en f. Tambin se puede indicar directamente W f. Si tenemos el registro VALOR = 00000001B y aplicamos la instruccin

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS:

INSTRUCCIN: Descripcin: Operacin:

Ejemplo:

Registro STATUS: INSTRUCCIN: Descripcin: Operacin:

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. Modifica el bit C (CARRY). 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. Segn sean los valores de W y el registro DATO, si aplicamos SUBWF DATO, obtendremos diferentes resultados en el bitCARRY. 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. 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). 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 (D7D4) 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. 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 acumuladorsin que vare el registro DATO . No modifica ningn bit de estado. XORWF f,d (hex = 06 ff) Operacin lgica XOR entre el acumulador y f. d = f XOR W (d puede ser W f).

Ejemplo:

Registro STATUS:

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: 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. Modifica el bit Z. Z vale 1 si el resultado de la operacin es 0.

7 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 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. ;(definicin del puntero FSR)

8 Tcnicas de programacin 1
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: Apagarset equ 0Ch ; Posicin de memoria RAM w equ 0 ; Destino W f equ 1 ; Destino F movf apagarset,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).

Tcnicas de programacin 2
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.

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:

Transportndolo a un programa: Numerohexa 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 numerohexa,0 ; Se enmascara la parte alta del nmero ; hexadecimal y pasa a W. iorlw 30h ; Convierte el nmero en ASCII. movwf ASCII ; El nmero queda salvado en la variable de ; salida. movlw 0F0h ; Dato para enmascarar parte baja. andwf numerohexa,1 ; Se enmascara la parte baja del nmero ; hexadecimal 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.

Tcnicas de programacin 3

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.

Una de las formas de solucionar en un programa este problema 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 accion1 movlw opcion2 xorwf OPCION,0 ; Se realiza la verificacin de OPCION respecto a W btfsc STATUS,Z ; verificando la bandera Z. goto accion2 movlw opcion3 xorwf OPCION,0 ; Se realiza la verificacin de OPCION respecto a W btfsc STATUS,Z ; verificando la bandera Z. goto accion3 accion1 ; instrucciones correspondientes a la accin 1. goto encontrar accion2 ; instrucciones correspondientes a la accin 2. goto encuentro accion3 ; instrucciones correspondientes a la accin 3. encuentro ; Sitio de encuentro luego de una de las acciones. ; Continuacin del programa.

Tcnicas de programacin 4
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. 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.

El ciclo repetitivo de retardo de la figura se tomar un nmero de ciclos as:

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.

También podría gustarte