Tema_12

Embed Size (px)

Citation preview

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Tema 12. Microcontroladores.12.1. Introduccin.Se denomina microcontrolador a un circuito integrado (un solo chip) que incluye un microprocesador y los perifricos necesarios para llevar a cabo el control de un proceso.

12.2. Elementos de un microcontrolador.Los elementos ms comunes de que consta un microcontrolador (todos ellos incluidos en el mismo chip) son: El microprocesador (o CPU). Es el elemento que se encarga de ejecutar las instrucciones del programa almacenado en la memoria de programa. Memoria de datos. Es la parte de la memoria donde se almacenan las variables (datos) utilizadas por el programa. Suele ser memoria RAM (voltil), aunque una parte de esta memoria suele ser EEPROM (grabable y borrable elctricamente, pero que no se pierde si se quita la alimentacin). Memoria de programa. Es la parte de la memoria que contiene el programa que ser ejecutado por el microprocesador. Suele ser memoria no voltil: ROM (grabable una sola vez en fbrica), OTP (grabable una sola vez por el usuario), EPROM (grabable elctricamente y borrable por luz ultravioleta) Flash EEPROM (grabable y borrable elctricamente). Lneas de entrada/salida digitales. Suelen llamarse puertos de entrada/salida. Permiten leer seales digitales de circuitos externos (normalmente a 5V) y sacar seales digitales hacia circuitos externos (normalmente tambin a 5V). En muchos casos las lneas de entrada/salida digitales son configurables por software como entradas o como salidas. En funcin del microcontrolador, suelen ser de nivel lgico compatible con circuitos TTL, o de nivel lgico compatible con circuitos CMOS. Temporizadores. Constan de un contador digital que permite contar pulsos del reloj del sistema. Se utilizan para contar tiempo. La forma ms habitual de funcionar es la carga de un valor inicial que se decrementa cada pulso de reloj. Cuando la cuenta llega a cero significa que ha pasado el tiempo requerido. Lo ms habitual es que al llegar a cero provoquen una interrupcin del microprocesador. Perro guardin. Es un temporizador independiente que provoca una interrupcin cuando llega a cero. Se utiliza para detectar fallos de bucles infinitos. Para que no se produzca esa interrupcin es necesario inicializar el perro guardin antes de que llegue a cero. Es tpico programar un tiempo del orden de 100 ms en este temporizador. De esta forma, si pasan ms de 100 ms sin inicializar el perro guardin significa que el programa ha entrado en un bucle infinito, y como consecuencia se dispara la interrupcin del perro guardin, que indica un fallo en el sistema. Todos los autmatas programables incorporan este elemento de seguridad.

Adems de los anteriores, que son los ms comunes, algunos microcontroladores tienen otros elementos, como: Puertos de comunicaciones. Son perifricos especiales utilizados para comunicar el microcontrolador con otros microcontroladores o equipos. Los ms tpicos son los puertos serie (RS232 RS485), aunque tambin pueden tener puertos paralelo, o puertos de comunicacin por bus de campo (bus CAN, profibus, etc). Convertidores A/D D/A. Se utilizan para leer seales analgicas de los sensores y dar seales analgicas a los actuadores, es decir, constituyen entradas y salidas analgicas. Sus caractersticas son similares a las de los convertidores de las tarjetas de adquisicin de datos. Mdulo PWM. Es un circuito interno que produce una salida digital modulada por ancho de pulso. Desde el microprocesador se escribe un valor digital proporcional al ciclo de trabajo. Tiene gran aplicacin en el control de motores elctricos. Mdulo de entrada de encoder incremental. Es un circuito que cuenta el nmero de pulsos a partir de las seales A y B de un encoder incremental. Desde el microprocesador se puede poner a cero el contador, o leer el valor actual del nmero de pulsos. Se utiliza para medir la posicin y la velocidad de motores elctricos.

-1-

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Circuito de reloj. Es el circuito encargado de generar la seal de reloj (onda cuadrada que sincroniza todos los eventos del microcontrolador). Lo ms habitual es que este circuito sea externo, pero algunos microcontroladores incorporan parte de este circuito para reducir al mximo el nmero de componentes externos.

Los elementos externos ms comunes que necesita el microcontrolador para funcionar son: Reloj. Suele ser un oscilador de cristal de cuarzo, que genera una seal cuadrada de una frecuencia determinada. Frecuencias de 4MHz, 8MHz, 10MHz, 20MHz son habituales. Esta seal de reloj es utilizada por el microcontrolador para sincronizar todos sus eventos. Tambin es utilizada por el temporizador para decrementar su cuenta. Fuente de alimentacin. El microcontrolador necesita una tensin de alimentacin continua estable. El valor ms habitual es de 5V, aunque cada vez es ms comn la alimentacin de 3.3V, e incluso de 1.8V. La reduccin de la tensin de alimentacin tiene como objetivo principal reducir la potencia disipada por el microcontrolador.

12.3. Arquitectura y funcionamiento bsico del microprocesador.La memoria de programa contiene las instrucciones a ejecutar. Estas instrucciones son en realidad nmeros binarios de una longitud (n de bits) determinada. En funcin del nmero binario de la instruccin el procesador realiza una operacin u otra (suma, resta, etc.). Por otra parte la memoria de datos contiene nmeros binarios que son los datos con los que operan las instrucciones. Bsicamente el procesador se dedica a leer las instrucciones, interpretar su significado y realizar la operacin adecuada utilizando los datos que la instruccin le indica. Para leer una instruccin (o un dato) el procesador utiliza tres buses, el bus de direcciones, el bus de control y el bus de datos. Un bus no es ms que un conjunto de pistas (conductores) cada una de las cuales permite transmitir una seal digital (un bit) entre el procesador y la memoria. El procedimiento es el siguiente: el procesador pone en el bus de direcciones la direccin de la instruccin (o dato) que quiere leer. A continuacin pone a 1 un bit del bus de control para indicarle a la memoria que debe poner en el bus de datos el valor de la instruccin (o del dato) requerido. Una vez hecho esto el procesador puede leer la instruccin (o el dato) del bus de datos. Segn la distribucin de la memoria de programa y de datos, se distinguen dos tipos bsicos de arquitectura, la arquitectura Von Newman, y la arquitectura Harvard.

12.3.1. Arquitectura Von Newman.Un nico espacio de memoria contiene el programa y los datos. Debido a esto solo hay un bus de datos (e instrucciones) y un bus de direcciones, adems del bus de control.

Bus de datos e instrucciones CPU Bus de direcciones Bus de control MEMORIA (Datos y Programa)

Los datos y el programa pueden ocupar el mismo espacio fsico (memoria RAM) o pueden ocupar espacios fsicos diferentes (RAM para los datos y ROM para el programa, por ejemplo), pero en cualquier caso ocupan direcciones de memoria del mismo espacio de direcciones. Los PC tienen una arquitectura de este tipo (los datos y el programa estn en la misma memoria RAM). La ventaja que tiene es que se puede aprovechar mejor la memoria al distribuirla libremente entre datos y programa. El inconveniente que tiene es que el tamao de las posiciones de memoria de datos y de programa es el mismo, cuando en muchas ocasiones sera conveniente utilizar tamaos diferentes. Otro inconveniente es que la ejecucin de las instrucciones es ms lenta, pues se tiene que leer la instruccin y el operando de la misma memoria (por el mismo bus). Un inconveniente importante es la posibilidad de producirse un error fatal en el sistema en el caso de que se escriba por error un dato en una direccin dentro de la zona del programa. En ese caso se modifica el programa con una instruccin aleatoria (la que resulta del cdigo representado por el valor del dato) lo que normalmente provoca que el sistema se cuelgue.

-2-

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

