Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Внешних прерываний у большинства МК AVR два или три (а вот в ATmegal28 и подобных— целых восемь). Естественно, они могут возникать независимо друг от друга. Уникальный случай представляет собой ATtiny28 (специально предназначенный для пультов управления), в котором имеется внешнее прерывание, возникающее при появлении сигнала низкого уровня на любом из контактов порта В, что позволяет обслуживать многокнопочную клавиатуру. Во всех остальных случаях внешнее прерывание — событие, которое наступает при наличии сигнала на одном из входов, специально предназначенных для этого (например, INTO и INT1).

Выделяют три вида событий, вызывающих такое прерывание, и их можно различать программно: это может быть низкий уровень напряжения, а также положительный или отрицательный фронт на соответствующем выводе. Любопытно, что прерывания по всем этим событиям выполняются, даже если соответствующий вывод порта сконфигурирован на выход (это, в частности, позволяет вызывать такие прерывания программно).

Кратко рассмотрим особенности этих режимов. Прерывание по низкому уровню (режим установлен по умолчанию, для его инициализации достаточно разрешить соответствующее прерывание) возникает всякий раз, когда на соответствующем входе присутствует низкий уровень. "Всякий раз" — это значит, что действительно всякий, т. е. если отрицательный импульс длится какое-то время, то прерывание, закончившись (т. е. когда выполнится соответствующий обработчик), повторится снова и снова, почти не давая основной программе работать. Поэтому обычная схема использования этого режима — сразу же по возникновении в начале обработчика его запретить (процедура обработки при этом, раз уж началась, выполнится до конца) и разрешить опять только тогда, когда внешнее воздействие должно уже закончиться (например, если это нажатие кнопки, то его следует опять разрешить по таймеру через одну-две секунды).

В отличие от этого,'прерывания по фронту или спаду выполняются один раз на каждый импульс. Конечно, от дребезга контактов там никакой защиты нет и быть не может, потому что МК не способен отличить дребезг от серии коротких импульсов. Если это критично, нужно либо принимать внешние меры по защите от дребезга, либо прибегнуть к тому же способу, что и для прерывания по уровню: внутри процедуры обработчика прерывания первой командой запретить само прерывание, а через некоторое время в другой процедуре (например, по таймеру или по иному событию) опять его разрешить. Но если при нажатии кнопки просто какая-то переменная или вывод порта устанавливается в некое состояние, то ничего страшного не случится, если оно установится несколько раз подряд, только следует учесть, что последний раз это может произойти с отпусканием кнопки.

У внимательного читателя возникает законный вопрос — а зачем вообще нужен режим внешнего прерывания по уровню, которое специально еще требуется сначала запрещать, а потом разрешать? Дело в том, что оно во всех моделях выполняется асинхронно — в тот момент, когда низкий уровень появился на выводе МК. Конечно, прерывание можно обнаружить только по окончанию текущей команды, так что очень короткие импульсы могут пропасть. Но в режиме управления по фронту у большинства моделей прерывания определяются наоборот, только синхронно — в момент перепада уровней тактового сигнала контроллера (поэтому их длительность не должна быть короче одного периода тактового сигнала).

И по большому счету разницы в этих режимах никакой бы не было, если не учесть то обстоятельство, что синхронный режим требует непременно наличия этого самого тактового сигнала. Потому асинхронное внешнее прерывание может "разбудить" контроллер, находящийся в одном из режимов "глубокого" энергосбережения, когда тактовый генератор не работает, а синхронное— нет. Обычные МК, вроде семейства Classic, вывести из глубокого "сна" можно только внешним прерыванием по уровню, что не всегда удобно. У большинства же моделей семейства Mega (из младших моделей — кроме ATmega8) имеется еще одно внешнее прерывание INT2, которое происходит только по фронтам (по уровню не может), и, в отличие от INTO и INT1, только асинхронно. Это значительно повышает удобство пользования семейством Mega в режимах энергосбережения, о которых мы сейчас поговорим.

Режимы энергосбережения
В различных моделях МК AVR имеется от 2-3 (семейства Classic и Tiny) до 5-6 (старшие Mega) режимов энергосбережения. Два базовых режима общие для всех моделей: Idle mode и Power Down mode. Отметим, что к режимам энергосбережения также относят стоящий несколько особняком специальный режим ADC Noise Reduction, который имеет иное назначение, и мы его рассмотрим в главе 10. При практическом использовании режимов энергосбережения следует учесть, что их нельзя вызывать из процедуры прерывания — только из основной программы (подробнее см. описание команды sleep в главах б и 14).



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru