Arduino įsiterpimai (interrupts)
Arduino programose įsiterpimai (Interrupts) nutraukai iki tol vykdytus procesus, tam kad atliktų specifines užduotis, o po jų atlikimo grįžta prie pagrindinės programos užduočių vykdymo.
Įsivaizduokite, kad sėdite prie kompiuterio ir vykdote savo kasdienes užduotis ir tuo metu jums kažkas pradeda skambinti telefonu. Jūs nustojate dirbti kompiuteriu ir atsiliepėte į telefono skambutį, o po pokalbio grįžtate prie anksčios dirbtų darbų – analogišku principu veikia ir įsiterpimai(interrupts) kurie šioje situacijoje atitiktų telefono skambutį.
Ypatybės
- Pertraukimai gali kilti iš įvairių šaltinių. Šiuo atveju naudosime aparatinės įrangos pertraukimą, kurį sukelia būsenos pasikeitimas viename iš skaitmeninių kontaktų.
- Daugumoje „Arduino“ architektūrų yra du aparatinės įrangos pertraukimai (vadinami „interrupt0“ ir „interrupt1“), prijungti atitinkamai prie skaitmeninių įvesties / išvesties 2 ir 3 kaiščių.
- Galite apibrėžti rutiną naudodami specialią funkciją, vadinamą „“Interrupt Service Routine“ (paprastai žinoma kaip ISR).
- Galite apibrėžti rutiną ir nurodyti sąlygas kylančiame, krentančiame krašte arba abiejose. Esant šioms konkrečioms sąlygoms, pertraukimas būtų aptarnaujamas.
- Galima, kad ši funkcija būtų vykdoma automatiškai, kiekvieną kartą, kai įvyksta įvykis įvesties kaištyje.
Interrupts tipai:
- Hardware Interrupts − Jie atsiranda reaguojant į įvesties signalus, pavyzdžiui, kai digitalRead() funkcija gauna reikšmes LOW arba HIGH.
- Software Interrupts − Jie atsiranda reaguojant į programinėje įrangoje atsiųstą nurodymą. Vienintelis pertraukimo tipas, kurį Arduino yra funkcija attachInterrupt().
Įsiterpimai yra labai naudingi Arduino programose, nes padeda išspręsti daugybę problemų. Geras įsiterpimo suteikia galimybe stebėti išorinių daviklių būsenas ir imtis veiksmų reikiamu laiku. Paprastai ISR turėtų būti kuo trumpesnis ir greitesnis. Jei eskizas naudoja kelis ISR, vienu metu gali būti paleistas tik vienas. Kiti pertraukimai bus vykdomi pasibaigus dabartiniam, tokia tvarka, kuri priklauso nuo jų turimo prioriteto.
Šios trys konstantos yra iš anksto deklaruotos:
LOW - paleidžia įsiterpimą, kai pin‘o gražinama reikšmė yra LOW.
CHANGE – paleidžia įsiterpimą kai tik pin‘p grąžinama reikšmė pasikeičia.
FALLING - paleidžia įsiterpimą kai tik pin‘p grąžinama reikšmė pasikeičia iš HIGH į LOW.
Pavyzdys:
int pin = 2; //priskiriama interrupt kaiščiui 2.
volatile int state = LOW; // Įsitikinama, kad ISR dalijesi kintamaisiais.
void setup() {
pinMode(13, OUTPUT); // 13 pin‘as priskiriamas išvesčiai.
attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE); // Laukiama pasikeitusios reikšmės
}
void loop() {
digitalWrite(13, state); //kaištis 13 vykdo nuo state reikšmės priklausančius veiksmus.
} void blink() {
//ISR funkcija
state = !state;
}