12.3.2. Arquitectura Harvard.Hay dos espacios de memoria diferentes para los datos y para el programa, con sus propios buses de direcciones y de datos (o instrucciones).Bus de datos MEMORIA DE DATOS RAM EEPROM Bus de direcciones de datos Bus de control de datos CPU Bus de instrucciones Bus de direcciones de instr. Bus de control de instr. MEMORIA DE PROGRAMA ROM OTP PROM EPROM FLASH EEPROM

Los datos y el programa no solo ocupan un espacio fsico diferente sino tambin un espacio diferente de direcciones de memoria, pues cada uno tiene su bus de direcciones. Las ventajas que tiene esta arquitectura son principalmente que el tiempo de ejecucin puede ser menor, ya que se puede leer a la vez la instruccin y el dato con el que opera. Por otra parte, el tamao de las posiciones de memoria puede ser diferente en la memoria de datos y la de programa, ajustndose a la necesidad del procesador (es habitual tener instrucciones de 12, 14 16 bits, y datos de 8 bits, por ejemplo). Otra ventaja importante es la robustez del funcionamiento. El programa que se est ejecutando no puede escribir sobre la memoria de programa, por lo que es ms difcil que se produzca un error. El inconveniente principal es que la memoria de datos solo puede ser de datos y la de programa solo de programa, por lo que el aprovechamiento de toda la memoria puede ser ms difcil. Otro inconveniente que tiene es la mayor complejidad del circuito integrado, pues tiene dos sistemas de buses diferentes. La mayora de microcontroladores actuales utiliza una arquitectura Harvard. Los autmatas programables tambin utilizan este tipo de arquitectura.

12.3.3. Funcionamiento bsico del microprocesador.El microprocesador dispone de un contador de programa (Program Counter PC) que se inicializa en un valor determinado. El PC contiene la direccin de memoria donde est la instruccin que se va a ejecutar. El procesador lee la instruccin de la memoria de programa, la decodifica y la ejecuta, utilizando para ello los operandos necesarios de la memoria de datos. El resultado de la operacin se almacena en un registro especial llamado acumulador. Despus de ejecutar la instruccin se incrementa automticamente el PC, y se vuelve a repetir el ciclo. Algunas instrucciones modifican el valor del PC (instrucciones de salto por ejemplo), por lo que la instruccin que se ejecuta a continuacin no es la siguiente en la memoria de programa, sino otra. El acumulador se utiliza en casi todas las instrucciones. Por ejemplo, la instruccin que suma dos valores realiza la suma del contenido actual del acumulador con un valor de la memoria de datos, escribiendo el resultado en el mismo acumulador. Para realizar una suma habra por tanto que transferir uno de los datos de la memoria de datos al acumulador, realizar la suma con el otro dato, y transferir el resultado del acumulador a la memoria de datos. Otro elemento bsico del microprocesador es la pila (o stack). Es un conjunto de registros especiales que se utilizan para guardar el contador de programa cuando se ejecuta una rutina de interrupcin o una subrutina normal. La pila tiene un tamao (un nmero de registros) finito. Cuando se llama a una subrutina (o se produce una interrupcin) desde el programa principal, en primer lugar se guarda el PC en la pila, y a continuacin se le da al PC el valor donde empieza la subrutina. Cuando la subrutina finaliza, se le da al PC el valor almacenado en la ltima posicin de la pila, por lo que se vuelve al punto del programa principal en el que se estaba antes de la subrutina. Esta misma operacin se puede hacer varias veces (desde una subrutina se llama a otra subrutina). En ese caso se almacenan en la pila dos valores de PC, recuperndose en primer lugar el ltimo introducido (al volver de la subrutina secundaria) y despus el primero introducido (al volver de la subrutina primaria). Se pueden encadenar tantas subrutinas como tamao tiene la pila, ya que si la pila se llena, al intentar escribir un valor de PC se borra otro anterior, y el programa ya no puede volver al punto del programa principal donde se haba producido la llamada.

-3-

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

La diferencia entre una llamada a subrutina y una interrupcin es que la primera es una instruccin que se pone a propsito en un punto determinado del programa principal. La interrupcin en cambio se produce por un evento externo al programa principal. Por ejemplo puede producirse por la activacin de una entrada digital del microcontrolador. En ese caso, cuando esa entrada pasa de 0 a 1, el procesador interrumpe el programa principal en el punto en el que se encuentre (que puede ser cualquiera), almacena el valor actual del PC en la pila, y cambia el valor del PC pasando a ejecutar una subrutina especial (la subrutina de interrupcin). La direccin donde empieza esa subrutina se llama vector de interrupcin. La siguiente figura muestra cmo evoluciona la pila cuando se producen dos llamadas encadenadas a subrutinas. Dir1 es la direccin del programa principal en la que se llama a la subrutina. Dir2 es la direccin de la subrutina en la que se llama a la subrutina secundaria. En principio la pila est vaca. Cuando se llama a la subrutina se guarda en la primera posicin de la pila la direccin del programa principal a la que se debe volver al terminar la subrutina. Si dentro de la subrutina se llama a otra subrutina secundaria, se guarda en la pila la direccin a donde debe volver cuando acabe esa subrutina secundaria. Se observa que la primera direccin guardada se corre hacia abajo. Cuando termina la subrutina secundaria se recupera el valor del contador de programa Dir_2+1 , y se contina con la subrutina inicial. Al recuperar una direccin de la pila sta se corre hacia arriba. Cuando termina la subrutina inicial se recupera el valor del contador de programa Dir1+1 y la pila queda vaca.

Dir1+1

Dir2+1 Dir1+1

Dir1+1

El microprocesador suele tener tambin una serie de registros especiales. El acumulador es de hecho el registro especial ms importante (lo tienen todos los procesadores). Los registros especiales se suelen utilizar para guardar variables u operandos intermedios.

12.4. Memorias.Un microcontrolador puede tener memorias de diversos tipos: RAM. Se borra si se quita la alimentacin. Se utiliza para datos. ROM. Grabable solo una vez en fbrica (cuando se fabrica el chip). No se puede borrar. Se utiliza para memoria de programa. OTP PROM. Grabable solo una vez, pero se graba despus de fabricar el chip (la puede grabar el propio usuario). Una vez grabada no se puede borrar. Se utiliza para memoria de programa. EPROM. Es una memoria no voltil (no se borra aunque se quite la alimentacin), pero que adems se puede borrar con luz ultravioleta y volver a grabar elctricamente. Se utiliza para memoria de programa, aunque hoy en da est en desuso. EEPROM. Es una memoria no voltil, pero que es grabable y borrable elctricamente. Se utiliza para datos que no se deben perder aunque se quite la alimentacin y para programa. FLASH EEPROM. Como la anterior es grabable y borrable elctricamente, siendo no voltil (no se borra si se quita la alimentacin). La diferencia con la EEPROM normal es que no se puede grabar direccin a direccin, sino que es necesario borrarla toda para poder volver a escribirla (o al menos se tiene que borrar por bloques). Debido a esto no sirve para datos. Se utiliza para memoria de programa. Tiene la ventaja sobre la EEPROM normal de ocupar mucho menos espacio y ser ms barata que aquella.

12.5. Juego de instrucciones y lenguajes de programacin.El nmero de instrucciones diferentes que admite un microprocesador es una caracterstica importante del mismo. Existen dos filosofas distintas, los procesadores CISC y los procesadores RISC.

-4-

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Procesador CISC.Significa Complex Instruction Set Computer e indica que el nmero de instrucciones diferentes es muy elevado. Tienen la ventaja de que muchas operaciones se programan como una sola instruccin. El inconveniente que tienen es que aprenderse todas esas instrucciones lleva bastante tiempo. Adems, la ejecucin de las instrucciones es ms lenta (al tener que decodificar un nmero grande de posibles instrucciones).

