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

372 Часть 111. Практическое программирование микроконтроллеров АVR вились, и ничего плохого от жизни больше не ждем. Но вполне могут быть случаи, когда возможность повторных срабатываний так легко предотвратить не удается. Да и здесь тоже возникнет неприятная ситуация, если вы задержите палец на кноп­ ке дольше секунды. В этом деле могут помочь возможности, которые предоставляют другие контролле­ ры. В ATmega8535 и ATmega l 6 (как и во многих других) есть прерывание INT2, которое выполняется асинхронно. Потому в них можно смело объявлять прерыва­ ние INT2 на нажатие, т. е. по перепаду из единицы в ноль (режим специально уста­ навливать не надо - как и режим по уровню для INTO/INT 1 , он действует по умол­ чанию). И дальше в нашем случае· делать все то же самое. Отдельную тестовую программу для этого случая вы найдете в архиве по адресу, указанному во введении (файл Sleep_I NT2_test.asm ) . Она мало чем отличается от предыдущей - различие только в настройках прерывания и выводов: кнопка под­ ключается к выводу РЕО (вывод 3 1 корпуса ATmega853 5) , на котором здесь нахо­ дится INT2, светодиод - к тому же выводу РВО (вывод 1 ATmega8535) . Здесь в нашем случае (только при использовании кнопки ! ) может возникнуть другая за­ сада- если вы задержите палец дольше секунды, то при отпускании, скорее всего, прерывание возникнет повторно из-за дребезга. И с этим бо р оться здесь непро­ сто - придется как-то отслеживать отпускание и только потом разрешать уходить в s leep. Еще интереснее возможность, которую предоставляет прерывание PCINT. Ни в од­ ной из «наших» моделей Mega оно не представлено - в этом семействе прерыва­ ние появилось, начиная с ATmega88 . Зато оно есть в ATtiny23 1 3 , на примере кото­ рого мы сейчас его и продемонстрируем . Преимущество прерывания PCINT, кроме его асинхронности, в том, что его можно поймать на любом из семи выводов (в на­ шем случае - порта В), недостаток- в том, что оно происходит по любому изме­ нению логического уровня на выбранном выводе (потому и называется Pin Change Interrupt). То есть определять, что это было: нажатие или отпускание, придется про­ граммным путем. Но мы ведь это уже умеем, правда? На рис . 1 4 . 1 показано подключение кнопки и светодиода к АTtiny23 1 3 для иллюст­ рации применения прерывания PCINT. Подключение кварца на схеме не показа­ но - хотя приведенная далее программа рассчитана на 4 МГц, но это несущест­ венно для обсуждаемого случая . Чтобы не пересчитывать настройку задержки, вы можете выбрать внутреннее тактирование с этой частотой, установив конфигура­ ционные ячейки скsЕLЗ : о в состояние 0 0 1 0 или 0 0 1 1 (и обязательно не забыв вы­ ключить ячейку скоrvв ). Кстати, в АTtiny23 l 3 различные варианты тактовой часто­ ты можно установить из программы, предварительно выключив только ячейку скоrvв (встроенный генератор начнет тактирование на частоте 8 МГц) и затем уста­ новив биты делителя тактовой частоты CLKPSЗ : о в регистре CLКPR ( CLKPSЗ : о = 0001 дает коэффициент деления 2) . Программа с использованием PCINT согласно схеме, показанной на рис . 1 4. 1 , при­ ведена в листинге 1 4 . 2 . Ее также можно найти в архиве по адресу, указанному во введении (файл Sleep_PCINT_test .asm ) .

RkJQdWJsaXNoZXIy MTExODQxMg==