Не могу даже понять, откуда проблема.
Необходимо запустить первый таймер в режиме - CTC по сравнению с регистром ICR1.
Вот исходник:
Код
void InitializationTimer1(void){
TCCR1B |= _BV(CS11); // Тактирование таймера clk/8 = 1843200 Гц
TCCR1B | _BV(WGM13) | _BV(WGM12); // Режим работы - "Сброс при совпадении ICR1"
ICR1 = (F_CPU/8)/100; // Переполнение - через 10 mSec
TIMSK |= _BV(TOIE1); // Разрешить прерывание по переполнению
}
ISR (TIMER1_OVF_vect) {
static u16 q = 0;
if(q == 0){
PORTA ^= _BV(PA3);
q = 100;
}else
--q;
}
Теоретически, прерывание должно возникать 100 раз в секунду, соответственно, дерганье ногой, в моем случае, должно происходить каждую секунду. Но в железе видно, что это происходит раз за почти четыре секунды. Значит, почему-то в регистре ICR1 не мое значение, а 0xFFFF.
Решил глянуть в симуляторе студии. Оказывается, проблема в следующем:
строка TCCR1B |= _BV(CS11) отрабатывается корректно, а
строка TCCR1B | _BV(WGM13) | _BV(WGM12) не выставляет никакие биты, соответственно, таймер работает в режиме normal.
Когда я объединил эти строки в одну TCCR1B |= _BV(CS11) | _BV(WGM13) | _BV(WGM12), в симуляторе начали выставляться все положенные биты, но в железе нога больше не дергается.
Понимаю, что чего-то я не знаю. Вот собственно и вопрос - ЧЕГО?
Компилятор с WinAVR-20100110, makefile - студийный, оптимизация Os