- Miért van szükségünk megszakításra?
- A megszakítás típusai az MSP430-ban
- A programvezérlés megszakítása az MSP430-ban
- MSP430 áramkör a GPIO megszakítás teszteléséhez
- Az MSP430 programozása megszakításokhoz
- Program feltöltése az MSP430-ba a CCS-ből
- Program megszakítása az MSP430-on
Vegyünk egy egyszerű digitális órát, amely úgy van programozva, hogy csak megmutassa az időt, most képzelje el, hogy módosítani szeretné az időzónáját. Mit csinálnál? Egyszerűen megnyom egy gombot, amely megváltozik a menüben, amely lehetővé teszi az időzóna megváltoztatását. Itt a rendszer nem tudja megjósolni az időmegtartási folyamatok külső megszakítását, és nem kérheti meg, hogy várjon, mivel az órája másodpercértékének növelésével van elfoglalva. Itt jönnek jól a megszakítások.
A megszakításoknak nem kell mindig külsőnek lenniük; belső is lehet. A beágyazott megszakítások többnyire megkönnyítik a CPU két perifériája közötti kommunikációt. Vegyük fontolóra egy előre beállított időzítő visszaállítását és egy megszakítást, amikor az idő eléri az időzítő regiszter értékét. A megszakításkezelő használható a többi periféria, például a DMA kezdeményezésére.
Ebben az oktatóanyagban az MSP430 külső megszakítóit használtuk a különböző LED-ek váltására. Amikor egy külső megszakítást ad az állapotváltás egy nyomógomb segítségével, a vezérlés átkerül (előre ki van töltve) az ISR-be, és megteszi a szükségeset. Az MSP430G2 indítópult CCS-környezetének alapjainak megismeréséhez kövesse ezt a linket az MSP430 használatához a CCS használatával, mert ebben az oktatóanyagban nem foglalkozunk ennek részleteivel. Ellenőrizze a többi MSP430 alapú oktatóanyagot is az Energia IDE és a CCS használatával a linkre kattintva.
Miért van szükségünk megszakításra?
Megszakításokra van szükség a lekérdezési költségek beágyazott rendszerben történő mentéséhez. Akkor hívják őket, amikor a nagyobb prioritású feladatokat az aktuálisan futó feladat előzetes törlésével kell végrehajtani. Használható a CPU felébresztésére alacsony fogyasztású üzemmódokból is. Amikor egy külső jel éle felébreszt egy GPIO porton keresztül, az ISR végrehajtásra kerül, és a CPU ismét visszatér az alacsony fogyasztású üzemmódba.
A megszakítás típusai az MSP430-ban
Az MSP430 megszakításai a következő típusokba tartoznak:
- Rendszer visszaállítása
- Nem maszkolható megszakítás
- Álarcos megszakítás
- Vektoros és nem vektoros megszakítások
Rendszer visszaállítása:
Ez bekövetkezhet a tápfeszültség (Vcc) és az alacsony jel miatt az RST / NMI tűnél a Reset mód kiválasztásával, és olyan okok miatt is előfordulhat, mint a watchdog időzítő túlcsordulása és a biztonsági kulcs megsértése.
Nem maszkolható megszakítás:
Ezeket a megszakításokat nem tudja elfedni a CPU utasításai. Az Általános megszakítás engedélyezése után a nem maszkolható megszakítást nem lehet elterelni a feldolgozásról. Ezt olyan források generálják, mint az oszcillátor hibái és az RST / NMI-nek manuálisan adott él (NMI módban).
Álarcos megszakítás:
Amikor megszakítás következik be, és ha egy CPU utasítással elfedhető, akkor maszkolható megszakítás. Nem szükséges, hogy mindig külsőek legyenek. A perifériáktól és azok funkcióitól is függenek. Az itt használt külső port megszakítások ebbe a kategóriába tartoznak.
Vektoros megszakítások és nem-megszakítások:
Vektoros: Ebben az esetben a megszakító eszközök megadják nekünk a megszakítás forrását a megszakítási vektor cím átadásával. Itt rögzítik az ISR címét, és a vezérlés átkerül erre a címre, és az ISR gondoskodik a többiről.
Nem vektoros: Itt minden megszakítónak közös ISR -je van. Ha nem vektoros forrásból származó megszakítás történik, a vezérlő átkerül a közös címre, ahová az összes nem vektoros megszakítás megoszlik.
A programvezérlés megszakítása az MSP430-ban
A megszakítás bekapcsolásakor az MCLK be van kapcsolva, és a CPU-t visszahívják KI állapotból. Mivel a program vezérlése a megszakítás bekövetkezése után átkerül az ISR címre, a program számlálóban és az állapotregiszterben szereplő értékek továbbkerülnek a verembe.
Az állapotregiszter törlődik, ezáltal törli a GIE-t és megszünteti az alacsony fogyasztású üzemmódot. A legnagyobb prioritású megszakítást úgy választja ki és hajtja végre, hogy a megszakítási vektor címet a program számlálójába helyezi. Mielőtt eljutnánk az MSP430 GPIO megszakítási példakódunkhoz, fontos megérteni a benne szereplő portregiszterek működését.
Portregiszterek a GPIO vezérléshez az MSP430-on:
PxDIR: Ez egy kikötő irányítási regiszter. Lehetővé teszi a programozó számára, hogy 0 vagy 1 beírásával kiválassza a funkcióját. Ha egy tűt 1-nek választunk, akkor kimenetként működik. Tekintsük az 1-es portot egy 8 bites portnak, és ha a 2-es és a 3-as csapokat kimeneti portokká kell rendelni, akkor a P1DIR regisztert 0x0C értékkel kell beállítani.
PxIN: Ez csak olvasható regiszter, és a port aktuális értékei ezen regiszter segítségével olvashatók.
PxOUT: Ez a regiszter felhasználható értékek közvetlen beírására a portokba. Ez csak akkor lehetséges, ha a pullup / pulldown regisztráció le van tiltva.
PxREN: Ez egy 8 bites regiszter, amelyet a pullup / pulldown regisztráció engedélyezésére vagy letiltására használnak. Ha a tűt 1-re állítják a PxREN és a PxOUT regiszterben, akkor az adott csapot felhúzza.
PxDIR |
PxREN |
PxOUT |
I / O konfiguráció |
0 |
0 |
x |
Bemenet ellenállások letiltva |
0 |
1 |
0 |
Bemenet engedélyezve a belső legördüléssel |
0 |
1 |
1 |
Bemenet engedélyezve a belső felhúzással |
1 |
x |
x |
Kimenet - A PxREN-nek nincs hatása |
PxSEL és PxSEL2: Mivel az MSP430 összes csapja multiplexálva van, az alkalmazás előtt ki kell választani az adott függvényt. Amikor a PxSEL és a PxSEL2 regiszter egyaránt 0-ra van állítva egy adott tűnél, akkor az általános célú I / O kerül kiválasztásra. Ha a PxSEL értéke 1, akkor az elsődleges perifériás funkciót választják, és így tovább.
PxIE: Engedélyezi vagy letiltja a megszakításokat egy adott tűnél az x portban.
PxIES: Kiválasztja azt az élt, amelynél a megszakítás létrejön. 0-hoz egy emelkedő él, 1-hez pedig egy eső él kerül kiválasztásra.
MSP430 áramkör a GPIO megszakítás teszteléséhez
Az MSP430 megszakítási példa kódunk teszteléséhez használt MSP430 áramkör az alábbiakban látható.
A tábla földje a LED és a gomb földelésére szolgál. A nyomógomb átlósan ellentétes oldala általában nyitott kapocs, és a nyomógomb lenyomásakor összekapcsolódik. A LED előtt egy ellenállást csatlakoztatnak, hogy elkerüljék a LED nagy áramfelvételét. Általában alacsony ellenállásokat használnak 100ohm - 220ohm tartományban.
3 különböző kódot használunk, hogy jobban megértsük a port megszakításait. Az első két kód ugyanazt az áramkört használja, mint az 1. kapcsolási rajzon. Merüljünk bele a kódba. A csatlakozások létrejötte után a beállításom így néz ki.
Az MSP430 programozása megszakításokhoz
A teljes MSP430 megszakító program az oldal alján található, a kód magyarázata a következő.
Az alábbi sor megállítja a watchdog időzítő működését. A Watchdog időzítő általában két műveletet hajt végre. Az egyik a vezérlő alaphelyzetbe állításával akadályozza meg a vezérlőt a végtelen hurkokban, a másik pedig az, hogy időszakos eseményeket vált ki a beépített időzítő segítségével. Amikor a mikrovezérlőt visszaállítják (vagy bekapcsolják), időzítő módban van, és hajlamos alaphelyzetbe állítani az MCU-t 32 milliszekundum után. Ez a vonal megakadályozza a vezérlőt abban.
WDTCTL = WDTPW + WDTHOLD;
Ha a P1DIR regisztert 0x07 értékre állítja, akkor a pin0, pin1 és pin2 kimenetének irányát állítja be. Ha a P1OUT értéket 0x30 értékre állítja, akkor egy bemenetet konfigurál, ahol a belső pullup ellenállások engedélyezve vannak a pin4-en és az pin5-n. A P1REN 0x30 értékre állítása lehetővé teszi a belső felhúzást ezeken a csapokon. A P1IE lehetővé teszi a megszakítást, ahol a P1IES a magas vagy alacsony átmenetet választja megszakítási élként ezeken a csapokon.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
A következő sor lehetővé teszi az alacsony fogyasztású üzemmódot, és engedélyezi a GIE- t az állapotregiszterben, hogy a megszakításokat fogadni lehessen.
__bis_SR_register (LPM4bits + GIE)
A programszámlálót az 1. port vektor címével állítják be a makró segítségével.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
Az alábbi kód egyesével kapcsolja be a pin0, pin1, pin2 csatlakozó LED-eket.
if (számláld% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; szám ++; } else if (számláld meg% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; szám ++; } else { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; szám ++; }
2. kapcsolási rajz:
Hasonlóképpen próbálkozzunk egy másik tűvel, hogy sokkal jobban megértsük a fogalmat. Tehát itt a nyomógomb a 2.0 tűhöz van csatlakoztatva az 1.5 tű helyett. a módosított áramkör a következő. Ismét ezt az áramkört használják az MSP430 gombmegszakító program tesztelésére.
Itt a 2-es portot használjuk a bevitelhez. Tehát más megszakítási vektort kell használni. P1.4 és P2.0 veszi a bemeneteket.
Mivel a 2-es portot csak bemenetként használják, a P2DIR 0-ra van állítva. A 2-es port pin0-ának bemenetként való beállításához, engedélyezve a belső felhúzási ellenállásokat, a P2OUT és a P2REN regisztereket 1 értékkel kell beállítani. megszakítás a 2. port pin0-ján, és a megszakítás szélének kiválasztásához a P2IE és a P2IES értéke 1 lesz. A zászló alaphelyzetbe állításához a 2-es portban a P2IFG törlődik, hogy a zászló újra beállítható legyen a megszakítás bekövetkezése.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Amikor a megszakítás forrása az 1. portról származik, akkor az 1. port 1. érintkezőjéhez csatlakoztatott LED világít. Ha a megszakítás forrása a 2. porthoz tartozik, akkor az 1. port 2. érintkezőjéhez csatlakoztatott LED világít.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; mert (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (érvénytelen) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; mert (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Program feltöltése az MSP430-ba a CCS-ből
A projekt betöltéséhez az indítópultra és a hibakereséshez jelölje ki a projektet, majd kattintson az eszköztár hibakeresési ikonjára. Alternatív megoldásként nyomja meg az F11 billentyűt, vagy kattintson a RunàDebug gombra a hibakeresési módba való belépéshez.
Miután a hibakeresési módba lépett, nyomja meg a zöld színű futtatás gombot a betöltött kód szabad futtatásához az MCU-ban. Most, amikor a nyomógombot lenyomják, a megszakítást az élváltozás váltja ki, ami a LED állapotának megváltoztatását ösztönzi.
Program megszakítása az MSP430-on
A kód sikeres feltöltése után egyszerűen tesztelhetjük a nyomógomb használatával. A LED-minta a programunknak megfelelően változik, ha a nyomógomb segítségével megszakítás történik.
A teljes munka megtalálható az alábbi linkre kattintva. Remélem, tetszett a bemutató, és valami hasznosat tanultál. Ha bármilyen kérdése van, hagyja őket a megjegyzés részben, vagy más technikai kérdésekhez használja fórumunkat.