| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > ATtiny84 прерывание PCINT0 |
| Автор: daemon17 10.5.2011, 18:46 | ||
| Всем привет! Помогите пожалуйста разобраться с прерыванием. необходимо фиксировать на ножке перепад 0->1 и 1->0 и соответствующие события обрабатывать в прерывании. Оговорюсь что при использовании прерывания EXTINT0 все работает, но уперся в то что нехватает к-ва ножек на обработку событий, по этому решил перейти на прерывание PCINT0. Но тут началась непонятка в эмуляторе AVRStudio (v 4.18 build 700). Дело в том, что при выставлении на Pin-е соответствующего порта уровень "1" прерывание срабатывает, но почему то на этом Pin-е самостоятельно изменяется урвень с "1" на "0" через 42 такта и снова отрабатывает прерывание. Никак не пойму почему на ноге порта самостоятельно изменяется уровень. Этот уровень должен изменяться от прихода внешнего сигнала но никак не самостоятельно. (Может я чего-то не дочитал в даташите?) вот кусок кода
|
| Автор: UniBomb 12.5.2011, 14:33 | ||||
daemon17, первое что бросается в глаза - неправильно написана таблица векторов прерываний. Должно быть как-то так:
И по идее на все неиспользуемые прерывания надо ставить заглушки в виде reti, т.е. так:
Потому, что когда срабатывает прерывание, то счётчик команд перепрыгивает по нужному и вектору и не найдя команды возврата продолжает молотить с того места. В данном случае, покуда вектор PCINT0 Handler был не на своём месте, программа начинала выполняться сначала со всеми вытекающими - сброс и реинициализация портов. |
| Автор: daemon17 12.5.2011, 23:01 |
| да так оно и есть, просто чтоб не вставлять лишнего, я чего-то решил сократить да и махнул косой в исходниках у меня как надо написано. |
| Автор: UniBomb 13.5.2011, 07:58 |
| daemon17, тогда выложи полный исходник, а то вдруг ты ещё чего "лишнего" вырезал |