Sie sind auf Seite 1von 9

EL REGISTRO TMR0

Un temporizador especial.
Hoy: 17 Niviembre 2011, Incluir en favoritos, para volver a visitarnos.
Creado por: V. Garca.

Introduccin.
Debido a la importancia de este registro, se ha optado por realizar un artculo en exclusiva para este registro. Se supone que el lector tiene unos conocimientos bsicos para la comprensin y seguimiento del contenido de este artculo, sobre los microcontroladores y en especial sobre los microPICs. Esto es lo que nos hace emprender este proyecto. La medida constante del tiempo es en s, una constante Universal del hombre, en todas sus facetas y esta no es una rama que escape a esta sentencia. Una funcin muy habitual de los programas para controlar dispositivos consiste en contar intervalos de tiempo, el elemento que realiza esta funcin se llama temporizador (Timer), en ocasiones cuenta impulsos provenientes del mundo exterior, entonces el elemento destinado a tal fin se llama contador. Ahora bien, si las labores de temporizador o contador en un programa, las asignramos al programa principal le robaran mucho tiempo al procesador en detrimento de actividades ms importantes, es decir, en el tiempo que emplea en temporizar o contar, no puede atender otras rutinas. Por este motivo se disean recursos especficamente orientados a estas misiones. Este tipo de circuitos, se conocen con el nombre de RTCC (Real Time Clock Counter) y tambin como Timer/Counter (Temporizador/Contador). Especificacin Detallada para PIC16F84A. En este artculo, explicar los datos especficos del registro TMR0 para este PIC.

Especificaciones del temporizador (TMR0)


La figura que sigue se muestra el temporizador (TMR0) y el temporizador perro guardin (WDT) en diagrama de bloques. Al pi de la figura (en amarillo) los bits relacionados, de cada registro que afecta el ajuste de los temporizadores.

El Preescaler que, est en el centro de la figura, puede ser usado por el TMR0 o por el WDT. La figura anterior muestra el preescaler conectado a TMR0. El bit PSA (bit 3) del OPTION_REG determina a cual de los dos es conectado el preescaler. El preescaler es un contador programable cuyo rango es determinado por los bits PS0, PS1, PS2 (bits 0, 1 y 2) de OPTION_REG. TMR0 es un contador binario de 8 bit que puede contar hasta 256. Cuando el contador rebasa la cuenta de 255 (FFh) a 0 (00h) ocurre una interrupcin por desbordamiento y el bit T0IF (bit 2) del registro INTCON es puesto a 1. El hardware est diseado tal que cuando

