You are on page 1of 18

Temporizador Timer 2 en los microcontroladores PIC.

El Timer 2 es un temporizador de 8 bits que tiene la particularidad de tener un preescalador y unpost-escalador. Adems este mdulo cuenta con un registro de periodo PR2 que marca el valor mximo que puede alcanzar la cuenta del registro TMR2. A diferencia de los otros temporizadores, el temporizador Timer 2 no incrementa su cuenta hasta llegar a 0xFF y despus al desborde sino que incrementa su cuenta desde 0x00 con cada ciclo de instruccin hasta que el valor del registro TMR2 coincide con el del registro PR2 y despus, en el siguiente ciclo reinicia la cuenta desde 0x00. Este mdulo cuenta con un preescalador y un post-escalador. El preescalador tiene la misma funcin que en los otros dos timers y sirve como divisor de frecuencia antes de cada incremento. El post-escalador funciona como un divisor de frecuencia despus de cada coincidencia entre los registros TMR2 y PR2. Si el post-escalador es 1:1 la bandera de interrupcin TMR2IF se habilitar en cada coincidencia entre TMR2 y PR2, en cambio si por ejemplo el post-escalador es 1:16, la interrupcin se presentar cada 16 coincidencias. Este temporizador, al igual que el Timer 1, puede habilitarse y deshabilitarse mediante el bitTMR2ON. El preescalador se selecciona con los bits T2CKPS1:T2CKPS0 y el postescalador con los bitsT0UTPS3:TOUTPS0 de la siguiente manera:
Preescalador 00 = 1:1 01 = 1:4 1x = 1:16 . . Post-escalador 0000 = 1:1 0001 = 1:2 0010 = 1:3

. 1111 = 1:16

Carga y Temporizacin La temporizacin del Timer 2 est dada por la siguiente expresin: TempTMR2 = [Preescaler*(PR2+1)*Postscaler]*Tinstr Donde Preescaler = Valor del preescalador PR2 = Valor cargado al registro PR2 Postscaler = Valor del post-escalador Tinstr = 4/frecuencia de oscilacin TempTMR2 = Temporizacin dada en segundos La temporizacin mxima que puede alcanzar el Timer 2 es la misma que alcanza el Timer 0. Utilizando el oscilador interno del pic 16f628 la temporizacin mxima sera de 65536uS. Si se desea otra temporizacin se puede lograr cargando el valor necesario al registro PR2. PR2 = [([TempTMR2/(4/fosc)])/(Preescaler*Postscaler)]-1 Veamos el mismo ejemplo de los temporizadores anteriores, ahora aplicado al Timer 2: Se desea complementar el valor del puerto B cada 50ms. Se estar revisando que se haya cumplido el tiempo de la temporizacion checando la bandera TMR2IF. Utilizando la expresin de la precarga y utilizando el preescalador y el post-escalador ms grande (16) obtenemos el valor quer que necesitamos cargar al registro PR2 para obtener una temporizacion de 50mS. PR2 = [([50mS/(4/4Mhz)])/(16*16)]-1 = 194.31 Ya que no podemos cargar numeros fraccionarios el valor del registro PR2 necesario es 194. El cdigo del programa sera el siguiente:

INICIO bsf clrf bcf movlw movwf clrf bcf PRECARGA bcf bsf movlw movwf bcf bsf ESPERA btfss goto bcf comf goto PIR1,TMR2IF ESPERA PIR1,TMR2IF PORTB,f PRECARGA T2CON,TMR2ON STATUS,RP0 .194 PR2 STATUS,RP0 T2CON,TMR2ON STATUS,RP0 TRISB STATUS,RP0 b'01111010' T2CON PORTB PIR1,TMR2IF

