Megszakítások kezelése



Kezdjük az elején: mi is az a megszakítás? A megszakítás egy külső jel ami megállítja az aktuális program futását, elvégzi a saját függvényét, majd vissza adja a vezérlést a programnak. A programunk megszakítás után ott folytatódik ahol a megszakítás előtt abba maradt.


Miért jó ez nekünk? Amikor több felé kell figyelni vezérlőnknek és közben még műveleteket is
kell végeznie a háttérben annyira leterhelődik , hogy nem lenne stabil a működése. A megszakításoknak ez az előnye, nem kell figyelni az érzékelőt vagy az eszközt, ha megadott változás történik az eszköz kimenetén a megszakítás kérelem aktiválódik és a megfelelő függvények lefutnak. Tehát nem terheli feleslegesen a vezérlőnket.


Az arduino négy függvényt használ a megszakítások kezelésére ezek a következők:
interrupts() – megszakítás engedélyezése, ezt csak akkor használjuk ha előtte már letiltottuk a megszakításokat( néhány kód részletnél kritikus lehet az időzítés használata, itt érdemes letiltani a
megszakításokat). Alapból engedélyezettek.

noInterrupts() – megszakítások letiltása az előzőekben leírtak miatt. Nem törli a megszakítást csak
felfüggeszti azt.


attachInterrupt() – megszakítás beállítása az adott lábon. A következő paramétereket használja:
attachInterupt(megszakítás száma, függvény, aktiválójel);
 megszakítás száma: itt nem a pinek számát adjuk meg hanem a lábakhoz rendelt megszakítások számát. Az Uno esetén ez 0 és 1, a 0-s int. a 2-s pinhez van rendelve, az 1-s int. a 3-ashoz.
 függvény: a megszakításkor végrehajtandó függvény
 aktiválójel: ez aktiválja a megszakítást, a megszakításoknál négy féle lehet:

Az interrupt bemenetek:
Board    int.0    int.1    int.2    int.3    int.4    int.5.
 Uno      2 láb    3 láb    x          x        x          x
 Mega     2        3        21        20      19       18


detachInterrrupt() – az adott megszakítás letiltása, a zárójelen belül egyetlen paraméter található:
a letiltandó megszakítás száma (Unonál 0 vagy 1).

Egy az egyben átmásoltam ide az arduino.cc-n lévő példa progit, azt hiszem ennél több nem kell.

int pin = 13;
//állapot jelző
volatile int state = LOW;

void setup()
{
pinMode(pin, OUTPUT);
//megszakítás a nullás interrupt-ot(2-es láb) használja, a blink függvényt hívja meg minden
//bemeneti jel változásra
attachInterrupt(0, blink, CHANGE);
}


void loop()
{
digitalWrite(pin, state);//kiíratás a ledre
}


void blink()
{
//állapot váltás
state = !state;
}

A kapcsolásból a led áramköre elhagyható(a panel ledje is visszajelez).

A panel 2-es lábára kell kötni egy nyomógombot 10kohmos felhúzó ellenállással.
A megszakító jelet majd ez fogja generálni nekünk. A megszakítás CHANGE-re van állítva ezért
a gomb lenyomásakor és felengedésekor is végbe fog menni.


Még egy pár szó a volatile jelzőről: azt jelzi hogy a tároló egység tartalma bármikor megváltozhat,
ez úgy értendő, hogy a változás végbemehet programon kívül is, nincs külön regiszter létrehozva a
változó értékeinek tárolására. Egyszerűsítve az interruptokhoz csak evvel a jelzővel ellátott típusok
használhatók (csak ezek használhatók programon kívül).