Procesador RISC.Significa Reduced Instruction Set Computer e indica que el nmero de instrucciones es muy pequeo. La ventaja respecto del CISC es que esas pocas instrucciones se aprenden en muy poco tiempo. Adems, la ejecucin de las instrucciones es muy rpida, pues la decodificacin tambin lo es (hay pocos cdigos de instruccin diferentes que distinguir). La estrategia RISC permite adems aplicar el concepto de pipelining que consiste en que las instrucciones consecutivas se ejecutan solapadas (mientras se lee una instruccin de memoria, a la vez se decodifica la anterior y se ejecuta la anterior a sta). Esto permite aumentar mucho la rapidez de ejecucin. Los microcontroladores se pueden programar de dos formas fundamentales: a bajo nivel en ensamblador, o con un compilador de alto nivel (como C).

Lenguaje ensamblador.Las instrucciones del programa que est en la memoria del microcontrolador son en realidad nmeros binarios de una longitud (n de bits) determinada. Estos nmeros binarios son los que interpreta el procesador para decodificar y ejecutar la instruccin. A este formato de las instrucciones (el que entiende de hecho el procesador) se le denomina cdigo mquina. Cuando se realiza un programa para un microcontrolador se podra escribir directamente los nmeros binarios de las instrucciones, pero esto resulta extremadamente engorroso y lento. En lugar de eso se ha creado el lenguaje ensamblador, que representa esas instrucciones en forma de nemnicos mucho ms fciles de entender y de manejar por parte del programador. El lenguaje ensamblador es una representacin directa de las instrucciones en cdigo mquina, pero permite utilizar nemnicos para referirse a las instrucciones y etiquetas para referirse a los datos y a las direcciones. Una vez escrito el programa en ensamblador el programa ensamblador lo traduce a cdigo mquina (que puede grabarse directamente en la memoria de programa del microcontrolador).

Lenguajes de alto nivel (compiladores).Una alternativa al lenguaje ensamblador es la utilizacin de un lenguaje de alto nivel, como el C. El programa se escribe en este lenguaje y posteriormente se traduce a cdigo mquina mediante el programa compilador. En muchos casos el compilador traduce el programa a ensamblador, y despus el programa ensamblador lo traduce a cdigo mquina. A diferencia del lenguaje ensamblador, cuando se utiliza un lenguaje de alto nivel no se sabe exactamente las instrucciones del programa final. Por ejemplo en C se puede poner A=B+C. El compilador traduce esta lnea en las instrucciones necesarias para realizar la suma (que puede ser un nmero importante de instrucciones). En funcin de lo bueno que sea el compilador el cdigo mquina resultante puede ser ms o menos largo o ms o menos rpido en su ejecucin. El lenguaje de alto nivel tiene el inconveniente, por tanto, de que no se tiene control total sobre las instrucciones del programa resultante. Debido a esto, cuando hay escasez de memoria de programa puede ser conveniente escribir el programa en ensamblador (o al menos la parte ms crtica del mismo). La ventaja de programar en un lenguaje de alto nivel es la rapidez y comodidad en el desarrollo del programa. Si no hay problemas de memoria de programa es conveniente optar por esta forma de programacin.

Herramientas de desarrollo.Se llaman herramientas de desarrollo a aquellas herramientas hardware o software que permiten desarrollar un circuito electrnico basado en microcontrolador. stas herramientas son: Programador. Es un equipo que sirve para introducir el programa en la memoria de programa del microcontrolador. Este programador suele funcionar conectado a un PC por el puerto serie, USB o paralelo. Desde el software del PC se escribe el programa, se ensambla y se manda al programador, que lo graba en el microcontrolador.

-5-

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Simulador. Es un software que se ejecuta en el PC, y que permite simular la ejecucin del programa que se ha elaborado sin necesidad de grabarlo en el microcontrolador. Permite corregir errores antes de programar el microcontrolador. Depurador residente. Consiste en un programa monitor que se encuentra en una parte de la memoria ROM del microcontrolador, y que permite comunicar ste con un PC para poder monitorizar el estado de las diversas variables mientras se ejecuta el programa que se ha grabado en el microcontrolador. Permite depurar los errores que contiene el programa. El inconveniente que tiene es que ocupa una parte de la memoria de programa (normalmente pequea), y que utiliza una interrupcin. Esta interrupcin no puede ser utilizada por el programa de usuario. Por otra parte, si el programa que se est probando utiliza otras interrupciones, el funcionamiento puede no ser exactamente igual al del sistema final, debido a la presencia del programa monitor (que interrumpe cada cierto tiempo al programa de usuario para comunicar con el PC). Emulador en tiempo real. Es un circuito electrnico complejo (que tiene un microprocesador ms potente que el que se est programando) que emula totalmente el comportamiento del microcontrolador. A este emulador se le pasa el programa, y ste reproduce exactamente lo que hara el microcontrolador en el circuito en el que se conectara (para ello dispone de un terminal con el patillaje idntico al del microcontrolador). Al mismo tiempo permite monitorizar el estado de todas las variables, por lo que permite depurar errores cmodamente. El mayor inconveniente de los emuladores suele ser su elevado precio.

12.6. Microcontroladores PIC.Los microcontroladores PIC fabricados por Microchip constituyen una familia de microcontroladores de distintas prestaciones. Existen tres gamas: gama baja, gama media y gama alta. Cada gama dispone de varios modelos con distintas configuraciones (memoria, nmero de entradas y salidas, etc). Algunos de esos modelos tiene memoria regrabable (Flash EEPROM), lo que permite fcilmente desarrollar una aplicacin (modificando el programa las veces que sea necesario). Estos modelos tienen su equivalente con memoria ROM u OTP PROM. Son microcontroladores RISC con arquitectura Harvard. Tienen muy pocas instrucciones y son muy fciles de utilizar. Un microcontrolador de la gama media con memoria Flash EEPROM es el PIC16F84. Se describir con cierto detalle el funcionamiento de este microcontrolador, siendo los dems de la gama media similares.

Caractersticas bsicas del PIC16F84.Las caractersticas fundamentales de este microcontrolador son: Longitud de las instrucciones de 14 bits. Longitud de los datos de 8 bits. Memoria de programa Flash EEPROM de 1024 palabras de 14 bits. Memoria RAM de datos de 68 bytes. Memoria EEPROM de datos de 64 bytes. Nmero de instrucciones 35. 13 lneas de entrada/salida digital configurables. PORT A (5 lneas), PORT B (8 lneas). Temporizador de 8 bits con prescaler de 8 bits. Configurable como temporizador o contador. Un solo vector de interrupcin (direccin 04), pero 4 eventos distintos que pueden provocar dicha interrupcin: Timer 0 overflow (fin de cuenta del temporizador 0). Seal digital externa (RB0/Int). Interrupcin por cambio en el PORT B. Fin de escritura en la EEPROM de datos.

-6-

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Estructura simplificada del PIC16F84.El siguiente diagrama muestra de forma simplificada la arquitectura interna del PIC16F84, incluyendo los perifricos de que dispone:

-7-

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Estructura de la ALU del PIC16F84.La estructura bsica del procesador es la mostrada en la figura:Memoria de programa 14 Memoria de datos 8 14 MUX 8 8 8

Instruction Register

A.L.U. 8 8 Acumulador (W)

La Unidad Aritmtico Lgica es la encargada de realizar la operacin descrita en la instruccin. Esta operacin opera normalmente con 2 operandos. Uno de ellos es siempre el acumulador. El otro puede ser el contenido de un registro de la memoria de datos, o bien los 8 bits menos significativos de la instruccin. Cul de estos dos operandos se utiliza depende de los 6 bits ms significativos de la instruccin. Las operaciones ms tpicas son el desplazamiento (a la derecha o a la izquierda), la suma, la resta, la comparacin, el AND, el OR, etc. El resultado de la operacin se almacena de nuevo en el acumulador, que de esta forma cambia de valor. Por otra parte el resultado puede almacenarse tambin directamente en un registro de la memoria de datos.

