- Prečo potrebujeme prerušenie?
- Typy prerušenia v MSP430
- Prerušenie riadenia programu v MSP430
- Obvod MSP430 na testovanie prerušenia GPIO
- Programovanie MSP430 na prerušenia
- Program na nahrávanie do MSP430 z CCS
- Prerušiť program na MSP430
Zvážte jednoduché digitálne hodinky, ktoré sú naprogramované tak, aby vám ukazovali iba čas, a teraz si predstavte, že chcete zmeniť ich časové pásmo. Čo by si robil? Jednoducho stlačte tlačidlo, ktoré zmení ponuku, ktorá vám umožní zmeniť časové pásmo. Systém tu nedokáže predvídať vaše externé prerušenie procesov udržiavania času a nemôže vás požiadať, aby ste čakali, pretože je zaneprázdnený zvyšovaním hodnoty sekúnd na hodinkách. Tu prichádzajú vhod prerušenia.
Prerušenia nemusia byť vždy externé; môže to byť aj interné. Najčastejšie v prípade prerušenia Embedded tiež uľahčuje komunikáciu medzi dvoma perifériami CPU. Zvážte, že prednastavený časovač je vynulovaný a prerušenie sa spustí, keď čas dosiahne hodnotu v registri časovača. Obslužný program prerušenia sa môže použiť na inicializáciu ďalších periférií, ako je DMA.
V tomto tutoriáli sme použili externé prerušenia na MSP430 na prepínanie rôznych LED diód. Keď je vonkajšie prerušenie dané zmenou stavu pomocou tlačidla, riadenie sa prevedie (prednostne) na ISR a urobí sa potrebné. Ak chcete poznať základné informácie, ako je nastavenie prostredia CCS pre launchpad MSP430G2, kliknite na tento odkaz, začíname s programom MSP430 pomocou CCS, pretože v tomto tutoriále sa nebudeme podrobne zaoberať. Skontrolujte tiež ďalšie výukové programy založené na MSP430 pomocou programu Energia IDE a CCS pomocou nasledujúceho odkazu.
Prečo potrebujeme prerušenie?
Na uloženie réžie dotazovania v zabudovanom systéme sú potrebné prerušenia. Vyvolávajú sa, keď je potrebné vykonať úlohy s vyššou prioritou predbežným vypustením aktuálnej spustenej úlohy. Môže sa tiež použiť na prebudenie procesora z režimov nízkej spotreby. Keď sa prebudí prechodom okraja externého signálu cez port GPIO, vykoná sa ISR a procesor sa znova vráti späť do režimu nízkej spotreby.
Typy prerušenia v MSP430
K prerušeniu v MSP430 spadajú do nasledujúceho types-
- Reset systému
- Nemaskovateľné prerušenie
- Maskovateľné prerušenie
- Vectored and Non-Vectored Interrupts
Reset systému:
Môže sa to vyskytnúť z dôvodu napájacieho napätia (Vcc) a z dôvodu nízkeho signálu v kolíku RST / NMI s vybraným režimom Reset a môže sa to vyskytnúť aj z dôvodov, ako je pretečenie časovača strážneho psa a porušenie bezpečnostného kľúča.
Nemaskovateľné prerušenie:
Tieto prerušenia nemôžu byť maskované podľa pokynov CPU. Keď je povolené všeobecné prerušenie, nemaskovateľné prerušenie nie je možné odkloniť od spracovania. To je generované zdrojmi, ako sú poruchy oscilátora a hrana ručne zadaná do RST / NMI (v režime NMI).
Maskovateľné prerušenie:
Keď dôjde k prerušeniu a ak ho možno maskovať inštrukciou CPU, potom ide o maskovateľné prerušenie. Nemusia byť vždy externé. Závisia tiež od periférií a ich funkcií. Tu použité prerušenia externých portov patria do tejto kategórie.
Vectored Interrupts and Non-Vectored Interrupts:
Vektorované: V tomto prípade nám zariadenia, ktoré prerušujú, poskytnú zdroj prerušenia odovzdaním vektorovej adresy prerušenia. Tu je adresa ISR pevná a kontrola sa prenesie na túto adresu a ISR sa postará o zvyšok.
Bez vektorov: Tu majú všetky prerušenia spoločné ISR. Keď dôjde k prerušeniu z ne-vektorovaného zdroja, riadenie sa prenesie na spoločnú adresu, na ktorú sa zdieľajú všetky ne-vektorové prerušenia.
Prerušenie riadenia programu v MSP430
Keď dôjde k prerušeniu, MCLK sa zapne a CPU sa zavolá späť zo stavu OFF. Keď sa riadenie programu po výskyte prerušenia prenesie na adresu ISR, hodnoty v počítadle programu a stavovom registri sa presunú do zásobníka.
Postupne sa vymaže stavový register, čím sa vymaže GIE a ukončí sa režim nízkej spotreby. Prerušenie s najvyššou prioritou sa vyberie a vykoná umiestnením vektorovej adresy prerušenia do počítadla programu. Predtým, ako sa dostaneme k nášmu vzorovému kódu prerušenia GPIO MSP430, je dôležité pochopiť fungovanie registrov portov, ktoré sú doň zapojené.
Registre portov pre riadenie GPIO na MSP430:
PxDIR: Je to riadiaci register smeru portu. Umožňuje programátorovi špecificky zvoliť jeho funkciu zápisom 0 alebo 1. Ak je pin vybraný ako 1, potom funguje ako výstup. Port 1 považujte za 8-bitový port, a ak sa majú kolíky 2 a 3 priradiť ako výstupné porty, musí sa register P1DIR nastaviť na hodnotu 0x0C.
PxIN: Je to register iba na čítanie a pomocou tohto registra je možné načítať aktuálne hodnoty v porte.
PxOUT: Tento konkrétny register je možné použiť na priamy zápis hodnôt na porty. To je možné iba v prípade, že je vypnutý register vytiahnutia / rozbalenia.
PxREN: Je to 8-bitový register, ktorý sa používa na povolenie alebo zakázanie vyťahovacieho / rozbaľovacieho registra. Keď je pin nastavený na 1 v registri PxREN aj PxOUT, potom je konkrétny pin vytiahnutý nahor.
PxDIR |
PxREN |
PxOUT |
Konfigurácia I / O |
0 |
0 |
X |
Vstup so zablokovanými rezistormi |
0 |
1 |
0 |
Vstup s povoleným vnútorným rozbaľovaním |
0 |
1 |
1 |
Vstup s povoleným interným načítaním |
1 |
X |
X |
Výstup - PxREN nemá žiadny vplyv |
PxSEL a PxSEL2: Pretože sú všetky piny v MSP430 multiplexované, je potrebné pred použitím zvoliť konkrétnu funkciu. Keď sú registre PxSEL aj PxSEL2 nastavené ako 0 pre konkrétny pin, potom je vybraný univerzálny I / O. Keď je PxSEL nastavený na 1, vyberie sa primárna periférna funkcia atď.
PxIE: Zapína alebo vypína prerušenia pre konkrétny pin v porte x.
PxIES: Vyberie hranu, na ktorej sa vygeneruje prerušenie. Pre 0 je vybratá stúpajúca hrana a pre 1 klesajúca hrana.
Obvod MSP430 na testovanie prerušenia GPIO
Obvod MSP430 použitý na testovanie nášho príkladu kódu prerušenia MSP430 je uvedený nižšie.
Uzemnenie dosky sa používa na uzemnenie LED aj tlačidla. Diagonálne protiľahlé strany tlačidla sú zvyčajne otvorené svorky a pripoja sa, keď je tlačidlo stlačené nadol. Pred LED je pripojený rezistor, aby sa zabránilo vysokej spotrebe prúdu LED. Zvyčajne sa používajú nízke odpory v rozmedzí 100ohm - 220ohm.
Na lepšie pochopenie prerušenia portu používame 3 rôzne kódy. Prvé dva kódy používajú rovnaký obvod ako v obvodovom diagrame 1. Poďme sa ponoriť do kódu. Po vytvorení pripojení vyzerá moje nastavenie takto.
Programovanie MSP430 na prerušenia
Kompletný program prerušenia MSP430 nájdete v spodnej časti tejto stránky, vysvetlenie kódu je nasledujúce.
Dolný riadok zastaví činnosť časovača strážneho psa. Časovač Watchdog zvyčajne vykonáva dve operácie. Jeden bráni radiču v nekonečných slučkách resetovaním radiča a druhý je, že spúšťa periodické udalosti pomocou zabudovaného časovača. Keď je mikrokontrolér resetovaný (alebo zapnutý), je v režime časovača a má tendenciu resetovať MCU po 32 minútach. Tento riadok zastaví radič v tom.
WDTCTL = WDTPW + WDTHOLD;
Nastavením registra P1DIR na hodnotu 0x07 sa nastaví smer pin0, pin1 a pin2 ako výstupu. Nastavením P1OUT na 0x30 sa nakonfiguruje vstup s internými pullup rezistormi povolenými na pin4 a pin5. Nastavením P1REN na 0x30 sa umožní vnútorné načítanie týchto pinov. P1IE umožňuje prerušenie, kde P1IES vyberá prechod od vysokej k nízkej ako hranu prerušenia na týchto kolíkoch.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Nasledujúci riadok aktivuje režim nízkej spotreby a aktivuje GIE v stavovom registri, aby bolo možné prijímať prerušenia.
__bis_SR_register (LPM4bits + GIE)
Počítadlo programu sa pomocou makra nastaví na adresu vektora portu 1.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
Nižšie uvedený kód prepína každú z LED diód pripojených k pin0, pin1, pin2 jeden po druhom.
if (počet% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; počet ++; } else if (pocet% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; počet ++; } else { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; počet ++; }
Schéma zapojenia 2:
Podobne skúsime iný pin, aby sme koncept pochopili oveľa lepšie. Takže tu je tlačidlo pripojené k pin 2.0 namiesto pin 1.5. upravený obvod je nasledovný. Tento obvod sa opäť používa na testovanie programu prerušenia tlačidiel MSP430.
Tu sa na vstup používa port 2. Musí sa teda použiť iný vektor prerušenia. Vstupy prijímajú P1.4 a P2.0.
Pretože port 2 sa používa iba na vstup, P2DIR je nastavený na 0. Ak chcete nastaviť pin0 portu 2 ako vstup so zapnutými internými pull-up rezistormi, musia byť registre P2OUT a P2REN nastavené s hodnotou 1. Ak chcete povoliť prerušenie na pin0 portu 2 a tiež pre výber okraja prerušenia sú P2IE a P2IES nastavené na hodnotu 1. Ak chcete resetovať príznak na porte 2, P2IFG sa vymaže, aby bolo možné príznak znovu nastaviť na výskyt prerušenia.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Keď je zdroj prerušenia z portu 1, potom svieti LED pripojená k pin1 portu 1. Pokiaľ zdroj prerušenia patrí k portu 2, potom svieti LED pripojená k kolíku 2 portu 1.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; pre (i = 0; i <20 000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; pre (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Program na nahrávanie do MSP430 z CCS
Ak chcete načítať projekt do príručnej plochy a ladiť ho, vyberte projekt a kliknite na ikonu ladenia na paneli nástrojov. Prípadne stlačte kláves F11 alebo kliknite na RunàDebug, aby ste vstúpili do režimu ladenia.
Po zadaní režimu ladenia stlačte zelené tlačidlo spustenia, aby ste voľne spustili načítaný kód v MCU. Teraz, keď je tlačidlo stlačené, prerušenie sa vyvolá zmenou okraja, čo vyvolá zmenu stavu LED.
Prerušiť program na MSP430
Po úspešnom nahraní kódu ho môžeme otestovať jednoduchým použitím tlačidla. Vzorec LED sa bude podľa nášho programu meniť vždy, keď dôjde k prerušeniu pomocou tlačidla.
Kompletné fungovanie nájdete vo videu, na ktoré odkazujete nižšie. Dúfam, že sa vám výukový program páčil a dozvedeli ste sa niečo užitočné. Ak máte akékoľvek otázky, nechajte ich v sekcii komentárov alebo použite naše fóra na ďalšie technické otázky.