Таймер 1 COMPA ISR - поведение по умолчанию?
Я создаю генератор частоты LCD.
Когда TIMER1
достигает заданного значения, он переключается на контакт 9 (через OC1A
).
Случайно, я оставил TIMER1
"прерывание при сравнении соответствия A" включенным, но не определил вектор прерывания TIMER1_COMPA_vect
.
Это приводило к перезагрузке Uno, но не через загрузчик, а только к программной части, всякий раз, когда вызывался TIMER1_COMPA_vect
.
После того как я определил ISR, даже без содержания, он заработал как положено.
Есть ли содержимое по умолчанию для ISR, которое сбрасывает устройство/запускается сразу после загрузчика? Разве компилятор не должен обнаруживать полное отсутствие ISR?
@towe, 👍1
1 ответ
Лучший ответ:
Компилятор не может обнаружить отсутствующий ISR, так как это очень сложно, т.к. общем случае, чтобы определить, является ли какой-либо конкретный бит разрешения прерывания был установлен программой.
Библиотека avr-libc действительно обеспечивает «универсальный» ISR и, как указано в руководстве,
действием по умолчанию является сброс устройства путем перехода к сбросу вектор.
Если вам не нравится такое поведение, вы можете переопределить этот прием с помощью свой собственный, как описано в руководстве (ищите «Catch-all вектор прерывания").
- Отправка последовательных данных в прерывании
- Светодиод не мигает - Arduino UNO+WiFi R3 ATmega328P+Плата ESP8266
- 24/14 секундный таймер обратного отсчета или часы для кнопки запуска/остановки баскетбольного мяча плохо реагируют
- ATmega328P - проблема с использованием таймера 2 для генерации тона
- Точность синхронизации Arduino nano
- Интервальный таймер на Arduino: Сомнения по поводу библиотеки TimerOne
- Можно ли отсоединить прерывание на определенное время
- Заставить TCNT оставаться ниже OCRxA на ATmega328P
Очень интересно, это решает мою путаницу - спасибо., @towe