Timers Avr Atmega8

21
TIMERS AVR atmega8 sesion4

Transcript of Timers Avr Atmega8

TIMERS AVR atmega8

sesion4

Los Timers son módulos que trabajan en paralelo con el procesador, permitiendo que las operaciones de temporización 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 TIMER0los registros de E/S del Timer0 son:TCNT0. TCCR0A, TCCR0B, OCR0A, OCR0B, TIMSK0 y TIFR0Aparte de ellos, tenemos al registro GTCCR, el cual es de uso común para todos los Timer

MODOS DE OPERACIÓN DEL TIMER0 Y TIMER2En general existen 3 modos en que pueden trabajar los Timers:•Modo Normal•Modo CTC•Modo PWMCada 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 atrás, según se programe, impulsado por la señal 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 máximo de 255, continuará después contando desde 0 otra vez, cíclicamente. Esta transición 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. También 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 están 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 programación, 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 configuración de los bits. En realidad, su función implica más 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 más 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 Timer2La similitud entre el Timer0 y el Timer2 se comprueba fácilmente examinando sus correspondientes registros de control. Es en esta sección donde nos ocuparemos de las pocas diferencias entre ellos.

El reloj del Timer0 es la señal digital, periódica 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 señal 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 idénticos, 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 señal 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 señal 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 sería conveniente que para tal caso la señal fuera periódica.

Contador del Timer2 con su fuente de reloj.

El Prescaler del Timer0 y del Timer2El 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á más lento, según las necesidades del diseñador.El prescaler es parte del reloj del Timer, así que para configurarlo se usan los bits de Selección de Reloj o bits CS (por Clock Select).

Registro TCCR0B

TCCR0B FOC0A FOC0B --- --- WGM02 CS02 CS01 CS00

Registro TCCR2B

TCCR2B FOC2A FOC2B --- --- 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 simultáneamente con el prescaler y utilizando diferentes factores de división puesto que cada Timer tiene sus propios bits CS (de Clock Select). El único reparo sería que se debe tener cuidado al resetear el prescaler porque para esto se dispone de una única señal 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

Registro TCCR0BTCCR0BFOC0A FOC0B --- --- WGM02 CS02 CS01 CS00

CS02 CS01 CS00 Fuente de reloj del Timer0

0 0 0 Sin fuente de reloj (Timer0 detenido)

0 0 1 F_CPU (Sin prescaler)

0 1 0 F_CPU/8 (con prescaler)

0 1 1 F_CPU/64 (con prescaler)

1 0 0 F_CPU/256 (con prescaler)

1 0 1 F_CPU/1024 (con prescaler)

1 1 0Reloj externo en pin T0. El Timer0 avanza con el flanco de bajada.

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

Modos de Operación del Timer0 y Timer2En general existen 3 modos en que pueden trabajar los Timers:•Modo Normal•Modo CTC•Modo PWMCada 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 práctica es raro utilizar otras formas de onda que no sean de tipo PWM, así que el nombre no parece muy apropiado.

Registro TCCR0B

TCCR0B FOC0A FOC0B --- --- WGM02 CS02 CS01 CS00

En la figura también se aprecia que los GENERADORES DE ONDA también dependen de los bits COM (de Compare Output Mode). Estos bits establecen el modo en que finalmente saldrán 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 NORMALEste 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.

WGM02 WGM01 WGM00Modo de Operación

de Timer0Inicio del Conteo

Tope del Conteo

0 0 0 Normal 0x00 0xFF

0 0 1 PWM de Fase Correcta 0x00 0xFF

0 1 0 CTC 0x00 OCR0A

0 1 1 Fast PWM 0x00 0xFF

1 0 0 Reservado 0x00 ---

1 0 1 PWM de Fase Correcta 0x00 OCR0A

1 1 0 Reservado 0x00 ---

1 1 1 Fast PWM 0x00 OCR0A

En modo Normal el Timer0, habilitado, avanza libre y cíclicamente 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 TIFR0

TIFR0 --- --- --- --- --- OCF0B OCF0A TOV0

Registro TCCR0B

TCCR0B FOC0A FOC0B --- --- WGM02 CS02 CS01 CS00

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, según 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 señales que se pueden configurar con los bits COM. En los modos Normal o CTC esta señal 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 temporización, que es normalmente el propósito del modo Normal o CTC, debemos escoger la primera opción, que es la predeterminada y que nos dejará los pines OC0A/OC0B libres para seguir usándolos como puertos de E/S generales

COM0A1 COM0A0 Descripción

0 0 Pin OC0A desconectado. Operación normal del pin

0 1 Pin OC0A conmuta en Coincidencia entre TCNT0 y OCR0A

1 0 Pin OC0A se limpia en Coincidencia entre TCNT0 y OCR0A

1 1 Pin OC0A se setea en Coincidencia entre TCNT0 y OCR0A

Cálculo de la Temporización en Modo NormalTemporizar 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 cálculo y la programación de ese tiempo el objetivo de esta sección.

Para empezar, debemos usar el reloj interno derivado de F_CPU (cuyo valor es teóricamente igual a la frecuencia del XTAL del megaAVR.), salvo que tengamos una señal externa periódica. Como sabemos, si la fuente de reloj es interna, el Timer0 y el Timer2 se programan igual. Lo único que cambiará serán los factores de prescaler.

CS02 CS01 CS00 Fuente de reloj del Timer0

0 0 0 Sin fuente de reloj (Timer0 detenido)

0 0 1 F_CPU (Sin prescaler)

0 1 0 F_CPU/8 (con prescaler)

0 1 1 F_CPU/64 (con prescaler)

1 0 0 F_CPU/256 (con prescaler)

1 0 1 F_CPU/1024 (con prescaler)

1 1 0 Reloj externo en pin T0. El Timer0 avanza con el flanco de bajada.

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

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 instrucción básica. 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 serán 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 después de 7us; y si usamos prescaler de 8, lo hará después de 7×8 = 56us.

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

Tiempo = Valor de la temporización.

F_CPU = Frecuencia del XTAL del megaAVR.

N = Factor de prescaler (1, 8, 64, 256 ó 1024).

TCNT0 = Valor de inicio del registro TCNT0.

Donde:

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

Lo más probable es que el valor obtenido con esta fórmula no esté disponible como factor de prescaler válido (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 más cercano (“redondear” para arriba). La otra fórmula es:

A modo de ejemplo, hallemos el factor de prescaler N y el valor de inicio de TCNT0 para generar una temporización 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 resultaría así:

Otro ejemplo. ¿Cuáles son la razón de prescaler y el valor inicial de TCNT0 para conseguir una temporización de 200 µs si nuestro megaAVR tiene un XTAL de 4 MHz?