2
Andrew82Из Вашегоисходника:
Код
void timer0_init()
{
SREG |= (1 << 7);
OCR0 = 1; // Таймер срабатывает каждые 1024 такта. Прерывание каждые
// 1024*16 тактов.
TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS02);
TIMSK |= (1 << OCIE0);
TIFR |=(1 << 1);
}
По порядку
"SREG |= (1 << 7);" - необходимости в такой конструкции нет, хотя и она вполне законна. Лучше было написать sei() или #asm("sei") или __asm__ __volatile__ ("sei" :: ), в зависимости от компилятора.
"OCR0 = 1; // Таймер срабатывает каждые 1024 такта. Прерывание каждые 1024*16 тактов." - Непонятно... (С)
"TIFR |=(1 << 1);" - Зачем это?
"TIMSK |= (1 << OCIE0);" - а вот тут похоже и зарыта собака. Вы включаете прерывание по сравнению, но обрабатываете похоже прерывание по переполнению. Вот это у вас далее по тексту:
Код
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
Пожалуйста, указывайте явно, какой используете контроллер и компилятор.