Ревич, Ю.В. Программирование микроконтроллеров 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 в режимах энергосбережения .
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==