ambos el GIE (bit 7) y TOIE (bit 5) del registro INTCON son H ("1") la interrupcin ocurre y el PC (program counter) va la direccin 004h, para comenzar la operacin de programa. Una cuenta 256 de TMR0, a veces es corta. Por ejemplo, cuando el reloj interno es 20MHz, la frecuencia de entrada del contador es 5MHz. (F osc/4). El perodo de este pulso de reloj es de 200ns (1 / 5Mhz = 0.2 s.). Para desbordar el TMR0 se necesitan 0.2 s. x 256 (51.2 s.). Entonces para ampliar este perodo se usa el preescaler. El preescaler se puede usar para dividir la entrada por 2, 4, 8, 16, 32, 64, 128, o 256. Por ejemplo, cuando el preescaler es puesto para dividir por 2, hay 1 pulso de salida por cada 2 pulsos de entrada al preescaler. Si ponemos a 256, habr 1 pulso de salida por cada 256 pulsos entrada. As que, el tiempo de desbordamiento de TMR0 se puede hacer ms largo modificando el valor del preescaler. En el ejemplo anterior cuando el preescaler fue puesto a 256, el tiempo de desbordamiento se hizo 51.2 s. x 256 = 13,107.2 s. (aproximadamente 13 milisegundos). La entrada al temporizador (TMR0) puede ser un reloj externo o el reloj interno. Para usar el reloj externo, el bit T0CS (bit 6) del registro OPTION_REG y bit 4 del registro TRISA debe ser puesto a "1". Esto pondr el pin RA4/T0CKI en el modo entrada de reloj (TMR0 CLOCK IN). El borde de las transiciones de subida o de cada del pulso de reloj, tambin, se pueden seleccionar por el bit T0SE (bit 5) del registro OPTION_REG. As, "0" para el borde creciente y "1" para el borde de cada. En la entrada al temporizador (TMR0) hay un circuito de sincronizacin de reloj. Usando un reloj externo, el conteo del borde de subida y cada de reloj no se sincronizar con el reloj interno, esto afectara la sincronizacin de la interrupcin. Dicho circuito sincroniza la entrada de escritura de TMR0 con el reloj interno. La sincronizacin se alcanza en un mximo de 2 ciclos. El oscilador del Temporizador Perro Guardin (WDT) es independiente del reloj de la CPU. La interrupcin WDT se produce aproximadamente cada 18 ms. Generalmente, para prevenir un tiempo mayor de la condicin del WDT debe ser reiniciado de vez en cuando va software, usando la instruccin CLRWDT. Ver imagen de la derecha. Si el Temporizador no es reiniciado antes de la interrupcin, la CPU forzar un reinicio a la posicin de direccin inmediatamente despus del encendido (Power up). El preescaler puede ser usado para ampliar el perodo de interrupcin. En este caso, los valores de contador son diferentes del TMR0. El preescaler puede ser puesto a uno de los ocho valores 1, 2, 4, 8, 16, 32, 64 o 128. Cuando se pone a 128, la interrupcin es aproximadamente 2 segundos (18msec x 128 = 2,304msec). La funcin del temporizador perro guardin (WDT) debe prevenir una operacin incorrecta del software. (Ej.: Ejecutar instrucciones que no son parte del programa. Lazo: Ejecutar la misma parte repetidamente). La funcin WDT no es siempre necesaria. Si hay un error en el programa, por lo general, puede reconocerse que hay un mal funcionamiento por el modo en el que ste se desarrolla (esto, no se realiza del modo que se esperaba). Si el WDT reinicia el PIC, no se puede ser capaz de entender, que hizo que, el programa funcionara mal. En ocasiones es mejor, no usar el temporizador perro guardin. Para desactivar la operacin del temporizador perro guardin, resetee el bit WDT de la palabra de configuracin (2007) del programa de memoria a "0" cuando grabe el micro en su quemador de PICs. Hemos visto las especificaciones generales del temporizador TMR0 y el WDT. Ahora, con ms detalle, continuaremos con las caractersticas de los registros que intervienen en mdulo Timer0, que nos permiten configurar su capacidad.

El registro TMR0.
Los PICs poseen un registro llamado TMRO, es un temporizador/contador de 8 bits. El registro TMR0 es un temporizador especial del mdulo Timer0. El mdulo Timer0, tiene las

