Johnny81 0 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба IAR, Atmega128 В программе есть переход в некий специальный режим. До перехода прерывание timer3CompareC работает - ставлю бряк в отладчике - попадаю в обработчик. После перехода - не работает. Содержимое регистров таймера 3 после перехода - на скриншоте, ничего криминального не вижу (OCIE3C стоит, OCF3C стоит, таймер работает, TCNT3 меняется, SREG I стоит). Программа в это время крутится в основном в for(;;); в конце main(). Есть еще аналогичное прерывание timer1CompareB, так оно работает :maniac: Сейчас пытаюсь отключать части кода, которые выполняются при входе в этот режим работы. Но пока безуспешно. Не могу понять, что такое могло испортиться, чтобы не работало прерывание? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба upd Расследование показало, что отваливаются прерывания таймера по сравнению 1С, 3A, 3B, 3C. А вот 1A и 1B работают. Т.е. не работают те, которые настраиваются в ETIMSK Контрольный список - почему не срабатывает прерывание * SREG/I - включен * Флаг самого прерывания в ETIMSK - включен * Условие прерывания - сработало, бит в ETIFR установлен * Постоянно срабатывает прерывание с более высоким приоритетом - у меня это явно не так, если исполнять по шагам - отладчик крутится в for(;;); в main() * Перенесена таблица прерываний (MCUCR / IVSEL) - нет, IVSEL сброшен. К тому ж некоторые прерывания работают * Что-то еще? Блин, вот такое чувство, что включается Atmega103 compatibility mode, но ведь его нельзя установить программно, только через программатор? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gorby 6 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба * Что-то еще? Убедитесь, что в ERRATA не упоминается такой случай. Убедитесь, что в настройках компилятора выбран правильный процессор (при неверном выборе всё "как-бы" работает, но не так). Наблюдатель влияет на объект. Отладчик Вам здесь не поможет. Лучшая отладка - пин на выход и осциллограф. Урезайте код до минимально возможного, вычленяйте проблему. Проверьте, выполняется ли условие возникновения прерывания (ну например, счетчик тупо никогда не досчитывает до места , где должен вызвать прерывание). Понизьте уровень оптимизации или совсем ее отключите. Поскольку код урезан до минимального, смотрите его ассемблер глазами очень тщательно - например на предмет доступа к регистрам, куда не должен доступаться (управление прерываниями). Удачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба "Постоянно срабатывает прерывание с более высоким приоритетом " - как раз мой случай :) При переходе в мой специальный режим включалось прерывание EE_READY, а сам обработчик отсутствовал. Приоритет у него как раз пониже 1A/1B и повыше 1С/3A/3B/3C Кстати в режиме disassembly студия даже показывает попадания в этот вектор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться