- Varför behöver vi avbryta?
- Typer av avbrott i MSP430
- Avbryt programkontrollen i MSP430
- MSP430 krets för att testa GPIO-avbrott
- Programmering MSP430 för avbrott
- Ladda upp program till MSP430 från CCS
- Avbryt program på MSP430
Tänk på en enkel digital klocka som är programmerad för att bara visa dig tid, föreställ dig nu att du vill ändra sin tidszon. Vad skulle du göra? Du trycker helt enkelt på en knapp som ändras till menyn som gör att du kan ändra tidszonen. Här kan systemet inte förutsäga din externa avbrott till dess tidshanteringsprocesser och kan inte be dig vänta eftersom det är upptaget med att öka sekundernas värde på din klocka. Det är här avbrotten är praktiska.
Avbrott behöver inte alltid vara externa; det kan också vara internt. Oftast underlättar i en inbäddad avbrott också kommunikation mellan två kringutrustningar i CPU: n. Tänk på att en förinställd timer återställs och ett avbrott utlöses när tiden når värdet i timerregistret. Avbrottshanteraren kan användas för att initiera andra kringutrustning som DMA.
I den här handledningen har vi använt externa avbrott på MSP430 för att växla olika lysdioder. När ett externt avbrott ges av tillståndsförändringen med hjälp av en tryckknapp överförs kontrollen (föregås) till ISR och det gör det nödvändigt. För att känna till grunderna som CCS-miljöinställningar för MSP430G2-startplattan, följ den här länken för att komma igång med MSP430 med hjälp av CCS eftersom vi inte kommer att få detaljer om det i den här handledningen. Kontrollera även andra MSP430-baserade handledningar med Energia IDE och CCS genom att följa länken.
Varför behöver vi avbryta?
Avbrott behövs för att spara valet i ett inbäddat system. De kallas in när uppgifterna med högre prioritet behövs för att utföras genom att föregripa den aktuella löpande uppgiften. Det kan också användas för att väcka CPU från lägen för låg effekt. När den väcks av en övergång från en extern signal genom en GPIO-port körs ISR och CPU återgår igen till lågeffektläget.
Typer av avbrott i MSP430
De avbrott i MSP430 komma under följande typer-
- Systemåterställning
- Icke-maskerbart avbrott
- Maskable Interrupt
- Vektoriserade och icke-vektorerade avbrott
Systemåterställning:
Det kan uppstå på grund av matningsspänningen (Vcc) och på grund av en låg signal i RST / NMI stift med Reset-mod väljs och kan också uppstå på grund av orsaker som watchdog timer overflow och säkerhetsnyckel kränkning.
Icke-maskerbar avbrott:
Dessa avbrott kan inte maskeras av CPU-instruktionerna. När det allmänna avbrottet är aktiverat kan det icke-maskerbara avbrottet avledas från bearbetning. Detta genereras av källor som oscillatorfel och en kant manuellt ges till RST / NMI (i NMI-läge).
Maskable Interrupt:
När ett avbrott inträffar och om det kan maskeras av en CPU-instruktion, är det Maskable Interrupt. De behöver inte alltid vara externa. De är också beroende av kringutrustning och deras funktioner. De externa portavbrotten som används här faller under denna kategori.
Vectored Interrupts och Non-Vectored Interrupts:
Vectored: I det här fallet ger enheter som avbryter källan till avbrottet genom att skicka avbrottsadressen. Här är ISR-adressen fast och kontrollen överförs till den adressen och ISR tar hand om resten.
Icke-vektoriserad: Här har alla avbrott gemensam ISR. När ett avbrott inträffar från en icke-vektoriserad källa överförs kontrollen till den gemensamma adressen, till vilken alla icke-vektoriserade avbrott delar.
Avbryt programkontrollen i MSP430
När avbrottet inträffar slås MCLK PÅ och CPU återkallas från OFF-tillståndet. När kontrollen av programmet överförs till ISR-adressen efter avbrottet, förflyttas värdena i programräknaren och statusregistret till stacken.
I följd rensas statusregistret, vilket gör att GIE rensas och läget för låg effekt avslutas. Avbrott med högsta prioritet väljs och utförs genom att placera avbrottsvektoradressen i programräknaren. Innan vi kommer till vår MSP430 GPIO Interrupt Exempel-kod är det viktigt att förstå hur portregisterna är inblandade i den.
Portregister för GPIO-kontroll på MSP430:
PxDIR: Det är ett portriktningsregister. Det tillåter programmeraren att specifikt välja sin funktion genom att skriva 0 eller 1. Om en stift väljs som 1, fungerar den som en utgång. Anser port 1 som en 8-bitarsport, och om stiften 2 och 3 ska tilldelas som utgångsportar måste P1DIR-registret ställas in med värdet 0x0C.
PxIN: Det är ett skrivskyddat register och de aktuella värdena i porten kan läsas med detta register.
PxOUT: Det här registret kan användas för att skriva värden direkt till portarna. Detta är endast möjligt när pullup / nedrullningsregistret är inaktiverat.
PxREN: Det är ett 8-bitars register som används för att aktivera eller inaktivera pullup / nedrullningsregistret. När en stift är inställd som 1 i både PxREN- och PxOUT-registret dras den särskilda stiftet upp.
PxDIR |
PxREN |
PxOUT |
I / O-konfiguration |
0 |
0 |
X |
Ingång med motstånd inaktiverat |
0 |
1 |
0 |
Ingång med intern nedrullning aktiverad |
0 |
1 |
1 |
Ingång med intern pullup aktiverad |
1 |
X |
X |
Output - PxREN har ingen effekt |
PxSEL och PxSEL2: Eftersom alla stift i MSP430 är multiplexade, måste den specifika funktionen väljas innan den används. När både PxSEL- och PxSEL2-registren är inställda på 0 för en viss stift, väljs I / O för allmänt ändamål. När PxSEL är inställt som 1, väljs den primära perifera funktionen och så vidare.
PxIE: Det aktiverar eller inaktiverar avbrott för en viss stift i en port x.
PxIES: Den väljer kanten vid vilken ett avbrott genereras. För 0 väljs en stigande kant och för 1 väljs en fallande kant.
MSP430 krets för att testa GPIO-avbrott
MSP430-kretsen som används för att testa vår MSP430 Interrupt Exempel- kod visas nedan.
Jordning av brädet används för att jorda både lysdioden och knappen. De diagonalt motsatta sidorna av tryckknappen är normalt öppna terminaler och ansluts när tryckknappen trycks ner. Ett motstånd är anslutet före lysdioden för att undvika hög strömförbrukning av lysdioden. Vanligtvis används låga motstånd i området 100ohm - 220ohm.
Vi använder tre olika koder för att få en bättre förståelse för portavbrott. De första två koderna använder samma krets som i kretsdiagrammet 1. Låt oss dyka in i koden. När anslutningarna gjordes ser min inställning ut så här.
Programmering MSP430 för avbrott
Det kompletta MSP430-avbrottsprogrammet hittar du längst ner på denna sida, förklaringen till koden är som följer.
Raden nedan stoppar övervakningstimern från att fungera. Watchdog timer utför vanligtvis två operationer. Det ena hindrar styrenheten från oändliga slingor genom att återställa styrenheten och den andra är att den utlöser periodiska händelser med hjälp av den inbyggda timern. När en mikrokontroller återställs (eller slås på), är den i timerläge och tenderar att återställa MCU efter 32 miljoner sekunder. Denna linje hindrar styrenheten från att göra det.
WDTCTL = WDTPW + WDTHOLD;
Att ställa in P1DIR- registret till värdet 0x07 ställer in riktningen för pin0, pin1 och pin2 som utgång. Om du ställer in P1OUT till 0x30 konfigureras den till en ingång med interna pullup-motstånd aktiverade på pin4 och pin5. Om du ställer in P1REN på 0x30 kan du dra in dessa stift internt. P1IE möjliggör avbrott, där P1IES väljer hög till låg övergång som avbrottskant på dessa stift.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Nästa rad aktiverar lågeffektsläget och aktiverar GIE i statusregistret så att avbrott kan tas emot.
__bis_SR_register (LPM4bits + GIE)
Programräknaren ställs in med adressen för port 1-vektorn med hjälp av makrot.
PORT1_VECTOR . #pragmavektor = PORT1_VECTOR __avbrott ogiltigt Port_1 (ogiltigt)
Koden nedan växlar var och en av lysdioderna som är anslutna till pin0, pin1, pin2 en efter en.
if (räkna% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; räkna ++; } annars om (räkna% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; räkna ++; } annat { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; räkna ++; }
Kretsdiagram 2:
På samma sätt, låt oss prova en annan stift för att förstå konceptet mycket bättre. Så här är tryckknappen ansluten till stift 2.0 istället för stift 1.5. den modifierade kretsen är som följer. Återigen används denna krets för att testa MSP430-avbrottsprogrammet.
Här används port 2 för inmatning. Så olika avbrottsvektorer måste användas. P1.4 och P2.0 tar ingångarna.
Eftersom port 2 endast används för ingång, är P2DIR inställd på 0. För att ställa in pin0 på port 2 som ingång med inre uppdragningsmotstånd aktiverat, måste registren P2OUT och P2REN ställas in med värdet 1. För att aktivera avbryt på pin0 på port 2 och även för att välja kanten på avbrottet är P2IE och P2IES inställt med värdet 1. För att återställa flaggan i port 2 rensas P2IFG så att flaggan kan ställas in igen avbrott.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
När avbrottskällan kommer från port 1 lyser lysdioden som är ansluten till stift 1 på port 1. När avbrytarkällan tillhör port 2 lyser lysdioden som är ansluten till pin2 i port 1.
#pragmavektor = PORT1_VECTOR __avbrott ogiltigt Port_1 (ogiltigt) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; för (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragmavektor = PORT2_VECTOR __avbrott ogiltig Port_2 (ogiltig) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; för (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Ladda upp program till MSP430 från CCS
För att ladda projektet till startplattan och felsöka det, välj projektet och klicka på felsökningsikonen i verktygsfältet. Alternativt kan du trycka på F11 eller klicka på RunàDebug för att gå in i felsökningsläget.
När felsökningsläget har aktiverats trycker du på den gröna körknappen för att fritt köra den laddade koden i MCU. Nu, när tryckknappen trycks ned, utlöses avbrottet av kantförändringen, vilket leder till att lysdioden ändras.
Avbryt program på MSP430
När koden har laddats upp kan vi testa den genom att helt enkelt använda tryckknappen. LED-mönstret ändras enligt vårt program när ett avbrott ges med tryckknappen.
Hela arbetet finns i videon som länkas nedan. Hoppas att du gillade självstudien och lärde dig något användbart. Om du har några frågor lämnar du dem i kommentarsektionen eller använder våra forum för andra tekniska frågor.