caractersticas que se indican a continuacin: Temporizador/contador de 8 bit Capacidad de Lectura/Escritura Software de 8 bits con Preescaler programable Seleccin de Reloj Interno o externo Interrupcin por desbordamiento (al pasar de) FFH a 00H Seleccin del Borde (de subida o bajada) para el reloj externo El registro TMR0 como se ha dicho, es un temporizador especial del mdulo Timer0, es decir, es un contador de 8 bits cuyo contenido, se incrementa con una frecuencia constante en cada oscilacin de su seal de reloj Ftmr0 programable por hardware. Por su estructura de 8 bits, el mximo de la cuenta est en 256 (podemos contar hasta 28 = 256 valores, entre 0 y 255). Este registro TMR0, tambin puede usarse de modo que, permita contar eventos externos, segn el valor del bit 5 (TOCS) del registro OPTION. Si este bit 5 est a 1, TMR0 cuenta pulsos de entrada por RA4 y se le llama Contador, por el contrario, si el bit 5 est a 0, TMR0 (como ya se ha descrito ms arriba) cuenta pulsos internos de reloj de frecuencia constante (en modo temporizador) y se le llama Timer. Si nos interesa, se puede insertar un divisor de frecuencia programable (preescaler). Como se ha dicho, este divisor puede ser utilizado indistintamente como preescaler del TMR0 o como postscaler del WDT (Watch Dog Timer), segn lo programemos por software. A diferencia de otros registros, el valor que contiene el registro TMR0 se incrementa continuamente. De modo que, si asignamos el valor 10, despus de un ciclo de instruccin, el contenido del registro comienza a ser incrementado a 11, 12, 13 y as sucesivamente con una cadencia constante y totalmente independiente de la ejecucin del resto del programa. Una vez alcanzado el valor 255, en la cuenta siguiente, se desborda el registro TMR0, es decir, es puesto a cero automticamente, cuando pasa de FFh a 00h, comenzando entonces a contar nuevamente desde cero y no desde el valor originalmente cargado. Adems, en el momento de pasar por cero, se activa la bandera TOIF, bit 2 del registro INTCON por desbordamiento del TMR0, generndose la interrupcin, slo si el Control Global de Interrupciones est activado GIE = 1, INTCON bit 7. La frecuencia de conteo es directamente proporcional a la frecuencia de reloj aplicada al dispositivo que, como se ha dicho, puede ser modificada, programando adecuadamente los bits de configuracin del preescaler. La primera figura, es un diagrama simplificado de los bloques del mdulo Timer0 y preescaler. La informacin adicional est disponible en el "Manual de Referencia de la Familia PIC de Gama Media MCU" (DS33023).

La tabla anterior debe despejar las posibles dudas al principiante, respecto del registro TMR0 y el mdulo Timer0. El registro TMR0 est localizado en la direccin 01h y el mdulo Timer0, es un mdulo que tiene asociados los registros TMR0, OPTION_REG, TRISA e INTCON, como muestra la tabla. En los PIC's de gama media, el mdulo Timer0 es un mdulo interno de los micros y el registro TMR0, como ya se ha mencionado, es un registro de 8 bits que interviene en las operaciones de interrupciones producidas por el mdulo Timer0 que veremos con detalle.

El mdulo Timer0.
El mdulo Timer0 es un dispositivo que como se ha descrito (ver imagen), puede funcionar de

dos formas: como contador de pulsos externos o como temporizador para calcular intervalos de tiempo. El denominado mdulo Timer0 en las hojas de datos (descrito ms arriba), es un Temporizador/Contador de 8 bits habitual en los microcontroladores PIC16F84 (en otros modelos, es posible encontrar mdulos adicionales de 8 16 bits cuyo funcionamiento bsico, es el mismo). Antes de explicar el funcionamiento y uso con ejemplos del Timer0, para evitar confusiones, debemos definir los tres conceptos siguientes:

Frecuencia de oscilacin (Fosc): Es la frecuencia externa del PIC (mediante un cristal de cuarzo, un resonador, etc.). Frecuencia interna (Fint): Es la frecuencia del reloj interno de instrucciones, generada a partir de la frecuencia de oscilacin externa. Frecuencia TMR0 (Ftmr0): Es la frecuencia constante, despus del preescaler, a la entrada del TMR0.

Nota.- En los microcontroladores PIC, la frecuencia Fint difiere de la frecuencia Fosc, ya que para mantener la compatibilidad con los diseos originales es necesario dividirla por cuatro. El tiempo empleado en una temporizacin se puede calcular a partir de un ciclo de instruccin (es decir, si estamos trabajando con un XT de 4 Mhz, es una instruccin por cada microsegundo, 1s), segn la formula:

Cuando los pulsos provengan del reloj interno (Fint), el Timer0 se utilizar para generar interrupciones peridicas mediante una cuenta programada. Puesto que conocemos la frecuencia de funcionamiento y en base a un valor que cargaremos en el contador del timer TMR0 podremos temporizar eventos. Cuando dicha seal provenga de una fuente externa (patilla RA4/T0CKI) del microcontrolador (Fext), es especialmente til para contar el nmero de pulsos que dicha seal genera en el tiempo ya que cada pulso de dicha seal incrementa el valor del TMR0. El esquema simplificado del Timer0, se puede ver en la figura que sigue:

