Перейти к содержанию
    

Почему может не срабатывать прерывание таймера по сравнению в Atmega128?

IAR, Atmega128

 

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

 

post-29153-1441786634_thumb.png

post-29153-1441786703_thumb.png

 

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

 

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

 

Не могу понять, что такое могло испортиться, чтобы не работало прерывание?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Контрольный список - почему не срабатывает прерывание

* SREG/I - включен

* Флаг самого прерывания в ETIMSK - включен

* Условие прерывания - сработало, бит в ETIFR установлен

* Постоянно срабатывает прерывание с более высоким приоритетом - у меня это явно не так, если исполнять по шагам - отладчик крутится в for(;;); в main()

* Перенесена таблица прерываний (MCUCR / IVSEL) - нет, IVSEL сброшен. К тому ж некоторые прерывания работают

* Что-то еще?

 

Блин, вот такое чувство, что включается Atmega103 compatibility mode, но ведь его нельзя установить программно, только через программатор?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

* Что-то еще?

 

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

 

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

 

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

Урезайте код до минимально возможного, вычленяйте проблему. Проверьте, выполняется ли условие возникновения прерывания (ну например, счетчик тупо никогда не досчитывает до места , где должен вызвать прерывание).

Понизьте уровень оптимизации или совсем ее отключите.

Поскольку код урезан до минимального, смотрите его ассемблер глазами очень тщательно - например на предмет доступа к регистрам, куда не должен доступаться (управление прерываниями).

 

Удачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Кстати в режиме disassembly студия даже показывает попадания в этот вектор

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...