You are on page 1of 20

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

Mdulo 2: Manejo de Timers


El PIC16F877A adems de manejar PUERTOS de entrada y salida, tambin posee muchos perifricos de ayuda que hace que este dispositivo sea muy potente para muchas aplicaciones embebidas. Entindase por perifricos a chips que se encuentran dentro del microcontrolador y que funcionan en forma paralela a la ejecucin de las instrucciones del microcontrolador, lo nico que hay que hacer para su correcto funcionamiento es configurarlos de acuerdo a nuestra necesidad. Los TIMERs son perifricos de gran uso en las aplicaciones con microcontroladores. Sus caractersticas y funcionamiento varan de acuerdo a su estructura interna, en nuestro caso los timers del PIC posee 3 modos de funcionamiento: Modo Temporizador. Modo Contador Asncrono. Modo Contador Sncrono.

Algunos autores, al modo contador sncrono lo conocen como modo oscilador, y al modo contador asncrono slo le dicen modo contador. El PIC16f877A posee tres timers, los cuales tienen estructuras internas diferentes, por consiguiente funcionan de forma diferente, no todos poseen los modos descritos arriba:

Temporizador TIMER 0 TIMER 1 TIMER 2 Si Si Si

Contador Si Si No

Oscilador No Si No

La eleccin correcta del TIMER a usar es importante, pues nos facilitara la labor de programacin y no sobrecargaremos al procesador.

El TIMER 0 El mdulo Timer0 puede ser usado para generar periodos de tiempo (si funciona como temporizador) o puede ser usado para registrar el paso de eventos (si trabaja como contador de eventos). Al igual que en el mdulo anterior existen registros que controlan el funcionamiento del mdulo timer 0:

Profesor: Mishell Sanchez

Pgina 1

CURSO DE MICROCONTROLADORES PIC16F877A


La operacin implica la siguiente secuencia: - Ingresar al banco 1 - Configurar el modulo timer 0 (como contador de eventos o timer) - Regresar al banco 0 - Cargar el valor del TMR0 (inicializar la cuenta ) Las principales caractersticas del modulo timer 0 son. -

MANEJO DE TIMERS

Puede ejecutar hasta 256 cuentas (0-255) debido a que el registro TMR0 es de 8 bits. El registro TMR0 puede ser ledo para saber cual es valor actual de las cuentas o puede ser escrito para colocar un valor inicial. Posee un bloque de pre-escalamiento que permite ampliar el rango de las cuentas. Selector interno para definir si trabaja como temporizador o como contador de eventos Genera una seal de interrupcin cuando se produce un desborde en el registro TMR0 (cuando pasa de 0xFF a 00). Bit T0IF del registro INTCON Selector para indicar si detecta flanco de subida o bajada cuando opera como contador de eventos. Bit T0SE del registro OPTION_REG (OPTION para fines prcticos lo llamaremos OPTION_REG en adelante).

A continuacin se muestra el diagrama de bloques del mdulo Timer 0:

Como se aprecia en la parte superior derecha est presente un MUX. El MUX es controlado por el bit T0CS, si es 0 el mdulo opera como temporizador; si es 1 como contador de eventos. El bit T0CS pertenece al registro OPTION_REG y es el bit 5. Cuando el mdulo funciona como timer el registro TMR0 se incrementa en cada ciclo de instruccin (siempre y cuando el Pre-escalamiento este deshabilitado). Cuando el registro TMR0 es escrito el microcontrolador debe esperar 2 ciclos de instruccin para que comenzar la cuenta. Cuando el mdulo trabaja como contador de eventos el registro TMR0 incrementa su valor cada vez que aparece un flanco en el pin RA4/T0CKI. La seleccin del tipo de flanco (subida o bajada) depender de la programacin del bit T0SE (registro OPTION_REG bit 4). Si T0SE es 0-lgico trabaja con flanco de subida si es 1-lgico con flanco de bajada. El pre-escaler es un mdulo compartido por el WATCHDOG y el Timer 0. El pre-escaler es como un divisor de frecuencia programable. Como se aprecia puede conectarse en serie al modulo timer 0 (dependiendo de los valores de T0CS y PSA). Supongamos que el mdulo timer 0 funciona como contador de eventos y el pre-escaler est habilitado. El valor es 1:1, eso significa que cada pulso que