El Timer0, usado como temporizador, puede contar perodos de tiempo exactos, acumulndolos en un registro auxiliar, cada vez que ocurra un pulso de entrada podemos consultar el registro auxiliar y comparar el incremento acumulado desde el anterior pulso. Conocidos los perodos, podemos calcular el tiempo transcurrido. Adems como se describi ms arriba, de las dos formas de reloj descritas, tambin podemos configurar que el disparo de la seal, sea por flanco ascendente o descendente. Esto lo podemos realizar con los siguientes bits de control:

T0SC (Timer0 Select Clock) (bit5) del registro OPTION: Indica el origen del reloj del contador, oscilador interno (1) o seal externa (0). T0SE (Timer0 Set Edge) (bit4) del registro OPTION: Cuando se selecciona seal externa, indica el flanco activo que se usar (1 ascendente; 0 descendente).

El preescaler.
Un circuito adicional en el Timer0, es el preescaler, este circuito, nos permite modificar la frecuencia del reloj de entrada del Timer0, dividiendo sta y generando una nueva seal de menor frecuencia a su salida que, ser la seal de reloj (Ftmr0) de entrada al registro TMR0. El preescaler, es una ayuda para cuando la seal de entrada es una frecuencia demasiado alta para nuestros propsitos y necesitamos reducirla. El preescaler es un divisor de frecuencia programable que, se utiliza normalmente para lograr tiempos largos y se puede aplicar al TMR0 o al WDT, esto se configura en el bit PSA (bit3) del registro OPTION. Para configurar el preescaler del registro TMR0, como veremos en la siguiente seccin, usaremos 4 bits del registro OPTION, el PSA y tres bits que nos permiten dividir la frecuencia de una seal de entrada por 2, 4, 8, 16, 32, 64, 128 o 256. En caso de utilizar un divisor por 1, la seal de salida es la de entrada sin ningn cambio. Por ejemplo, si usamos como oscilador externo del PIC un cristal de 4Mhz, entonces el reloj interno de instrucciones funciona a Fint = 4Mhz /4 = 1 Mhz = 1 s. Si el Timer0 usa la seal del reloj interno y la pasamos por el preescaler configurado para una divisin por 4, la seal a la salida del preescaler ser Fpresc = 250 Khz. La configuracin se realiza con los siguientes bits de control:

PSA (Post Scaler Assignament) (bit3) del registro OPTION: Indica si el postscaler es asignado "1" al WDT o "0" al Timer0. PS2:0 (bit2:0) del registro OPTION: Indican el valor del divisor a utilizar en el postscaler (consultar tabla para los valores).

Nota de Microchip: Al alimentar el PIC o despus de un overflow por WDT, el postscaler esta asignado al WDT. Si se asigna el postscaler al Timer0, es posible que ocurra un reset por el WDT (incluso aun deshabilitado). Por esto se recomienda usar CLRWDT antes de reasignar el postscaler:
clrwdt movlw movwf ;borra postscaler y WDT b'11110001' ;reloj externo por flanco de caida OPTION_REG ;preescaler 1:4 asignado al Timer0

Registro OPTION

Para el clculo del divisor de frecuencia en PS2 - PS1 - PS0, usaremos la tabla siguiente:

Aprovechamos este punto para insertar la tabla de los registros pertenecientes a INTCON, ya que nos ayudarn a comprender mejor los Bits implicados en el proceso de temporizadores con el TMR0.

Temporizaciones con TMR0.


