Está en la página 1de 7

Timers Avr Atmega8

Los Timers son mdulos que trabajan en paralelo con el procesador, permitiendo que
las operaciones de temporizacin y conteo se puedan llevar a cabo de manera
eficiente, mientras el procesador se ocupa deotras tareas. Normalmente los megaAVR
cuentan con tres Timers, llamados:
TIMER0, TIMER1 Y TIMER2
EL TIMER0
Los registros de E/S del Timer0 son:
TCNT0.
TCCR0A,
TCCR0B,
OCR0A,
OCR0B,
TIMSK0
yTIFR0
Aparte de ellos, tenemos al registroGTCCR, el cual es de uso comn para todos los
Timer
MODOS DE OPERACIN DEL TIMER0 Y TIMER2
En general existen 3 modos en que pueden trabajar los Timers:
Modo Normal
Modo CTC
Modo PWM
Cada modo tendr sus variantes dependiendo del Timer.
DIAGRAMA DE BLOQUES DEL TIMER0

El elemento central del Timer0 es su contador, que es el mismo registroTCNT0.Como


es un registro de 8 bits, decimos que el Timer0 es de 8 bits. ElTimer0 puede avanzar
hacia adelante o hacia atrs, segn se programe,impulsado por la seal de su reloj, el
cual puede ser interno o externo.Cuando nos referirnos al avance del Timer en
realidad nos referimos alavance de su contador, el registroTCNT0
Con sus 8 bits, el Timer0 puede contar en todo su rango, o sea, entre 0y 255. Cuando
el Timer0 opera solo en modo ascendente y llega a su valor mximo de 255,
continuar despus contando desde 0 otra vez,cclicamente. Esta transicin de 255 a

0 es el famoso Desbordamiento y es un concepto clave en los Timers. El


desbordamiento del Timer0activa el bit de flagTOV0. Tambin es posible hacer que el
Timer0 cuente solo hasta un tope establecido por el registro OCR0A
El Timer0 tiene dos comparadores que en todo momento estn comparando el valor
del registroTCNT0 con los registrosOCR0A y OCR0B. Cada igualdad detectada entre
los registros indicados se conoce como Coincidencia y es el segundo concepto clave
de los Timers del AVR. La coincidencia entreTCNT0 y OCR0A activa el bit de flag
OCF0A y la coincidencia entreTCNT0 y OCR0B activa el bit de flag OCF0B
Desde el punto de vista de la programacin, podemos controlar elTimer0 con tres tipos
de bits:
Los bits CS(de Clock Select). Los bits CS02, CS01 y CS00 se encargan de configurar
todo lo relacionado con el reloj y el prescaler del Timer
Los bits WGM(de Waveform Generator Mode). Los bits WGM02, WGM01y WGM00
trabajan con los comparadores para producir ondas cuadradas de acuerdo con la
configuracin de los bits. En realidad, su funcin implica ms que eso, pues
establecen el modo en que operar el Timer0, ya seamodo Normal,CTCoPWM
Los bits COM(de Compare Output Mode). Son los bits COM0A1 y COM0A0 los que en
ltima instancia deciden si las ondas generadas por los comparadores saleno no por
los pines OC0A y OC0B del AVR. El tipo de onda ms popular es PWM yes
habitualmente el nico caso en que se dejan salir las ondas. Cuando el Timer0va a
trabajar como simple contador o temporizador, los bits COM quedan con su valor por
defecto de 0, con lo cual los pines OC0A y OC0B quedan desconectados del Timer y
se pueden seguir usando como puertos de E/S generales
El Reloj del Timer0 y del Timer2
La similitud entre el Timer0 y el Timer2 se comprueba fcilmente examinando sus
correspondientes registros de control. Es en esta seccin donde nosocuparemos de
las pocas diferencias entre ellos.
El reloj del Timer0 es la seal digital, peridica o no, cuyos pulsos hacen avanzar el
Timer. La fuente de reloj del Timer0 puede ser interna o externa
Reloj Interno.
Aqu el reloj del Timer0 deriva del mismo oscilador interno del sistema F_CPU. Como
se ve en la figura, en este caso la seal pasa previamente por el prescaler, que puede
dividir la frecuencia de F_CPU por un valor seleccionado por nosotros. Los prescalers
del Timer0 y del Timer2 no son idnticos, aunque tengan los bits de control similares.
Pero siendo este reloj el que se usa con regularidad, ya sea para las temporizaciones
o para generar ondas PWM, sobrar espacio para familiarizarnos con estas ligeras
diferencias.
Reloj externo:
En el Timer0 la seal externa se conecta al pin T0 del megaAVR. Con esto el
programador decide si el Timer0 avanzar con cada flanco de subida o de bajada
detectado en dicho pin. Notemos en el diagrama que la seal externa no pasar por su
prescaler
El modo donde el Timer0/2 trabaja con un reloj externo aplicado al pin T0(para el
Timer0) o TOSC1 (para el Timer2) se conoce como modo Contador porque de

