Timers Avr Atmega8
Los Timers son son módulos módulos que trabajan trabajan en paralelo con el el procesador, procesador, permitiendo permitiendo que las operaciones de temporización temporización y conteo se puedan puedan llevar a cabo de manera eficiente, mientras el procesador procesador se ocupa deotras deotras tareas. Normalmente Normalmente los megaAVR cuentan con tres Timers, Timers, llamados: TIMER0, TIMER1 Y TIMER2 EL TIMER0 Los registros de de E/S del del Timer0 son: TCNT0.. TCNT0 TCCR0A,, TCCR0A TCCR0B,, TCCR0B OCR0A,, OCR0A OCR0B,, OCR0B TIMSK0 yTIFR0 Aparte de ellos, ellos, tenemos al registro registroGTCCR GTCCR,, el cual cual es de de uso común común para todos los Timer MODOS DE OPERACIÓN DEL TIMER0 Y TIMER2 En general existen 3 modos en que pueden trabajar los Timers:• Modo Modo Norma Normall Modo Modo CTC CTC Modo odo 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 registroTCNT0.Como es un registro de 8 bits, decimos que el Timer0 es de 8 bits. ElTimer0 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 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 solo en modo ascendente ascendente y llega a su valor máximo 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 Timer0activa el bit de flagTOV0. 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 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 programación, 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 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 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 más 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 fácilmente examinando sus correspondientes registros de control. Es en esta sección donde nosocuparemos 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 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á 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
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 delos pines T0 o T1, respectivamente.El bit PSRSYNC se encuentra en el registro GTCCR
Modos de Operación 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 práctica es raro utilizar otras formas de onda que no sean de tipo PWM, así que el nombre no parece muy apropiado.
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 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 cíclicamente 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, según lo estudiado en El Reloj del Timer0 y del Timer2 Recordemos que los comparadores del Timer0 pueden sacar por los pinesOC0A 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 detemporización, que es normalmente el propósito del modo Normal o CTC,debemosescoger 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
Cálculo de la Temporización 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 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
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 instrucción básica. 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 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 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 registroTCNT0. Nota: los factores de prescaler N del Timer2 son 1, 8, 32, 64, 128, 256 y 1024. Esopodría dar otras soluciones para N yTCNT2.
Lo más probable es que el valor obtenido con esta fórmula no esté disponiblecomo 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 deTCNT0 para generar una temporización de 5 ms si el megaAVR trabaja con un XTAL de 10MHz
¿Cuáles son la razón de prescaler y el valor inicial deTCNT0paraconseguir una temporización de 200 µs si nuestro megaAVR tiene un XTAL de 4 MHz? Otro
ejemplo.