Timer2 AVR temporizador


Compartir: Share on Facebook0Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0

En este caso se verá el uso del timer2 AVR, este temporizador no funciona como contador, solo como temporizador, y puede ser usado en modo comparador, y también en modo PWM, el uso del timer2 AVR en modo PWM se verá en otro apartado, a utilizarse el timer2 como temporizador, este tiene dos opciones,  el timer2 AVR puede trabajar con el mismo cristal  o reloj con el cual trabaja el microcontrolador AVR, o el timer2 AVR puede trabajar con un cristal o reloj independiete conctado exteriormente a los pines TOSC1 y TOSC2, en este  caso se dice que trabaja en forma asíncrona al sisterma.

En lo que sigue se comentará para el caso del ATmega88 por lo que es muy importante que se tenga a mano la hoja  de datos del atmega88, para el caso de utilizar algún otro microcontrolador AVR el procedimiento será muy similar a lo aquí comentado, la programación se realizará con atmel studio.

El timer2 AVR es un temporizador de 8 bits, el registro donde se guardan los valores del timer2 AVR es el registro representado por TCNT2, al ser utilizado este registro sus valores aumentaran de uno en uno entre 0 y 255 con cada ciclo de reloj, puede ser el reloj al  cual trabaja el microcontrolador AVR o un reloj externo, por ejemplo si trabaja con el reloj del sistema y si el oscilador con el que está funcionando el microcontrolador AVR es de 1MHz, entonces el registro TCNT2 aumentará una unidad en 1 us, si el registro TCNT2 se incrementa en 100 unidades habrán transcurrido 100us.

El registro TCNT2 del timer2 AVR puede ser leído y escrito, puede ser prescalado para que el tiempo en su incremento de valor en una unidad sea mayor, el timer2 AVR cuando alcanza su valor máximo de 255 se reinicia, volviendo a incrementar sus valores de 0 a 255, además cuando llega a su valor máximo y se reinicia puede producir una interrupción, lo cual se decide por programa.

Timer2 AVR  temporizador con reloj del sistema

Para el ATmega88 el registro TCNT2 del timer2 AVR está formado por 8 bits por lo que se sus valores pueden ser desde 0 hasta 255, al utilizar timer2 AVR como temporizador este aumentará sus valores o su cuenta con cada ciclo de reloj,  sus valores aumentaran de uno en uno entre 0 y 255, por ejemplo si el oscilador con el que está funcionando el microcontrolador AVR es de 1MHz, entonces el registro TCNT2 aumentará una unidad en 1 us, si el registro TCNT2 se incrementa en 93 unidades habrán transcurrido 93us.

Normalmente el registro del timer2 TCNT2 irá aumentando su conteo con cada ciclo de reloj del microcontrolador, si se usa por ejemplo una frecuencia de trabajo (lo que se conoce como FCPU) de 1Mhz entonces el registro TCNT2 aumentará en una unidad cada microsegundo, y como este registro es de 8 bits este aumentará desde 0, o desde algún valor que se le ponga como valor inicial al registro TCNT2, hasta un máximo de 255, por ejemplo si va desde 0 hasta 255 habrán transcurrido 255us luego volverá a 0 pero en esa vuelta a 0 transcurre 1us mas, por lo cual en ir de 0 y volver a 0 transcurren 256us; no siempre se utiliza una FCPU de 1Mhz esto puede variar, por lo que como consecuencia variará el tiempo que trascurre para que el registro TCNT2 aumente su valor.

Para programar el timer2 AVR como temporizador será necesario colocar todos los bits del registro TCCR2A a cero, esto es TCCR2A=0, en realidad esto no es necesario ya que el registro se inicializa automáticamente a 0, este registro será útil cuando se utilice el timer2 AVR en modo comparación y para la modulación de ancho de pulso PWM.

timer2 avr tccr2a

El registro TCCR2B es el que permitirá utilizar el temporizador timer2 avr.

El timer2 AVR cuenta con lo que se conoce como el prescaler esto hace que la frecuencia de trabajo FCPU se divida por este prescaler, con lo que se logra que el timer2 AVR tarde un poco mas en aumentar su valor en una unidad; el prescaler puede tomar el valor de 1, 8, 32, 64, 128, 256 o 1024; estos valores se eligen programando los bits 0, 1 y 2 del registro TCCR2B, los bits 7 a 3 en este caso se pondrán a 0.

