Sie sind auf Seite 1von 14

Temporizador AVR

Un temporizador AVR es un registro que aumenta su valor en una unidad con


cada ciclo de reloj al cual se encuentre funcionando el microcontrolador AVR,
si por ejemplo la frecuencia del oscilador es de 1M Hz, entonces su ciclo de
trabajo será de 1us, por lo que el temporizador AVR aumentará su valor de uno
en uno en cada microsegundo; por ejemplo cuando el temporizador aumenta su
valor en 10 unidades habrán transcurrido 10us.
El temporizador AVR es utilizado para obtener medidas de tiempos muy
precisas, de ahí que se le da el nombre de temporizador, en este caso el
temporizador AVR funciona con el reloj del sistema; pero también puede ser
utilizado para realizar conteos, por lo que también se le llama con tador, en este
caso el temporizador AVR ya no aumenta su valor de uno en uno en cada ciclo
de trabajo, sino que lo hará mediante el flanco de subida o el flanco de bajada
de alguna señal que llegue a un pin del AVR, estos pines son identificados como
Tx donde x es el número temporizador AVR que será usado como contador.
Una de las características muy importantes del temporizador AVR es que permite
ser utilizado en modo de comparación, en la generación de señales PWM, además
de producir interrupciones .
Los microcontroladores AVR suelen tener varios temporizadores, como ejemplo
se utilizará el ATmega88 , el cual tiene 3 temporizadores que son llamados
timer0, timer1 y timer2, el tiempo que tarda el temporizador AVR en aumentar
su valor de unidad en unidad, se puede modificar por programa mediante el uso
de prescalers, siendo de esta manera mucho mas provechosos; dependiendo del
modelo de microcontrolador AVR utilizado, no todos los temporizadores pueden
ser utilizados como temporizador y también como contador.
El registro en los microcontroladores AVR donde se guardan y realizan los
aumentos de uno en uno del temporizador AVR, es llamado registro temporizador
contador y es representado por TCNTx , donde x es el número de temporizador
AVR que puede ser 0, 1, 2, dependiendo del número de temporizadores con que
cuente el microcontrolador AVR; el temporizador AVR puede ser de 8 bits o de
16 bits.
El temporizador AVR puede aumentar sus valores de 0 a 255 si es de 8 bits como
el timer0, o de 0 a 65535 si es de 16 bits como el timer1, cada vez que estos
registros alcanzan su máximo valor sse reinician , volviendo a contar desde su
valor mínimo hasta su máximo, ademas pueden ser programados para
provocar interrupciones .
Para el uso del temporizador AVR se cuenta además con un grupo de registros
mediante los cuales se puede lo puede configurar de acuerdo a las necesidades
que se tengan.
En los enlaces que siguen se comentara por separado como se puede proceder
para utilizar cada una de las posibilidades de trabajo del temporizador AVR para

1
el timer0, el timer1 y el timer2 del ATmega88, siendo muy importante contar
con su hoja de datos que se puede ver y descargar aquí , con algunas pequeñas
variaciones es un procedimiento común para otros microcontroladores AVR

Timer0 AVR temporizador contador


En este caso se verá el uso del timer0 AVR como contador, temporizador y en
modo comparador, el uso del timer0 AVR en modo PWM se verá en otro
apartado, 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 timer0 AVR es un temporizador contador de 8 bits, el registro d onde se
guardan los valores del timer0 AVR es el registro temporizador contador
representado por TCNT0 , cuando es utilizado como temporizador, sus valores
aumentaran de uno en uno entre 0 y 255 con cada ciclo de reloj, por ejemplo si
el oscilador con el que está funcionando el microcontrolador AVR es de 1MHz,
entonces el registro TCNT0 aumentará una unidad en 1 us, si el registro TCNT0
se incrementa en 100 unidades habrán transcurrido 100us; cuando es utilizado
como contador el temporizador AVR ya no aumenta su valor de uno en uno en
cada ciclo de reloj, sino que lo hará mediante el flanco de subida o el flanco de
bajada de alguna señal que llegue a un pin especial del AVR conectado al timer0
AVR, este pin es identificado como T0 que en el ATmega88 es el pin6 o
PD4 , esto puede variar de acuerdo al microcontrolador avr utilizado, pero
siempre se llamará T0.

El registro TCNT0 del timer0 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 timer0 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.

