uso del tmr como temporizador

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 ejecución 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 máximo valor empieza otra vez desde 0 avisándonos de ello por medio de la bandera TMR1F . Si está activa la interrupción por desbordamiento del Timer 1 al desbordarse el contador, el programa entra en la función de tratamiento a la interrupción por desbordamiento del Timer1. El diagrama de bloques es el siguiente: Algunas características 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 señal 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 fórmula 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 Oscilación.Prescaler El Timer1 se puede habilitar o deshabilitar por medio del bit TMR1ON del registro T1CON.

Upload: wally761234

Post on 14-Feb-2015

28 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Uso Del Tmr Como Temporizador

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 ejecución 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 máximo valor empieza otra vez desde 0 avisándonos de ello por medio de la bandera TMR1F . Si está activa la interrupción por desbordamiento del Timer 1 al desbordarse el contador, el programa entra en la función de tratamiento a la interrupción por desbordamiento del Timer1. 

El diagrama de bloques es el siguiente:

 

 Algunas características 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 señal 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 fórmula 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 Oscilación.Prescaler 

El Timer1 se puede habilitar o deshabilitar por medio del bit TMR1ON del registro T1CON.

Un dibujo con los bits de configuración del registro TICON, lo tenéis en la figura de abajo: 

Page 2: Uso Del Tmr Como Temporizador

 

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 interrupción por desbordamiento habilitada. 

Para ello tenemos como siempre dos opciones, escribir nosotros todo el código o ayudarnos por medio del asistente que trae CCS. Cualquiera de las opciones es valida, ya que el código 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).  

Page 3: Uso Del Tmr Como Temporizador

 Después en el apartado timers habrá que configurar los parámetros para el Timer1, como vamos a trabajar con el Timer1 en modo Temporizador, en el tipo de reloj seleccionaremos Internal, después seleccionaremos una resolución entre las cuatro disponibles, según se muestra en la figura de abajo. 

 

Page 4: Uso Del Tmr Como Temporizador

La resolución 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 opción 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 Oscilación.Prescaler= 4/4MHz.8= 8u segundos. 

El asistente también nos muestra el Overflow, que como hemos dicho también, 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 fórmula 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 interrupción por desbordamiento del Timer 1, según se muestra en la figura de abajo: 

  El código de nuestro ejemplo quedará de la siguiente forma: 01.#include <16F887.h>//Pic utilizado02.//Palabra de configuración de los fusibles.

Page 5: Uso Del Tmr Como Temporizador

03.#FUSES NOWDT, XT, NOPUT, NOMCLR, NOPROTECT, NOCPD, NOBROWNOUT, NOIESO, NOFCMEN, NOLVP, NODEBUG, NOWRT, BORV4004.#use delay(clock=4000000)//Frecuencia del reloj principal05.#bit RB7=0x06.7 //Identificador para el bit RB706. 07.#int_TIMER108.void  TIMER1_isr(void)//Función de interrupción por desbordamiento TMR1  09.{10.RB7=~RB7; //Togle RB711.set_timer1(0x0BDC);//carga del TMR112.}13. 14. 15. 16.void main()17.{18.set_tris_b(0b01111111); //configura RB7 como salida el resto como entrada19.RB7=0;//Inicializo RB720.setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//Setup timer: Reloj interno, preescaler= 821.enable_interrupts(INT_TIMER1);//Habilito interrupción particular del TIMER122.enable_interrupts(GLOBAL);//Habilito interrupciones globales23.set_timer1(0x0BDC);//Carga del TMR124.while(true);//Bucle infinito hasta interrupción25. 26.}Siempre hay que limpiar un poco el código que nos genera el asistente, de parámetros y opciones que están deshabilitadas y que no nos sirven para nada. 

El circuito a montar en Proteus, será el siguiente:  

Page 6: Uso Del Tmr Como Temporizador

 En el que se ha incluido una gráfica digital para medir el intervalo de tiempo de parpadeo del diodo LED. 

Si hacemos un zoom sobre la gráfica y añadimos un segundo cursor (Ctrl+c), podemos ver que el intervalo es de 500 ms.  

Page 7: Uso Del Tmr Como Temporizador