Итак, есть девайс, Atmega168. Задачу можно свести к следующему минимуму:
Необходимо установить режим FastPWM и дрыгать ножкой - устанавливать низкий уровень по совпадению с регистром сравнения, высокий по переполнению счетного регистра таймера. Используется Timer1 16bit.
Проблема заключается в том, что по идее в режиме FastPWM таймер должен дотикать до FF, сбросить счетчик в 0, выдать прерывание по переполнению, и продолжить по кругу. При отладке программы в симуляторе avrstudio, таймер тикает до FF, затем тикает обратно до 0, и только тогда выдает прерывание, как в режиме PWM Phase Correct.
Инициализация следующая:
COM1A1..0 = 00
COM1B1..0 = 00
WGM13..0 = 0101 ; FastPWM 8bit
CS12..0 = 001 ; без предделителя
OCIE1A = 1 ; прерывание по совпадению
TOIE1 = 1 ; прерывание по переполнению
В OCR1A пришу, например, 0x003F.
Притом флаги OCF1A и TOV1 вообще не выставляются по соответствующим событиям, но прерывания исправно отрабатываются. Итого имеем PWM Phase Correct при настройках для FastPWM.
Где собака зарыта? Глюк в симуляторе, или (скорее всего), я что-то делаю неправильно?
Проект на всякий случай прилагаю.