2
Timer0 AVR como contador
Para el ATmega88 el registro TCNT0 del timer0 AVR está formado por 8 bits
por lo que se puede contar desde 0 hasta 255, al utilizar timer0 AVR
como contador este no aumentará sus valores o su cuenta con cada ciclo de
programa, en este caso el timer0 estará conectado al pin T0 por donde se le hará
llegar una señal, la cual al cambiar de estado hará que el timer0 AVR se
incremente en una unidad, estos incrementos en su cuenta pueden ser por cada
flanco de subida o cada por flanco de bajada de la señal, el flanc o a utilizar se
elige por programa, por ejemplo su se elige el flanco de subida quiere decir que
cada vez que la señal que llega al pin T0 pase de un bajo a un alto o de 0 a 1, el
registro TCNT0 aumentará en una unidad, de esta manera se le puede utilizar
como contador, cuando la señal pase de un alto a un bajo o de 1 a 0 el registro
TCNT0 no aumentará su valor o no se incrementará.
Para programar el timer0 AVR como contador será necesario colocar todos los
bits del registro TCCR0A a cero, esto es TCCR0A=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 timer0 AVR en modo comparación y para la modulación
de ancho de pulso PWM.

El registro TCCR0B es el que permitirá utilizar el timer0 avr como contador:

Según se ve en la hoja de datos del ATmega88 para utilizar el timer0 AVR como
contador, del registro TCCR0B hay que manipular sus bits 0, 1 y 2 (CS00, CS01
y CS02) los demás bits se pondrán a 0, se tienen dos posibilidade s, para que el
conteo se realice cuando la señal que llega al pin T0 pase de 0 a 1 o por flanco
de subida estos 3 bits se pondrán a 1 esto es CS00=1, CS01=1 y CS02=1; y si el
conteo será cuando la señal que llega al pin T0 pase de 1 a 0 o por flanco de
bajada solo se pondrán a 1 los bits 1 y 2, mientras el bit0 se deja a 0 esto
es CS00=0, CS01=1 y CS02=1.

3
Al elegir alguna de las 2 posibilidades, cada vez que la señal digital que llegue
al pin T0 pase de un alto a un bajo o de un bajo a un alto, según se h aya elegido,
el valor del contador, esto es el valor del registro TCNT0 , aumentará en una
unidad hasta un máximo de 255, luego se pondrá nuevamente a 0 y otra vez
comenzará el conteo.
Ejemplo
Se utilizará el timer0 AVR como contador, para ello se ha preparado el circuito
tal como se muestra en la imagen, la señal digital será generada con la ayuda de
un fotorresistor y una resistencia conectados al pin T0, se hará que le registro
TCNT0 aumente su cuenta por cada flanco de subida, cada vez que al se ilumine
el fotorresistor este disminuá su valor y al pin T0 le llegará un alto produciendo
un flanco de subida, lo que provocará que el registro TCNT0 aumente en una
unidad, cuando se deje de iluminar el fotorresistor este aumentará su valor por
lo que al pin T0 le volverá a llegar un 0, pero esto no provocará el aumento del
registro TCNT0 en una unidad, ya que será un flanco de bajada; los valores del
registro TCNT0 serán vistos en el puerto B por medio leds, estos valores serán
vistos por tanto en forma binario contando de 0 a 255, tras lo cual se reiniciará
para volver a contar de 0 a 255.

El programa realizado en el atmel studio para el uso del temporizador contador


timer0 AVR como contador es el siguiente:

4
Timer0 AVR como temporizador
Para el ATmega88 el registro TCNT0 del timer0 AVR está formado por 8 bits
por lo que se sus valores pueden ser desde 0 hasta 255, al utilizar timer0 AVR
como temporizador este aumentará sus valores o su cuenta con cada ciclo de
reloj, sus valores aumentaran de uno en uno ent re 0 y 255, por ejemplo si el
oscilador con el que está funcionando el microcontrolador AVR es de 1MHz,
entonces el registro TCNT0 aumentará una unidad en 1 us, si el registro TCNT0
se incrementa en 27 unidades habrán transcurrido 27us.
Normalmente el registro del timer0 TCNT0 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 TCNT0
aumentará en una unidad cada microsegundo, y como e ste registro es de 8 bits
este aumentará desde 0, o desde algún valor que se le ponga como valor inicial
al registro TCNT0, 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 trans curre
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 TCNT0 aumente su valor.
Para programar el timer0 AVR como temporizador será necesario colocar todos
los bits del registro TCCR0A a cero, esto es TCCR0A=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 timer0 AVR en m odo comparación y para la modulación
de ancho de pulso PWM.

