Spider
Mar 17 2012, 16:19
Всем привет!
Столкнулся с странной проблемой у процов AT90USB127. Они как бы повисают. Ситуация следующая:
В соотвествии с кодом прошивки проц находится в Sleep режиме и по Timer2 просыпаясь проверяет некие условия и если условие удовлетворяет просыпается. Сразу же после пробуждения Timer2 перенастраивается в режим PWM и хардварно "пищит" ногой в буззер на время, которое отсчитывает другой таймер. Далее идёт основнйо код подпрограммы.
Так вот ИНОГДА, или даже можно сказать ЧАЩЕ ВСЕГО, всё это действие заканчивается бесконечным писком бузера и всё. Я сначала грешил на код, но код в этом месте на столько прост, что ошибку я даже предположить не могу. Ну и такой болезнью страдает только 2 экземпляра из 20ти доступных мне.
Теперь немного наблюдений. Если во время писка передёрнуть пинцетом RESET на проце, то он снова не запустится. И будет тупым куском кирамики с ногами. Запкстится только после "пере-снятия" питания. Опять же, если по время "пищяния" проца попытаться подключиться к нему JTAG или перепрошить ISP, ничего не получится, оне не будет отвечать.
Что это? Могу я как-то по коду вводить проц в это состояние? Почему этому подвержены не все процы?
Похоже на то, что этот случай оговаривается в эррате:
Цитата
Asynchronous timer interrupt wake up from sleep generates multiple interrupts
If the CPU core is in sleep and wakes-up from an asynchronous timer interrupt and then go
back in sleep again it may wake up multiple times.
Problem Fix/workaround
A software workaround is to wai t with performing the sleep instruction unt i l
TCNT2>OCR2+1.
Spider
Mar 19 2012, 06:30
Простите, чё-то трудности перевода, как они предлагают это обойти? Втупляю
Цитата(Alexey Belyaev @ Mar 19 2012, 10:30)

Простите, чё-то трудности перевода, как они предлагают это обойти? Втупляю

Пишут что при нахождении контроллера в режиме сна и пробуждения его по асинхронному прерыванию может вызывать множество прерываний. Путь обхода (мне правда тоже не очень понятно): ожидать при переходе в сон пока TCNT2>OCR2+1.
Дубовый перевод, но дословный такой.
Spider
Mar 21 2012, 05:45
Ну как я понял, что не стоит сбрасывать флаг прерывания пока таймер не перещёлкнеться, а то типа такой быстрый проц, может выполнить код и выйти из прерывания, а таймер ещё не перещёлкнулся, и вектор снова попадает в прерывание.
Но тогда почему он у меня виснет колом?!