Sie sind auf Seite 1von 13

http://microcontroladores-mrelberni.

com/timer0-avr/

EL TIMER0 AVR ATMEGA88

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 seal,
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 seal, el flanco a utilizar se elige por programa,
por ejemplo su se elige el flanco de subida quiere decir que cada vez que la
seal 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 seal 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 automticamente a 0, este registro
ser til cuando se utilice el timer0 AVR en modo comparacin y para la
modulacin de ancho de pulso PWM.

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 1
http://microcontroladores-mrelberni.com/timer0-avr/

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

Segn 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 dems bits se pondrn a 0, se tienen dos posibilidades, para que el
conteo se realice cuando la seal que llega al pin T0 pase de 0 a 1 o por flanco
de subida estos 3 bits se pondrn a 1 esto es CS00=1, CS01=1 y CS02=1; y si
el conteo ser cuando la seal que llega al pin T0 pase de 1 a 0 o por flanco de
bajada solo se pondrn a 1 los bits 1 y 2, mientras el bit0 se deja a 0 esto
es CS00=0, CS01=1 y CS02=1.

Al elegir alguna de las 2 posibilidades, cada vez que la seal digital que llegue
al pin T0 pase de un alto a un bajo o de un bajo a un alto, segn se haya
elegido, el valor del contador, esto es el valor del registro TCNT0, aumentar
en una unidad hasta un mximo 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 seal 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 sern vistos en el

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 2
http://microcontroladores-mrelberni.com/timer0-avr/
puerto B por medio leds, estos valores sern 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:

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 entre 0 y 255, por ejemplo si el

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 3
http://microcontroladores-mrelberni.com/timer0-avr/
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 habrn 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 este registro es de 8 bits
este aumentar desde 0, o desde algn valor que se le ponga como valor inicial
al registro TCNT0, hasta un mximo de 255, por ejemplo si va desde 0 hasta
255 habrn 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 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 automticamente a 0, este registro
ser til cuando se utilice el timer0 AVR en modo comparacin y para la
modulacin de ancho de pulso PWM.

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 pondrn 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 AVR est
deshabilitado.

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 4
http://microcontroladores-mrelberni.com/timer0-avr/

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 dems 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
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
tambin 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 ecuacin que ayudar a
encontrar el valor inicial adecuado a cargar en el registro TCNT0 para obtener
el tiempo buscado.
TCNT0=28-Tretardo*(FCPU/prescaler)
Donde TCNT0 es el valor inicial a cargar en este registro para obtener el
tiempo buscado, 28 porque el timer0 es de 8 bits, Tretardo 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
segn la tabla anterior.
Por ejemplo si se quiere temporizar 50ms, en este caso 50ms sera 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 ecuacin
anterior y ver si el nmero obtenido esta entre 0 y 255, de ser as la eleccin
del prescaler es correcta, de lo contrario habr que utilizar otro, por ejemplo si
se elige un prescaler de 256 se tendra:
TCNT0=256-(50ms)(1Mhz)/256
TCNT0=60,6875
El valor obtenido est entre 0 y 255 aunque no es un nmero entero, por lo que
hay que redondearlo a un entero cercano en este caso 60, al hacer esto la

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 5
http://microcontroladores-mrelberni.com/timer0-avr/
temporizacin no ser exactamente 50ms pero si un valor bastante prximo y
aceptable.
60 sera el valor inicial a cargar en el registro TCNT0 para obtener una
temporizacin 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 habrn 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 temporizacin
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.

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


timer0 avr como temporizador es el siguiente:

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 6
http://microcontroladores-mrelberni.com/timer0-avr/

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
automticamente a cero o tambin se dice se borra, para nuevamente

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 7
http://microcontroladores-mrelberni.com/timer0-avr/
comenzar a aumentar su valor desde 0 hasta que se vuelva hacer igual al valor
almacenado en el registro OCR0A.
A esto se lo conoce como el modo de trabajo CTC, que quiere decir borrado del
timer por comparacin.
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 algn 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 utilizarn los registros TCCR0A y
TCCR0B

El registro TCCR0A con este registro se elige si el evento a ocurrir como


respuesta por comparacin 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 comparacin
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 opcin OC0A del pin no est disponible trabajando el pin como una entrada
salida digital normal.

Si por ejemplo los bits 6 y 7 se ponen a 0 el pin 12(pin OC0A) no se ver


afectado por la comparacin 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 OC0A alternar cada vez que la comparacin 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 comparacin
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

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 8
http://microcontroladores-mrelberni.com/timer0-avr/
0 la opcin 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 comparacin 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 OC0B alternar cada vez que la comparacin 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 comparacin 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.

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 comparacin 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, segn la siguiente tabla.

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 9
http://microcontroladores-mrelberni.com/timer0-avr/

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 ecuacin:
TCNT0=28-Tretardo*(FCPU/prescaler)-1
Para el caso de utilizar el timer0 AVR en modo de comparacin 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 mximo valor al que el registro TCNT0
puede llegar que es 255 menos lo que sera necesario cargar en el registro
TCNT0 para obtener el tiempo buscado, entonces de la ecuacin anterior se
tendra que cargar el registro OCR0A:
OCR0A = 28-TCNT0-1 = Tretardo*(FCPU/prescaler)
entonces:
OCR0A= Tretardo*(FCPU/prescaler)
El registros OCR0A es de 8 bits por lo que el valor obtenido mediante la
ecuacin anterior tendr que ser un nmero entero comprendido entre 0 y 255,
de no ser as el valor no ser vlido.
Por ejemplo, para lograr que la comparacin ocurra 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 nmero entero, por lo que
hay que redondearlo al entero mas cercano en este caso 195, al hacer esto la
comparacin no ocurrir exactamente a los 50ms pero si en un momento
bastante prximo 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 habrn transcurrido 50ms.

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 10
http://microcontroladores-mrelberni.com/timer0-avr/
195 sera el valor a cargar en el registro OCR0A para que cada 50ms el valor
del registro TCNT0 llegue a 195 y por comparacin se produzca un evento en el
pin OC0A u OC0B, tras lo cual el registro TCNT0 se pondr automticamente 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 los clculos 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 tambin hay que poner
a 1 su bit1 para hacer trabajar el timer0 el modo CTC, sus dems 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 dems 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
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:

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 11
http://microcontroladores-mrelberni.com/timer0-avr/

La siguiente es una imagen de la simulacin 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.

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 12
http://microcontroladores-mrelberni.com/timer0-avr/

http://microcontroladores-mrelberni.com/timer0-avr/ pgina 13

Das könnte Ihnen auch gefallen