alguna forma el Timer contar los pulsos detectados en dicho pin. Sin embargo, el
hecho de que el reloj provenga de una fuente externa no le quita sus otras
funcionalidades, como por ejemplo, poder generar ondas PWM, interrupciones, etc.,
claro que sera conveniente que para tal caso la seal fuera peridica
Contador del Timer2 con su fuente de reloj.

El Prescaler del Timer0 y del Timer2


El prescaler es un circuito contador por el que se puede hacer pasar el reloj del Timer
para dividir su frecuencia. De ese modo el Timer avanzar ms lento, segn las
necesidades del diseador. El prescaler es parte del reloj del Timer, as que para
configurarlo se usan los bits de Seleccin de Reloj o bits CS (por Clock Select

El prescaler del Timer0


Es compartido con el Timer1 (y qu tiene que ver en todo esto el Timer1?).
De acuerdo con la figura, es posible que los dos Timers operen simultneamente con
el prescaler y utilizando diferentes factores de divisin puesto que cada Timer tiene
sus propios bits CS (de Clock Select).El nico reparo sera que se debe tener cuidado
al resetear el prescaler porque para esto se dispone de una nica seal PSRSYNC.Es
un reset SYNCrono porque el Timers0 y el Timer1 trabajan siempre sincronizados con
el reloj del sistema F_CPU, hasta cuando su reloj proviene delos pines T0 o T1,
respectivamente.El bit PSRSYNC se encuentra en el registro GTCCR

Modos de Operacin del Timer0 y Timer2


En general existen 3 modos en que pueden trabajar los Timers:
ModoNormal
ModoCTC
ModoPWM
Cada modo tendr sus variantes dependiendo del Timer.

Diagrama de bloques del Timer0.


La figura nos resalta que esta vez vamos a trabajar con los bits WGM. Su nombre
viene de Waveform Generation Mode porque estos bits pre-establecen el tipo de onda
que podr generar el Timer0 por los pines OC0A y OC0B. En la prctica es raro utilizar
otras formas de onda que no sean de tipo PWM, as que el nombre no parece muy
apropiado.

En la figura tambin se aprecia que los GENERADORES DE ONDA tambin


dependen de los bits COM (de Compare Output Mode). Estos bits establecen el modo
en que finalmente saldrn las ondas por los pinesOC0A y OC0B, es decir, pueden salir
normales, invertidas, o pueden simplemente no salir y dejar los pines OC0x libres para

otras tareas. A lo que quiero llegar es que al menos en cursomicros los bits COM solo
se usan en modo PWM. En los modos Normal y CTC nos olvidamos de ellos.
EL TIMER0 Y EL TIMER2 EN MODO NORMAL
Este modo queda seleccionado cuando todos los bits WGM valen 0, es decir, es el
modo por defecto del Timer0. De hecho, lo es en todos losTimers

En modo Normal el Timer0, habilitado, avanza libre y cclicamente en todo su rango,


es decir, su registroTCNT0cuenta desde 0x00hasta 0xFF, luego se desborda para
volver a iniciar desde 0x00
El desbordamiento del Timer activa el flag TOV0 del registroTIFR0 el cual puede
programarse para disparar interrupciones. Como el registroTCNT0es de lectura y
escritura podemos en cualquier momento modificar su valor y as recortar los periodos
de conteo para calibrar o ajustar las temporizaciones

El Timer0 siempre inicia detenido, as que para que se cumpla todo lo descrito primero
habr echarlo a andar configurando los bits de reloj CS, segn lo estudiado en El Reloj
del Timer0 y del Timer2
Recordemos que los comparadores del Timer0 pueden sacar por los pinesOC0A y
OC0B unas seales que se pueden configurar con los bits COM.En los modos Normal
o CTC esta seal se forma poniendo a cero, a uno, o conmutando el valor de
OC0A/OC0B.Todas las opciones posibles se muestran en la siguiente tabla. Para
temas detemporizacin, que es normalmente el propsito del modo Normal o
CTC,debemosescoger la primera opcin, que es la predeterminada y que nos dejar
los pines OC0A/OC0B libres para seguir usndolos como puertos de E/S generales

Clculo de la Temporizacin en Modo Normal


Temporizar con el Timer0 implica cargar su registroTCNT0 con un valor adecuado y
dejar que siga contando hasta que se desborde. Es el tiempo que demora en
desbordarse lo que nos interesa conocer para aplicarlo a nuestras necesidades; y son
el clculo y la programacin de ese tiempo el objetivo de esta seccin.
Para empezar, debemos usar el reloj interno derivado de F_CPU (cuyo valor es
tericamente igual a la frecuencia del XTAL del megaAVR.), salvo que tengamos una
seal externa peridica. Como sabemos, si la fuente de reloj es interna, el Timer0 y el
Timer2 se programan igual. Lo nico que cambiar sern los factores de prescaler

Por ejemplo,
si tenemos un XTAL de 8 MHz y no usamos prescaler, entonces el reloj del Timer0
ser de 8 MHz y el registroTCNT0se incrementar cada 1/8MHz= 128ns, lo mismo que
un ciclo de instruccin bsica. Pero si usamos el factor de prescaler 8,TCNT0
avanzar cada 1us.Si usamos el factor de prescaler de 256,TCNT0avanzar cada
32us. Y si cambiamos de XTAL, los tiempos sern otros
Ahora entonces, suponiendo que seguimos con nuestro XTAL de 8MHz, el registro
TCNT0 avanzar desde 0 hasta 255 en 32us (sin prescaler). Pero si cargamos TCNT0
con 200, llegar al desbordamiento despus de 7us; y si usamos prescaler de 8, lo
har despus de 78 = 56us
Tiempo que pasar el Timer0 contando desde un valor inicial TCNT0 hasta 255 y se
produzca el desbordamiento est dado por la frmula

Tiempo = Valor de la temporizacin.


F_CPU = Frecuencia del XTAL del megaAVR.
N = Factor de prescaler (1, 8, 64, 256 1024).
TCNT0 = Valor de inicio del registroTCNT0.
Nota: los factores de prescaler N del Timer2 son 1, 8, 32, 64, 128, 256 y 1024.
Esopodra dar otras soluciones para N yTCNT2.

Lo ms probable es que el valor obtenido con esta frmula no est disponiblecomo


factor de prescaler vlido (1, 8, 64, 256 1024 para el Timer0 o 1, 8, 32,64, 128, 256 y
1024 para el Timer2). En tal caso deberemos tomar el factor superior ms
cercano(redondearpara arriba). La otra frmula es:

A modo de ejemplo, hallemos el factor de prescaler N y el valor de inicio deTCNT0


para generar una temporizacin de 5 ms si el megaAVR trabaja con un XTAL de
10MHz

Otro ejemplo. Cules son la razn de prescaler y el valor inicial


deTCNT0paraconseguir una temporizacin de 200 s si nuestro megaAVR tiene un
XTAL de 4 MHz?

También podría gustarte