Ревич, Ю.В. Программирование микроконтроллеров 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 и т. п. ), но и такой промежуток совершенно не является запредельно большим в обычных случаях использования контроллера. Если нужно обработать несколько событий, происходящих подряд друг за другом,
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==