This is an old revision of the document!
Внешние прерывания (англ. external interrupt) являются одними из самых простых функций периферии. У микроконтроллеров AVR обычно от 1 до 8 специальных выводов, при изменении логического значения или в определённом состоянии которых, создаётся прерывание в программе. Так как в основном эта функция используется для отслеживания логических сигналов вне контроллера, соответствующие выводы называются выводами внешнего прерывания.
Для использования внешнего прерывания следует настроить вывод на обычный режим входа IO (можно использовать и в режиме выхода, но в таком случае прерывание может быть создано только самим контроллером). В регистре конфигурации следует разрешить создание прерывания и указать условие, при котором оно будет выполнено. Имеется четыре возможных условия:
При выборе логического нуля, прерывание создаётся до тех пор, пока значение вывода равно нулю. Работа основной программы в тот момент остановлена.
Исходя из принципов работы, существуют два вида внешних прерываний: синхронизированный с тактом контроллера и асинхронный. Синхронизированные прерывания работают, запоминая значение выводов, что означает, что логические изменения находятся путём сравнения значений, полученных от двух разных тактов. Если логические изменения внешнего сигнала происходят быстрее, чем идёт рабочий такт, то прерывания либо создаются неверно, либо вовсе пропускаются. Асинхронные прерывания не зависят от такта контроллера и позволяют определить быстро меняющийся внешний сигнал – логический нуль должен удерживаться сигналом как минимум в 50 ns. У ATmega128 4 синхронизированных и 4 асинхронных внешних прерывания.
Näide
Vaja on panna ATmega128 viik number 9 ehk siini E viik 7 tekitama katkestust, kui selle väärtus muutub. Sellele viigule vastab väline katkestus INT7, mis on sünkroonne.
#include <avr/interrupt.h> // Välise katkestuse programm ISR(INT7_vect) { // Tee midagi } int main() { // Siini E viigu 7 muutmine sisendiks biti 7 nullimise teel DDRE &= ~(1 << PIN7); // Siini E viigule 7 pull-up takisti määramine sisendi ujumise vastu PORTE |= (1 << PIN7); // Väliste katkestuste seaderegistris katkestuse 7 // tekitajaks loogilise muutuse määramine EICRB = (1 << ISC70); // Välise katkestuse 7 lubamine EIMSK |= (1 << INT7); // Globaalne katkestuste lubamine sei(); // Lõputu programmitsükkel while (1) continue; }
Lisaks üksikute viikude tekitatavatele katkestustele on suurematel AVR-idel võimalik kasutada ka tervete gruppide viikude loogiliste väärtuste muutuste katkestusi. Neid katkestusi nimetatakse lihtsalt viigu muutuse katkestusteks (inglise keeles pin change interrupt). Need rakenduvad siis, kui vähemalt ühe viigu väärtus grupis muutub.