Descargar cdigo: Ejemplo del temporizador Timer 2 /********************************

/**************************************

KKKKKKKKKKKKKKKKKKKKKKKKK

Temporizador Timer 1 en los microcontroladores PIC.


El Timer 1 es un mdulo temporizador/contador de 16 bits, que consiste en dos registros de 8 bits (TMR1H y TMR1L) que son de lectura y escritura. Este mdulo incrementa su cuenta desde0x000 hasta 0xFFFF y al desbordarse vuelve a 0x0000. Al presentarse el desborde la bandera de interrupcin TMR1IF se pone a 1 y, si est habilitada, la interrupcin se presenta. Este mdulo al igual que el Timer 0 puede funcionar en modo temporizador y en modo contador. En modo temporizador el par de registros TMR1 se incrementa en cada ciclo de instruccin, este modo se selecciona poniendo a 0 el bit TMR1CS del registro T1CON. En modo contador elpar de registros TMR1 se incrementa en cada flanco ascendente de una seal de reloj externa, este modo se selecciona poniendo a 1 el bit TMR1CS del registro T1CON. El preescalador del Timer 1 tiene un valor mximo de 8 y se selecciona con los bitsT1CKPS1:T1CKPS0 de la siguiente manera:
00 = 1:1 01 = 1:2 10 = 1:4 11 = 1:8

A diferencia del Timer 0, el Timer 1 tiene la posibilidad de activar o detener la cuenta mediante el bit TMR1ON del registro T1CON. Carga y Temporizacin En modo temporizador el Timer 1 incrementa su cuenta en cada ciclo de instruccin. Latemporizacin que se puede obtener con este mdulo se

obtiene de la siguiente relacin: TempTMR1 = [(65536 - precarga)*PS]*Tinstr Donde: precarga = Valor que se le asigna al par de registros TMR1 al comenzar la temporizacin PS = Valor del preescalador Tinstr = 4/frecuencia de oscilacin TempTMR1 = Temporizacin dada en segundos La temporizacin mxima utilizando el oscilador interno del pic 16f628 y el valor ms grande de preescalador es: TempTMR1.Max = [(65536 - 0)*8]*1uS = 524288uS De modo que la temporizacin mxima que se puede tener con este temporizador, utilizando el oscilador interno de 4Mhz del pic 16f628, es de 524.288mS. Con la misma frecuencia de oscilacin el Timer 0 solamente podia lograr una temporizacin de 65.538mS as que con el Timer 1 se logran temporizaciones de mayor duracin. Si se desea obtener una temporizacin distinta solo se debe escribir en el par de registros TMR1 el valor de la precarga necesaria para la temporizacin deseada. precarga = -[([Temporizacion/(4/fosc)])/PS]+65536 Veamos el mismo ejemplo que el del temporizador Timer 0 ahora aplicado al Timer 1: Se desea complementar el valor del puerto B cada 50mS. Se estar revisando que se haya cumplido el tiempo de la temporizacin checando la bandera TMR1IF. Utilizando la expresin de la precarga y utilizando el preescalador ms grande (8) obtenemos el valor que necesitamos cargar al par de registros TMR1 para obtener una temporizacin de 50mS.

precarga = -[([50mS/(4/fosc)])/8]+65536 = 59286 = 0xE796 As que para obtener una temporizacin de 50mS mediante el Timer 1 se debe cargar 0xE7 al registro TMR1h y 0x96 al registro TMR1L. El cdigo del programa sera el siguiente:
INICIO bsf clrf bcf movlw movwf clrf bcf PRECARGA bcf movlw movwf movlw movwf bsf ESPERA btfss goto bcf comf goto PIR1,TMR1IF ESPERA PIR1,TMR1IF PORTB,f PRECARGA T1CON,TMR1ON 0xE7 TMR1H 0x96 TMR1L T1CON,TMR1ON STATUS,RP0 TRISB STATUS,RP0 b'00110000' T1CON PORTB PIR1,TMR1IF

La configuracin del Timer 1 se realiza mediante las lneas movlw b01100000 y movwf T1CON. Mediante estas lineas se configura el timer en modo temporizador (TMR1CS = 0) y se selecciona el preescalador mximo (T1CKPS1:T1CKPS0 = 11). Una vez configurado el timer 1 se limpia el puerto B y la bandera TMR1IF del registro PIR1. Posteriormente se realiza la precarga cargando un 0xE7 al registro TMR1H y un 0x96 al registro TMR1L. Ntese que antes de realizar la carga se detuvo el timer poniendo a 0 el bit TMR1ON, esto se hace para evitar errores al

momento de cargar el valor a los registros TMR1, despus de realizar la carga se enciende el timer poniendo a 1 el bit TMR1ON y en ese momento la temporizacin comienza. Para saber si la temporizacin termin se est revisando continuamente la bandera TMR1IF. Mientras esta sea 0 la temporizacin an no habr terminado, cuando la bandera es 1 entonces la temporizacin finaliz, entonces se borra la bandera TMR1IF, se complementa el puerto B y se vuelve a realizar la precarga. De este modo el programa est complementado el puerto B cada 50mS. Descargar cdigo: Ejemplo del temporizador Timer 1 /********************************* /*********************************

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

El temporizador Timer 0 en los microcontroladores PIC.


El Timer 0 es un modulo temporizador/contador de 8 bits que cuenta con un preescalador programable tambin de 8 bits. Puede funcionar como temporizador o como contador. En modotemporizador el valor del registro TMR0 se incrementa con cada ciclo de instruccin (o cada X ciclos dependiendo del preescalador). En modo contador el valor del registro TMR0 se incrementa en cada flanco (ascendente o descendente) del pin RA4/T0CKI. En ambos casos al desbordarse (pasar de 0xFF a 0x0) el registro TMR0 la bandera de interrupcin del timer 0 (bit T0IF del registro INTCON) se pone a 1.

El modo temporizador se selecciona poniendo a cero el bit T0CS del registro OPTION. Poniendo a uno ese bit el modulo trabaja en modo contador, en este modo de operacin adems se debe seleccionar si el incremento se producir en cada filo ascendente o descendente, al poner a cero el bit T0SE del registro OPTION se selecciona el filo ascendente. El preescalador es compartido por el Timer 0 y por el Watchdog. Se asigna a un mdulo o a otro mediante el bit PSA del registro OPTION. Poniendo el bit a 1 el preescalador se asigna alWatchdog y poniendolo a 0 el preescalador se asigna al Timer 0. El valor del preescalador se selecciona con los bits PS2:PS0 de la siguiente manera:
PS2:P20 000 001 010 011 100 101 110 111 TMR0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256 WDT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

Carga y temporizacin En modo temporizador el Timer 0 incrementa su cuenta en cada ciclo de instruccin. Este modo sirve para generar temporizaciones y bases de tiempo de la misma forma que los retardos por software, sin embargo las temporizaciones con el Timer 0 pueden ser ms exactas y adems se cuenta con la ventaja de que el mdulo puede trabajar mediante interrupciones as que el programa puede ejecutar otras isntrucciones mientras se realiza la temporizacin. La temporizacin que se puede obtener con este mdulo se obtiene de la siguiente relacin:

Temporizacin = [(256 - precarga)*PS+2]*Tinstruccion Donde: precarga = Valor que se le asigna al registro TMR0 al comenzar la temporizacin PS = Preescalador. Si esta asignado al watchdog tomar el valor de 1 Tinstruccin = 4/frecuencia de oscilacin y la temporizacin est dada en segundos. La temporizacin mxima utilizando el oscilador interno del pic 16f628 es: Temp.max. = [(256 - 0)*256+2]*1uS = 65528uS De modo que la temporizacion mxima que se puede tener con el es solamente de 65.538mS. Si se desea obtener una temporizacion distinta solo se debe escribir en el registro TMR0 el valor de la precarga necesaria. precarga = -[([Temporizacion/(4/fosc)]-2)/PS]+256 Donde, de nuevo, la temporizacin est dada en segundos. Veamos un ejemplo de aplicacin: Se desea complementar el valor del puerto B cada 50mS. Se estar revisando que se haya cumplido el tiempo de la temporizacin checando la bandera T0IF. Utilizando la expresin de la precarga y utilizando el preescalador ms grande (256) obtenemos el valor que necesitamos cargar al registro TMR0 para obtener una temporizacin de 50mS. precarga = -[([50mS/(4/4Mhz)]-2)/256]+256 = 60.69 60 Ya que no podemos cargar numeros fraccionarios el valor de precarga necesario es 60. Teniendo entonces el valor de la precarga el cdigo del programa sera el siguiente:

INICIO bsf clrf movlw movwf bcf clrf bcf PRECARGA movlw movwf ESPERA btfss goto bcf comf goto INTCON,T0IF ESPERA INTCON,T0IF PORTB,f PRECARGA .60 TMR0 STATUS,RP0 TRISB b'00000111' OPTION_REG STATUS,RP0 PORTB INTCON,T0IF

La configuracin del Timer 0 se realiza mediante las lneas "movlw b'00000111'" y "movwf OPTION_REG". Mediante estas lineas se configura el timer en modo temporizador (T0CS = 0), el preescalador se asigna al timer 0 (PSA = 0) y se selecciona el preescalador mximo (PS2:PS0 = 111). Una vez configurado el timer 0 se limpia el puerto B y la bandera T0IF. Posteriormente se realiza la precarga cargando un 60 al registro TMR0 y en ese momento la temporizacin comienza. Para saber si la temporizacin termin se est revisando la bandera T0IF. Mientras esta sea 0 la temporizacin an no habr terminado, cuando la bandera es 1 entonces la temporizacin finaliz, se borra la bandera, se complementa el puerto B y se vuelve a realizar la precarga. De este modo el programa est complementado el puerto B cada 50mS. Descargar cdigo: Ejemplo del temporizador Timer 0 /************************** /************************

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

Manejo de interrupciones en los microcontroladores PIC.


Una interrupcin es un evento que hace que el microcontrolador deje de ejecutar la tarea que est realizando para atender dicho acontecimiento y luego regrese y continue la tarea que estaba realizando antes de que se presentara la interrupcin. El pic 16F628 (y el 16F628A) tiene 10 fuentes de interrupcin, si las interrupciones estn habilitadas cada vez que una de estos acontecimientos se presente el pic dejar de ejecutar el programa para ir a atender la interrupcin y al termino de la misma continuar ejecutando el programa donde lo haba dejado. Las fuentes de interrupcin son:

Interrupcin externa RB0/INT Interrupcin por cambio lgico en el puerto B (pines RB7 a RB4) Interrupcin por desborde del timer 0 (TMR0) Interrupcin por desborde del timer 1 (TMR1) Interrupcin por comparacin exitosa exitosa en TMR2 Interrupcin del comparador Interrupcin del transmisor del USART Interrupcin del receptor del USART Interrupcin del mdulo CCP Interrupcin del EEPROM

Aunque el pic cuenta con 10 fuentes distintas de interrupcin solamentetiene un vector de interrupcin por lo que si se habilitan varias interrupciones al momento de presentarse cualquiera de ellas el programa saltara a la misma rutina de interrupcion y es responsabilidad del programador crear una rutina que identifique la fuente de la interrupcion.

Los registros asociados con las interrupciones son el registro de control de interrupcion INTCON, el registro habilitacion de interrupciones de perifericos PIE1 y el registro de interrupciones de perifericos PIR1. En el registro INTCON se encuentra el bit de habilitacion global de interrupcionesGIE, el bit de habilitacion de interrupcion por perifericos PEIE y los bits de habilitacion de algunas interrupciones como la interrupcion externa del pin RB0 (INTE), la interrupcion por cambio de estado en los pines RB4 a RB7 (RBIE) y la interrupcion por desborde del timer 0 (T0IE), asi como las banderas correspondientes a cada interrupcion (INTF, RBIF y T0IF). En el registro PIE1 se encuentran los bits de habilitacion de las demas interrupciones y en el registro PIR1 se encuentran las banderas asociadas con cada interrupcion. Para habilitar las interrupciones se deben seguir los siguientes pasos:

Habilitar el bit correspondiente a cada interrupcion. Limpiar la bandera correspondiente a la interrupcion habilitada para evitar falsas interrupciones. En caso de ser necesario habilitar el bit PEIE del registro INTCON (necesario para todas las interrupciones con excepcion de INTE y RBIE).

Habilitar el bit de habilitacion global de interrupciones GIE del registro INTCON.

En el codigo tambien es necesario indicar hacia que rutina debe saltar el programa al presentarse la interrupcin. Ya se dijo que el vector de interrupcin est en la direccin 0x04 por lo que es necesario agregar las lineas org 0x04 y goto ISR al programa, donde ISR es la rutina de servicio de interrupcin y puede, desde luego, tener cualquier otro nombre. La ventaja de utilizar interrupciones es que mientras se espera a que se presente el evento que produce la interrupcin el microcontrolador puede estar ejecutando cualquier otra tarea. De ese modo el micro no esta ciclado en una sola tarea sino que puede seguir trabajando en otras hasta que una interrupcin haga que el programa salte y ejecute la tarea que se quiera y al

terminarla el programa continuara su ejecucin en el punto en el que se encontraba en el momento de presentarse la interrupcin. En el ejemplo pasado se vi como leer botones e interruptores, ahora se va a realizar el mismo programa pero haciendo uso de interrupciones y para que se aprecie que el microcontrolador puede realizar otra tarea mientras se espera la interrupcin el programa har que parpadee el puerto A cada medio segundo. Por lo demas el programa sera igual, tendra 4 botones conectados a los pines RB4 a RB7 y 4 leds conectados a la parte baja del puerto B. Se habilitarn las interrupciones y de ese modo los botones se leern solamente al ser presionados. Veamos entonces el codigo:

Ese es el cdigo del programa principal. Se comienza declarando el vector de reset y el vector de interrupcion, despus se configuran los puertos, el puerto A como salida, la parte baja del puerto B como salida y la parte alta del puerto B como entrada. Hasta ah lo nico nuevo es la declaracin del vector de reset. Despus se configuran las interrupciones: Primero se habilita el bit RBIE del registro INTCON que es el correspondiente a la interrupcin por cambio de estado en los pines RB4 a RB7, despus se pone a cero el bit RBIF del mismo registro para poner la bandera de interrupcin en cero y as evitar entrar a la rutina de servicio sin que exista una interrupcin, y por ltimo se habilita el bit GIE para habilitar las interrupciones. De esta manera la interrupcin queda configurada y habilitada. Es muy importante siempre limpiar las banderas de interrupcin antes de habilitar el bit GIE. Despus de configurar las interrupciones se pasa al programa principal que lo nico que hace es poner a 1 todos los pines del puerto A, esperar medio segundo, poner a 0 todos los pines del puerto A, volver a esperar medio segundo para iniciar de nuevo el ciclo y as el programa se repite una y otra vez. La tarea de encender los leds correspondientes a cada botn queda en manos de la rutina de interrupcin:

La rutina es muy parecida a la del programa del ejemplo anterior con

algunos cambios pequeos. Lo importante en la rutina es que al entrar a la misma se deshabilitan las interrupciones al poner a 0 el bit GIE, con esto evitamos que se produzca otra interrupcin mientras se est atendiendo una. Despus de hacer eso el programa simplemente identifica la tecla pulsada y enciende el led correspondiente. Ya que se encendi el led la rutina continua hacia la etiqueta SALIDA_ISR donde primero se limpia la bandera de interrupcin poniendo a 0 el bit RBIF y despus se vuelve ahabilitar la interrupcion poniendo a 1 el bit GIE, ambos del registro INTCON. Para terminar la rutina y regresar al programa principal se utiliza la instruccin retfie (RETurn From IntErruption). La rutina de servicio de interrupcin siempre debe terminar con esa instruccin. Por ltimo una imgen del diseo esquemtico de este ejemplo:

Descargar cdigo: Manejo de interrupciones.

Para mayor informacin sobre el uso y configuracin de interrupciones y los registros de configuracin consulta las hojas de datos proporcionadas por Microchip: 16f628a, 16f877a.

You might also like