You are on page 1of 7

Uso del tmr como temporizador

El Timer1 es un temporizador/contador ascendente parecido al TMR0, pero con algunas peculiaridades que lo hacen muy interesante a la hora de incluir temporizaciones en nuestros programas. La primera de ellas, es que se trata de un contador de 16 bits cuyo valor se almacena en dos registros de 8 bits el TMR1H y el TMR1L, ambos registros se pueden leer y escribir su valor durante la ejecucin del programa. Cuando el Timer1 est habilitado, el valor de esos registros se incrementan desde 0000h a FFFFh y una vez que llega a su mximo valor empieza otra vez desde 0 avisndonos de ello por medio de la bandera TMR1F . Si est activa la interrupcin por desbordamiento del Timer 1 al desbordarse el contador, el programa entra en la funcin de tratamiento a la interrupcin por desbordamiento del Timer1. El diagrama de bloques es el siguiente:

Algunas caractersticas de este Timer son las siguientes:

El Timer1 puede funcionar con un oscilador externo y trabajar a una frecuencia distinta a la del oscilador principal del PIC. Al igual que el TMR0 el Timer1 puede operar en dos modos: como temporizador y como contador. El modo de funcionamiento est determinado por el tipo de reloj seleccionado (interno -->temporizador, externo -->contador), lo configuramos por medio del bit TMR1CS del registro TICON. Cuando est en modo contador su valor se incrementa en cada flanco de subida de la seal de reloj externa. El tiempo que se tarda en incrementarse el contador se le suele llamar paso, el paso del contador depende de la frecuencia del oscilador y del prescaler seleccionado. La frmula para determinar los tiempos del Timer1 cuando es utilizado como temporizador (Reloj interno) es la siguiente:

El paso del contador vendr determinado por: Paso_Contador= 4/Frecuencia Oscilacin.Prescaler

El Timer1 se puede habilitar o deshabilitar por medio del bit TMR1ON del registro T1CON. Un dibujo con los bits de configuracin del registro TICON, lo tenis en la figura de abajo:

Vamos a ver un ejemplo sencillo (como siempre) de como utilizar el Timer1 como temporizador usando el reloj interno del micro. El ejemplo consiste simplemente en hacer parpadear un led a un intervalo de 0.5 segundos, usando el Timer1 con la interrupcin por desbordamiento habilitada. Para ello tenemos como siempre dos opciones, escribir nosotros todo el cdigo o ayudarnos por medio del asistente que trae CCS. Cualquiera de las opciones es valida, ya que el cdigo es muy sencillo. El que utilice el asistente, deber configurar primeramente el micro a utilizar y la frecuencia de reloj. Yo voy ha utilizar el PIC16f877 y un cristal de 4MHz (el viejo amigo de batallas PIC16f84A no dispone de este recurso).

Despus en el apartado timers habr que configurar los parmetros para el Timer1, como vamos a trabajar con el Timer1 en modo Temporizador, en el tipo de reloj seleccionaremos Internal, despus seleccionaremos una resolucin entre las cuatro disponibles, segn se muestra en la figura de abajo.

La resolucin es el tiempo que tarda el contador en incrementar su valor, es decir, el paso del contador. Este valor, como hemos dicho ya, depende del Preescaler seleccionado y de la frecuencia del reloj principal. Por ejemplo, si seleccionamos la ltima opcin le estamos diciendo al asistente que queremos un preescaler de 8 y como hemos seleccionado una frecuencia de 4MHz para el reloj principal, el paso del contador ser igual a: 4/Frecuencia Oscilacin.Prescaler= 4/4MHz.8= 8u segundos. El asistente tambin nos muestra el Overflow, que como hemos dicho tambin, es el tiempo que tardar el contador en desbordarse. Suponiendo que carguemos el TMR1 con valor 0, que es como viene por defecto, si aplicamos la formula obtendremos el valor de 524ms (Desbordamiento_Timer1= 4/4MHz*8(65536-0)= 524 ms). Como en vez de 524 ms, queremos obtener 500 ms. Sustituimos ese valor en la frmula y despejamos el valor a cargar en el TMR1:

El valor de TMR1 que sale es de 3036 que en hexadecimal es: 0x0BDC Por ltimo solo nos queda decirle al asistente que queremos utilizar la interrupcin por desbordamiento del Timer 1, segn se muestra en la figura de abajo:

El cdigo de nuestro ejemplo quedar de la siguiente forma:

01.#include <16F887.h>//Pic utilizado 02.//Palabra de configuracin de los fusibles.

03.#FUSES NOWDT, XT, NOPUT, NOMCLR, NOPROTECT, NOCPD, NOBROWNOUT, NOIESO, NOFCMEN, NOLVP, NODEBUG, NOWRT, BORV40 04.#use delay(clock=4000000)//Frecuencia del reloj principal 05.#bit RB7=0x06.7 //Identificador para el bit RB7 06. 07.#int_TIMER1 08.void TIMER1_isr(void)//Funcin de interrupcin por desbordamiento TMR1 09.{ 10.RB7=~RB7; //Togle RB7 11.set_timer1(0x0BDC);//carga del TMR1 12.} 13. 14. 15. 16.void main() 17.{ 18.set_tris_b(0b01111111); //configura RB7 como salida el resto como entrada 19.RB7=0;//Inicializo RB7 20.setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//Setup timer: Reloj interno, preescaler= 8 21.enable_interrupts(INT_TIMER1);//Habilito interrupcin particular del TIMER1 22.enable_interrupts(GLOBAL);//Habilito interrupciones globales 23.set_timer1(0x0BDC);//Carga del TMR1 24.while(true);//Bucle infinito hasta interrupcin 25. 26.}
Siempre hay que limpiar un poco el cdigo que nos genera el asistente, de parmetros y opciones que estn deshabilitadas y que no nos sirven para nada. El circuito a montar en Proteus, ser el siguiente:

En el que se ha incluido una grfica digital para medir el intervalo de tiempo de parpadeo del diodo LED. Si hacemos un zoom sobre la grfica y aadimos un segundo cursor (Ctrl+c), podemos ver que el intervalo es de 500 ms.