You are on page 1of 21

TIMERS AVR atmega8

sesion4

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 de otras 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 y TIFR0 Aparte de ellos, tenemos al registro GTCCR, 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 registro TCNT0. Como es un registro de 8 bits, decimos que el Timer0 es de 8 bits. El Timer0 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 al avance de su contador, el registro TCNT0

Con sus 8 bits, el Timer0 puede contar en todo su rango, o sea, entre 0 y 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 Timer0 activa el bit de flag TOV0. 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 registro TCNT0 con los registros OCR0A 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 entre TCNT0 y OCR0A activa el bit de flag OCF0A y la coincidencia entre TCNT0 y OCR0B activa el bit de flag OCF0B.

Desde el punto de vista de la programacin, podemos controlar el Timer0 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, WGM01 y 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 sea modo Normal, CTC o PWM.

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 salen o no por los pines OC0A y OC0B del AVR. El tipo de onda ms popular es PWM y es habitualmente el nico caso en que se dejan salir las ondas. Cuando el Timer0 va 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 nos ocuparemos 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).
Registro TCCR0B TCCR0B FOC0A FOC0B ----WGM02

CS02

CS01

CS00

TCCR2B FOC2A FOC2B

Registro TCCR2B --- --WGM22 CS22

CS21

CS20

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 de los pines T0 o T1, respectivamente. El bit PSRSYNC se encuentra en el registro GTCCR

TCCR0B FOC0A FOC0B ---

Registro TCCR0B --WGM02 CS02

CS01

CS00

CS02 CS01 CS00 0 0 0 0 0 1

Fuente de reloj del Timer0 Sin fuente de reloj (Timer0 detenido) F_CPU (Sin prescaler)

0 0 1 1
1 1

1 1 0 0
1 1

0 1 0 1
0 1

F_CPU/8 (con prescaler) F_CPU/64 (con prescaler) F_CPU/256 (con prescaler) F_CPU/1024 (con prescaler)
Reloj externo en pin T0. El Timer0 avanza con el flanco de bajada. Reloj externo en pin T0. El Timer0 avanza con el flanco de subida.

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.


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.

TCCR0B FOC0A FOC0B ---

Registro TCCR0B --WGM02 CS02

CS01

CS00

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 pines OC0A 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 los Timers.
Modo de Operacin WGM02 WGM01 WGM00 de Timer0 0 0 0 Normal 0 0 1 PWM de Fase Correcta 0 1 0 CTC 0 1 1 Fast PWM 1 0 0 Reservado 1 0 1 PWM de Fase Correcta 1 1 0 Reservado 1 1 1 Fast PWM Inicio del Conteo 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 Tope del Conteo 0xFF 0xFF OCR0A 0xFF --OCR0A --OCR0A

En modo Normal el Timer0, habilitado, avanza libre y cclicamente en todo su rango, es decir, su registro TCNT0 cuenta desde 0x00 hasta 0xFF, luego se desborda para volver a iniciar desde 0x00

El desbordamiento del Timer activa el flag TOV0 del registro TIFR0 el cual puede programarse para disparar interrupciones. Como el registro TCNT0 es de lectura y escritura podemos en cualquier momento modificar su valor y as recortar los periodos de conteo para calibrar o ajustar las temporizaciones
Registro TCCR0A TCCR0A COM0A1 COM0A0 COM0B1 COM0B0 --- --- WGM01 WGM00

Registro TCCR0B TCCR0B FOC0A FOC0B --- --- WGM02

CS02 CS01 CS00

TIFR0 ---

---

---

---

Registro TIFR0 --OCF0B OCF0A TOV0

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 pines OC0A 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 de temporizacin, que es normalmente el propsito del modo Normal o CTC, debemos escoger 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

COM0A1 0 0 1 1 0 1 0 1

COM0A0

Descripcin Pin OC0A desconectado. Operacin normal del pin Pin OC0A conmuta en Coincidencia entre TCNT0 y OCR0A Pin OC0A se limpia en Coincidencia entre TCNT0 y OCR0A Pin OC0A se setea en Coincidencia entre TCNT0 y OCR0A

Clculo de la Temporizacin en Modo Normal Temporizar con el Timer0 implica cargar su registro TCNT0 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.
CS02
0 0 0 0 0 1

CS01
0 1 0

CS00
F_CPU (Sin prescaler) F_CPU/8 (con prescaler)

Fuente de reloj del Timer0


Sin fuente de reloj (Timer0 detenido)

0
1 1 1

1
0 0 1

1
0 1 0

F_CPU/64 (con prescaler)


F_CPU/256 (con prescaler) F_CPU/1024 (con prescaler) Reloj externo en pin T0. El Timer0 avanza con el flanco de bajada.

Reloj externo en pin T0. El Timer0 avanza con el flanco de subida.

Donde:

Por ejemplo, si tenemos un XTAL de 8 MHz y no usamos prescaler, entonces el reloj del Timer0 ser de 8 MHz y el registro TCNT0 se 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, TCNT0 avanzar 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.

El Tiempo que pasar el Timer0 contando desde un valor inicial TCNT0 hasta 255 y se produzca el desbordamiento est dado por la frmula:

Tiempo F_CPU N TCNT0

= Valor de la temporizacin. = Frecuencia del XTAL del megaAVR. = Factor de prescaler (1, 8, 64, 256 1024). = Valor de inicio del registro TCNT0.

Nota: los factores de prescaler N del Timer2 son 1, 8, 32, 64, 128, 256 y 1024. Eso podra dar otras soluciones para N y TCNT2.

Lo ms probable es que el valor obtenido con esta frmula no est disponible como 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 (redondear para arriba). La otra frmula es:

A modo de ejemplo, hallemos el factor de prescaler N y el valor de inicio de TCNT0 para generar una temporizacin de 5 ms si el megaAVR trabaja con un XTAL de 10 MHz.

el valor de inicio del registro TCNT0 ser:

La secuencia de conteo resultara as:

Otro ejemplo. Cules son la razn de prescaler y el valor inicial de TCNT0 para conseguir una temporizacin de 200 s si nuestro megaAVR tiene un XTAL de 4 MHz?

You might also like