Veamos en la practica, como hacer una temporizacin con el registro TMR0. Por lo descrito, el tiempo empleado en una temporizacin se puede calcular a partir de un ciclo de instruccin, es decir, si usamos un XT de 4 Mhz, 1 instruccin por cada microsegundo, necesitaremos el valor del divisor de frecuencia (el que se selecciona con los bit's PS2, PS1 y PS0) y tambin el complemento del valor cargado en TMR0 (es decir 255 - TMR0), la ecuacin que nos permite realizar el clculo es la que siguiente: Temporizacin = Ciclo de instruccin * (255-TMR0) * Divisor de Frecuencia [1]

Generalizando: Retardo = 4 * Tosc (s) * (256 - Valor cargado en TMR0) * (Rango del preescaler) . . . . [2] 1) Supngase que necesitamos una temporizacin de 1s (1000 milisegundos), si usamos un cristal XT de 4 Mhz y a dems como divisor de frecuencia seleccionamos 8 (los bits PS2, PS1, PS0 = 0, 1, 0). Sabemos que, 1 seg. = 1000 ms = 1000000 s y como 1 ciclos/s es el tiempo empleado en ejecutarse una instruccin, aplicando la ecuacin anterior, tenemos:
255 - TMR0 = Temporizacin (en microsegundos) / (1 ciclo/S * Div. de Frec.) que sustituyendo: 255-TMR0 = 255-TMR0 = 255-TMR0 = 255-TMR0~= 1000000 s/(1 ciclo/s * 8) 1000000 /(8 ciclos) 125000 ciclos 125 ciclos

Por lo tanto TMR0 se debe cargar con: 255 - TMR0 = 125, que despejando nos proporciona el valor de TMR0 = 255 - 125 = 130 (82h). El valor que se debe cargar en TMR0 es 82h. Entonces empezar a contar los 130 ciclos necesarios para desbordarse, produciendo as la interrupcin. El tiempo empleado es el previsto, 1000000s = 1s.

2) Calculemos en este caso, el mximo retraso que es posible obtener con el mdulo Timer0, usando la seal interna de reloj de un PIC genrico que usa un cristal de 4 Mhz. El mayor retraso se puede obtener con el mayor divisor del preescaler 256 (PSA2,1,0 = 111), un valor 0 para el TMR0 (contar desde 0 a 255 antes del desbordamiento, es decir, 256 incrementos). Como Fosc= 4 Mhz el retraso mximo es: Retardo - TMR0 = (256 * 256) * (4/ 4 Mhz) = 65,566 ms 3) En esta ocasin, utilizando el mdulo Timer0 vamos a crear una funcin que genere un retardo de un milisegundo, el cual incrementa un contador cuyo valor se muestra por el PORTC de un PIC16F877. Ahora, veamos como realizar una funcin de retardo. Debemos tener en cuenta que el reloj es de 20 Mhz, entonces segn la formula [2],
1 (20x10^6) 1 ms = = x 0.05 * s 0.05 ; los ciclos ; para y hacer 1 ms x

despejando

x= 1000 / 0.05 = 20.000 ciclos.

Por lo tanto, necesitamos 20.000 ciclos para hacer 1 ms. Si, cada instruccin toma 4 ciclos en realizarse, las instrucciones que necesitamos son: 20.000/4 = 5.000 instrucciones para tener nuestro retardo de 1 ms (en el caso de contar ciclos de instruccin en lugar de los pulsos en RA4). Un ciclo de instruccin = 4 * Fosc Que, multiplicado por un numero X, obtendremos que, Retardo = Un ciclo de instruccin * X Retardo_R = 4 * Fosc * TMR0 Segn esta expresin, debemos considerar que el tiempo mximo sera: Retardo_R = 4 * Fosc * 256 256 s. Ahora si tenemos un clock de 4MHz conectado al PIC tendramos: luego:

Adems sabemos que el modulo timer 0 posee un preescaler que servira para amplia el

retardo. Si lo usamos debemos configurar el bit PSA a 0 . Si seteamos el bit PS2, PS1 y PS0 a 1 el preescaler tendra un valor de 256. Retardo_T0_Pre = 4 * Tosc * TMR0 * Preescaler. Retardo_T0_Pre = 4.0.25 s * 256 * 256 = 65536 s = 65.536 ms Con esto no alcanzamos a generar un segundo. Sin embargo podemos usar un registro que sirva para efectuar varios bucles. En tal caso, podramos lograr retardos mayores: Retardo = Bucle * Retardo_T0_Pre Retardo = Bucle * 65,536 ms 1000 ms = Bucle * 65,536 ; Como el Retardo debe ser 1segundo ;Bucle = 15.25

