Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

158 Часть 11. Программирование микроконтроллеров АVR на ассемблере i f ( i>4 ) break ; / /пробуем пять раз if ( yes ) . . . < выполнение кода далее> Если вы посчитаете, что этот текст понятнее, чем наша ассемблерная программа, то вам прямая дорога в С-программисты. Испол ьзование прерываний Теперь давайте попробуем сделать ту же самую программу «по-человечески» - а именно с использованием прерываний. Обычно контроллер не только следит за кнопками, а еще делает разные другие полезные операции, поэтому нехорошо за­ нимать все его время пустыми циклами в ожидании, когда наконец кто-то соизво­ лит нажать на кнопку. Хотя, отметим, пустые циклы, в ко�;-орых МК больше ничего не делает, кроме отслеживания подобных крайне редких, с его точки зрения, собы­ тий (даже за время ожидания пересылки байта через UART, занимающее при ско­ рости 9600 бит/с ок о ло одной миллисекунды, контроллер успеет выполнить не­ сколько тысяч команд), как раз представляют собой наименьшее зло, поскольку легко могут быть прерваны на время выполнения других процедур без опасности что-то потерять. Но в общем случае лучше, если мы будем стараться по возможно­ сти освободить контроллер от бесцельного зацикливания в ожидании событий - при этом, например, невозможно задействовать режимы энергосбережения, о кото­ рых пойдет речь в главе 14. Итак, вернемся к схеме и обратим внимание, что кнопка Кн 1 у нас подсоединена к контакту PD2, который, если вы взглянете в описание модели АTmega8, одновре­ менно служит входом внешнего прерывания INTO . Таким образом, чтобы ловить кнопку на отпускание, у нас вырисовывается следующая схема действий: сначала мы инициируем прерывание INTO по спаду и, определив таким образом, что кнопка была нажата, делаем небольшую паузу (2 мс), чтобы отфильтровать дребезг при нажатии. Затем опять разрешаем прерывание INTO , но уже по фронту, по возникно­ вению прерывания определяем момент отпускания, производим нужные манипу­ ляции со счетчиком, снова разрешаем прерывания по спаду, и все повторяется сна­ чала. П рограмма счетчика с использованием прерывани й Здесь нам придется развернуться «по полной программе», т. е. включить в состав программы таблицу прерываний, написать секцию инициализации ( RESET ) и т. п. Таблицу прерываний мы включим полностью, т. к. для ATmega8 она невелика, а в дальнейшем, если потребуется, такой текст программы гораздо легче дорабатывать (с этой же целью я сохранил в тексте названия даже неиспользуемых прерываний). Учтите только, что предыдущие программы без использования прерываний (см. листинги 6 . 1 2-6 . 1 3), в целом годятся без переделок для любой модели МК АVR, имеющей порты D и С, а вот новую придется перед переносом внимательно просмотреть на предмет совпадения адресов прерываний и наименований регист-

RkJQdWJsaXNoZXIy MTExODQxMg==