Profesor: Mishell Sanchez

Pgina 2

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

ingrese incrementar el valor en el registro TMR0 (el valor mximo de cuentas ser 256). Si el preescaler vale 1:8 por cada 8 eventos que sucedan solo aumentar una cuenta en el registro TMR0 (el valor mximo de cuentas ser 8x256). El valor del pre-escaler depende de los bits PS2 (bit 2), PS1 (bit 1) y PS0 (bit 0) del registro OPTION_REG. El bit PSA (bit 3) del registro INTCON define si el pre-escaler funciona con el Watchdog o con el Timer 0. Observemos con detalle al registro OPTION_REG:

bit 7 bit 6 bit 5

RBPU INTEDG T0CS: Bit selector de fuente para el TMR0 1 = Clock externo, pin RA4/T0CKI 0 =Clock interno(CLKOUT) bit 4 T0SE:Bit selector de flanco 1 = Incrementa en flanco de bajada en pin T0CKI 0 = Incrementa en flanco de subida en pin T0CKI bit 3 PSA: Bits de asignacin del pre-escaler 1 = Pre-escaler es asignado al WATCHDOG 0 = Pre-escaler es asignado al modulo Timer0 bit 2-0 PS2:PS0: Bits selectores relacin de trabajo

La gran mayora de microcontroladores de Microchip poseen al timer 0, por ejemplo el PIC 16F84A, un pic bsico, posee entre sus escasos perifricos al timer 0. El timer 0 posee un registro contador de 8 bits, este al tener desbordamiento (overflow) puede activar un salto de interrupcin habilitando el bit T0IE del registro INTCON. El concepto de interrupcin lo trataremos en el capitulo siguiente, en este captulo nos centraremos en ejemplificar los 2 modos de funcionamiento del timer0: modo temporizador y modo contador.

Profesor: Mishell Sanchez

Pgina 3

CURSO DE MICROCONTROLADORES PIC16F877A


Modo Temporizador TIMER 0

MANEJO DE TIMERS

Ejemplo: Generar una seal PWM por el pin RB0, duty=50% y periodo de 2 milisegundos. Usar un cristal de 20MHz: 1- El bit T0CS deber estar en CERO para que los pulsos del cristal divididos por 4 (Fosc/4) pasen por el MUX. 2- Luego viene la etapa de pre-divisor, si queremos que el registro de 8 bits TMR0 incremente en uno con cada pulso que sale del mux, seleccionaremos PSA=1, si queremos que por cada X pulsos el registro TMR0 incremente en una unidad deberemos colocar PSA=0, donde las diferentes combinaciones de X serian las siguientes: a. b. c. d. e. f. g. h. X=2 X=4 X=8 X = 16 X = 32 X = 64 X = 128 X = 256 para para para para para para para para PS2-PS1-PS0 = 000 PS2-PS1-PS0 = 001 PS2-PS1-PS0 = 010 PS2-PS1-PS0 = 011 PS2-PS1-PS0 = 100 PS2-PS1-PS0 = 101 PS2-PS1-PS0 = 110 PS2-PS1-PS0 = 111

3- Finalmente, debemos colocar un numero Y de inicio para la cuenta del TMR0, adems elegir un X, esto es para contabilizar el tiempo que queremos, en nuestro caso 1ms:

Usaremos la siguiente formula, que expresa el retardo en funcin de X e Y:

Para un cristal de 20MHz el Tci=0.2us

Ntese que escogimos X=128 por que la divisin de 5000/128 da un numero casi entero, la eleccin de otro numero para X nos hubiera dado ms error de redondeo. Ahora vamos a hacer el cdigo en ASM para esta aplicacin:

Profesor: Mishell Sanchez

Pgina 4

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

Profesor: Mishell Sanchez

Pgina 5

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