EJEMPLOS. MOVF 2Ah,0 ; Copia el contenido de la direccin 2Ah de la memoria de datos al acumulador ADDWF 2Bh,0 ; Suma el acumulador y el contenido de la dir. 2Bh y deja el resultado en el acumulador ADDWF 2Ch,1 ; Suma el acumulador y el contenido de la dir. 2Ch y deja el resultado en la direcc. 2Ch ADDLW 05h ; Suma el acumulador y el valor 05h y deja el resultado en el acumulador

Las operaciones de la ALU afectan a los bits Z, C y DC del registro STATUS. El bit C es el bit de acarreo. Se pone a 1 si el resultado de una suma se sale del rango de 8 bits, quedando igual a 0 si no se sale. En la resta sucede lo contrario. Si el resultado de la resta es menor que cero, el bit C de pone a 0, ponindose a 1 si el resultado es positivo (no se sale del rango de 8 bits). El bit Z es el bit de cero, y se pone a 1 si el resultado de una operacin es cero. El bit DC es un acarreo especial que se aplica a los 4 primeros bits del resultado.

-8-

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Mapa de memoria de programa del PIC16F84.Debido a la arquitectura Harvard se distingue entre la memoria de datos y la memoria de programa. El mapa de la memoria de programa es:

0000h

Reset Vector

0004h

Interrupt Vector . . .

03FFh

El vector de reset es la direccin 0000h. Cuando se produce un reset del procesador (al inicializarse) se ejecuta la instruccin escrita en esa direccin. Normalmente se escribe un salto a la direccin 0005h, donde empieza el programa principal. El vector de interrupcin es la direccin 0004h. Cuando se produce una interrupcin el procesador deja lo que est ejecutando en ese momento y ejecuta la instruccin que hay en la direccin 0004h. En esta direccin se suele poner un salto a la direccin donde empieza la rutina de interrupcin. El programa de usuario se puede escribir entre la direccin 0005h y la direccin 03FFh (que es la ltima disponible). En total hay 1024 posiciones de memoria de 14 bits cada una. El bus de direcciones es de 13 bits, pero solo se utilizan los 10 menos significativos (por haber nicamente 1024 posiciones de memoria disponibles).

Mapa de memoria de datos y direccionamiento en el PIC16F84.El mapa de la memoria de datos es:INDF 00h TMR0 01h PCL 02h 03h STATUS FSR 12 Registros 04h PORTA 05h de funciones PORTB 06h especiales 07h Direccin no vlida EEDATA 08h EEADR 09h PCLATH 0Ah INTCON 0Bh 0Ch 68 bytes de RAM de usuario 4Fh . INDF OPTION PCL STATUS FSR TRISA TRISB Direccin no vlida EECON1 EECON2 PCLATH INTCON Mapeados en el banco 0 . CFh 80h 81h 82h 83h 84h 85h 86h 87h 88h 89h 8Ah 8Bh 8Ch

12 Registros de funciones especiales

Banco 0

Banco 1

-9-

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Los 68 bytes de RAM de propsito general de usuario estn ubicados entre las direcciones 0Ch y 4Fh. Esos bytes pueden utilizarse libremente para almacenar variables. En las direcciones 00h a 0Bh y 80h a 8Bh se ubican los registros especiales (como registros del temporizador, los puertos de entrada/salida, etc). Se ha dibujado la memoria de datos dividida en dos bloques o bancos. Esto se debe a la forma de direccionamiento (de acceso) de la misma que se describe a continuacin. Se llama direccionamiento a la forma de definir cul es el byte de la memoria de datos que se utiliza como operando de la instruccin que se va a ejecutar. Existen dos tipos de direccionamiento: el direccionamiento directo y el direccionamiento indirecto. En ambos casos la direccin completa del dato se compone de dos partes. Por una parte se tienen los 7 bits menos significativos de la direccin. Estos bits definen un nmero entre 0 y 127, y determinan la posicin dentro del banco de memoria. Por otra parte se tiene un bit adicional que determina cul de los bancos se accede. Si ese bit vale 0 se tiene un nmero entre 0 y 127 y se accede al banco 0 y si vale 1 se tiene un nmero entre 128 y 255 y se accede al banco 1. Las dos formas de direccionamiento son: Direccionamiento directo. Los 7 bits menos significativos de la direccin del dato estn incluidos en el cdigo de la instruccin (son los 7 bits menos significativos de la instruccin). El bit que determina el banco es el bit RP0 del registro especial STATUS. Para acceder a los registros de usuario da igual el valor que tome este bit, pues ese bit se ignora (por ejemplo la direccin 0Ch y la direccin 8Ch acceden al mismo byte de memoria de datos). Para acceder a los registros especiales, sin embargo, s es necesario poner el valor correcto del bit RP0 antes de ejecutar la instruccin que accede a uno de esos registros. Direccionamiento indirecto. La direccin del dato con el que se opera no est contenida en el cdigo de la instruccin, sino que est en un registro especial, el FSR. Para utilizar este modo de direccionamiento es necesario poner en ese registro la direccin del dato antes de ejecutar la instruccin que opera con el dato que queremos. Esto tiene utilidad por ejemplo para acceder a varios datos consecutivos, ya que para acceder al siguiente dato basta con incrementar el registro FSR. La forma de indicar en la instruccin el direccionamiento indirecto es acceder al registro especial INDF. Cuando se realiza una escritura sobre el registro especial INDF, no se escribe sobre la direccin 00h, sino que se escribe sobre la direccin almacenada en FSR (es decir, se hace direccionamiento indirecto).

Adems del direccionamiento directo e indirecto, algunos autores denominan direccionamiento inmediato cuando el operando forma parte de la instruccin. En ese caso no se opera con un valor de la memoria de datos, sino con una constante que forma parte del cdigo de la instruccin (son los 8 bits menos significativos de la instruccin).

EJEMPLOS Direccionamiento directo. Los 7 bits menos significativos de 2Bh forman parte del cdigo de la instruccin. ADDWF 2Bh,0 ; Suma el acumulador y el contenido de la dir. 2Bh y deja el resultado en el acumulador Direccionamiento indirecto. MOVLW 2Bh; Mueve el valor 2Bh al acumulador MOVWF FSR ; Mueve el contenido del acumulador al registro FSR ADDWF INDF,1 ; Suma el contenido de la direccin contenida en FSR (direccin 2Bh)con el acumulador, y guarda el resultado en la misma direccin (2Bh en este caso). Direccionamiento inmediato. ADDLW 08h ; Suma el valor 08h con el acumulador y guarda el resultado en el acumulador

La memoria EEPROM de datos no est direccionada de forma normal, sino que se accede a ella por medio de cuatro registros especiales (EEADR, EEDATA, EECON1 y EECON2) y utilizando instrucciones especiales para escribir y leer los datos.

- 10 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Instrucciones.El PIC16F84 tiene exactamente 35 instrucciones diferentes. Todas las instrucciones tienen una longitud total de 14 bits. El significado de esos 14 bits depende del tipo de instruccin. Se pueden clasificar las instrucciones en: Instrucciones de byte (file instructions). Son las que permiten operar con los datos de la memoria de datos. La estructura general de la mayora de estas instrucciones es:

Cdigo de la instruccin b13 b12 b11 b10 b9 b8

Destino b7 b6

Direccin del dato(7 bits) b5 b4 b3 b2 b1 b0

