Actualmente estoy usando un ATmega32 para mantener el tiempo, así que leí cuidadosamente la hoja de datos y configuré el temporizador 1 para generar una interrupción cada segundo.
De acuerdo con la siguiente fórmula en la hoja de datos, utilizando un reloj de 16 MHz, un preescalador de 256 y OCR1A = 31249, debería obtener una frecuencia de 1 Hz en modo CTC:
\ $ f_ {OCnA} = \ frac {f_ {clk \ _I / O}} {2 \: \ cdot \: N \ cdot \: (1 \: + \: OCRnA)} \ $
Esta fórmula está disponible en la página 99 de la Hoja de datos de ATmega32 .
He configurado el temporizador 1 de la siguiente manera:
TCCR1A = 0;
TCCR1B = (1<<WGM12)|(1<<CS12);
OCR1A = 31249;
TIMSK = (1<<OCIE1A);
Aquí está el código de interrupción
ISR(TIMER1_COMPA_vect){
sec++;
}
Luego, uso un LCD para imprimir continuamente el valor de sec , y obtengo un tiempo de 0.5 segundos. En otras palabras, por cada segundo que pasa, el temporizador genera dos interrupciones.
Al principio pensé que tal vez tenía mal los fusibles, pero no parece ser el caso, ya que los retrasos funcionan bien. De todos modos, así es como configuré los fusibles:
-U lfuse:w:0xff:m -U hfuse:w:0x99:m
No tengo la menor idea de lo que está sucediendo, he revisado todo nuevamente, probé otro ATmega32, probé otro oscilador de cristal de 16 MHz y todavía obtengo el mismo resultado.
¿Está mal la hoja de datos o me falta algo aquí?