Modo Contador Asncrono TIMER0 Ejemplo: Activar una Rel conectado en el pin RD3 cuando hayamos presionado un pulsador 400 veces. Mostrar la cuenta del registro TMR0 en el PORTB.

Profesor: Mishell Sanchez

Pgina 6

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

Para poder contabilizar 400 pulsos con el registro TMR0 directamente es imposible, pues este registro es de 8 bits y su cuenta mxima es de 256 produciendo overflow. Para la solucin del conteo usaremos el pre-divisor, este podr tomar los valores: x2, x4 y x8 pues el nmero 400 es mltiplo de estos nmeros, asi la cuenta seria entera. El pin de entrada de conteo el timer0 es el pin RA4 tambin llamado T0CKI. Usaremos la combinacin de x2, queda para el alumno de ejercicio hacer el clculo para los otros casos.

Reemplazaremos los datos exigidos por el problema para luego proceder con la configuracin:

Ahora que ya tenemos el clculo matemtico terminado, procedemos con la configuracin del registro OPTION_REG, recordando que segn el circuito el pin RA4 est a nivel bajo mientras no se pulse. Por consiguiente tenemos que contar flancos de subida, T0SE=0. Adems el T0CS=1 para establecer el modo contador. El programa en ASM seria:

Profesor: Mishell Sanchez

Pgina 7

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

Para la simulacin de este programa, usaremos el software ISIS de PROTEUS. Usaremos un generador de pulsos para verificar el correcto funcionamiento, el archivo de simulacin como los programas realizados se encuentran en el CD del curso. En el dibujo observamos que se ha producido el overflow, por tanto la cuenta del TMR0 est en cero en el momento en que se prende el LED que representa al rel propuesto en el problema.

Profesor: Mishell Sanchez

Pgina 8

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

Profesor: Mishell Sanchez

Pgina 9

CURSO DE MICROCONTROLADORES PIC16F877A


EL TIMER 1

MANEJO DE TIMERS

El timer1 es un perifrico ms profesional que el timer0, pues posee un registro contador de 16 bits, representado en 2 bytes: TMR1H y TMR1L. Sus mejoras se reflejan en su arquitectura interna que vemos a continuacin:

El Timer1 tiene tres formas de funcionamiento: a) Temporizador b) Contador Asncrono c) Contador Sncrono Los bits de control del timer1 se encuentran alojados en el registro T1CON:

bit 7-6 Bits no implementados. Ledo como 0

bit 5-4 T1CKPS1:T1CKPS0: El Pre-escaler es un divisor de la frecuencia de los impulsos que se aplican al TIMER1 11 = 1:8 Valor de Pre-escaler 10 = 1:4 Valor de Pre-escaler 01 = 1:2 Valor de Pre-escaler 00 = 1:1 Valor de Pre-escaler bit 3 T1OSCEN: Control de habilitacin para el oscilador del Timer1 1 = El Oscilador es habilitado (RC0 y RC1 = entradas del oscilador externo) 0 = El oscilador trabaja en otro modo (RC0 = entrada del oscilador externo) bit 2 T1SYNC: Determina la posible sincronizacin o no de los impulsos del reloj externo con los del reloj interno. TMR1CS = 1 1 = No sincronizacin con un reloj externo 0 = Sincronizacin con un reloj externo TMR1CS = 0 Este bit es ignorado cuando el Timer1 usa el reloj interno bit 1 TMR1CS: Selecciona la fuente de los impulsos de contaje 1 = Reloj externo desde el pin RC0/T1OSO/T1CKI (en el flanco de subida) 0 = Reloj interno (FOSC/4) bit 0 TMR1ON: gobierna el permiso o la prohibicin de funcionamiento del Timer1. 1 = Habilitar el Timer1 0 = Detener el Timer1

Profesor: Mishell Sanchez

Pgina 10

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

