- Hvorfor trenger vi avbrudd?
- Typer avbrudd i MSP430
- Avbryt programkontroll i MSP430
- MSP430 krets for å teste GPIO Interrupt
- Programmering MSP430 for avbrudd
- Laster opp program til MSP430 fra CCS
- Avbryt program på MSP430
Vurder en enkel digital klokke som er programmert til å bare vise deg tid, forestill deg nå at du vil endre tidssonen. Hva ville du gjort? Du trykker ganske enkelt på en knapp som endres til menyen som lar deg endre tidssonen. Her kan ikke systemet forutsi din eksterne forstyrrelse til prosessene for tidsforhold og kan ikke be deg om å vente siden det er opptatt med å øke sekundverdien på klokken din. Det er her avbruddene er nyttige.
Avbrudd trenger ikke alltid å være eksterne; det kan også være internt. De fleste ganger i en innebygd avbrudd forenkler også kommunikasjon mellom to eksterne enheter i CPUen. Tenk på at en forhåndsinnstilt tidtaker er tilbakestilt, og et avbrudd utløses når tiden når verdien i tidtakerregisteret. Avbruddshåndtereren kan brukes til å initiere andre eksterne enheter som DMA.
I denne opplæringen har vi brukt de eksterne avbruddene på MSP430 for å veksle forskjellige lysdioder. Når et eksternt avbrudd blir gitt ved endring av tilstand ved hjelp av en trykknapp, blir kontrollen overført (forhindret) til ISR, og den gjør det nødvendige. For å vite det grunnleggende som CCS-miljøoppsett for MSP430G2-startplaten, følg denne lenken for å komme i gang med MSP430 ved å bruke CCS fordi vi ikke får detaljer om det i denne veiledningen. Sjekk også andre MSP430-baserte opplæringsprogrammer ved hjelp av Energia IDE og CCS ved å følge lenken.
Hvorfor trenger vi avbrudd?
Det er behov for avbrudd for å lagre valgomkostningene i et innebygd system. De blir kalt inn når oppgavene med høyere prioritet er nødvendige for å utføres ved å forutse den nåværende løpende oppgaven. Den kan også brukes til å vekke CPUen fra moduser med lav strøm. Når den blir vekket av et eksternt signalets kantovergang gjennom en GPIO-port, blir ISR utført, og CPU-en går tilbake til Low Power Mode.
Typer avbrudd i MSP430
De avbrudd i MSP430 kommer under følgende typer-
- System Reset
- Ikke-maskerbar avbrudd
- Maskable Interrupt
- Vektorer og ikke-vektorerte avbrudd
System Tilbakestill:
Det kan oppstå på grunn av forsyningsspenning (Vcc) og på grunn av et lavt signal i RST / NMI-pinne med tilbakestillingsmodus valgt og kan også oppstå på grunn av overløp av vakthundtimer og brudd på sikkerhetsnøkkel.
Ikke-maskerbar avbrudd:
Disse avbruddene kan ikke maskeres av CPU-instruksjonene. Når den generelle avbruddet er aktivert, kan den ikke-maskerbare avbruddet ikke viderekobles fra behandlingen. Dette genereres av kilder som oscillatorfeil og en kant manuelt gitt til RST / NMI (i NMI-modus).
Maskable Interrupt:
Når det oppstår et avbrudd, og hvis det kan maskeres av en CPU-instruksjon, er det Maskable Interrupt. De trenger ikke alltid være eksterne. De er også avhengige av eksterne enheter og deres funksjoner. De eksterne portavbruddene som brukes her, faller inn under denne kategorien.
Vectored Interrupts og Non-Vectored Interrupts:
Vektorert: I dette tilfellet gir enheter som avbryter kilden til avbruddet ved å sende avbruddsvektoradressen. Her er adressen til ISR fast, og kontrollen overføres til den adressen, og ISR tar seg av resten.
Ikke-vektorert: Her har alle avbruddene felles ISR. Når det oppstår et avbrudd fra en kilde som ikke er vektor, overføres kontrollen til den vanlige adressen, som alle de ikke-vektorerte avbruddene deler.
Avbryt programkontroll i MSP430
Når avbruddet inntreffer, slås MCLK PÅ og CPUen kalles tilbake fra AV-tilstanden. Når kontrollen av programmet overføres til ISR-adressen etter avbruddet, flyttes verdiene i programtelleren og statusregisteret til stakken.
Fortløpende tømmes statusregisteret, og sletter dermed GIE og avslutter laveffektsmodus. Avbrudd med høyest prioritet velges og utføres ved å plassere avbrytelsesvektoradressen i programtelleren. Før vi kommer til MSP430 GPIO Interrupt Example Code, er det viktig å forstå hvordan portregistrene er involvert i den.
Portregister for GPIO-kontroll på MSP430:
PxDIR: Det er et portretningskontrollregister. Det lar programmereren spesifikt velge funksjonen ved å skrive 0 eller 1. Hvis en pin er valgt som 1, fungerer den som en utgang. Betrakt port 1 som en 8-biters port, og hvis pinnene 2 og 3 skal tildeles som utgangsporter, må P1DIR-registeret settes med verdien 0x0C.
PxIN: Det er et skrivebeskyttet register, og gjeldende verdier i porten kan leses ved hjelp av dette registeret.
PxOUT: Dette bestemte registeret kan brukes til å skrive verdier direkte til portene. Dette er bare mulig når pullup / nedtrekksregisteret er deaktivert.
PxREN: Det er et 8-biters register som brukes til å aktivere eller deaktivere pullup / nedtrekksregisteret. Når en pinne er satt til 1 i både PxREN- og PxOUT-registeret, trekkes den spesielle pinnen opp.
PxDIR |
PxREN |
PxOUT |
I / O-konfigurasjon |
0 |
0 |
X |
Inngang med motstand deaktivert |
0 |
1 |
0 |
Inndata med intern nedtrekking aktivert |
0 |
1 |
1 |
Inngang med intern pullup aktivert |
1 |
X |
X |
Utgang - PxREN har ingen effekt |
PxSEL og PxSEL2: Ettersom alle pinnene i MSP430 er multipleksede, må den spesielle funksjonen velges før du bruker den. Når både PxSEL- og PxSEL2-registerene er satt til 0 for en bestemt pin, så velges den generelle I / O. Når PxSEL er satt til 1, velges den primære perifere funksjonen, og så videre.
PxIE: Det aktiverer eller deaktiverer avbrudd for en bestemt pin i en port x.
PxIES: Den velger kanten der et avbrudd genereres. For 0 velges en stigende kant og for 1 velges en fallende kant.
MSP430 krets for å teste GPIO Interrupt
MSP430-kretsen som brukes til å teste vår MSP430 Interrupt Eksempel- kode, vises nedenfor.
Bakken på brettet brukes til å jorde både lysdioden og knappen. De diagonalt motsatte sidene av trykknappen er normalt åpne terminaler og kobles til når trykknappen trykkes ned. En motstand er koblet til LED for å unngå høyt strømforbruk av LED. Vanligvis brukes lave motstander i området 100ohm - 220ohm.
Vi bruker 3 forskjellige koder for å få en bedre forståelse av port Interrupts. De to første kodene bruker samme krets som i kretsdiagrammet 1. La oss dykke ned i koden. Etter at tilkoblingene ble gjort, ser oppsettet mitt slik ut.
Programmering MSP430 for avbrudd
Det komplette MSP430 Interrupt-programmet finner du nederst på denne siden, forklaringen på koden er som følger.
Linjen nedenfor stopper vakthundtimeren fra drift. Vakthundstimeren utfører vanligvis to operasjoner. Den ene hindrer kontrolleren fra uendelige sløyfer ved å tilbakestille kontrolleren, og den andre er at den utløser periodiske hendelser ved hjelp av den innebygde tidtakeren. Når en mikrokontroller tilbakestilles (eller slås på), er den i timermodus og har en tendens til å tilbakestille MCU etter 32 millisekunder. Denne linjen hindrer kontrolleren i å gjøre det.
WDTCTL = WDTPW + WDTHOLD;
Å sette P1DIR- registeret til verdien 0x07 setter retningen til pin0, pin1 og pin2 som utgang. Hvis du setter P1OUT til 0x30, konfigurerer den en inngang med interne mottaksmotstander aktivert på pin4 og pin5. Hvis du setter P1REN til 0x30, kan du trekke inn disse pinnene internt. P1IE muliggjør avbrudd, der P1IES velger høy til lav overgang som avbruddskant på disse pinnene.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Neste linje aktiverer laveffektsmodus og aktiverer GIE i statusregisteret slik at avbruddene kan mottas.
__bis_SR_register (LPM4bits + GIE)
Programtelleren er satt med adressen til port 1-vektoren ved hjelp av makroen.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __avbrudd ugyldig Port_1 (ugyldig)
Koden nedenfor bytter hver av lysdiodene som er koblet til pin0, pin1, pin2 en etter en.
hvis (tell% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; telle ++; } annet hvis (tell% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; telle ++; } annet { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; telle ++; }
Kretsdiagram 2:
På samme måte, la oss prøve en annen pin for å forstå konseptet mye bedre. Så her er trykknappen koblet til pin 2.0 i stedet for pin 1.5. den modifiserte kretsen er som følger. Igjen brukes denne kretsen til å teste avbruddsprogrammet for MSP430-knappen.
Her brukes port 2 til input. Så forskjellige avbrytelsesvektorer må brukes. P1.4 og P2.0 tar inngangene.
Ettersom port 2 bare brukes til inngang, er P2DIR satt til 0. For å sette pin0 til port 2 som inngang med interne opptrekksmotstander aktivert, må registrene P2OUT og P2REN settes med verdien 1. For å aktivere avbryte på pin0 i port 2 og også for å velge kanten på avbruddet, er P2IE og P2IES satt med en verdi på 1. For å tilbakestille flagget i port 2, er P2IFG fjernet, slik at flagget kan settes på nytt på forekomsten av avbruddet.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Når avbruddskilden kommer fra port 1, lyser LED-en som er koblet til pin1 på port 1. Når avbruddskilden tilhører port 2, lyser LED-en som er koblet til pin2 i port 1.
#pragmavektor = PORT1_VECTOR __avbrudd ugyldig Port_1 (ugyldig) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; for (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma-vektor = PORT2_VECTOR __avbrudd ugyldig Port_2 (ugyldig) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; for (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Laster opp program til MSP430 fra CCS
For å laste prosjektet til startplaten og feilsøke det, velg prosjektet og klikk feilsøkingsikonet på verktøylinjen. Alternativt kan du trykke på F11 eller klikke på RunàDebug for å gå inn i feilsøkingsmodus.
Når feilsøkingsmodus er aktivert, trykker du på den grønne fargeknappen for å kjøre den lastede koden fritt i MCU. Nå, når trykknappen trykkes ned, utløses avbrudd av endringen i kanten, og be om endring i tilstanden til LED.
Avbryt program på MSP430
Etter at koden er lastet opp, kan vi teste den ved å bruke trykknappen. LED-mønsteret vil endres i henhold til vårt program når et avbrudd gis ved hjelp av trykknappen.
Komplett arbeid finner du i videoen som er lenket nedenfor. Håper du likte opplæringen og lærte noe nyttig. Hvis du har spørsmål, kan du legge dem i kommentarfeltet eller bruke forumene våre for andre tekniske spørsmål.