Приветствую всех. В очередной раз подниму тему с таймерами. Ибо либо лыжи не едут, либо я ни фига не понимаю.
TIMER0 код инициализации:
Код:
// Таймер 0
// TIMER 0 for interrupt frequency undefined Hz:
cli(); // stop interrupts
TCCR0A = 0; // set entire TCCR0A register to 0
TCCR0B = 0; // same for TCCR0B
TCNT0 = 0x83; // 0x83 to 16 mS B, 9C to 100 uS A
// set compare match register for undefined Hz increments
//OCR0A = 0x63; // to 100 uS A
OCR0B = 0x53; // 16 mS B
TCCR0A |= (1 << WGM01); // turn on CTC mode
TIMSK0 |= (1<<OCIE0B); // enable timer compare interrupt OCIE0B to 16 mS (1 << OCIE0A)|(1<<OCIE0B)
// Set CS02, CS01 and CS00 bits for 1 prescaler
TCCR0B |= (1 << CS02) | (0 << CS01) | (1 << CS00); // CS02|CS00 1024 /16mS/, CS01 8 /100 uS
Выбран режим CTC, прерывание по совпадению OCIE0B (канал В), начальное значение TCNTO= 0x83, счетчик OCR0B = 0x53.
Прерывания:
Код:
ISR(TIMER0_COMPA_vect)
{
flag_SEND_BIT = _ON;
// 100 uS
}
ISR(TIMER0_COMPB_vect)
{
flag_BUTTON = _ON;
TCNT0 = 0x83; // было ошибочно TCNT2, после исправления ничего не поменялось
}
Прерывание не генерится и в симуляторе не идет счет TCNT0. В симуляторе постоянно висит флаг OCF0A и TOV0

Если тот же таймер перестраиваю на прерывания по совпадению OCIE0A,
Код:
// Таймер 0
// TIMER 0 for interrupt frequency undefined Hz:
cli(); // stop interrupts
TCCR0A = 0; // set entire TCCR0A register to 0
TCCR0B = 0; // same for TCCR0B
TCNT0 = 0x83; // 0x83 to 16 mS B, 9C to 100 uS A
// set compare match register for undefined Hz increments
OCR0A = 0x63; // to 100 uS A
//OCR0B = 0x53; // 16 mS B
TCCR0A |= (1 << WGM01); // turn on CTC mode
TIMSK0 |= (1<<OCIE0A); // enable timer compare interrupt OCIE0B to 16 mS (1 << OCIE0A)|(1<<OCIE0B)
// Set CS02, CS01 and CS00 bits for 1 prescaler
TCCR0B |= (1 << CS02) | (0 << CS01) | (1 << CS00); // CS02|CS00 1024 /16mS/, CS01 8 /100 uS
т.е. меняю две строчки кода, то прерывание есть и счет TCNT0 идет

При этом висит флаг OCF0B и TOV0.
глобальное разрешение прерываний sei в коде есть само-собой.
Ткните пальцем, где туплю