Como vemos generar el retardo es bastante fcil teniendo en cuenta que hemos de definir una rutina que se encargue de comparar o contar las veces que el TMR0 produce los desbordes hasta llegar a 256 cuentas.

Resumiendo
Sabemos que, la bandera T0IF del registro INTCON (bit2) que se pone a 1 siempre que hay un desborde en el Registro TMR0 es decir cuando pasa de 255 a 0. Esta bandera puede servir nuestros intereses ya que una vez producido el desborde el bit T0IF permanece en "1" y es necesario que lo pongamos a "0". Otro punto importante a recordar es que, debemos cargar el TMR0 con el valor apropiado para conseguir el retardo deseado. Supongamos que se necesita un retardo de 10 us. Entonces nuestro algoritmo sera:
T0IF = 0 Poner (256 - 246) 10 en el registro TMR0 Comprobar cuando T0IF sea 1

Se ha cargado el TMR0 con 10 ciclos de instruccin (10 s), lo que supone 10 cuentas de desbordamiento del TMR0, porque 10 cuentas = 1 T0IF. La que sigue podra ser una formula para el clculo del retardo que necesitamos: Retardo = Ciclo_instruccin * Valor_TMR0 * Valor_Preescaler * Bucle Esto nos indica que puede haber otras soluciones. Segn lo descrito, el registro OPTION_REG debera configurarse as: OPTION_REG = 1100 0110 ; Esto se puede traducir como:
MSB 1 1 0 0 0 1 1 0 Todas las resistencias de carga (Pull up) desconectadas Flanco para la interrupcin ascendente Pulsos de reloj interno Fosc/4 Cada flanco ascendente incrementa TMR0 Divisor de frecuencia se asigna al TMR0 \ } Valor del preescaler = 128 /

LSB

El programa que cumpla lo considerado, puede ser el siguiente:


list p=16f627A include "p16f628A.inc" CONTA EQU 0x20 ORG 0x00 inicio: BSF STATUS,RP0 BCF STATUS,RP1 ;Comando que indica el Pic usado ;Etiquetas genricas para el Pic16F877 ;Variable CONTA en direccin 0x20 hexadecimal ;Inicio del programa en la posicin cero de memoria ;Ir banco 1

CLRF TRISA MOVLW b'11000110' MOVWF OPTION_REG BCF STATUS,RP0 BCF STATUS,RP1 CLRF PORTC bucle: CALL retardo INCF PORTC,F GOTO bucle retardo: MOVLW d'64' MOVWF CONTA espera1: CLRF INTCON MOVLW d'134' MOVWF TMR0 espera: BTFSS INTCON,T0IF GOTO espera DECFSZ CONTA,F GOTO espera1 RETURN END

;PORTA salida ;Configuracin del modulo TMR0 ;Preescaler = 128 ;Ir banco 0 ;PORTC = 0 ;Llama la rutina de retardo ;Incrementa el valor del PORTC ;Ir bucle ;T = 4 * Tosc * Valor de TMR0 * Preescaler ;Cargar el valor de CONTA para 1 segundo

;Deshabilitar interrupciones ;Cargar el valor de TMR0 para 122 cuentas ;(Complemento) ;Esperar desborde del TMR0 ;Decrementar el registro CONTA hasta cero ;Si no es cero: ir a espera1 ;retorno de call

Con esto, estoy convencido que se ha descrito con extensin y puede darse por cerrado el tema. Esta informacin se ha obtenido de distintas fuentes y de la red. Volver al ndice de artculos PIC.
Creada el: 12-09-07 Actualizada el: 02-11-07 Copyright 2007, Hispavila.com. Reservados todos los derechos. | declaracin de privacidad | Pngase en contacto con nosotros

Das könnte Ihnen auch gefallen