- Szükséges anyagok:
- Mi a megszakítás és hol használható:
- Áramkör és magyarázat:
- Megszakítások szimulációja a PIC mikrovezérlőben:
- Kód Magyarázat:
- A PIC16F877A megszakításainak működése:
Ebben az oktatóanyagban megtudhatjuk, hogyan kell használni a külső megszakítást a PIC mikrokontrollerben, és miért / hol lesz szükségünk rájuk. Ez a PIC oktatóprogramok sorozatának egy része, amelyben elkezdtük a semmiből tanulni a PIC mikrovezérlőket; ennélfogva ez az oktatóanyag feltételezi, hogy ismeri a PIC MCU programozását az MPLABX használatával és az LCD és a PIC összekapcsolását. Ha nem, kérjük, térjen vissza a megfelelő linkekre, és olvassa el őket, mert kihagyom az ott már szereplő információk nagy részét.
Szükséges anyagok:
- PIC16F877A Perf Board
- 16x2 LCD kijelző
- Nyomógomb
- Vezetékek csatlakoztatása
- Kenyérlap
- PicKit 3
Mi a megszakítás és hol használható:
Mielőtt belekezdenénk a PIC mikrovezérlő megszakításainak programozásába, értsük meg, mi is az a megszakítás valójában, és hol kellene ezeket használni. Ezenkívül sokféle megszakítás létezik a mikrokontrollerben, és a PIC16F877A körülbelül 15 ilyenet tartalmaz. Ne keverjük egyelőre mindet a fejünkbe.
Így! mi a megszakítás a mikrokontrollerekben?
Mint mindannyian tudjuk, a mikrovezérlőket egy előre definiált (programozott) aktiválás halmazának végrehajtására használják, amelyek a bemenet alapján elindítják a szükséges kimeneteket. De míg a mikrovezérlő egy darab kód futtatásával van elfoglalva, vészhelyzet állhat elő, amikor a kód másik része azonnal figyelmet igényel. Ezt a másik, azonnali figyelmet igénylő kóddarabot megszakításként kell kezelni.
Például: Vegyük fontolóra, hogy a kedvenc játékát játssza a mobilján, és a telefonban található vezérlő (feltételezés) elfoglalt az összes grafika eldobásával, amely a játék élvezéséhez szükséges. De hirtelen a barátnője felhívja a telefonszámát. Most a legrosszabb dolog az, ha a mobil vezérlője elhanyagolja a barátnője hívását, mivel Ön egy játékkal van elfoglalva. Annak megakadályozására, hogy ez a rémálom bekövetkezzen, valami megszakítást használunk.
Ezek a megszakítások mindig aktívak lesznek bizonyos műveletek bekövetkezésekor, és amikor bekövetkeznek, végrehajtanak egy darab kódot, majd visszatérnek a normál funkcióhoz. Ezt a kóddarabot hívják megszakítási szolgáltatási rutinnak (ISR). Az egyik gyakorlati projekt, amelyben kötelező a megszakítás, a „Digitális sebességmérő és kilométeróra áramkör PIC mikrokontrollerrel”
A mikrokontrollerekben két fő típusú megszakítás létezik. Ezek külső megszakítás és belső megszakítás. A belső megszakítások a mikrovezérlőn belül fordulnak elő egy feladat végrehajtásához, például időzítő megszakítások, ADC megszakítások stb. Ezeket a megszakításokat a szoftver váltja ki az időzítő vagy az ADC művelet befejezéséhez.
A külső megszakítást váltja ki a felhasználó. Ebben a programban megtanuljuk, hogyan kell használni a külső megszakítást egy nyomógomb segítségével a megszakítás kiváltásához. LCD-t fogunk használni a 0-tól 1000-ig növekvő számok megjelenítésére, és amikor megszakítás lép fel, értesítenünk kell róla a megszakító szolgáltatás rutin ISR-től, majd folytassuk a számok növelésével.
Áramkör és magyarázat:
A PIC16F877 megszakítások kapcsolási rajzát a fenti kép tartalmazza. Egyszerűen csatlakoztatnia kell az LCD-t a PIC-hez, ahogyan azt az LCD oktatóanyagának összekapcsolásakor tettük.
Most, hogy csatlakoztassuk a megszakító csapot, meg kell néznünk az adatlapot, hogy megtudjuk , a PIC melyik tűjét használják külső megszakításhoz. Esetünkben i n PIC16F877A a 33 rd pin RBO / INT használják külső megszakítás. A PIN-kódon kívül más PIN-kódot nem használhat. Ennek a kapcsolási rajznak a csatlakozóját az alábbi táblázat mutatja.
S. Nem: |
Pinkód |
PIN neve |
Csatlakozva valamihez |
1 |
21 |
RD2 |
Az LCD RS-je |
2 |
22. |
RD3 |
E az LCD |
3 |
27. |
RD4 |
Az LCD D4 |
4 |
28. |
RD5 |
D5 LCD |
5. |
29. |
RD6 |
Az LCD D6-ja |
6. |
30 |
RD7 |
D7 LCD |
7 |
33 |
RBO / INT |
Nyomógomb |
Engedélyeztük a belső felhúzási ellenállásokat a PORT B-n, így az RB0 csapot egy nyomógombon keresztül közvetlenül a földhöz köthetjük. Tehát, amikor ez a tű LOW lesz, megszakítás indul.
A csatlakozásokat egy kenyérlapon lehet kialakítani, az alábbiak szerint.
Ha követte oktatóanyagainkat, ismernie kellett volna ezt a Perf Boardot, amelyet itt használtam. Ha nem, akkor nem kell sokat gondolkodnia rajta, csak egyszerűen kövesse a kapcsolási rajzot, és a dolgok működni fognak.
Megszakítások szimulációja a PIC mikrovezérlőben:
A projekt szimulációja a Proteus segítségével készült.
Amikor szimulálja a projektet, látnia kell az LCD kijelzőn növekvő számok sorozatát. Ez a fő hurok belsejében történik, és amikor a nyomógombot megnyomja, az LCD-nek jeleznie kell, hogy belépett az ISR-be. Módosíthatja a kódot, és itt kipróbálhatja.
Kód Magyarázat:
A projekt teljes kódja az oktatóanyag végén található. A program azonban fontos részekre van osztva, és az alábbiakban elmagyarázzuk a jobb megértés érdekében.
Mint minden programnál, úgy a kódot is el kell kezdenünk, hogy meghatározzuk a programunkban használt csapok csapkonfigurációját. Itt is meg kell határoznunk, hogy az RB0 / INT-t külső megszakító tűként használjuk, és nem bemeneti vagy kimeneti tűként. Az alábbi kódsor lehetővé teszi a belső felhúzó ellenállást PORTB azáltal, hogy a 7- edik bit a 0.
OPTION_REG = 0b00000000;
Ezután engedélyezzük a globális / perifériás megszakításokat, és kijelentjük, hogy az RB0-t külső megszakító tűként használjuk.
GIE = 1; // Globális megszakítás engedélyezése PEIE = 1; // Engedélyezze a perifériás megszakítást INTE = 1; // Engedélyezze az RB0-t külső megszakító tűként
Miután az RB0 tű külső megszakító tűként definiálva van, minden egyes alkalommal, amikor alacsony lesz, az INTF külső megszakítási jelző 1 lesz, és az érvénytelen megszakítási funkció belsejében lévő kód végrehajtásra kerül, mivel a megszakító szolgáltatás rutin (ISR) hívásra kerül.
void megszakítás ISR_example () {if (INTF == 1) // Külső megszakítást észleltek {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Belépett ISR"); INTF = 0; // törli a megszakítás jelzőt, miután végzett vele __delay_ms (2000); Lcd_Clear (); }}
Amint láthatja, a megszakítási függvényt ISR_example néven neveztem el. Megnevezheti kívánságának megfelelően. A megszakítási funkción belül ellenőrizzük, hogy az INTF jelző magas-e, és elvégezzük a szükséges műveleteket. Nagyon fontos törölni a megszakítás jelzőt, ha végzett a rutinnal. Csak ezután tér vissza a program az érvénytelen fő funkcióhoz. Ezt az elszámolást a vonalat használó szoftvernek kell elvégeznie
INTF = 0; // törölje a megszakítás jelzőt, miután végzett vele
A fő funkción belül csak növelünk egy számot minden 500 ms-onként, és megjelenítjük az LCD képernyőn. Nincs külön sorunk az RB0 tű állapotának ellenőrzésére. A megszakítás mindig aktív marad, és amikor megnyomják a nyomógombot, akkor kiugrik az üregből és végrehajtja az ISR sorait.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Belső főhurok"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Szám:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __késleltesms (500); szám ++;
A PIC16F877A megszakításainak működése:
Miután megértette a megszakítás működését, kipróbálhatja a hardveren, és hegedülhet körülötte. Ez az itt megadott program nagyon egyszerű példa a külső megszakításra, ahol csak megszakítja az LCD képernyő megjelenítését, ha megszakítást észlel.
A projekt teljes működése megtalálható az alábbi videóban. Remélem, megértette a megszakításokat, és hol / hogyan használja őket. Ha kétségei vannak, a fórumokon vagy a megjegyzés szakaszon keresztül érhet el hozzám.