Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Почему может не срабатывать прерывание таймера по сравнению в Atmega128?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Непомнящий Евгений
IAR, Atmega128

В программе есть переход в некий специальный режим. До перехода прерывание timer3CompareC работает - ставлю бряк в отладчике - попадаю в обработчик. После перехода - не работает. Содержимое регистров таймера 3 после перехода - на скриншоте, ничего криминального не вижу (OCIE3C стоит, OCF3C стоит, таймер работает, TCNT3 меняется, SREG I стоит). Программа в это время крутится в основном в for(;;); в конце main().

Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла

Есть еще аналогичное прерывание timer1CompareB, так оно работает maniac.gif

Сейчас пытаюсь отключать части кода, которые выполняются при входе в этот режим работы. Но пока безуспешно.

Не могу понять, что такое могло испортиться, чтобы не работало прерывание?
Непомнящий Евгений
upd Расследование показало, что отваливаются прерывания таймера по сравнению 1С, 3A, 3B, 3C. А вот 1A и 1B работают. Т.е. не работают те, которые настраиваются в ETIMSK

Контрольный список - почему не срабатывает прерывание
* SREG/I - включен
* Флаг самого прерывания в ETIMSK - включен
* Условие прерывания - сработало, бит в ETIFR установлен
* Постоянно срабатывает прерывание с более высоким приоритетом - у меня это явно не так, если исполнять по шагам - отладчик крутится в for(;;); в main()
* Перенесена таблица прерываний (MCUCR / IVSEL) - нет, IVSEL сброшен. К тому ж некоторые прерывания работают
* Что-то еще?

Блин, вот такое чувство, что включается Atmega103 compatibility mode, но ведь его нельзя установить программно, только через программатор?
Gorby
Цитата(Непомнящий Евгений @ Sep 9 2015, 14:14) *
* Что-то еще?


Убедитесь, что в ERRATA не упоминается такой случай.

Убедитесь, что в настройках компилятора выбран правильный процессор (при неверном выборе всё "как-бы" работает, но не так).

Наблюдатель влияет на объект. Отладчик Вам здесь не поможет. Лучшая отладка - пин на выход и осциллограф.
Урезайте код до минимально возможного, вычленяйте проблему. Проверьте, выполняется ли условие возникновения прерывания (ну например, счетчик тупо никогда не досчитывает до места , где должен вызвать прерывание).
Понизьте уровень оптимизации или совсем ее отключите.
Поскольку код урезан до минимального, смотрите его ассемблер глазами очень тщательно - например на предмет доступа к регистрам, куда не должен доступаться (управление прерываниями).

Удачи.
Непомнящий Евгений
"Постоянно срабатывает прерывание с более высоким приоритетом " - как раз мой случай sm.gif При переходе в мой специальный режим включалось прерывание EE_READY, а сам обработчик отсутствовал. Приоритет у него как раз пониже 1A/1B и повыше 1С/3A/3B/3C

Кстати в режиме disassembly студия даже показывает попадания в этот вектор
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.