- Proč potřebujeme přerušení?
- Typy přerušení v MSP430
- Přerušení řízení programu v MSP430
- Obvod MSP430 pro testování přerušení GPIO
- Programování MSP430 pro přerušení
- Nahrávání programu do MSP430 z CCS
- Přerušit program na MSP430
Zvažte jednoduché digitální hodinky, které jsou naprogramovány tak, aby vám ukazovaly čas, a nyní si představte, že chcete změnit jejich časové pásmo. Co bys dělal? Jednoduše stisknete tlačítko, které se změní v nabídce, která vám umožní změnit časové pásmo. Zde systém nedokáže předpovědět vaše externí přerušení jeho procesů udržování času a nemůže vás požádat, abyste počkali, protože je zaneprázdněn zvyšováním hodnoty sekund na vašich hodinkách. To je místo, kde přerušení přijde vhod.
Přerušení nemusí být vždy externí; může to být také interní. Většinou v integrovaném přerušení také usnadňuje komunikaci mezi dvěma periferiemi CPU. Zvažte resetování přednastaveného časovače a spuštění přerušení, když čas dosáhne hodnoty v registru časovače. Obslužný program přerušení lze použít k zahájení dalších periferií, jako je DMA.
V tomto tutoriálu jsme použili externí přerušení na MSP430 k přepínání různých LED. Když je externí přerušení dáno změnou stavu pomocí tlačítka, ovládací prvek se přenese (předem) na ISR a provede to nutné. Chcete-li znát základy, jako je nastavení prostředí CCS pro příruční panel MSP430G2, postupujte podle tohoto odkazu a začněte s MSP430 pomocí CCS, protože se v tomto tutoriálu nebudeme podrobněji zabývat. Zkontrolujte také další výukové programy založené na MSP430 pomocí Energia IDE a CCS pomocí odkazu.
Proč potřebujeme přerušení?
K uložení režie dotazování ve vestavěném systému jsou nutná přerušení. Jsou vyvolány, když je potřeba vykonat úkoly s vyšší prioritou předběžným uvolněním aktuální běžící úlohy. Lze jej také použít k probuzení CPU z režimů nízké spotřeby. Když je probuzen přechodem hrany externího signálu přes port GPIO, provede se ISR a CPU se znovu vrátí zpět do režimu nízké spotřeby.
Typy přerušení v MSP430
K přerušení v MSP430 spadají do následujícího types-
- Reset systému
- Nemaskovatelné přerušení
- Maskovatelné přerušení
- Přerušení vektorová a ne Vectorovaná
Reset systému:
Může k tomu dojít kvůli napájecímu napětí (Vcc) a kvůli nízkému signálu v kolíku RST / NMI s vybraným režimem Reset a může k tomu dojít také z důvodů, jako je přetečení časovače hlídacího psa a narušení bezpečnostního klíče.
Nemaskovatelné přerušení:
Tato přerušení nelze maskovat instrukcemi CPU. Jakmile je povoleno Obecné přerušení, nemaskovatelné přerušení nelze přesměrovat ze zpracování. To je generováno zdroji, jako jsou poruchy oscilátoru, a hranou ručně danou RST / NMI (v režimu NMI).
Maskovatelné přerušení:
Když dojde k přerušení a pokud jej lze maskovat instrukcí CPU, pak se jedná o Maskable Interrupt. Nemusí být vždy externí. Závisí také na periferních zařízeních a jejich funkcích. Zde použitá přerušení externího portu spadají do této kategorie.
Přerušení vektorová a přerušení vektorová:
Vectored: V tomto případě zařízení, která přerušují, nám poskytují zdroj přerušení předáním vektorové adresy přerušení. Zde je adresa ISR pevná a kontrola je přenesena na tuto adresu a ISR se postará o zbytek.
Bez vektorů: Zde mají všechna přerušení společný ISR. Když dojde k přerušení z ne-vektorového zdroje, ovládací prvek se přenese na společnou adresu, na kterou sdílejí všechna ne-vektorová přerušení.
Přerušení řízení programu v MSP430
Když dojde k přerušení, MCLK se zapne a CPU se zavolá zpět ze stavu OFF. Protože se řízení programu po výskytu přerušení přenáší na adresu ISR, hodnoty v čítači programu a stavovém registru se přesouvají do zásobníku.
Následně se vymaže stavový registr, čímž se vymaže GIE a ukončí režim nízké spotřeby. Přerušení s nejvyšší prioritou je vybráno a provedeno umístěním vektorové adresy přerušení do čítače programu. Než se dostaneme k našemu ukázkovému kódu přerušení MSP430 GPIO, je důležité porozumět fungování registrů Port, které jsou v něm zapojeny.
Registry portů pro ovládání GPIO na MSP430:
PxDIR: Jedná se o registr řízení směru portu. Umožňuje programátorovi specificky vybrat jeho funkci zápisem 0 nebo 1. Pokud je pin vybrán jako 1, pak funguje jako výstup. Považujte port 1 za 8bitový port, a pokud mají být piny 2 a 3 přiřazeny jako výstupní porty, musí být registr P1DIR nastaven na hodnotu 0x0C.
PxIN: Je to registr pouze ke čtení a pomocí tohoto registru lze číst aktuální hodnoty v portu.
PxOUT: Tento konkrétní registr lze použít k přímému zápisu hodnot na porty. To je možné pouze v případě, že je vytahovací / rozbalovací registr deaktivován.
PxREN: Jedná se o 8bitový registr, který se používá k povolení nebo zakázání vytahovacího / rozbalovacího registru. Když je pin nastaven na 1 v registru PxREN i PxOUT, pak je konkrétní pin vytažen nahoru.
PxDIR |
PxREN |
PxOUT |
Konfigurace I / O |
0 |
0 |
X |
Vstup s deaktivovanými rezistory |
0 |
1 |
0 |
Vstup s povoleným interním roztažením |
0 |
1 |
1 |
Vstup s povoleným interním stahováním |
1 |
X |
X |
Výstup - PxREN nemá žádný účinek |
PxSEL a PxSEL2: Protože jsou všechny piny v MSP430 multiplexovány, je nutné před použitím vybrat konkrétní funkci. Když jsou registry PxSEL i PxSEL2 nastaveny jako 0 pro konkrétní pin, je vybrán I / O pro všeobecné použití. Když je PxSEL nastaven na 1, je vybrána primární periferní funkce atd.
PxIE: Povoluje nebo zakazuje přerušení pro konkrétní pin v portu x.
PxIES: Vybírá hranu, na které je generováno přerušení. Pro 0 je vybrána náběžná hrana a pro 1 je vybrána sestupná hrana.
Obvod MSP430 pro testování přerušení GPIO
Níže je uveden obvod MSP430 použitý k testování našeho příkladu kódu přerušení MSP430.
Uzemnění desky se používá k uzemnění LED i tlačítka. Diagonálně protilehlé strany tlačítka jsou normálně otevřené svorky a připojují se, když je tlačítko stisknuto dolů. Před LED je připojen odpor, aby se zabránilo vysoké spotřebě proudu LED. Obvykle se používají nízké rezistory v rozsahu 100ohm - 220ohm.
Používáme 3 různé kódy, abychom lépe porozuměli přerušení portů. První dva kódy používají stejný obvod jako v obvodovém diagramu 1. Pojďme se ponořit do kódu. Po připojení vypadá moje nastavení takto.
Programování MSP430 pro přerušení
Kompletní program přerušení MSP430 najdete ve spodní části této stránky, vysvětlení kódu je následující.
Níže uvedený řádek zastaví časovač hlídacího psa z provozu. Časovač Watchdog obvykle provádí dvě operace. Jeden brání řadiči v nekonečných smyčkách resetováním řadiče a druhý je, že spouští periodické události pomocí vestavěného časovače. Když je mikrokontrolér resetován (nebo napájen), je v režimu časovače a má tendenci resetovat MCU po 32 milisekundách. Tento řádek zastaví řadič v tom.
WDTCTL = WDTPW + WDTHOLD;
Nastavení registru P1DIR na hodnotu 0x07 nastaví směr pin0, pin1 a pin2 jako výstup. Nastavením P1OUT na 0x30 se nakonfiguruje vstup s povolenými interními pullup rezistory na pin4 a pin5. Nastavení P1REN na 0x30 umožňuje interní vytažení těchto pinů. P1IE umožňuje přerušení, kde P1IES vybere přechod od vysoké k nízké jako hranu přerušení na těchto pinech.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Další řádek aktivuje režim nízké spotřeby a aktivuje GIE ve stavovém registru, aby bylo možné přijímat přerušení.
__bis_SR_register (LPM4bits + GIE)
Čítač programu je nastaven pomocí adresy vektoru portu 1 pomocí makra.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
Níže uvedený kód přepíná jednotlivé LED diody připojené k pin0, pin1, pin2 jeden po druhém.
if (počet% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; count ++; } else if (count% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; count ++; } else { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; count ++; }
Schéma zapojení 2:
Podobně zkusme jiný pin, abychom pochopili koncept mnohem lépe. Zde je tedy tlačítko připojeno k kolíku 2.0 místo kolíku 1.5. upravený obvod je následující. Tento obvod se opět používá k testování programu přerušení tlačítka MSP430.
Zde se pro vstup používá port 2. Musí se tedy použít jiný vektor přerušení. P1.4 a P2.0 přijímají vstupy.
Protože port 2 se používá pouze pro vstup, P2DIR je nastaven na 0. Chcete-li nastavit pin0 portu 2 jako vstup se zapnutými interními pull-up rezistory, musí být registry P2OUT a P2REN nastaveny na hodnotu 1. Chcete-li povolit přerušení na pin0 portu 2 a také pro výběr okraje přerušení, P2IE a P2IES jsou nastaveny na hodnotu 1. Chcete-li resetovat příznak na portu 2, P2IFG je vymazán, takže příznak lze znovu nastavit na výskyt přerušení.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Když je zdroj přerušení z portu 1, pak svítí LED připojená k pin1 portu 1. Pokud zdroj přerušení patří k portu 2, pak LED připojená k pin2 portu 1 svítí.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; pro (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; pro (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Nahrávání programu do MSP430 z CCS
Chcete-li načíst projekt do příručního panelu a ladit jej, vyberte projekt a klikněte na ikonu ladění na panelu nástrojů. Případně stiskněte klávesu F11 nebo klikněte na RunàDebug a přejděte do režimu ladění.
Jakmile vstoupíte do režimu ladění, stisknutím zeleného tlačítka spuštění spustíte volně spuštěný kód v MCU. Nyní, když je tlačítko stisknuto dolů, je přerušení spuštěno změnou okraje, což vyvolá změnu stavu LED.
Přerušit program na MSP430
Po úspěšném nahrání kódu jej můžeme otestovat jednoduše pomocí tlačítka. Vzorec LED se bude měnit podle našeho programu, kdykoli dojde k přerušení pomocí tlačítka.
Kompletní práci najdete ve videu, na které odkazujete níže. Doufám, že se vám výukový program líbil a naučili jste se něco užitečného. Máte-li jakékoli dotazy, nechte je v sekci komentářů nebo použijte naše fóra pro další technické dotazy.