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

66 Часть /. Общие принципы устройства и функционирования Аtте/ АVR всякий, т. е . если отрицательный импульс длится какое-то время, то прерывание, закончившись (когда выполнится соответствующий обработчик), повторится снова и снова, почти не давая основной программе работать. Поэтому обычная схема использования этого режима - сразу же по возникновении в начале обработчика запретить это прерывание (процедура обработки при этом, раз уж началась, выпол­ нится до конца) и разрешить опять только тогда, когда внешнее воздействие долж­ но уже закончиться, - например, если это нажатие кнопки, то его следует опять разрешить по таймеру через одну-две секунды. В отличие от прерываний по низкому уровню, прерывания по фронту или спаду выполняются один раз на каждый импульс. Конечно, от дребезга контактов здесь никакой защиты нет и быть не может, потому что МК не способен отличить дре­ безг от серии коротких импульсов. Если это критично, нужно либо принимать внешние меры по защите от дребезга, либо прибегнуть к тому же способу, что и для прерывания по уровню: внутри процедуры обработчика прерывания первой командой запретить само прерывание, а через некоторое время в другой процедуре (например, по таймеру или по иному событию) опять его разрешить . Но если по нажатию кнопки просто какая-то переменная или вывод порта устанавливается в некое состояние (зажигает светодиод, например), то ничего страшного не случит­ ся, если оно установится несколько раз подряд, - только следует учесть, что по­ следний раз это может произойти с отпусканием кнопки. У внимательного читателя возникает законный вопрос - а зачем вообще нужен режим внешнего прерывания по уровню, которое специально еще требуется снача­ ла запрещать, а потом разрешать? Дело в том, что оно во всех моделях выполняется асинхронно - в тот момент, когда низкий уровень появился на выводе МК (точно так же асинхронно, кстати, выполняются и прерывания PCINT, - о чем рассказано далее). Конечно, прерывание можно обнаружить только по окончании текущей команды, так что очень короткие импульсы могут пропасть . Но в режиме управле­ ния по фронту у большинства моделей прерывания INTO и INTl определяются на­ оборот, только синхронно - в момент перепада уровней тактового сигнала кон­ троллера (поэтому их длительность не должна быть короче одного периода такто­ вого сигнала). И по большому счету разницы в этих режимах никакой бы не было, если не учесть то обстоятельство, что синхронный режим требует непременно наличия этого самого тактового сигнала. Потому асинхронное внешнее прерывание может «раз­ будить» контроллер, находящийся в одном из режимов «глубокого» энергосбере­ жения, когда тактовый генератор не работает, а синхронное - нет. Старые МК се­ мейства Classic вывести из глубокого «Сна>> путем внешнего прерывания (напри­ мер, нажатием кнопки) можно было только внешним прерыванием по уровню, что не всегда удобно. У большинства же моделей семейства Mega (из младших моделей - кроме ATmega8), имеется еще одно внешнее прерывание - INT2, которое, в отличие от што и INTl, происходит только по фронтам и только асинхронно. У некоторых старших моде­ лей Mega (ATmega64/ 1 28, ATmega l 64/324/644, ATmega640-2 1 60 и др. ) асинхронно выполняются все прерывания во всех режимах. Это значительно повышает удобст­ во пользования семейством Mega в режимах энергосбережения .

RkJQdWJsaXNoZXIy MTExODQxMg==