его ардуино проектом. Настраиваю прерывание по совпадению счётчика TCNT2 с регистром сравнения OCR2A и сброс счётчика при этом совпадении. Предделитель 1024. В итоге, почему-то не имеет значение, что находится в регистре OCR2A, счётчик стоит на нуле и прерывание срабатывает каждые 1024 такта. То есть ведёт себя так, словно в OCR2A находится ноль, но это не так, я проверял.
Вопросы и ответы:
Может я случайно настроил сброс счётчика по OCR2B ?
Нет, вроде бы такого режима даже нет в ATmega328. Но для верности я пробовал загонять в OCR2B то же значение, что и в OCR2A.
Может в регистрах TCCR2A и TCCR2B оказываются какие-то другие значения?
Нет, пробовал выводить в цикле в консоль значения всех регистров, связанных с этим счётчиком.
Этот же код работает, если использовать его вне среды Ардуино?
Таки да! Изначально использовал его в WinAVR.
Ну хз, может Ардуина при компиляции оборачивает код прерывания в какой-то свой враппер, который мою функцию прерывания вызывает реже?
Не может быть, так как прерывание наоборот срабатывает чаще, чем нужно, а также, напоминаю, TCNT2 стоит на нуле.
А компилятор никаких предупреждений не выдаёт?
Никак нет!
Кстати, странный факт, с которым я столкнулся чуть ранее перед этим: почему-то по умолчанию в ардуине предделитель этого счётчика настроен на 64, а не на остановку счётчика, как должно быть.
https://www.instructables.com/id/Arduino-Timer-Interrupts/
Обсуждают сегодня