- Hvorfor har vi brug for afbrydelse?
- Typer af afbrydelse i MSP430
- Afbryd programstyring i MSP430
- MSP430 kredsløb til test af GPIO-afbrydelse
- Programmering MSP430 til afbrydelser
- Uploader program til MSP430 fra CCS
- Afbryd program på MSP430
Overvej et simpelt digitalt ur, der er programmeret til bare at vise dig tid, forestil dig nu, at du vil ændre sin tidszone. Hvad ville du gøre? Du skal blot trykke på en knap, der skifter til menuen, der giver dig mulighed for at ændre tidszonen. Her kan systemet ikke forudsige din eksterne afbrydelse af sine tidsbesparende processer og kan ikke bede dig om at vente, da det er optaget med at øge sekundernes værdi på dit ur. Det er her, afbrydelserne er nyttige.
Afbrydelser behøver ikke altid at være eksterne; det kan også være internt. De fleste gange i en indlejret afbrydelse letter også kommunikation mellem to perifere enheder i CPU'en. Overvej, at en forudindstillet timer nulstilles, og en afbrydelse udløses, når tiden når værdien i timeregistret. Interrupthandleren kan bruges til at starte de andre perifere enheder som DMA.
I denne vejledning har vi brugt de eksterne afbrydelser på MSP430 til at skifte forskellige lysdioder. Når en ekstern afbrydelse gives ved ændring af tilstand ved hjælp af en trykknap, overføres kontrollen (forudgående) til ISR, og den gør det nødvendigt. For at kende det grundlæggende som CCS-miljøopsætning til MSP430G2-startpladen skal du følge dette link, komme i gang med MSP430 ved hjælp af CCS, fordi vi ikke kommer i detaljer om det i denne tutorial. Tjek også andre MSP430-baserede tutorials ved hjælp af Energia IDE og CCS ved at følge linket.
Hvorfor har vi brug for afbrydelse?
Afbrydelser er nødvendige for at gemme afstemningsomkostningerne i et integreret system. De kaldes, når opgaver med højere prioritet er nødvendige for at blive udført ved at foregribe den aktuelle kørende opgave. Det kan også bruges til at vække CPU'en fra lavt strømtilstande. Når det vækkes af et eksternt signal, kantovergang gennem en GPIO-port, udføres ISR, og CPU'en vender tilbage til Low Power Mode.
Typer af afbrydelse i MSP430
De afbryder i MSP430 kommet under den følgende typer-
- System nulstilling
- Ikke-maskerbar afbrydelse
- Maskerbar afbrydelse
- Vektorede og ikke-vektorerede afbrydelser
System nulstilling:
Det kan forekomme på grund af forsyningsspænding (Vcc) og på grund af et lavt signal i RST / NMI-pin med Reset-tilstand valgt og kan også forekomme på grund af overvågning af vagthundtimeren og overtrædelse af sikkerhedsnøglen.
Ikke-maskerbar afbrydelse:
Disse afbrydelser kan ikke maskeres af CPU-instruktionerne. Når den generelle afbrydelse er aktiveret, kan den ikke-maskerbare afbrydelse ikke omdirigeres fra behandlingen. Dette genereres af kilder som oscillatorfejl og en kant manuelt givet til RST / NMI (i NMI-tilstand).
Maskerbar afbrydelse:
Når der opstår et afbrydelse, og hvis det kan maskeres af en CPU-instruktion, er det Maskable Interrupt. De behøver ikke altid være eksterne. De er også afhængige af perifert udstyr og deres funktioner. De eksterne portafbrydelser, der anvendes her, falder ind under denne kategori.
Vectored Interrupts og Non-Vectored Interrupts:
Vektoreret: I dette tilfælde giver enheder, der afbryder, os kilden til afbrydelsen ved at passere afbrydelsesvektoradressen. Her er adressen på ISR fast, og kontrollen overføres til den adresse, og ISR tager sig af resten.
Ikke-vektoreret: Her har alle afbrydelser fælles ISR. Når der opstår en afbrydelse fra en kilde, der ikke er vektor, overføres kontrollen til den fælles adresse, som alle de ikke-vektorerede afbrydelser deler.
Afbryd programstyring i MSP430
Når afbrydelsen opstår, tændes MCLK, og CPU'en kaldes tilbage fra OFF-tilstanden. Når styringen af programmet overføres til ISR-adressen efter forekomsten af afbrydelsen, flyttes værdierne i programtælleren og statusregistret videre til stakken.
Efterfølgende ryddes statusregistret, hvorved GIE ryddes og tilstanden med lavt strømforbrug afsluttes. Afbrydelse med den højeste prioritet vælges og udføres ved at placere afbrydelsesvektoradressen i programtælleren. Før vi kommer til vores MSP430 GPIO Interrupt-eksempelkode, er det vigtigt at forstå funktionen af havneregistre, der er involveret i den.
Portregistre til GPIO-kontrol på MSP430:
PxDIR: Det er et portretningskontrolregister. Det giver programmøren mulighed for specifikt at vælge sin funktion ved at skrive 0 eller 1. Hvis en pin er valgt som 1, fungerer den som en output. Betragt port 1 som en 8-bit port, og hvis benene 2 og 3 skal tildeles som outputporte, skal P1DIR-registret indstilles med værdien 0x0C.
PxIN: Det er et skrivebeskyttet register, og de aktuelle værdier i porten kan læses ved hjælp af dette register.
PxOUT: Dette bestemte register kan bruges til at skrive værdier direkte til portene. Dette er kun muligt, når pullup / nedrullingsregistret er deaktiveret.
PxREN: Det er et 8-bit register, der bruges til at aktivere eller deaktivere pullup / pulldown-registeret. Når en pin er indstillet som 1 i både PxREN- og PxOUT-registret, trækkes den pågældende pin op.
PxDIR |
PxREN |
PxOUT |
I / O-konfiguration |
0 |
0 |
x |
Input med modstande deaktiveret |
0 |
1 |
0 |
Input med intern nedrulning aktiveret |
0 |
1 |
1 |
Input med intern pullup aktiveret |
1 |
x |
x |
Output - PxREN har ingen effekt |
PxSEL og PxSEL2: Da alle benene i MSP430 er multipleksede, skal den særlige funktion vælges, før den bruges. Når både PxSEL- og PxSEL2-registre er indstillet som 0 for en bestemt pin, så vælges I / O til det generelle formål. Når PxSEL er indstillet til 1, vælges den primære perifere funktion osv.
PxIE: Det aktiverer eller deaktiverer afbrydelser for en bestemt pin i en port x.
PxIES: Det vælger den kant, hvorfra et afbrydelse genereres. For 0 vælges en stigende kant, og for 1 vælges en faldende kant.
MSP430 kredsløb til test af GPIO-afbrydelse
MSP430-kredsløbet, der bruges til at teste vores MSP430-interrupteksempel, vises nedenfor.
Jorden på tavlen bruges til at jorde både LED og knappen. De diagonalt modsatte sider af trykknappen er normalt åbne terminaler og forbindes, når trykknappen trykkes ned. En modstand er tilsluttet før LED'en for at undgå det høje strømforbrug af LED'en. Normalt anvendes lave modstande i området 100ohm - 220ohm.
Vi bruger 3 forskellige koder for at få en bedre forståelse af port Interrupts. De to første koder bruger det samme kredsløb som i kredsløbsdiagrammet 1. Lad os dykke ned i koden. Efter oprettelsen af forbindelserne ser min opsætning sådan ud.
Programmering MSP430 til afbrydelser
Det komplette MSP430 Interrupt-program findes nederst på denne side, forklaringen på koden er som følger.
Nedenstående linje stopper vagthundtimeren fra drift. Watchdog timer udfører normalt to operationer. Den ene forhindrer controlleren i uendelige sløjfer ved at nulstille controlleren, og den anden er, at den udløser periodiske hændelser ved hjælp af den indbyggede timer. Når en mikrokontroller nulstilles (eller tændes), er den i timer-tilstand og har tendens til at nulstille MCU'en efter 32 millisekunder. Denne linje forhindrer controlleren i at gøre det.
WDTCTL = WDTPW + WDTHOLD;
Indstilling af P1DIR- registeret til værdien 0x07 indstiller retningen for pin0, pin1 og pin2 som output. Indstilling af P1OUT til 0x30 konfigurerer den til en indgang med interne pullup-modstande aktiveret på pin4 og pin5. Indstilling af P1REN til 0x30 muliggør intern pullup på disse ben. P1IE muliggør afbrydelse, hvor P1IES vælger den høje til lave overgang som afbrydelseskanten på disse ben.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Næste linje aktiverer lavt strømtilstand og aktiverer GIE i statusregistret, så afbrydelserne kan modtages.
__bis_SR_register (LPM4bits + GIE)
Programtælleren indstilles med adressen på port 1-vektoren ved hjælp af makroen.
PORT1_VECTOR . #pragma-vektor = PORT1_VECTOR __interrupt ugyldig Port_1 (ugyldig)
Nedenstående kode skifter hver af de lysdioder, der er tilsluttet pin0, pin1, pin2 en efter en.
if (count% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; tælle ++; } ellers hvis (tæl% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; tælle ++; } andet { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; tælle ++; }
Kredsløbsdiagram 2:
Lad os ligeledes prøve en anden nål for at forstå konceptet meget bedre. Så her er trykknappen forbundet til pin 2.0 i stedet for pin 1.5. det modificerede kredsløb er som følger. Igen bruges dette kredsløb til at teste MSP430-afbrydelsesprogrammet.
Her bruges port 2 til input. Så forskellige afbrydelsesvektorer skal bruges. P1.4 og P2.0 tager indgangene.
Da port 2 kun bruges til input, er P2DIR indstillet til 0. For at indstille pin0 på port 2 som input med interne pull-up-modstande aktiveret, skal registerene P2OUT og P2REN indstilles med en værdi på 1. For at aktivere afbryde på pin0 i port 2 og også for at vælge kanten på afbrydelsen, er P2IE og P2IES indstillet med en værdi på 1. For at nulstille flag i port 2, er P2IFG ryddet, så flag kan indstilles igen på afbrydelsen.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Når afbrydelseskilden kommer fra port 1, lyser LED'en, der er tilsluttet pin1 i port 1. Når afbrydelseskilden hører til port 2, lyser LED'en, der er tilsluttet pin2 i port 1.
#pragma-vektor = PORT1_VECTOR __interrupt ugyldig Port_1 (ugyldig) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; for (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma-vektor = PORT2_VECTOR __interrupt ugyldig Port_2 (ugyldig) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; for (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Uploader program til MSP430 fra CCS
For at indlæse projektet på startpladen og fejle det skal du vælge projektet og klikke på fejlretningsikonet på værktøjslinjen. Alternativt kan du trykke på F11 eller klikke på RunàDebug for at gå ind i fejlretningstilstand.
Når fejlretningstilstanden er aktiveret, skal du trykke på den grønne farvekørselsknap for frit at køre den indlæste kode i MCU'en. Nu, når trykknappen trykkes ned, udløses afbrydelse af ændringen i kant, hvilket bevirker ændringen i LED-tilstanden.
Afbryd program på MSP430
Når koden er uploadet med succes, kan vi teste den ved blot at bruge trykknappen. LED-mønsteret ændres i henhold til vores program, hver gang der afbrydes ved hjælp af trykknappen.
Det komplette arbejde kan findes i den linkede video nedenfor. Håber du nød tutorialen og lærte noget nyttigt. Hvis du har spørgsmål, skal du lade dem være i kommentarsektionen eller bruge vores fora til andre tekniske spørgsmål.