Recientemente planifiqué usar el temporizador / contador AVR para mis proyectos. He estudiado una serie de documentos sobre cómo configurarlo. Utilizo ATTiny2313A para probarlo y aprender sobre sus características. Encontré un problema al intentar cambiar un pin por cada pocos segundos.
Según la hoja de datos, el TIFR
tiene la siguiente disposición de bits:
Como ves, el primer bit se asigna a TOV0
. Cuando se produce un desbordamiento de contador, este bit se establece en 1. Usé este hecho y desarrollé un código como el siguiente:
#include <avr/io.h>
int main(void)
{
uint16_t count=0, M=500;
uint8_t n=0x02;
DDRB=0xff;
TCNT0=0x00;
TCCR0B=(1<<CS00) | (1<<CS02); //use prescaler 1024
while (1)
{
while ((TIFR & n) == 0); // control passes this loop after TIFR sets to n,
// which is when counter overflows
TCNT0 = 0x00;
TIFR=n; // clear TIFR
count++;
if (count>=M)
{
PORTB ^= (1 << PB0);
count=0;
}
return (0);
}
El código funciona como se esperaba. Espero que cuando se produzca un desbordamiento, TIFR
cambie a 0x02
cuando TOV0
se establezca en uno. Pero ese no parece ser el único escenario. Si cambio la variable n
a algo como n=0x04
y compilo el programa, veo el mismo comportamiento, lo que significa que el LED conectado a PB0
aún alterna con la misma frecuencia que lo hacía anteriormente. El segundo bit en TIFR
corresponde a OCF0B
. Entonces, si el código quiere trabajar como antes, este bit debe cambiar a 1 cuando se produce un desbordamiento. Pero lo hace? No creo que el indicador de comparación de salida esté habilitado, por lo que OCF0B
no puede cambiar.