Hola, estoy tratando de hacer que el LED parpadee usando interrupciones en el temporizador de 16 bits. Mi modelo atmega es Atmega168A. La frecuencia de reloj del chip es de 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 encienda el led de inicio del programa. Después de comparar el partido, debería apagarse. Y funciona, pero con un problema extraño.
Si cambio OCR1A, solo cambia el primer período de tiempo antes de que se encienda y se 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 sólo el primer cambio de estado.
Otro parpadeo del led no se hace cargo de los cambios de OCR1A.
¿Qué ocurre?
¿Necesito restablecer algunas banderas o algo así?
No configuró el modo CTC, WGM12 está en TCCR1B
brahans
bielu000