No todos los microcontroladores de Microchip poseen al timer1, por ejemplo el PIC 16F84A no tiene timer1, mientras el PIC16F628A si lo tiene. El timer1 posee un registro contador de 16 bits, este al tener desbordamiento (overflow) puede activar un salto de interrupcin habilitando el bit TMR1IE del registro PIE1, mientras su flag TMR1IF se encuentra en el registro PIR1. Modo Temporizador TIMER 1 Este modo es seleccionado limpiando el bit TMR1CS (T1CON<1>). En este modo la entrada de reloj al timer es Fosc/4. El bit T1SYNC (T1CON<2>) no tiene efecto desde el reloj interno; es siempre sncrono.

Ejemplo: Generar una seal PWM de DUTY=50% y periodo 100ms por el pin RB0. Usar un cristal de 4MHz. 1- El bit TMR1CS deber estar en CERO para que los pulsos del cristal divididos por 4 (Fosc/4) pasen por el MUX hacia el pre-divisor. 2- Luego viene la etapa de pre-divisor, al igual que para el timer0 tendremos algunas combinaciones de divisor: a. b. c. d. X=1 X=2 X=4 X=8 para para para para T1CKPS1-T1CKPS0 = 00 T1CKPS1-T1CKPS0 = 01 T1CKPS1-T1CKPS0 = 10 T1CKPS1-T1CKPS0 = 11

3- Ahora vamos a calcular un numero Y de inicio de 16 bits para la cuenta del TMR1, adems elegir un X, esto es para contabilizar el tiempo que queremos, en nuestro caso 50ms:

Usaremos la siguiente formula, que expresa el retardo en funcin de X e Y:

Para un cristal de 4MHz el Tci=1us

Profesor: Mishell Sanchez

Pgina 11

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

Del resultado obtenido, cargaramos el valor de Y en los registros TMR1H y TMR1L. TMR1H=0x3C y TMR1L=0xB0. El programa en ASM seria:

Profesor: Mishell Sanchez

Pgina 12

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

Modo Contador Asncrono TIMER1 Si el bit T1SYNC (T1CON<2>) es seteado, el reloj externo no es sincronizado. El timer contina un incremento asncrono a la fase del reloj interno. El timer continuar funcionando durante el modo SLEEP y podr generar una interrupcin de desborde; el cual podra despertar al procesador del modo SLEEP. Lectura y escritura del Timer 1 en modo contador Asncrono Leer los registros TMR1H TMR1L mientras el timer est corriendo desde un reloj asncrono externo garantizar una lectura vlida (tener cuidado con el hardware). Sin embargo el usuario tendr en mente que leer 16 bits del timer en 2 registros de 8 bits puede causar molestia si el timer desborda mientras se produce la lectura. Para escribir es recomendable que el usuario detenga el timer y escriba recin los valores deseados. Ejemplo: Hacer un programa que nos permita contar 1/2 milln de pulsos externos, cuando lleguemos a la cuenta 1/2 milln activar una alarma por el pin RD7. Para el modo contador asncrono antes de hacer los clculos debemos poner los bits T1OSCEN en 0 y el TMR1CS en 1. Ahora vamos a elegir el pre-divisor para poder contar sin problema 1/2 milln de pulsos.

Los resultados nos indican configurar al timer1 con un pre-divisor de X=8 y una cuenta inicial del registro contador TIMER1 de Y=36. Ntese que la cuenta esta casi al mximo, pues si quisiramos contar un nmero mayor de pulsos deberamos ingenirnoslas para lograrlo usando registros adicionales para que ayuden a contar al TIMER1.

Profesor: Mishell Sanchez

Pgina 13

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

Profesor: Mishell Sanchez

Pgina 14

CURSO DE MICROCONTROLADORES PIC16F877A


Modo Contador Sncrono TIMER1

MANEJO DE TIMERS

Este modo es seleccionado seteando el bit TMR1CS. En este modo el timer incrementa cada flanco de subida de una entrada de reloj externo en el pin RC1, cuando el bit T1OSCEN es seteado. O cuando una entrada de reloj ingresa por el pin RC0, cuando el bit T1OSCEN es limpiado. Si el T1SYNC es limpiado, entonces el reloj externo es sincronizado con la fase del reloj interno. Ejemplo: Hacer parpadear un led, 1 seg. de prendido y 1seg. de apagado. El led estar conectado en el pin RA0. Usar un cristal de 32.768 KHz en entre los pines RC0 y RC1. Para el modo contador sncrono antes de hacer los clculos debemos poner los bits T1OSCEN en 1 y el TMR1CS en 1. Ahora vamos a elegir el pre-divisor para poder generar 1 seg, recodemos que el valor de la frecuencia del oscilador ser ahora 32.768KHz pues estamos en la configuracin de contador sncrono.