5
El registro TCCR0B es el que permitirá utilizar el timer0 avr como temporizador:
El timer0 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 timer0 AVR tarde un poco mas en aumentar su valor en una
unidad; el prescaler puede tomar el valor de 1, 8, 64, 256 o 1024; estos valores
se eligen programando los bits 0, 1 y 2 del registro TCCR0B , los bits 7 a 3 en
este caso se pondrán a 0.

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 timer0 AVR,
observar que cuando estos bits son todos iguales a 0 el timer0 A VR está
deshabilitado.

Si el prescaler elegido es por ejemplo de 8 y la FCPU=1Mhz, entonces la


frecuencia de trabajo del timer0 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 timer0 AVR aumentará en una
unidad cada 8us y en este caso entonces el registro TCNT0 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 TCNT0 del timer0 AVR, y por lo

6
tanto realizar temporizaciones mas largas mientras el timer0 AVR incrementa
sus valores.
De acuerdo a los tiempos que se quieran obtener al utilizar el timer0 AVR, habrá
que utilizar el prescaler adecuado así como inicializar el registro TCNT0 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 TCNT0 para obtener
el tiempo buscado.
TCNT0=2 8 -T r e t a r d o *(FCPU/prescaler)
Donde TCNT0 es el valor inicial a cargar en este registro para obtener el tiempo
buscado, 2 8 porque el timer0 es de 8 bits, T r e t a r d o es el tiempo que se quiere obtener
con el timer0 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 50ms, en este caso 50ms 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 256 se tendría:
TCNT0=256-(50ms)(1Mhz)/256
TCNT0=60,6875
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 60, al hacer esto la
temporización no será exactamente 50ms pero si un valor bastante próximo y
aceptable.
60 sería el valor inicial a cargar en el registro TCNT0 para obtener una
temporización de 50ms con el timer0 AVR, esto quiere decir que si se inicia el
timer0 AVR con 60 y un prescaler de 256, cuando aumente su valor de 60 a 255
habrán transcurrido 50ms.
Este proceso será el que se seguirá cuando se utilice el timer0 AVR como
temporizador.
Ejemplo:
Se utilizará el timer0 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 50ms, este tiempo será obtenido mediante la temporización
con el timer0 AVR aprovechando lo calculado hace un momento, la frecuencia
de trabajo será de 1Mhz, el prescaler será de 256 y habrá que cargar el registro
TCNT0 con un valor inicial de 60.

7
El programa realizado en el atmel studio para el uso del temporizar contador
timer0 avr como temporizador es el siguiente:

Timer0 AVR en modo comparador modo CTC


Al utilizar el timer0 AVR en modo comparador ocurre que el
registro TCNT0 , 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 OCR0A (no en el registro OCR0B ), en el momento que se hacen iguales
los valores de los registros TCNT0 y OCR0A, el registro TCNT0 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 a lmacenado
en el registro OCR0A.
A esto se lo conoce como el modo de trabajo CTC , que quiere decir borrado del
timer por comparación.

8
Si se utiliza el modo CTC y se tiene almacenado un valor en el registro OCR0A,
eso quiere decir que por el pin 12 (pin OC0A) o el pin 11 (pin OC0B) , mas
adelante se verá como elegir el pin a utilizar en este caso para atmega88, cuando
el valor del registro TCNT0 se haga igual al valor almacenado en el
registro OCR0A 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, que para el atmega88
está en el puerto D.
En el modo de trabajo CTC del timer0 se utilizarán los registros TCCR0A
y TCCR0B
El registro TCCR0A con este registro se elige si el evento a ocurrir como
respuesta por comparación a la igualdad entre el registro TCNT0 y el registro
OCR0A, será por el pin OC0A u OC0B, en la siguiente imagen se tiene el registro
TCCR0A, en el se pueden ver los nombres dados a sus bits.

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