temporizador contador timer2

En la siguiente tabla se ve los valores que hay que dar a estos bits para obtener los diferentes valores de los prescaler para el temporizador timer2 AVR, observar que cuando estos bits son todos iguales a 0 el timer2 AVR está deshabilitado.

temporizador timer2

Si el prescaler elegido es por ejemplo de 8 y la FCPU=1Mhz, entonces la frecuencia de trabajo del timer2 AVR Ftemp será de Ftemp=FCPU/prescaler, el tiempo  que tardará ahora el temporizador en aumentar una unidad será la inversa de este valor lo cual se conoce como periodo Ttemp=prescaler/FCPU por lo que en este caso Ttemp=(8)/(1Mz) de donde Ttemp=8us, esto quiere decir que ahora el timer2 AVR aumentará en una unidad cada 8us y en este caso entonces el registro TCNT2 para ir de 0 a 255 tardará 255*Ttemp=255*8us=2040us=2,040ms; la misma idea es para los demás prescaler.

Al utilizar los prescaler se tiene la ventaja de lograr tiempos mas largos para cada incremento en una unidad del registro TCNT2 del timer2 AVR, y por lo tanto realizar temporizaciones mas largas mientras el timer2 AVR incrementa sus valores.

De acuerdo a los tiempos que se quieran obtener al utilizar el timer2 AVR, habrá que utilizar el prescaler adecuado así como inicializar el registro TCNT2 también con un valor adecuado, no olvidar que este registro es de 8 bits y por lo tanto solo puede contener valores enteros entre 0 y 255.

Utilizando una regla de 3 simple se llega a la siguiente ecuación que ayudará a encontrar el valor inicial adecuado a cargar en el registro TCNT2 para obtener el tiempo buscado.

TCNT2=28-Tretardo*(FCPU/prescaler)

Donde TCNT2 es el valor inicial a cargar en este registro para obtener el  tiempo buscado, 28 porque el timer2 es de 8 bits, Tretardo es el tiempo que se quiere obtener con el timer2 AVR, FCPU es la frecuencia de trabajo del microcontrolador o del cristal utilizado, y prescaler será el prescaler elegido según la tabla anterior.

Por ejemplo si se quiere temporizar 100ms, en este caso 100ms sería el tiempo de retardo, y si el microcontrolador AVR trabaja con una FCPU de 1Mhz, habrá que elegir entre los posibles prescaler que se tienen, reemplazar en la ecuación anterior y ver si el número obtenido esta entre 0 y 255, de ser así la elección del prescaler es correcta, de lo contrario habrá que utilizar otro, por ejemplo si se elige un prescaler de 1024 se tendría:

TCNT2=256-(100ms)(1Mhz)/1024

TCNT2=157,3437

El valor obtenido está entre 0 y 255 aunque no es un número entero, por lo que hay que redondearlo a un entero cercano en este caso 158, al hacer esto la temporización no será exactamente 100ms pero si un valor bastante próximo y aceptable.

158 sería el valor inicial a cargar en el registro TCNT2 para obtener una temporización de 100ms con el timer2 AVR, esto quiere decir que si se inicia el timer2 AVR con 158 y un prescaler de 1024, cuando aumente su valor de 158 a 255 habrán transcurrido 100ms.

Este proceso será el que se seguirá cuando se utilice el timer2 AVR como temporizador.

Ejemplo

Se utilizará el timer2 AVR como temporizador,  para ello se ha preparado el circuito tal como se muestra en la imagen, se hará parpadear un led conectado en el pin PD7 cada 100ms, este tiempo será obtenido mediante la temporización con el timer2 AVR aprovechando lo calculado hace un momento, la frecuencia de trabajo será de 1Mhz, el prescaler será de 1024 y habrá que cargar el registro TCNT2 con un valor inicial de 158.

timer2 avr circuito ejemplo

El programa realizado en el atmel studio para el uso del temporizador contador timer2 AVR como contador es el siguiente:

timer2 avr código

El uso del temporizador contador avr es mucho mas eficaz si se utiliza mediante las interrupciones, este tema se verá en la sección de interrupciones con el avr.

Timer2 AVR en modo comparador

timer0 avr atmega88

