- Zakaj moramo prekiniti?
- Vrste prekinitev v MSP430
- Prekinitev nadzora programa v MSP430
- Vezje MSP430 za preizkušanje prekinitve GPIO
- Programiranje MSP430 za prekinitve
- Nalaganje programa na MSP430 s CCS
- Prekinitveni program na MSP430
Razmislite o preprosti digitalni uri, ki je programirana tako, da vam prikazuje čas, zdaj pa si predstavljajte, da želite spremeniti njen časovni pas. Kaj bi naredil? Preprosto pritisnete gumb, ki se spremeni v meni, ki vam omogoča spreminjanje časovnega pasu. Tu sistem ne more napovedati vaše zunanje prekinitve glede na procese vodenja časa in ne more zahtevati, da počakate, saj je zaseden s povečevanjem sekundne vrednosti na vaši uri. Tu pridejo prekinitve prav.
Prekinitve niso vedno zunanje; lahko je tudi notranji. Večina vgrajenih prekinitev olajša tudi komunikacijo med dvema zunanjima napravama CPU. Prednastavljeni časovnik se ponastavi in prekinitev se sproži, ko čas doseže vrednost v registru časovnika. Upravljalnik prekinitev lahko uporabite za sprožitev drugih zunanjih naprav, kot je DMA.
V tej vadnici smo uporabili zunanje prekinitve na MSP430 za preklop različnih LED. Ko zunanja prekinitev povzroči sprememba stanja s pritiskom na gumb, se nadzor prenese (predpomni) na ISR in ta naredi potrebno. Če želite poznati osnove, kot je nastavitev okolja CCS za lansirno ploščo MSP430G2, sledite tej povezavi in začnite uporabljati MSP430 z uporabo CCS, ker podrobnosti o tem v tej vadnici ne bomo podrobneje preučili. Preverite tudi druge vadnice na osnovi MSP430, ki uporabljajo Energia IDE in CCS, tako da sledite povezavi.
Zakaj moramo prekiniti?
Prekinitve so potrebne za shranjevanje režijskih stroškov v vdelanem sistemu. Vpokličejo se, kadar je treba naloge z višjo prioriteto izvesti s predhodnim izvlečenjem trenutne izvajane naloge. Uporabite ga lahko tudi za prebujanje procesorja iz načinov nizke porabe. Ko ga preklopi robni prehod zunanjega signala skozi vrata GPIO, se ISR izvede in CPU se spet vrne v način nizke porabe.
Vrste prekinitev v MSP430
V prekinitve v MSP430 prišel pod naslednjim types-
- Ponastavitev sistema
- Nemaskabilna prekinitev
- Maskabilna prekinitev
- Vektorske in nevektorske prekinitve
Ponastavitev sistema:
Pojavi se lahko zaradi napajalne napetosti (Vcc) in zaradi nizkega signala v zatiču RST / NMI z izbranim načinom ponastavitve, lahko pa tudi zaradi razlogov, kot sta prelivanje nadzornega časovnika in kršitev varnostnega ključa.
Nepremočljiva prekinitev:
Teh prekinitev ni mogoče prikriti z navodili CPU. Ko je omogočena splošna prekinitev, nepremostljive prekinitve ni mogoče preusmeriti iz obdelave. To ustvarijo viri, kot so napake oscilatorja in rob, ki je ročno podan RST / NMI (v načinu NMI).
Prekrita maska:
Ko pride do prekinitve in če jo je mogoče prikriti z navodilom CPU, je to Maskable Interrupt. Ni treba, da so vedno zunanji. Odvisni so tudi od zunanjih naprav in njihovih funkcij. Tukaj uporabljene prekinitve zunanjih vrat spadajo v to kategorijo.
Vektorske prekinitve in nevektorske prekinitve:
Vektorirano: V tem primeru nam naprave, ki prekinjajo, priskrbijo vir prekinitve s posredovanjem naslova vektorja prekinitve. Tu je naslov ISR določen in nadzor se prenese na ta naslov, ISR pa poskrbi za ostalo.
Non Vectored: Tu imajo vsi prekinitve skupni ISR. Ko pride do prekinitve iz nevektorskega vira, se nadzor prenese na skupni naslov, na katerega si delijo vse nevektorske prekinitve.
Prekinitev nadzora programa v MSP430
Ko pride do prekinitve, se MCLK vklopi in CPU se pokliče nazaj iz stanja OFF. Ko se nadzor nad programom po nastanku prekinitve prenese na naslov ISR, se vrednosti v programskem števcu in registru stanja premaknejo v sklad.
Zaporedoma se statusni register izbriše, s čimer se počisti GIE in konča način nizke porabe. Prekinitev z najvišjo prioriteto se izbere in izvede tako, da se v programski števec namesti vektorski naslov prekinitve. Preden pridemo do naše kode primera prekinitve MSP430 GPIO, je pomembno razumeti delovanje vhodnih registrov, ki so v njem vključeni.
Pristaniški registri za nadzor GPIO na MSP430:
PxDIR: To je register za nadzor smeri vrat. Programerju omogoča, da posebej izbere svojo funkcijo tako, da napiše 0 ali 1. Če je zatič izbran kot 1, potem deluje kot izhod. Štejte, da so vrata 1 8-bitna vrata in če naj bodo nožice 2 in 3 dodeljena kot izhodna vrata, je treba register P1DIR nastaviti z vrednostjo 0x0C.
PxIN: Je register samo za branje in trenutne vrednosti v vratih je mogoče prebrati s pomočjo tega registra.
PxOUT: Ta poseben register lahko uporabite za neposredno zapisovanje vrednosti v vrata. To je mogoče le, če je onemogočen vlečni / izvlečni register.
PxREN: To je 8-bitni register, ki se uporablja za omogočanje ali onemogočanje vlečnega / izvlečnega registra. Ko je zatič nastavljen na 1 v registru PxREN in PxOUT, se določeni zatič potegne navzgor.
PxDIR |
PxREN |
PxOUT |
V / I konfiguracija |
0 |
0 |
X |
Vhod z onemogočenimi upori |
0 |
1. |
0 |
Vnos z omogočenim notranjim spuščanjem |
0 |
1. |
1. |
Vhod z omogočenim notranjim vlečenjem |
1. |
X |
X |
Izhod - PxREN nima učinka |
PxSEL in PxSEL2: Ker so vsi zatiči v MSP430 multipleksirani, je treba pred uporabo izbrati določeno funkcijo. Ko sta oba registra PxSEL in PxSEL2 nastavljena na 0 za določen pin, je izbran splošni namen V / I. Ko je PxSEL nastavljen na 1, je izbrana primarna zunanja funkcija itd.
PxIE: Omogoči ali onemogoči prekinitve za določen zatič v vratih x.
PxIES: Izbere rob, na katerem se ustvari prekinitev. Za 0 je izbran naraščajoči rob, za 1 pa padajoči rob.
Vezje MSP430 za preizkušanje prekinitve GPIO
Vezje MSP430, ki se uporablja za preizkušanje naše kode primera prekinitve MSP430, je prikazano spodaj.
Ozemljitev plošče se uporablja za ozemljitev tako LED kot gumba. Diagonalno nasprotni strani gumba sta običajno odprti sponki in se povežeta, ko pritisnete gumb. Pred LED je priključen upor, da se prepreči velika poraba toka LED. Običajno se uporabljajo nizko upori v območju od 100 ohm do 220 ohm.
Za boljše razumevanje prekinitev vrat uporabljamo tri različne kode. Prvi dve kodi uporabljata isto vezje kot na vezju 1. Potopimo se v kodo. Po vzpostavitvi povezav je moja postavitev videti tako.
Programiranje MSP430 za prekinitve
Celoten program prekinitev MSP430 najdete na dnu te strani, razlaga kode pa je naslednja.
Spodnja vrstica ustavi nadzor časovnega pasu. Watchdog timer ponavadi izvede dve operaciji. Eno preprečuje krmilniku neskončne zanke s ponastavitvijo krmilnika, drugo pa, da sproži periodične dogodke z uporabo vgrajenega časovnika. Ko se mikrokrmilnik ponastavi (ali vklopi), je v načinu časovnika in ponavadi ponastavi MCU po 32 milisekundah. Ta vrstica krmilniku preprečuje, da bi to storil.
WDTCTL = WDTPW + WDTHOLD;
Če nastavite register P1DIR na vrednost 0x07, nastavite smer pin0, pin1 in pin2 kot izhod. Če nastavite P1OUT na 0x30, ga nastavite na vhod z vgrajenimi upori na pul4 in pin5. Nastavitev P1REN na 0x30 omogoča notranje vlečenje na teh zatičih. P1IE omogoča prekinitev, kjer P1IES izbere prehod med visokimi in nizkimi kot prekinitveni rob na teh nožicah.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Naslednja vrstica omogoča način nizke porabe in omogoča GIE v registru stanja, tako da je mogoče sprejemati prekinitve.
__bis_SR_register (LPM4bits + GIE)
Programski števec se nastavi z naslovom vektorja vrat 1 z uporabo makra.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
Spodnja koda enega za drugim preklopi vsako LED-diodo, priključeno na pin0, pin1, pin2.
če (šteje% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; štetje ++; } sicer če (šteje% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; štetje ++; } else { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; štetje ++; }
Shema vezja 2:
Podobno poskusimo z drugim zatičem, da bomo koncept bolje razumeli. Torej je tu gumb pritisnjen na pin 2.0 namesto na pin 1.5. spremenjeno vezje je naslednje. Tudi to vezje se uporablja za preizkušanje programa prekinitve gumba MSP430.
Tu se za vnos uporabljajo vrata 2. Torej je treba uporabiti drugačen vektor prekinitve. P1.4 in P2.0 sprejeti vhode.
Ker se vrata 2 uporabljajo samo za vhod, je P2DIR nastavljen na 0. Če želite pin0 vhoda 2 nastaviti kot vhod z omogočenimi notranjimi vlečnimi upori, je treba registra P2OUT in P2REN nastaviti z vrednostjo 1. Če želite omogočiti prekinitev na pin0 vhoda 2 in tudi za izbiro roba prekinitve sta P2IE in P2IES nastavljena z vrednostjo 1. Če želite ponastaviti zastavico v vratih 2, se P2IFG izbriše, tako da lahko zastavico znova nastavite na pojav prekinitve.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Ko je vir prekinitve iz vrat 1, potem sveti LED, priključena na nožico 1 na vratih 1. Ko vir prekinitve pripada vhodu 2, potem sveti LED, priključena na zatič 2 vhoda 1.
#pragma vector = PORT1_VECTOR __prekini void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; za (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __prekini void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; za (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Nalaganje programa na MSP430 s CCS
Če želite projekt naložiti na zagonsko ploščico in odpraviti napake, izberite projekt in v orodni vrstici kliknite ikono za odpravljanje napak. Druga možnost je, da pritisnete F11 ali kliknete RunàDebug, da vstopite v način za odpravljanje napak.
Ko vstopite v način odpravljanja napak, pritisnite zeleni gumb za zagon, da v MCU prosto zaženete naloženo kodo. Zdaj, ko pritisnete gumb, se zaradi spremembe roba sproži prekinitev, kar povzroči spremembo stanja LED.
Prekinitveni program na MSP430
Ko je koda uspešno naložena, jo lahko preizkusimo s preprostim gumbom. Vzorec LED se bo spremenil v skladu z našim programom vsakič, ko bomo s pritiskom na gumb dali prekinitev.
Celotno delo najdete v spodnjem videoposnetku. Upam, da ste uživali v vadnici in se naučili kaj koristnega. Če imate kakršna koli vprašanja, jih pustite v oddelku za komentarje ali uporabite naša forum za druga tehnična vprašanja.