9
Si por ejemplo los bits 6 y 7 se ponen a 0 el pin 12(pin OC0A) 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 d el pin
OC0A alternará cada vez que la comparación ocurra, si el bit7 y el bt6 se ponen
a 1 ocurrirá que si el pin OC0A 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 OC0B, para elegir el tipo de evento que ocurrirá cuando se iguale
el registro TCNT0 con el registro OCR0A, en el caso de utilizar el pin OC0B
para las combinaciones de los bits 5 y 4 se tiene la siguiente tabla, si ambos bits
son 0 la opción OC0A del pin no está disponible trabajando el pin como una
entrada salida digital normal.

Si por ejemplo los bits 5 y 4 se ponen a 0 el pin 11(pin OC0B) no se verá afectado
por la comparación pudiendo utilizarse como una entrada salida digi tal, si por
ejemplo el el bit5 se pone a 0 y el bit4 a 1 entonces el estado del pin OC0B
alternará cada vez que la comparación ocurra, si el bit5 y el bt4 se ponen a 1
ocurrirá que si el pin OC0B 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 TCCR0B con este registro se elige el prescaler a utilizar, para
obtener en cuanto tiempo se quiere que el registro TCNT0 se iguale al registro
OCR0A, en la siguiente imagen se tiene el registro TCCR0B, en el se pueden ver
los nombres dados a sus bits.

10
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.

Timer0 AVR en modo comparador modo CTC el registro


OCR0A
En el registro OCR0A se cargará el valor hasta el cual se quiere que llegue el
registro TCNT0 en el modo CTC, por lo que hay que ver como se puede encontrar
el valor adecuado a cargar en el registro OCR0A, se ha visto que para utilizar el
timer0 AVR como temporizador hay que cargar el registro TCNT0 con un valor
obtenido de la siguiente ecuación:
TCNT0=2 8 -T r e t a r d o *(FCPU/prescaler)-1
Para el caso de utilizar el timer0 AVR en modo de comparación o CTC hay
que cargar en el registro OCR0A , la cantidad de veces que tiene que contar el
registro TCNT0, lo que viene a ser el máximo valor al que el registro TCNT0
puede llegar que es 255 menos lo que sería necesario cargar en el registro TCNT0
para obtener el tiempo buscado, entonces de la ecuación anterior se tendría que
cargar el registro OCR0A :
OCR0A = 2 8 -TCNT0-1 = T r e t a r d o *(FCPU/prescaler)
entonces:
OCR0A= T r e t a r d o *(FCPU/prescaler)

11
El registros OCR0A 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 o curra cada 50ms, utilizando un
prescaler de 256 será necesario cargar el registro OCR0A con el valor de
OCR0A=(50ms)(1Mhz)/256
De donde OCR0A=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 TCNT0 del timer0 AVR, si se carga el registro OCR0A con 195 y
se utiliza un prescaler de 256, entonces cuando aumente el valor del registro
TCNT0 de 0 a 195 habrán transcurrido 50ms.
195 sería el valor a cargar en el registro OCR0A para que cada 50ms el valor del
registro TCNT0 llegue a 195 y por comparación se produzca un evento en el pin
OC0A u OC0B, tras lo cual el registro TCNT0 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 timer0 avr en modo CTC, se
utilizará el pin 11 o pin OC0B del ATmega88 como el pin en el que ocurrirá un
evento, que será que cada vez que ocurra la la igualdad entre el registro TCNT0
y el registro OCR0A el estado de este pin OC0B cambie, este pin hay que
configurar como una salida digital mediante el DDRD correspondiente, se hará
que el pin OC0B cambie de estado cada 50ms, esto será observado mediante un
led conectado a este pin.
Será necesario entonces utilizando lo s cálculos anteriores cargar el
registro OCR0A=195 , del registro TCCR0A hay que poner a 1 su bit4 para
que el evento por cambio de estado sea por el pin OC0B, y también hay que
poner a 1 su bit1 para hacer trabajar el timer0 el modo CTC, sus demás bits se
ponen a 0.
TCCR0A=0b00010010;//cambio estado en el pin OC0B modo CTC
Del registro TCCR0B 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 OC0B cambie de
estado cada 50ms.
TCCR0B=00000100;//prescaler de 256

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

El programa realizado en el atmel studio para el uso del temporizador contador


timer0 AVR en modo CTC es el siguiente:

La siguiente es una imagen de la simulación hecha para el ejemplo del uso del
timer0 AVR en modo CTC, se puede ver que el cambio de estado del pin OC0B
es cada 50ms.

13
14

Das könnte Ihnen auch gefallen