Ebben a cikkben az ATmega8 külső megszakításaival foglalkozom. Példaként bemutatom, hogy hogyan használtam őket WILL-I robot végső verziójában.
Bevezetés
WILL-I fejlesztése során, ahogy tudásom egyre jobban gyarapodott az ATmega8 mikrovezérlővel kapcsolatban, a robotom is fokozatosan egyre bonyolultabb, és fejlettebb lett.
- WILL-I V1.0: A legelső verzió csak vakon tapogatózott a karjain lévő 2 db mikrokapcsolóval, de a motorok vezérlése már PWM jellel történt.
- WILL-I V2.0: A második verzióban WILL-I az ADC-t felhasználva, egy Sharp infravörös távolságérzékelő szenzorral érzékelte a körülötte lévő tárgyakat. De csak akkor, ha a tárgy a keskeny IR sugárnyaláb útjába került. A szenzor a robot tetején lett elhelyezve és vízszintesen pásztázott, ezért az alacsonyabb akadályokat nem érzékelte (a karon lévő 2 mikrokapcsoló jeleit ekkor még nem használta a vezérlőprogram).
- WILL-I V3.0: A harmadik verzióban, a fenti hiányosságok kiküszöbölésére, a karokon lévő mikrokapcsolókat is felhasználjuk az akadályok érzékelésére. A kapcsolók ha beleütköznek valamibe, akkor külső megszakításokat fognak kelteni.
De nézzük is meg kicsit részletesebben, hogy mi is az a megszakítás, és mire is lesz ez jó nekünk!
A való életben legtöbbször a külvilággal kapcsolatban lévő mikrovezérlőnek, mielőtt végrehajtana egy feladatot, külső esemény(ek) bekövetkezésére kell várni (például egy gombnyomásra). Például tegyük fel, hogy egy nyomógomb, és egy LED van a mikrovezérlőre kötve, és az a feladat, hogy a LED-et a gombnyomással ki/be kapcsolgassuk. Ezt a feladat alapvetően kétféle módszerrel oldható meg.
- Az un. “polling” módszerrel
- Megszakítások használatával
Az un. “polling” módszer esetén a programban létrehozunk egy ciklust, amelyben a mikrovezérlő folyamatosan ellenőrzi a gomb állapotát, hogy le van-e nyomva, vagy nincs. Amennyiben a gomb le van nyomva, a mikrovezérlő végrehajtja az adott eseményhez tartozó feladatot (ki-/bekapcsolja a LED-et). Ennél a módszernél a mikrovezérlő folyamatosan egy aktív várakozó ciklust hajt végre amíg a gombnyomásra vár, és mással nem tud eközben foglalkozni, csak pazarolja a processzoridőt. Ez akkor kellemetlen amikor más, sok processzoridőt igénylő feladatot is szeretnénk végrehajtani eközben.
Mennyivel egyszerűbb lenne, ha a processzor végezné a számításokat, ahelyett hogy folyton a gombnyomásra figyelne, és a gomb szólna a mikrovezérlőnek, hogy kapcsolja be a LED-et ha gombnyomás történt.
Megszakítások használatakor pont ez történik. Amikor lenyomjuk a gombot, akkor az egy hardveresen generált jelet küld a mikrovezérlőnek, ami azonnal reagál erre a kérelemre, félbehagyja az éppen futó feladatot (ezért hívjuk megszakításnak), és végrehajtja a megszakítást kiszolgáló eljárást, majd visszatér a fő programhoz, és ott folytatja a félbehagyott feladat végrehajtását ahol abbahagyta. Megszakítások használatakor a processzor nem várakozik feleslegesen.
Megpróbálom egy példán keresztül kicsit érthetőbben szemléltetni a két módszer közötti különbséget.
Tegyük fel, hogy éppen kedvenc filmünket akarjuk otthon megnézni DVD-n. Tegyük fel azt is hogy éhesek is vagyunk, és rendeltünk egy pizzát.
Ha a pizzafutárt a “polling” módszerrel akarjuk beengedni, akkor az azt jelenti, hogy néhány percenként odamegyünk az ajtóhoz, kinyitjuk, és megnézzük hogy megjött-e már a pizzánk. Látható, hogy ilyenkor a folyamatos ajtónyitogatás mellett nem nagyon tudunk filmet nézni.
Ha megszakítások használatával akarjuk beengedni a pizzafutárt, akkor kényelmesen leülünk kedvenc fotelünkbe, és elkezdjük nézni a filmet. Ha a pizzafutár megérkezik, küld egy megszakítás kérelmet (becsenget), ekkor mi megállítjuk a filmet, és végrehajtjuk a megszakítást kiszolgáló utasításokat (kinyitjuk az ajtót, fizetünk és átvesszük a pizzát). Ha ezzel készen vagyunk, akkor folytathatjuk azt a tevékenységet amit a csengetés előtt végeztünk (mehetünk vissza filmet nézni, pontosan onnantól nézve tovább ahol megállítottuk).
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!