- De ce avem nevoie de întrerupere?
- Tipuri de întreruperi în MSP430
- Întrerupeți controlul programului în MSP430
- Circuitul MSP430 pentru testarea întreruperii GPIO
- Programarea MSP430 pentru întreruperi
- Încărcarea programului pe MSP430 din CCS
- Program de întrerupere pe MSP430
Luați în considerare un ceas digital simplu, programat să vă arate doar timpul, imaginați-vă acum că doriți să schimbați fusul orar al acestuia. Ce ai face? Pur și simplu apăsați un buton care se schimbă în meniu care vă permite să schimbați fusul orar. Aici, sistemul nu vă poate prezice întreruperea externă la procesele sale de menținere a timpului și nu vă poate cere să așteptați, deoarece este ocupat cu creșterea valorii secundelor pe ceas. Aici întreruperile sunt utile.
Întreruperile nu trebuie să fie întotdeauna externe; poate fi și intern. De cele mai multe ori într-o întrerupere încorporată facilitează, de asemenea, comunicarea între două periferice ale procesorului. Luați în considerare că un temporizator presetat este resetat și o întrerupere este declanșată atunci când timpul atinge valoarea din registrul temporizatorului. Handlerul de întrerupere poate fi utilizat pentru a iniția celelalte periferice, cum ar fi DMA.
În acest tutorial, am folosit întreruperile externe de pe MSP430 pentru a comuta diferite LED-uri. Când o întrerupere externă este dată de schimbarea stării folosind un buton, controlul este transferat (pre-evitat) către ISR și face ceea ce este necesar. Pentru a cunoaște elementele de bază cum ar fi configurarea mediului CCS pentru lansatorul MSP430G2, urmați acest link pentru a începe utilizarea MSP430 folosind CCS, deoarece nu vom intra în detalii în acest tutorial. De asemenea, verificați alte tutoriale bazate pe MSP430 folosind Energia IDE și CCS urmând linkul.
De ce avem nevoie de întrerupere?
Sunt necesare întreruperi pentru a salva cheltuielile de sondare într-un sistem încorporat. Acestea sunt apelate atunci când sarcinile cu prioritate mai mare sunt necesare pentru a fi executate prin prevenirea sarcinii curente de rulare. Poate fi, de asemenea, utilizat pentru a trezi procesorul și din modurile de consum redus. Când este trezit de tranziția de margine a unui semnal extern printr-un port GPIO, ISR este executat și CPU revine din nou la modul Low Power.
Tipuri de întreruperi în MSP430
Cele mai întrerupe în MSP430 vin în următoarele tipuri -
- Resetare sistem
- Întrerupere nemascabilă
- Întrerupere mascabilă
- Întreruperi vectorizate și non-vectorizate
Resetare sistem:
Poate apărea din cauza tensiunii de alimentare (Vcc) și a unui semnal scăzut în pinul RST / NMI cu modul Reset selectat și poate apărea și din motive precum depășirea temporizatorului de supraveghere și încălcarea cheii de securitate.
Întrerupere nemascabilă:
Aceste întreruperi nu pot fi mascate de instrucțiunile CPU. Odată activată întreruperea generală, întreruperea care nu poate fi mascată nu poate fi deviată de la procesare. Acest lucru este generat de surse precum defectele oscilatorului și o margine dată manual RST / NMI (în modul NMI).
Întrerupere mascabilă:
Când apare o întrerupere și dacă poate fi mascat de o instrucțiune CPU, atunci este întrerupere mascabilă. Nu trebuie să fie întotdeauna externe. De asemenea, depind de periferice și de funcțiile lor. Întreruperile de port externe utilizate aici intră în această categorie.
Întreruperi vectorizate și întreruperi non-vectorizate:
Vectorizat: În acest caz, dispozitivele care întrerup ne furnizează sursa întreruperii prin trecerea adresei vectorului de întrerupere. Aici adresa ISR este fixă, iar controlul este transferat la acea adresă, iar ISR se ocupă de restul.
Non-Vectored: Aici toate întreruperile au ISR comun. Când apare o întrerupere de la o sursă non-vectorizată, controlul este transferat la adresa comună, la care partajează toate întreruperile non-vectorizate.
Întrerupeți controlul programului în MSP430
Când apare întreruperea, MCLK este pornit și procesorul este chemat înapoi din starea OFF. Deoarece controlul programului este transferat la adresa ISR după apariția întreruperii, valorile din contorul programului și registrul de stare sunt mutate în stivă.
Consecutiv, Status Register este șters, astfel ștergeți GIE și pune capăt modului de consum redus. Întreruperea cu cea mai mare prioritate este selectată și executată prin plasarea adresei vectorului de întrerupere în contorul programului. Înainte de a ajunge la exemplul nostru de cod de întrerupere GPIO MSP430, este important să înțelegem funcționarea registrelor de port implicate în acesta.
Registre de porturi pentru control GPIO pe MSP430:
PxDIR: Este un registru de control al direcției portului. Permite programatorului să își selecteze în mod specific funcția scriind 0 sau 1. Dacă un pin este selectat ca 1, atunci acționează ca o ieșire. Luați în considerare portul 1 ca un port pe 8 biți și dacă pinii 2 și 3 trebuie să fie atribuiți ca porturi de ieșire, atunci registrul P1DIR trebuie setat cu valoarea 0x0C.
PxIN: Este un registru de numai citire și valorile curente din port pot fi citite folosind acest registru.
PxOUT: Acest registru particular poate fi folosit pentru a scrie valori direct în porturi. Acest lucru este posibil numai atunci când registrul de extragere / derulare este dezactivat.
PxREN: Este un registru pe 8 biți folosit pentru a activa sau dezactiva registrul de extragere / derulare. Când un pin este setat ca 1 atât în registrul PxREN, cât și în PxOUT, atunci pinul particular este tras în sus.
PxDIR |
PxREN |
PxOUT |
Configurare I / O |
0 |
0 |
X |
Intrare cu rezistențe dezactivate |
0 |
1 |
0 |
Intrare cu derulant intern activat |
0 |
1 |
1 |
Intrare cu extragere internă activată |
1 |
X |
X |
Ieșire - PxREN nu are efect |
PxSEL și PxSEL2: Deoarece toți pinii din MSP430 sunt multiplexați, funcția specială trebuie selectată înainte de a o utiliza. Când ambele registre PxSEL și PxSEL2 sunt setate ca 0 pentru un anumit pin, atunci este selectat I / O cu scop general. Când PxSEL este setat ca 1, este selectată funcția periferică primară și așa mai departe.
PxIE: Activează sau dezactivează întreruperile pentru un anumit pin dintr-un port x.
PxIES: Selectează marginea la care este generată o întrerupere. Pentru 0, este selectată o margine ascendentă și pentru 1, este selectată o margine descendentă.
Circuitul MSP430 pentru testarea întreruperii GPIO
Circuitul MSP430 utilizat pentru testarea codului nostru de exemplu de întrerupere MSP430 este prezentat mai jos.
Masa plăcii este utilizată pentru împământarea LED-ului și a butonului. Laturile diagonal opuse ale butonului sunt în mod normal terminale deschise și se conectează atunci când butonul este apăsat în jos. Un rezistor este conectat înainte de LED pentru a evita consumul ridicat de curent de către LED. De obicei, se folosesc rezistențe scăzute cuprinse între 100ohm - 220ohm.
Folosim 3 coduri diferite pentru a înțelege mai bine portul întrerupe. Primele două coduri utilizează același circuit ca în schema de circuite 1. Să ne scufundăm în cod. După ce s-au făcut conexiunile, configurarea mea arată așa.
Programarea MSP430 pentru întreruperi
Programul complet de întrerupere MSP430 poate fi găsit în partea de jos a acestei pagini, explicația codului este următoarea.
Linia de mai jos oprește cronometrul câinelui de pază din funcționare. Cronometrul câinelui de supraveghere efectuează de obicei două operații. Una previne controlerul de bucle infinite prin resetarea controlerului, iar cealaltă este că declanșează evenimente periodice folosind cronometrul încorporat. Când un microcontroler este resetat (sau pornit), acesta se află în modul temporizator și tinde să reseteze MCU după 32 de milioane de secunde. Această linie oprește controlerul să facă asta.
WDTCTL = WDTPW + WDTHOLD;
Setarea registrului P1DIR la valoarea 0x07 setează direcția pin0, pin1 și pin2 ca ieșire. Setarea P1OUT la 0x30 configurează o intrare cu rezistențe interne de tragere activate pe pin4 și pin5. Setarea P1REN la 0x30 permite extragerea internă a acestor știfturi. P1IE activează întreruperea, unde P1IES selectează tranziția de la înalt la scăzut ca margine de întrerupere a acestor ace.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Linia următoare activează modul de consum redus și activează GIE în registrul de stare, astfel încât să poată fi primite întreruperile.
__bis_SR_register (LPM4bits + GIE)
Contorul programului este setat cu adresa vectorului port 1 folosind macro-ul.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (nul)
Codul de mai jos comută fiecare LED-uri conectate la pin0, pin1, pin2 unul câte unul.
if (count% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; conta ++; } else if (count% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; conta ++; } else { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; conta ++; }
Diagrama circuitului 2:
În mod similar, să încercăm un alt pin pentru a înțelege conceptul mult mai bine. Deci aici butonul este conectat la pinul 2.0 în loc de pinul 1.5. circuitul modificat este după cum urmează. Din nou, acest circuit este folosit pentru a testa programul de întrerupere a butonului MSP430.
Aici portul 2 este utilizat pentru intrare. Deci, trebuie folosit un vector de întrerupere diferit. P1.4 și P2.0 iau intrările.
Deoarece portul 2 este utilizat numai pentru intrare, P2DIR este setat ca 0. Pentru a seta pin0 al portului 2 ca intrare cu rezistențele interne de tragere activate, registrele P2OUT și P2REN trebuie setate cu o valoare 1. Pentru a activa întrerupere pe pin0 a portului 2 și, de asemenea, pentru a selecta marginea întreruperii, P2IE și P2IES sunt setate cu o valoare 1. Pentru a reseta semnalizatorul în portul 2, P2IFG este șters, astfel încât steagul să poată fi setat din nou pe apariția întreruperii.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Când sursa de întrerupere este de la portul 1, atunci LED-ul conectat la pinul 1 al portului 1 luminează. Când sursa de întrerupere aparține portului 2, atunci LED-ul conectat la pinul 2 al portului 1 se aprinde.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; pentru (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; pentru (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Încărcarea programului pe MSP430 din CCS
Pentru a încărca proiectul pe launchpad și a-l depana, selectați proiectul și faceți clic pe pictograma de depanare din bara de instrumente. Alternativ, apăsați F11 sau faceți clic pe RunàDebug pentru a intra în modul de depanare.
Odată ce modul de depanare este introdus, apăsați butonul de culoare verde pentru a rula liber codul încărcat în MCU. Acum, când butonul este apăsat în jos, întreruperea este declanșată de schimbarea marginii, determinând astfel schimbarea stării LED-ului.
Program de întrerupere pe MSP430
După ce codul este încărcat cu succes, îl putem testa prin simpla apăsare a butonului. Modelul cu LED-uri se va schimba în funcție de programul nostru ori de câte ori este dată o întrerupere cu ajutorul butonului.
Lucrarea completă poate fi găsită în videoclipul legat mai jos. Sper că ți-a plăcut tutorialul și ai învățat ceva util. Dacă aveți întrebări, lăsați-le în secțiunea de comentarii sau folosiți forumurile noastre pentru alte întrebări tehnice.