Hola, estoy tratando de hacer un parpadeo del led usando interrupciones en un temporizador de 16 bits. Mi modelo de atmega es Atmega168A. La velocidad de reloj del chip es 12Mhz.
Aquí está mi código:
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(TIMER1_COMPA_vect)
{
PORTC ^= (1 << PC5);
}
int main()
{
DDRC |= (1 << PC5);
PORTC |= (1 << PC5); //led on
sei();
TIMSK1 |= (1 << OCIE1A); // cmp interruupt enable
TCCR1B |= (1 << CS12) | (1 << CS10); //prescalser 64
OCR1A = 11718; // value to compare
TCCR1A |= (1 << WGM12); // set ctc mode
while(1)
{
}
return 0;
}
Cuando se enciende el led de inicio del programa. Después de comparar el partido debe apagarse. Y funciona, pero con un problema extraño.
Si cambio OCR1A, solo cambia el primer periodo de tiempo antes de que se encienda y apague el led.
Cuando configuro OCR1A, por ejemplo, 0x100, el led se apaga muy rápidamente.
Cuando configuro OCR1A, por ejemplo, 0xfffa, el led se apaga lentamente.
Pero solo cambia el primer estado.
Otros parpadeos de led no controlan los cambios de OCR1A.
¿Qué pasa?
¿Necesito restablecer algunas banderas o algo así?