Observando con ms detalle las ecuaciones, nos damos cuenta que el factor de resta debe ser mltiplo de 2, pues el numero que divide en la ecuacin es 2^15. Nuestro objetivo al resolver la ecuacin y crear tiempo perfectos de 1seg, seg. y tiempos en segundos.

Profesor: Mishell Sanchez

Pgina 15

CURSO DE MICROCONTROLADORES PIC16F877A


El programa en ASM seria:

MANEJO DE TIMERS

Profesor: Mishell Sanchez

Pgina 16

CURSO DE MICROCONTROLADORES PIC16F877A


EL TIMER 2

MANEJO DE TIMERS

El timer2 es un timer con un registro contador de 8bits.Este timer, a diferencia del timer 0 y timer 1 no posee un pin para ingresar pulsos externos, esto quiere decir que solo cuenta los pulsos internos del oscilador. Sus caractersticas se aprecian en el siguiente grfico:

Los bits de control del timer2 se encuentran alojados en el registro T2CON

bit 7 Bit no implementados. Ledo como 0 bit 6-3 TOUTPS3:TOUTPS0: El Post-escaler es un divisor de la frecuencia de los impulsos que salen del comparador(TMR2 vs PR2_REG). 0000 = 1:1 Valor de Post-escaler 0001 = 1:2 Valor de Post-escaler 0010 = 1:3 Valor de Post-escaler . . . 1111= 1:16 Valor de Post-escaler bit 2 TMR2ON: gobierna el permiso o la prohibicin de funcionamiento del Timer2. bit 1-0 T2CKPS1-T2CKPS0: El Pre-escaler es un divisor de la frecuencia de los impulsos que se aplican al TIMER1 00= Pre-escaler es 1 01 =Pre-escaler es 4 1x = Pre-escaler es 16 El timer2 posee un registro contador de 8 bits, este es comparado con el valor alojado en el registro PR2(92H), cada vez que estos registros sean iguales se le dar un pulso al post-escaler, adems reseteara al contador del timer2. Cuando el post-escaler termina de contabilizar el valor configurado puede generar un salto de interrupcin habilitando el bit TMR2IE del registro PIE1(8CH), mientras su flag TMR2IF se encuentra en el registro PIR1(0CH).

Profesor: Mishell Sanchez

Pgina 17

CURSO DE MICROCONTROLADORES PIC16F877A


Modo Temporizador TIMER 2

MANEJO DE TIMERS

Ejemplo: Programar el timer2 para generar un retardo de un segundo. A partir del cual se incrementa un contador cuyo valor se muestra por el PORTC. Usar un cristal de 20MHz. Con nuestra experiencia obtenida realizando temporizaciones con timers nos ser fcil intuir la formula que nos dar el tiempo que demorara nuestra rutina hasta que por overflow se activara el flag y terminara nuestro lazo de retardo.

Donde los valores disponibles para el pre-escaler son: T2CKPS1-T2CKPS0 00 01 1X Y los valores disponibles del post-escaler son: TOUTPS3-TOUTPS0 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Post-escaler x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 Pre-escaler x1 x4 x16

No ser necesario inicializar el registro contador del timer2, pues con prender y apagar el perifrico ser suficiente. Como vemos, el timer2 por s solo no podr generar un retardo de 1 segundo, vamos a calcular un valor adecuado para que con ayuda de un registro adicional cuente lo necesario para tener 1 segundo.

El programa en ASM seria:

Profesor: Mishell Sanchez

Pgina 18

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

Profesor: Mishell Sanchez

Pgina 19

CURSO DE MICROCONTROLADORES PIC16F877A

MANEJO DE TIMERS

Profesor: Mishell Sanchez

Pgina 20