Al utilizar el timer2 AVR en modo comparador ocurre que el registro TCNT2, que en este caso es de 8 bits, irá aumentando su valor de uno en uno desde 0 hasta que este se haga igual a un valor almacenado en el registro OCR2A (no en el registro OCR2B), en el momento que se hacen iguales los valores de los registros TCNT2 y OCR2A, el registro TCNT2 se pone automáticamente a cero o también se dice se borra, para nuevamente comenzar a aumentar su valor desde 0 hasta que se vuelva hacer igual al valor almacenado en el registro OCR2A.

A esto se lo conoce como el modo de trabajo CTC, que quiere decir borrado del timer por comparación.

Si se utiliza el modo CTC y se tiene almacenado un valor en el registro OCR2A, eso quiere decir que por el pin OC2A o el pin OC2B, mas adelante se verá como elegir el pin a utilizar en este caso para atmega88, cuando el valor del registro TCNT2 se haga igual al valor almacenado en el registro OCR2A ocurrirá algún evento en alguno de estos pines, como por ejemplo que si el  pin está a uno se pondrá a cero, o si está a cero se pondrá a uno; es necesario ademas configurar el pin a utilizar como una salida mediante el registro DDRx dependiendo en que puerto este el pin.

En el modo de trabajo CTC del timer2 se utilizarán los registros TCCR2A y  TCCR2B

El registro TCCR2A con este registro se elige si el evento a ocurrir como respuesta por comparación a la igualdad entre el registro TCNT2 y el registro OCR2A, será por el pin OC2A u OC2B, en la siguiente imagen se tiene el registro TCCR2A, en el se pueden ver los nombres dados a sus bits.

timer2 avr tccr2a

Los bits 7 y 6 son para elegir que el evento cuando ocurra la comparación sea por el pin OC2A, para elegir el tipo de evento que ocurrirá cuando se iguale el registro TCNT2 con el registro OCR2A, en el caso de utilizar el pin OC2A para las combinaciones de los bits 7 y 6 se tiene la siguiente tabla, si ambos bits son 0 la opción OC2A del pin no está disponible trabajando el pin como una entrada salida digital normal.

timer2 avr modo comparadort1

Si por ejemplo los bits 6 y 7 se ponen a 0 el pin OC2A no se verá afectado por la comparación pudiendo utilizarse como una entrada salida digital, si por ejemplo el el bit7 se pone a 0 y el bit6 a 1 entonces el estado del pin OC2A alternará cada vez que la comparación ocurra, si el bit7 y el bt6 se ponen a 1 ocurrirá que si el pin OC2A estaba a 0 este se pondrá a 1, pero si estaba a 1 este no se verá afectado.

Los bits 5 y 4 son para elegir que el evento cuando ocurra la comparación sea por el pin OC2B, para elegir el tipo de evento que ocurrirá cuando se iguale el registro TCNT2 con el registro OCR2A, en el caso de utilizar el pin OC2B para las combinaciones de los bits 5 y 4 se tiene la siguiente tabla, si ambos bits son 0 la opción OC2A del pin no está disponible trabajando el pin como una entrada salida digital normal.

timer2 avr modo comparadort2

Si por ejemplo los bits 5 y 4 se ponen a 0 el pin OC2B no se verá afectado por la comparación pudiendo utilizarse como una entrada salida digital, si por ejemplo el el bit5 se pone a 0 y el bit4 a 1 entonces el estado del pin OC2B alternará cada vez que la comparación ocurra, si el bit5 y el bt4 se ponen a 1 ocurrirá que si el pin OC2B estaba a 0 este se pondrá a 1, pero si estaba a 1 este no se verá afectado.

Los bits 3 y 2 no se utilizan por lo que se les suele pones a 0.

El bit1 para utilizar el modo CTC tiene que ser puesto a 1, ¡Muy importante!

El bit0 este bit en el modo comparación se pone a 0, será utilizado en el modo PWM.

El registro TCCR2B con este registro se elige el prescaler a utilizar, para obtener en cuanto tiempo se quiere que el registro TCNT2 se iguale al registro OCR2A, en la siguiente imagen se tiene el registro TCCR2B, en el se pueden ver los nombres dados a sus bits.

temporizador contador timer2

Los bits 7 y 6 no son utilizados en el modo CTC por lo que se les pone a 0.

Los bits 5 y 4 no se utilizan por lo que se les suele poner a 0.

El bit3  este bit en el modo comparación se pone a 0, será utilizado en el modo PWM.