El destino indica dnde se guarda el resultado. Si el bit vale 0, se guarda en el acumulador, si vale 1 se guarda en la direccin del propio dato (se modifica ste). La direccin del dato contiene los 7 bits menos significativos de sta. El bit restante es el bit RP0 del registro especial STATUS. Las siguientes instrucciones responden a esta estructura: ADDWF, ANDWF, SUBWF, COMF, DECF, DECFSZ, INCF, INCFSZ, IORWF, MOVF, RLF, RRF, SUBWF, SWAPF, XORWF. El formato de estas instrucciones cuando se utilizan en ensamblador es: ADDWF f,d donde f es la direccin del dato y d vale 0 1. Algunas instrucciones de byte tienen una estructura ligeramente distinta, por no haber un destino seleccionable. stas son: CLRF y MOVWF. Su formato en ensamblador es: MOVWF f Instrucciones de bit. Son instrucciones que permiten leer o modificar un bit determinado de un dato de 8 bits. La estructura es:

Cdigo de la instruccin b13 b12 b11 b10 b9

N de bit b8 b7 b6

Direccin del dato(7 bits) b5 b4 b3 b2 b1 b0

El nmero del bit al que accede la instruccin est codificado en binario en los bits 9,8 y 7 de la instruccin. Las instrucciones con esta estructura son: BCF, BSF, BTFSC, BTFSS. El formato de estas instrucciones cuando se utilizan en ensamblador es: BCF f,b donde f es la direccin del dato, y b es un nmero del 0 al 7 e indica el bit sobre el que se opera. Instrucciones con operandos literales. Son instrucciones en las que el valor del operando forma parte de la instruccin. El resultado siempre se guarda en el acumulador. La estructura es:

Cdigo de la instruccin b13 b12 b11 b10 b9 b8 b7 b6

Valor literal del operando b5 b4 b3 b2 b1 b0

El valor literal es un nmero entero de 8 bits. Las siguientes instrucciones tienen la estructura anterior: ADDLW, ANDLW, IORLW, MOVLW, RETLW, SUBLW, XORLW. El formato de estas instrucciones cuando se utilizan en ensamblador es: ADDLW k donde k es el valor con el que se opera (entre 0 y 255).

- 11 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Instrucciones de salto. Son dos instrucciones, GOTO y CALL. La primera permite que el programa salte a cualquier direccin de la memoria de programa. La segunda hace lo mismo, pero adems guarda el valor actual del contador de programa en la pila, con objeto de volver al punto donde se hace el salto. Sirve, por tanto para ejecutar subrutinas. La estructura de estas dos instrucciones es:

Cdigo de la instruccin b13 b12 b11 b10 b9

Direccin de la memoria de programa b8 b7 b6 b5 b4 b3 b2 b1 b0

El formato de estas instrucciones cuando se utilizan en ensamblador es: GOTO dir donde dir es la direccin del programa a la que se salta.

Otras instrucciones. Hay otras instrucciones que no tienen operandos. En ellas los 14 bits definen el cdigo de la instruccin. stas son: CLRW, NOP, CLRWDT, RETFIE, RETURN, SLEEPResumen de las instrucciones del PIC16F84. INSTRUCCIONES DE BYTE.

INSTRUCCIONES DE BIT:

- 12 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

INSTRUCCIONES LITERALES Y DE CONTROL:

Interrupciones.El PIC16F84 tiene un solo vector de interrupcin (direccin de la instruccin que se ejecuta cuando se produce una interrupcin), situado en la direccin 04 de la memoria de programa. En esa direccin se suele poner una instruccin de salto (GOTO) a otra direccin donde empieza la rutina de interrupcin. La interrupcin puede producirse por diversas causas (diversas fuentes). stas son: Seal digital externa, Fin del temporizador. Cambio en alguna entrada del puerto B. Fin de escritura de la memoria EEPROM de datos.

Como solo hay un vector de interrupcin, la rutina que se ejecuta es siempre la misma (independientemente de la fuente). Si la interrupcin puede haber tenido varias causas la rutina de interrupcin debe comprobar cul de esas causas ha sido la que la ha provocado y ejecutar el cdigo correspondiente. Para comprobar quin ha provocado la interrupcin basta con comprobar los flags (unos bits determinados) de cada interrupcin. El flag que est a 1 es el responsable.

Habilitacin de las interrupciones.La habilitacin general de todas las fuentes de interrupcin se controla con un bit del registro INTCON, llamado GIE. Si ese bit est a 0, ninguna interrupcin est habilitada. Si est a 1, todas las interrupciones estn habilitadas. Por otra parte cada interrupcin tiene una mscara que debe estar a 1 para que dicha interrupcin est habilitada. La mscara es un bit del registro INTCON para cada interrupcin. Los nombres de esos bits son T0IE, EEIE, INTE, RBIE. Para habilitar una interrupcin habr que poner a 1 la mscara correspondiente, y poner tambin a 1 el bit GIE. La figura siguiente muestra el circuito lgico que controla las interrupciones:

- 13 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Los flags de las distintas fuentes de interrupcin son bits del registro INTCON que se ponen a 1 si se ha producido esa interrupcin. Hay 4 flags, y sus nombres son: T0IF, INTF y RBIF (situados en el registro INTCON), y EEIF (situado en el registro EECON1). Cuando termina de ejecutarse la rutina de interrupcin es necesario poner a cero el flag de la fuente causante de la interrupcin, ya que en caso contrario ese flag estara siempre a 1, y no dejaran de producirse interrupciones. Para poner a 0 el flag basta con incluir una instruccin BCF del bit correspondiente. Por ejemplo, si la interrupcin ha sido causada por el temporizador habra que incluir al final de la rutina de interrupcin la instruccin: BCF INTCON,T0IF

Guardado del contexto del procesador en la rutina de interrupcin.Cuando se produce una interrupcin, el procesador almacena automticamente en la pila el valor del contador de programa con la direccin a la que debe volver cuando termine la interrupcin. La rutina de interrupcin debe terminarse con la instruccin RETFIE. Esta instruccin recupera de la pila el valor del contador de programa, por lo que el procesador vuelve al punto del programa principal en el que estaba. Guardar el contador de programa en la pila puede no ser suficiente para garantizar que cuando termine la interrupcin el programa principal continuar como estaba previsto. La razn es que puede que la interrupcin se produzca cuando el programa principal est a punto de ejecutar una instruccin que opera con el acumulador, o que depende de un bit del registro STATUS. Si es as, la rutina de interrupcin puede cambiar uno de estos registros (acumulador STATUS), por lo que cuando termine esta rutina, el programa principal tendr un comportamiento diferente al que se tendra si no hubiera habido interrupcin. Por lo tanto es necesario guardar adems del contador de programa (que lo guarda automticamente el procesador) el valor del acumulador y del registro STATUS, de tal forma que cuando se termine la interrupcin stos sean restaurados a sus valores originales. Esto se puede realizar incluyendo en la rutina de interrupcin el cdigo siguiente al principio y al final: MOVWF w_temporal MOVF STATUS,0 MOVWF status_temporal . . . cdigo de la rutina de interrupcin ... MOVF status_temporal,0 MOVWF STATUS MOVF w_temporal,0 RETFIE

- 14 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Pila (stack).La pila es un conjunto de registros en los que se guarda el contador de programa cuando se ejecuta una subrutina (sea de interrupcin o no) para que el procesador pueda volver al punto del programa principal en el que estaba. El PIC16F84 tiene una pila de 8 niveles, por lo que se pueden encadenar hasta 8 llamadas a subrutinas (desde una subrutina se llama a otra, desde esa a otra, etc). Cuando se ejecuta la instruccin CALL (llamada a subrutina), o se produce una interrupcin, el sistema guarda de forma automtica en la pila el valor actual del contador de programa (PC) incrementado en 1, es decir, se guarda la direccin del programa a la que se debe volver. Cuando se ejecuta la instruccin RETURN, RETFIE RETLW el contador de programa se carga de forma automtica con el valor guardado en la posicin ms alta de la pila. Por esta razn, la rutina de interrupcin debe terminar con la instruccin RETFIE, mientras que una subrutina normal debe terminar con la instruccin RETURN RETLW.

