- Waarom hebben we onderbreking nodig?
- Soorten onderbrekingen in MSP430
- Programmabeheer onderbreken in MSP430
- MSP430 Circuit om GPIO-onderbreking te testen
- MSP430 programmeren voor onderbrekingen
- Programma uploaden naar MSP430 vanuit CCS
- Interrupt-programma op MSP430
Overweeg een eenvoudig digitaal horloge dat is geprogrammeerd om u alleen de tijd te laten zien, stel u nu voor dat u de tijdzone wilt wijzigen. Wat zou jij doen? U drukt eenvoudig op een knop die naar het menu gaat waarmee u de tijdzone kunt wijzigen. Hier kan het systeem uw externe onderbreking van de tijdregistratieprocessen niet voorspellen en kan het u niet vragen te wachten, aangezien het bezig is met het verhogen van de secondenwaarde op uw horloge. Dit is waar de interrupts van pas komen.
Onderbrekingen hoeven niet altijd extern te zijn; het kan ook intern zijn. Meestal vergemakkelijkt een ingebouwde interrupt ook de communicatie tussen twee randapparatuur van de CPU. Stel dat een vooraf ingestelde timer wordt gereset en een onderbreking wordt geactiveerd wanneer de tijd de waarde in het timerregister bereikt. De interrupt-handler kan worden gebruikt om de andere randapparatuur zoals DMA te starten.
In deze tutorial hebben we de externe interrupts op MSP430 gebruikt om verschillende LED's te schakelen. Wanneer een externe onderbreking wordt gegeven door de verandering van toestand met behulp van een drukknop, wordt de besturing overgedragen (voorafgegaan) aan de ISR en doet het wat nodig is. Om de basisprincipes te kennen, zoals de CCS-omgevingsinstellingen voor het MSP430G2-startpunt, volgt u deze link om aan de slag te gaan met MSP430 met CCS, omdat we daar in deze tutorial niet op in zullen gaan. Bekijk ook andere op MSP430 gebaseerde tutorials met Energia IDE en CCS door de link te volgen.
Waarom hebben we onderbreking nodig?
Onderbrekingen zijn nodig om de polling-overhead in een ingebed systeem te besparen. Ze worden ingeschakeld wanneer de taken met een hogere prioriteit moeten worden uitgevoerd door vooruit te lopen op de huidige lopende taak. Het kan ook worden gebruikt om de CPU uit de energiebesparende modi te halen. Wanneer het wordt gewekt door de randovergang van een extern signaal via een GPIO-poort, wordt de ISR uitgevoerd en keert de CPU weer terug naar de energiebesparende modus.
Soorten onderbrekingen in MSP430
De interrupts in MSP430 vallen onder de volgende typen:
- Systeemreset
- Niet-maskeerbare onderbreking
- Maskeerbare onderbreking
- Vectored en niet-vectored interrupts
Systeemreset:
Het kan optreden als gevolg van voedingsspanning (Vcc) en als gevolg van een laag signaal in de RST / NMI-pin met geselecteerde resetmodus, en kan ook optreden als gevolg van overloop van de watchdog-timer en schending van de beveiligingssleutel.
Niet-maskeerbare onderbreking:
Deze interrupts kunnen niet worden gemaskeerd door de CPU-instructies. Zodra de algemene onderbreking is ingeschakeld, kan de niet-maskeerbare onderbreking niet worden omgeleid van de verwerking. Dit wordt gegenereerd door bronnen zoals oscillatorfouten en een handmatig gegeven rand aan de RST / NMI (in NMI-modus).
Maskeerbare onderbreking:
Wanneer er een onderbreking optreedt en deze kan worden gemaskeerd door een CPU-instructie, dan is dit Maskable Interrupt. Ze hoeven niet altijd extern te zijn. Ze zijn ook afhankelijk van randapparatuur en hun functies. De externe poortonderbrekingen die hier worden gebruikt, vallen onder deze categorie.
Vectored interrupts en niet-vectored interrupts:
Vectored: in dit geval geven apparaten die interrupt ons de bron van de interrupt door het interruptvectoradres door te geven. Hier staat het adres van de ISR vast en wordt de besturing naar dat adres overgedragen en doet de ISR de rest.
Niet-vectored: hier hebben alle interrupts een gemeenschappelijke ISR. Wanneer een onderbreking optreedt vanuit een niet-vectored bron, wordt de besturing overgedragen naar het gemeenschappelijke adres, waarnaar alle niet-vectored onderbrekingen delen.
Programmabeheer onderbreken in MSP430
Wanneer de onderbreking optreedt, wordt MCLK ingeschakeld en wordt de CPU teruggeroepen vanuit de stand UIT. Omdat de besturing van het programma wordt overgedragen aan het ISR-adres na het optreden van de onderbreking, worden de waarden in de programmateller en het statusregister verplaatst naar de stapel.
Achtereenvolgens wordt Status Registreer gewist, waardoor de GIE clearing en tot beëindiging van de low power mode. Interrupt met de hoogste prioriteit wordt geselecteerd en uitgevoerd door het interruptvectoradres in de programmateller te plaatsen. Voordat we bij onze MSP430 GPIO Interrupt-voorbeeldcode komen, is het belangrijk om de werking van de daarbij betrokken havenregisters te begrijpen.
Poortregisters voor GPIO-besturing op MSP430:
PxDIR: Het is een register voor poortrichtingcontrole. Het stelt de programmeur in staat om specifiek zijn functie te selecteren door 0 of 1 te schrijven. Als een pin is geselecteerd als 1, dan fungeert het als een output. Beschouw poort 1 als een 8-bits poort, en als de pinnen 2 en 3 moeten worden toegewezen als uitgangspoorten, moet het P1DIR-register worden ingesteld op de waarde 0x0C.
PxIN: het is een alleen-lezen register en de huidige waarden in de poort kunnen met dit register worden gelezen.
PxOUT: dit specifieke register kan worden gebruikt om waarden rechtstreeks naar de poorten te schrijven. Dit is alleen mogelijk als het pullup / pulldown-register is uitgeschakeld.
PxREN: Het is een 8-bits register dat wordt gebruikt om het pullup / pulldown-register in of uit te schakelen. Als een pin is ingesteld als 1 in zowel het PxREN- als het PxOUT-register, wordt de betreffende pin uitgetrokken.
PxDIR |
PxREN |
PxOUT |
I / O-configuratie |
0 |
0 |
X |
Ingang met weerstanden uitgeschakeld |
0 |
1 |
0 |
Invoer met interne pulldown ingeschakeld |
0 |
1 |
1 |
Invoer met interne pullup ingeschakeld |
1 |
X |
X |
Output - PxREN heeft geen effect |
PxSEL en PxSEL2: aangezien alle pinnen in MSP430 gemultiplexed zijn, moet de specifieke functie worden geselecteerd voordat deze wordt gebruikt. Als zowel de PxSEL- als de PxSEL2-registers zijn ingesteld op 0 voor een bepaalde pin, wordt de I / O voor algemeen gebruik geselecteerd. Als de PxSEL is ingesteld op 1, wordt de primaire perifere functie geselecteerd, enzovoort.
PxIE: het schakelt interrupts in of uit voor een bepaalde pin in een poort x.
PxIES: Het selecteert de rand waarop een interrupt wordt gegenereerd. Voor 0 is een stijgende flank geselecteerd en voor 1 is een dalende flank geselecteerd.
MSP430 Circuit om GPIO-onderbreking te testen
Het MSP430-circuit dat wordt gebruikt om onze MSP430 Interrupt-voorbeeldcode te testen, wordt hieronder weergegeven.
De massa van het bord wordt gebruikt om zowel de LED als de knop te aarden. De diagonaal tegenover elkaar liggende zijden van de drukknop zijn normaal gesproken open aansluitingen en worden verbonden wanneer de drukknop wordt ingedrukt. Voor de led wordt een weerstand aangesloten om het hoge stroomverbruik van de led te vermijden. Gewoonlijk worden lage weerstanden in het bereik van 100ohm - 220ohm gebruikt.
We gebruiken 3 verschillende codes om een beter begrip te krijgen van de Port Interrupts. De eerste twee codes gebruiken hetzelfde circuit als in het schakelschema 1. Laten we eens in de code duiken. Nadat de aansluitingen zijn gemaakt, ziet mijn opstelling er als volgt uit.
MSP430 programmeren voor onderbrekingen
Het complete MSP430 Interrupt Program staat onderaan deze pagina, de uitleg van de code is als volgt.
De onderstaande regel stopt de werking van de watchdog-timer. Watchdog-timer voert gewoonlijk twee bewerkingen uit. De ene voorkomt dat de controller oneindige lussen maakt door de controller te resetten en de andere is dat deze periodieke gebeurtenissen activeert met behulp van de ingebouwde timer. Wanneer een microcontroller wordt gereset (of ingeschakeld), bevindt deze zich in de timermodus en heeft hij de neiging de MCU na 32 milliseconden te resetten. Deze regel stopt de controller om dat te doen.
WDTCTL = WDTPW + WDTHOLD;
Door het P1DIR- register in te stellen op de waarde 0x07, wordt de richting van pin0, pin1 en pin2 als uitvoer ingesteld. Door de P1OUT op 0x30 in te stellen, wordt het een ingang geconfigureerd met interne pullup-weerstanden ingeschakeld op pin4 en pin5. Als u P1REN instelt op 0x30, wordt de interne pull-up op deze pinnen ingeschakeld. P1IE maakt interrupt mogelijk, waarbij P1IES de overgang van hoog naar laag selecteert als de interruptflank op deze pinnen.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
De volgende regel schakelt de energiebesparende modus in en schakelt de GIE in het statusregister in zodat de interrupts kunnen worden ontvangen.
__bis_SR_register (LPM4bits + GIE)
De programmateller wordt ingesteld met het adres van de vector van poort 1 met behulp van de macro.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (ongeldig)
De onderstaande code schakelt elk van de LED's die zijn aangesloten op pin0, pin1, pin2 één voor één om.
if (tel% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; tel ++; } else if (count% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; tel ++; } anders { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; tel ++; }
Schakelschema 2:
Laten we op dezelfde manier een andere pin proberen om het concept veel beter te begrijpen. Dus hier is de drukknop aangesloten op pin 2.0 in plaats van pin 1.5. het gemodificeerde circuit is als volgt. Dit circuit wordt weer gebruikt om het MSP430-knoponderbrekingsprogramma te testen.
Hier wordt poort 2 gebruikt voor invoer. Er moet dus een andere interruptvector worden gebruikt. P1.4 en P2.0 nemen de ingangen.
Omdat poort 2 alleen wordt gebruikt voor invoer, wordt P2DIR ingesteld op 0. Om pin0 van poort 2 in te stellen als invoer met ingeschakelde interne pull-up weerstanden, moeten de registers P2OUT en P2REN worden ingesteld op een waarde van 1. Om de interrupt op pin0 van poort 2 en ook om de rand van de interrupt te selecteren, worden P2IE en P2IES ingesteld met een waarde van 1. Om de vlag in poort 2 te resetten, wordt P2IFG gewist, zodat de vlag weer op de optreden van de onderbreking.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Als de interruptbron van poort 1 komt, brandt de LED die is aangesloten op pin1 van poort 1. Als de interruptbron tot poort 2 behoort, brandt de LED die is aangesloten op pin2 van poort 1.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; voor (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; voor (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Programma uploaden naar MSP430 vanuit CCS
Om het project naar het startvenster te laden en het te debuggen, selecteert u het project en klikt u op het foutopsporingspictogram in de werkbalk. U kunt ook op F11 drukken of op UitvoerenàDebug klikken om de foutopsporingsmodus te openen.
Zodra de foutopsporingsmodus is geactiveerd, drukt u op de groene kleur run-knop om de geladen code vrij in de MCU uit te voeren. Nu, wanneer de drukknop wordt ingedrukt, wordt de onderbreking getriggerd door de verandering in flank, waardoor de verandering in de toestand van de LED wordt veroorzaakt.
Interrupt-programma op MSP430
Nadat de code met succes is geüpload, kunnen we deze testen door simpelweg de drukknop te gebruiken. Het LED-patroon verandert volgens ons programma wanneer een onderbreking wordt gegeven met de drukknop.
De volledige werking is te vinden in de onderstaande video. Ik hoop dat je de tutorial leuk vond en iets nuttigs hebt geleerd. Als je vragen hebt, laat ze dan achter in het commentaargedeelte of gebruik onze forums voor andere technische vragen.