Los bits 2, 1, y 0 son utilizados para elegir el prescaler de acuerdo a las combinaciones de estos bits, según la siguiente tabla.

temporizador timer2

Timer2 AVR en modo comparador modo CTC el registro OCR2A

En el registro OCR2A se cargará el valor hasta el cual se quiere que llegue el registro TCNT2 en el modo CTC, por lo que hay que ver como se puede encontrar el valor adecuado a cargar en el registro OCR2A, se ha visto que para utilizar el timer2 AVR como temporizador hay que cargar el registro TCNT2 con un valor obtenido de la siguiente ecuación:

TCNT2=28-Tretardo*(FCPU/prescaler)-1

Para el caso de utilizar el timer2 AVR en modo de comparación o CTC hay que cargar en el registro OCR2A, la cantidad de veces que tiene que contar el registro TCNT2, lo que viene a ser el máximo valor al que el registro TCNT2 puede llegar que es 255 menos lo que sería necesario cargar en el registro TCNT2 para obtener el tiempo buscado, entonces de la ecuación anterior se tendría que cargar el registro OCR2A:

OCR02A  = 28-TCNT2-1 = Tretardo*(FCPU/prescaler)

entonces:

OCR2A= Tretardo*(FCPU/prescaler)

El registros OCR2A es de 8 bits por lo que el valor obtenido mediante la ecuación anterior tendrá que ser un número entero comprendido entre 0 y 255, de no ser así el valor no será válido.

Por ejemplo, para lograr que la comparación ocurra cada 50ms, utilizando un prescaler de 256 será necesario cargar el registro OCR2A con el valor de

OCR2A=(50ms)(1Mhz)/256

De donde OCR2A=195,3125

El valor obtenido está entre 0 y 255 aunque no es un número entero, por lo que hay que redondearlo al entero mas cercano en este caso 195, al hacer esto la comparación no ocurrirá exactamente a los 50ms pero si en un momento bastante próximo y aceptable.

Para el registro TCNT02 del timer2 AVR, si se carga el registro OCR2A con 195 y se utiliza un prescaler de 256, entonces cuando aumente el valor del registro TCNT2 de 0 a 195 habrán transcurrido 50ms.

195 sería el valor a cargar en el registro OCR2A para que cada 50ms el valor del registro TCNT2 llegue a 195 y por comparación se produzca un evento en el pin OC2A u OC2B, tras lo cual el registro TCNT2  se pondrá automáticamente a 0 para volver a aumentar su valor nuevamente hasta 195 en un lapso de 50ms y se vuelva ha repetir el proceso.

Con los valores obtenidos se hará el siguiente ejemplo.

Ejemplo:

Para el ejemplo del uso del temporizador contador timer2 avr en modo CTC, se utilizará el pin 5 o pin OC2B del ATmega88 como el pin en el que ocurrirá un evento, que será que cada vez que ocurra la la igualdad entre el registro TCNT2 y el registro OCR2A el estado de este pin OC2B cambie, este pin hay que configurar como una salida digital mediante el DDRD correspondiente, se hará que el pin OC2B cambie de estado cada 50ms, esto será observado mediante un led conectado a este pin.

Será necesario entonces utilizando los cálculos anteriores cargar el registro OCR2A=195, del registro TCCR2A hay que poner a 1 su bit4 para que el evento por cambio de estado sea por el pin OC2B, y también hay que poner a 1 su bit1 para hacer trabajar el timer2 el modo CTC, sus demás bits se ponen a 0.

TCCR2A=0b00010010;//cambio estado en el pin OC2B modo CTC

Del registro TCCR2B poner a 1 su bit2 y sus demás bits a 0 para tener el prescaler de 256, para hacer que un led conectado al pin OC2B cambie de estado cada 50ms.

TCCR2B=00000110;//prescaler de 256

El circuito utilizado para ver el uso del temporizador contador timer2 avr en modo CTC es el siguiente:

timer2 avr modo comparación circuito

El programa realizado en el atmel studio para el uso del temporizador contador timer2 AVR en modo CTC es el siguiente:

timer2 avr modo CTC código

Si he logrado ayudarte en cuanto a la utilización del timer2 AVR, comparte este enlace para poder ayudar a muchas personas mas, el uso del timer2 AVR en modo PWM se verá en otra sección. Muchas Gracias.

Atte MrElberni.

:

Compartir: Share on Facebook0Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0