Entradas y salidas digitales.El PIC16F84 tiene 13 pines de entrada/salida digital cada uno de los cuales es configurable por software como entrada o como salida. El puerto A (PORTA) tiene 5 de esas entradas/salidas, y el puerto B (PORTB) tiene las otras 8. Para acceder a ellas basta con leer o escribir en los registros especiales correspondientes (PORTA y PORTB). La configuracin como entradas o como salidas depende del estado de los bits de los registros TRISA y TRISB. Un 1 en el bit correspondiente a una de las entradas/salidas la configura como entrada. Un 0 en ese bit la configura como salida. Salidas digitales. El PIC16F84 est construido con circuitos de tecnologa CMOS. Las salidas digitales tienen una configuracin similar a los circuitos digitales CMOS estndar. De esta forma la salida a nivel alto da una tensin similar a la de alimentacin (5V), mientras que la salida a nivel bajo da una tensin cercana a 0V. Estas salidas se pueden conectar directamente a circuitos digitales tanto TTL como CMOS. Si lo que se quiere es atacar una carga de 24V (como la bobina de una electrovlvula), basta utilizar un circuito como el de la figura:

24V 5V

PIC16F877 R

La mxima corriente de salida que puede dar el microcontrolador es de 20mA, por lo que la resistencia debe ser mayor que unos 220. Normalmente se pone un valor bastante mayor, para evitar que se caliente en exceso el microcontrolador. Valores de R=1k R=4.7k pueden ser adecuados. Cuando hay varias salidas puede utilizarse un circuito integrado que contiene varios transistores con la resistencia de base ya incluida. Ejemplos de estos integrados son el ULN2001, ULN2002, ULN2003, ULN2004, ULN2801, ULN2802, ULN2803, ULN2804. La salida RA4 es especial, puesto que solo tiene el transistor a masa, es decir, es de drenador abierto. Eso quiere decir que cuando est a 1 la salida est al aire (sin conexin), por lo que el esquema anterior no es vlido. Se puede solucionar el problema simplemente aadiendo una resistencia entre el drenador y 5V.

- 15 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Entradas digitales. En cuanto a las entradas digitales, son compatibles con los niveles de circuitos TTL, es decir, interpretan un 0 si la tensin de entrada es menor de 0.8V, e interpretan un 1 si la tensin es mayor de 2.4V. Segn esto se pueden conectar directamente seales de circuitos digitales (tanto TTL como CMOS) cuya alimentacin sea de 5 V. Si se quiere conectar al microcontrolador un detector industrial de 24V hay que tener en cuenta esa limitacin de los niveles de tensin. Por ejemplo, si la salida del detector es un contacto simple, ste se puede conectar directamente mediante una resistencia a 5V:5V PIC16F84 Entrada

Si el contacto tiene en serie un diodo LED indicador (como sucede con los detectores magnticos de los cilindros neumticos), la conexin anterior ya no es vlida, pues la cada de tensin del LED es de 1.4V, y el microcontrolador podra detectar nivel alto. Si la salida del detector es a transistor NPN (a colector abierto) lo normal es que se pueda conectar directamente, ya que el transistor en saturacin tiene una cada de tensin de menos de 0.8V. La conexin podra ser de la forma:5V PIC16F84 Entrada 10k Detector NPN

Un detector con salida PNP no puede conectarse directamente, pues el transistor de salida tiene el emisor a 24V. Se podra utilizar el siguiente circuito24V

PIC16F84 Entrada 4.7k k

10k Detector PNP 5V

En muchas ocasiones es recomendable que el circuito del microcontrolador est aislado de los detectores y de los actuadores. En esos casos lo ms conveniente es utilizar un optoacoplador entre el microcontrolador y el dispositivo externo. Por ejemplo, un detector se podra conectar como:

- 16 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

5V PIC16F84 Entrada 10k

24V 4.7k

Detector NPN

donde el PIC leera un 0 cuando el detector estuviera activado (el transistor saturado).

Para la salida el circuito sera similar:24V 1k Salida PIC16F84 10k 47k

Temporizador del PIC16F84.El PIC16F84 tiene un solo temporizador de 8 bits con un preescalado tambin de 8 bits. El temporizador es un contador que permite contar tiempo (pulsos del reloj del sistema) pulsos de una seal externa. El registro de 8 bits del temporizador (que contiene el valor actual del nmero de cuentas) se puede escribir o leer en cualquier momento. El preescalado permite dividir la frecuencia de los pulsos (externos o del reloj del sistema) para que el temporizador se incremente ms despacio. Se puede programar una divisin por 2, 4, 8, 16, 32, 64, 128 256.

Cuando se utiliza el temporizador para contar tiempo, (bit T0CS del registro OPTION_REG puesto a 0), la seal cuadrada que recibe como entrada el preescalado es de una frecuencia igual a la cuarta parte de la del reloj del sistema. Si el reloj del sistema es un cristal de 4 MHz, la seal de entrada al preescalado es de 1MHz (1 pulso cada s). Si el preescalado se configura para una divisin de 32, por ejemplo, el registro TMR0 se incrementar cada 32 s. El preescalado se configura con los bits PSA, PS2, PS1 y PS0 del registro OPTION_REG. El temporizador se puede utilizar para provocar una interrupcin. sta se produce cuando el valor de TMR0 pasa de FF a 00 (es decir, cuando se pasa del valor de cuenta mximo). Por ejemplo, si el preescalado divide por 32, se producir una interrupcin cada 32*256=8192 s. Esto permite seleccionar periodos de 512, 1024, 2048, 4096, 8192, 16384, 32768 65536 s. Si se quiere un periodo diferente se puede conseguir escribiendo al - 17 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

principio de la rutina de interrupcin el valor deseado en el registro TMR0. De esta forma no empezar a contar desde 0, y tardar menos tiempo en llegar a FF y provocar la interrupcin. Los registros asociados con el temporizador son: TMR0 es el registro que contiene el nmero de cuentas. OPTION_REG es el registro que contiene los bits para configurar el temporizador. INTCON es el registro que contiene los bits para controlar la interrupcin del temporizador

- 18 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

- 19 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Programas de ejemplo. Ejemplo 1: control de sistema secuencial mediante el PIC16F84.El siguiente programa en ensamblador es un ejemplo sencillo que puede servir de base para otro programa ms complejo. El programa implementa el algoritmo de control de una embotelladora:

V B A M

Microcontrolador

Existen 2 seales dadas por sensores. La seal A es 1 si tiene una botella encima y 0 en caso contrario. La seal B es 1 si el lquido que llena la botella ha llegado al nivel mximo y 0 en caso contrario. Asimismo existen 2 seales de salida. Cuando M se pone a 1 el motor se pone en marcha, y cuando se pone a 0 se para. Cuando V se pone a 1 la electrovlvula se abre empezando a llenar la botella, cerrndose cuando V=0. En este sistema se distinguen 3 estados: botella acercndose, botella llenndose y botella llena alejndose. El paso de un estado a otro se produce segn los valores de las variables binarias A y B. El diagrama de estados que describe el funcionamiento del sistema es:M=1 V=0 0

A

A

M=1 V=0

2

1 B

M=0 V=1

PROGRAMA EN ENSAMBLADOR QUE IMPLEMENTA EL DIAGRAMA DE ESTADOS ANTERIOR:

