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

Глава 3. Периферийные устройства и прерывания 67 Дополнительные прерывания PCINT возникают при появлении любого фронта им­ пульса на входах портов, причем асинхронно. Прерывания типа PCINT, ввиду их многочисленности, обычно объединены в небольшое количество групп, каждая из которых связана со своим вектором (до восьми выводов на один вектор). Например, в ATtiny828 в отдельном регистре PCICR отведено четыре бита ( РСIЕО-з ) , устанавли­ вающихся каждый тогда, когда наступило событие на одной из четырех групп вы­ водов (PCINT0-7, PCINTS- 1 5 , PCINТ l б-23 , или PCINT24-27) . При этом возникает одно из прерываний: PCINTO, PCINTl , PCINT2, PCINTЗ . Выделять, на каком именно выводе (выводах) перехвачено прерывание, необходимо заранее, для чего служит регистр Рсмsк. При этом прерывание типа PCINТ наступает при любом переключе­ нии уровня (и из нуля в единицу, и обратно), и, в отли•.ше от обычных внешних прерываний INТx, управлять этим процессом невозможно. Зато их также можно ис­ пользовать для вывода контроллера из «сна>> гораздо более удобным способом, чем с помощью прерываний INТO и INТl по уровню. Из «наших» · моделей контроллеров INТ2 доступен в ATmega8535 , а дополнитель­ ные прерывания типа PCINТ - в АТtiny23 1 3 . Примеры использования этих преры­ ваний приведены в главе 14. Об о б щих принципах использования прерывани й При переносе основной функциональности программы в прерывания в ряде случа­ ев основная программа может состоять только из единственной процедуры беско­ нечного пустого цикла: cykle : rjmp cycle (что равносильно известному оператору while ( 1 ) в языке С) . Все остальное (в том числе начальная инициализация по сбро­ су) будет осуществляться через прерывания. Поясним подробнее, чем такая концепция лучше и в каких случаях наступают ее ограничения . Во-первых, потери событий оказываются намного менее вероятными. Прерывания могут потеряться только в том единственном случае, когда контроллер начинает захлебываться событиями, идущими одно за другим с временными про­ межутками менее длительности обработки. Причем, если у вас пришло два подряд прерывания, то с ними ничего не случится при любом промежутке времени между ними (разве что при промежутке менее периода тактовой частоты некоторые собы­ тия могут просто остаться незамеченными). Второе прерывание, как мы говорили, запоминается в состоянии своего флага и будет обработано, можно сказать, «свое­ временно или несколько позже». Критичный случай наступает, когда с минималь­ ным промежутком следуют подряд три одинаковых события или больше - вот то­ гда промежуточные события действительно потеряются . Рассмотрим еще подробнее условия возникновения такой ситуации. Критичные промежутки между событиями при обычных тактовых частотах составят менее единиц-десятков микросекунд. Это цифра увеличивается до миллисекунд в случае, если задействовать в прерываниях медленные процедуры (ожидание отправки по UART, обмен по I2c, запись в EEPROM и т. п. ), но и такой промежуток совершенно не является запредельно большим в обычных случаях использования контроллера. Если нужно обработать несколько событий, происходящих подряд друг за другом,

RkJQdWJsaXNoZXIy MTExODQxMg==