;Definicion del PIC utilizado e inclusion del fichero de configuracion LIST P=16F84 #include p16f84.inc

;Definimos las variables utilizadas en el programa y su posicion ;(algunas son variables de 1 byte (8 bits) y otras de 1 bit) ; Para ello utilizamos las directivas del ensamblador EQU y define, ; que nos permiten definir etiquetas Estados w_temporal status_temporal EQU EQU EQU 0x0C+0 0x0C+1 0x0C+2

- 20 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

#define A PORTB,0 #define B PORTB,1 #define M PORTA,0 #define V PORTA,1 #define E0 Estados,0 #define E1 Estados,1 #define E2 Estados,2

; Entrada A por pin RB0 ; Entrada B por pin RB1 ; Salida M por pin RA0 ; Salida V por pin RA1 ; Bit 0 del registro 0x0C ; Bit 1 del registro 0x0C ; Bit 2 del registro 0x0C

; Aqui empieza el codigo de programa ;**************************************** ;En primer lugar se pone en la direccion 0 (vector de reset) un salto ;a la direccion donde empieza el codigo. La direccion 0x05 es la menor ;posible, pues la 0x04 es el vector de interrupcion ) ORG 0 GOTO NOP NOP NOP GOTO Rutina_de_interrupcion ORG H'05' Inicio BSF STATUS,RP0 ;Selecciona el banco 1 Inicio

MOVLW B'11111111' MOVWF TRISB MOVLW B'00000000' MOVWF TRISA BCF STATUS,RP0 BCF BCF BSF E1 E2 E0 E0=1, E1=0, E2=0 (el sistema empieza en el estado 0) ;Configuracin puerto A: bits 0-4 salidas. ;Selecciona el banco 0 ;Configuracin puerto B: bits 0-7 entradas

;Aqui empieza el bucle infinito del programa principal Bucle ;Cdigo del diagrama de estados BTFSS E0 GOTO Trans_1 BTFSS A GOTO Trans_1 BCF E0 BSF E1 Trans_1 BTFSS E1 GOTO Trans_2 BTFSS B

- 21 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

GOTO Trans_2 BCF E1 BSF E2 Trans_2 BTFSS E2 GOTO Salidas BTFSC A GOTO Salidas BCF E2 BSF E0

; Cdigo de activacin de las salidas (se activan las salidas que ; corresponden en funcin del estado activo). Salidas BTFSS E0 GOTO Estado_1 BSF M BCF V Estado_1 BTFSS E1 GOTO Estado_2 BCF M BSF V Estado_2 BTFSS E2 GOTO fin BSF M BCF V

fin

CLRWDT GOTO

;Le damos una patada al perro guardian Bucle ; Bucle infinito

;Rutina de interrupcion (en este caso no hace nada) Rutina_de_interrupcion RETFIE END

- 22 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Ejemplo 2. Uso del temporizador y la interrupcin del PIC16F84.El siguiente programa utiliza el temporizador para producir una seal cuadrada que est 2 segundos a 1 y 1 segundo a 0. Para contar 1 segundo y 2 segundos, se fija el preescalado a 1:64, de forma que el temporizador se incrementa cada 64 us. De esa forma, se produce una interrupcin cada 64*256=16384 us. Para contar un segundo se utiliza una variable Contador, que se inicializa en 61 y se decrementa en cada interrupcin. Cuando llega a cero, significa que ha pasado un segundo. Para 2 segundos se hace lo mismo, pero se inicializa en 122.;Definicion del PIC utilizado e inclusion del fichero de configuracion LIST P=16F84 #include p16f84.inc

; Definimos las variables utilizadas en el programa y su posicion ; Para ello utilizamos las directivas del ensamblador EQU y define, Contador w_temporal status_temporal EQU EQU EQU 0x0C+0 0x0C+1 0x0C+2

#define Salida

PORTA,0

; Salida por pin RA0

; Ahora definimos dos constantes que definen el ancho de los pulsos que se van a ;generar: #define Num_cuenta_1 #define Num_cuenta_0 D122 ;Se cuentan 122 periodos de 16384 us para 2 segundos D61 ; Se cuentan 61 periodos de 16384 us para 1 segundo

; Aqui empieza el codigo de programa ;**************************************** ; En la direccin 04 (vector de interrupcin se pone un salto ; a donde empieza la rutina de interrupcin ORG 0 GOTO ORG 4 GOTO Rutina_de_interrupcion ORG H'05' Inicio BSF STATUS,RP0 ;Selecciona el banco 1 Inicio

MOVLW B'00000000' MOVWF TRISA MOVLW B'10000101' MOVWF OPTION_REG BCF STATUS,RP0 MOVLW Num_cuenta_0 MOVWF Contador BCF Salida BCF INTCON,T0IF BSF INTCON,T0IE BSF INTCON,GIE Bucle GOTO Bucle ;Se resetea el flag de la interr. del temp. ;Habilitamos la interrupcin del temporizador ;Habilitamos las interrupciones en general ;Configuracin puerto A: bits 0-4 salidas. ; Se define el preescalado del temporizador ; a 1:64 (el temp. se incrementa cada 64s) ;Selecciona el banco 0

; Bucle infinito

- 23 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Rutina_de_interrupcion MOVWF MOVF MOVWF w_temporal STATUS,0 status_temporal

DECFSZ Contador,1 GOTO fin BTFSC Salida GOTO Salida_1 Salida_0 MOVLW Num_cuenta_1 MOVWF Contador BSF Salida GOTO fin Salida_1 MOVLW Num_cuenta_0 MOVWF Contador BCF Salida fin MOVF status_temporal,0 MOVWF STATUS

MOVF w_temporal,0 BCF INTCON,T0IF ;Se borra el flag de la int. del temporizador RETFIE END

- 24 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

Ejemplo 3. Control de sistema secuencial con temporizacin.Considrese el mismo ejemplo de la embotelladora, pero de forma que el llenado se realiza por tiempo (no hay sensor de botella llena). Se supondr que para llenar una botella, la vlvula debe estar abierta durante 1 segundo. El diagrama de estados sera:

M=1 V=0 0

A

A

M=1 V=0

2

1 t=1seg

M=0 V=1

El programa siguiente combina los dos programas anteriores para implementar este diagrama de estados. Para contar 1 segundo, se fija el preescalado a 1:64, de forma que el temporizador se incrementa cada 64 us. De esa forma, se produce una interrupcin cada 64*256=16384 us. Para contar un segundo se utiliza una variable Contador, que se inicializa en 61 y se decrementa en cada interrupcin (solo si se est en el estado 1). Cuando llega a cero, significa que ha pasado un segundo, por lo que se pone a 1 un bit auxiliar que indica el fin de tiempo, y que es el bit que define la transicin al estado 2. PROGRAMA EN ENSAMBLADOR QUE IMPLEMENTA EL DIAGRAMA DE ESTADOS ANTERIOR:

;Definicion del PIC utilizado e inclusion del fichero de configuracion LIST P=16F84 #include p16f84.inc

;Definimos las variables utilizadas en el programa y su posicion ;(algunas son variables de 1 byte (8 bits) y otras de 1 bit) ; Para ello utilizamos las directivas del ensamblador EQU y define, ; que nos permiten definir etiquetas Estados Contador bits_auxiliares w_temporal status_temporal EQU EQU EQU EQU EQU 0x0C+0 0x0C+1 0x0C+2 0x0C+3 0x0C+4

#define A PORTB,0 #define B PORTB,1 #define M PORTA,0 #define V PORTA,1 #define E0 Estados,0 #define E1 Estados,1 #define E2 Estados,2

; Entrada A por pin RB0 ; Entrada B por pin RB1 ; Salida M por pin RA0 ; Salida V por pin RA1 ; Bit 0 del registro 0x0C ; Bit 1 del registro 0x0C ; Bit 2 del registro 0x0C ; bit que indicar que ha pasado 1 segundo

#define fintiempo bits_auxiliares,0

- 25 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

#define Cuenta_inicial D'61' ; el valor en el que se inicializa el contador

; Aqui empieza el codigo de programa ;**************************************** ;En primer lugar se pone en la direccion 0 (vector de reset) un salto ;a la direccion donde empieza el codigo. La direccion 0x05 es la menor ;posible, pues la 0x04 es el vector de interrupcion ) ORG 0 GOTO NOP NOP NOP GOTO Rutina_de_interrupcion ORG H'05' Inicio BSF STATUS,RP0 ;Selecciona el banco 1 Inicio

MOVLW B'11111111' MOVWF TRISB MOVLW B'00000000' MOVWF TRISA MOVLW B'10000101' MOVWF OPTION_REG BCF STATUS,RP0 BCF BCF BSF E1 E2 E0 ; E0=1, E1=0, E2=0 (el sistema empieza en el estado 0) ;Configuracin puerto A: bits 0-4 salidas. ; Se define el preescalado del temporizador ; a 1:64 (el temp. se incrementa cada 64s) ;Selecciona el banco 0 ;Configuracin puerto B: bits 0-7 entradas

MOVLW Cuenta_inicial MOVWF Contador BCF fintiempo BCF INTCON,T0IF BSF INTCON,T0IE BSF INTCON,GIE ;Se resetea el flag de la interr. del temp. ;Habilitamos la interrupcin del temporizador ;Habilitamos las interrupciones en general

;Aqui empieza el bucle infinito del programa principal Bucle ;Cdigo del diagrama de estados BTFSS E0 GOTO Trans_1 BTFSS A GOTO Trans_1 BCF E0 BSF E1 MOVLW Cuenta_inicial MOVWF Contador

- 26 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

BCF fintiempo Trans_1 BTFSS E1 GOTO Trans_2 BTFSS fintiempo GOTO Trans_2 BCF E1 BSF E2 Trans_2 BTFSS E2 GOTO Salidas BTFSC A GOTO Salidas BCF E2 BSF E0

; Cdigo de activacin de las salidas (se activan las salidas que ; corresponden en funcin del estado activo). Salidas BTFSS E0 GOTO Estado_1 BSF M BCF V Estado_1 BTFSS E1 GOTO Estado_2 BCF M BSF V Estado_2 BTFSS E2 GOTO fin BSF M BCF V

fin

CLRWDT GOTO

;Le damos una patada al perro guardian Bucle ; Bucle infinito

;Rutina de interrupcion (en este caso no hace nada) Rutina_de_interrupcion MOVWF MOVF MOVWF w_temporal STATUS,0 status_temporal

BTFSS E1 GOTO fin DECFSZ Contador,1 GOTO fin BSF fintiempo fin MOVF status_temporal,0

- 27 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

MOVWF

STATUS

MOVF w_temporal,0 BCF INTCON,T0IF ;Se borra el flag de la int. del temporizador RETFIE END

Ejemplo 4. Uso del temporizador y la interrupcin del PIC16F84 para posicionar un servo de radiocontrol.El siguiente programa genera por la salida RB0 del PIC16F84 la seal necesaria para posicionar un servo de radiocontrol. Dicha seal es de la forma: 16384 s

tON

donde el tiempo a nivel alto tON determina la posicin del servo, y debe estar entre 1 ms y 2 ms (para 1ms el servo se posiciona aproximadamente en un extremo de su recorrido, y para 2ms se posiciona en el otro). El ancho del pulso generado se controla mediante una constante (la constante anchopulso) de forma que tON (en microsegundos) es el producto de esa constante por 64. Con el valor de 23 el ancho del pulso generado es de 1472 s.

En este ejemplo se utiliza la interrupcin asociada al temporizador para generar el pulso. El temporizador (registro TMR0) se incrementa constantemente cada cierto tiempo (que depende del preescalado elegido en el registro OPTION_REG). Cuando llega al valor mximo (255) y se incrementa de nuevo, pasa a 0 y provoca la ejecucin de la rutina de interrupcin. Si el registro TMR0 y el preescalado no se modifican dentro de la rutina, sta se ejecutar cada cierto periodo constante. Si dentro de la rutina se cambia el valor de una salida (se pone a 0 si vale 1 y se pone a 1 si vale 0) se genera una seal cuadrada (mismo tiempo a 1 que a 0). Para generar una seal como la del servo es necesario contar intervalos de tiempo diferentes. Para ello se tiene que modificar el valor del registro TMR0 dentro de la rutina. Por ejemplo, si dentro de la rutina se escribe un valor de 200 en el registro TMR0, ste tardar mucho menos en llegar a 255 y por lo tanto la siguiente ejecucin de la rutina de interrupcin ser mucho antes. El programa de ejemplo escribe dentro de la rutina un valor u otro en TMR0 en funcin de que la salida actual valga 1 0, es decir, en funcin de que tengamos que contar 1472 ms (subperiodo corto) (16384-1472)ms (subperiodo largo).;Programa de ejemplo que genera por el pin RB0 una seal de periodo 16384 ; microsegundos y de ancho de pulso 1472 microsegundos ;Definicion del PIC utilizado e inclusion del fichero de configuracion LIST P=16F84 #include p16f84.inc ; Definimos las variables utilizadas en el programa y su posicion ; Para ello utilizamos las directivas del ensamblador EQU y define, Pulso_uno Pulso_cero w_temporal EQU EQU EQU 0x0C+2 EQU 0x0C+3 0x0C+0 0x0C+1

status_temporal

#define Salida

PORTB,0

; Salida por pin RB0

; Ahora definimos una constante entre 0 y 255 que define el ancho del pulso ;que se va a generar

- 28 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

#define anchopulso

D'23'

;ancho de pulso=64*anchopulso (microsegundos)

; Aqui empieza el codigo de programa ;**************************************** ; En la direccin 04 (vector de interrupcin se pone un salto ; a donde empieza la rutina de interrupcin ORG 0 GOTO ORG 4 GOTO Rutina_de_interrupcion ORG H'05' Inicio BSF STATUS,RP0 ;Selecciona el banco 1 Inicio

MOVLW B'00000000' MOVWF TRISB MOVLW B'10000101' MOVWF OPTION_REG BCF STATUS,RP0 MOVLW anchopulso MOVWF Pulso_cero SUBLW D255 MOVWF Pulso_uno BCF Salida MOVF Pulso_cero,0 ;Configuracin puerto B: bits 0-7 salidas. ; Se define el preescalado del temporizador ; a 1:64 (el temp. se incrementa cada 64s) ;Selecciona el banco 0

MOVWF TMR0 BCF INTCON,T0IF BSF INTCON,T0IE BSF INTCON,GIE Bucle GOTO Bucle ;Se resetea el flag de la interr. del temp. ;Habilitamos la interrupcin del temporizador ;Habilitamos las interrupciones en general

; Bucle infinito

Rutina_de_interrupcion MOVWF MOVF MOVWF w_temporal STATUS,0 status_temporal

BTFSC Salida GOTO Salida_1 Salida_0 MOVF Pulso_uno,0

MOVWF TMR0 BSF Salida GOTO fin Salida_1 MOVF Pulso_cero,0

MOVWF TMR0 BCF Salida fin MOVF status_temporal,0 MOVWF STATUS

- 29 -

Sistemas electrnicos. Roberto Sanchis. UJI.

Tema 12.

MOVF w_temporal,0 BCF INTCON,T0IF ;Se borra el flag de la int. del temporizador RETFIE END

- 30 -