- Perché abbiamo bisogno di interruzioni?
- Tipi di interrupt in MSP430
- Interrompere il controllo del programma in MSP430
- Circuito MSP430 per testare interrupt GPIO
- Programmazione MSP430 per interrupt
- Caricamento del programma su MSP430 da CCS
- Programma di interruzione su MSP430
Considera un semplice orologio digitale che è programmato per mostrarti solo l'ora, ora immagina di voler cambiare il suo fuso orario. Cosa faresti? È sufficiente premere un pulsante che passa al menu che consente di modificare il fuso orario. Qui, il sistema non può prevedere l'interruzione esterna per i suoi processi di mantenimento del tempo e non può chiederti di aspettare poiché è impegnato ad aumentare il valore dei secondi sul tuo orologio. È qui che gli interrupt tornano utili.
Gli interrupt non devono essere sempre esterni; può essere anche interno. La maggior parte delle volte in un interrupt integrato facilita anche la comunicazione tra due periferiche della CPU. Considerare che un timer preimpostato viene ripristinato e viene attivato un interrupt quando il tempo raggiunge il valore nel registro del timer. Il gestore di interrupt può essere utilizzato per avviare le altre periferiche come DMA.
In questo tutorial, abbiamo utilizzato gli interrupt esterni su MSP430 per attivare e disattivare diversi LED. Quando un interrupt esterno è dato dal cambio di stato tramite un pulsante, il controllo viene trasferito (anticipato) all'ISR e fa il necessario. Per conoscere le basi come la configurazione dell'ambiente CCS per il launchpad MSP430G2, segui questo collegamento per iniziare con MSP430 utilizzando CCS perché non entreremo nei dettagli in questo tutorial. Controlla anche altri tutorial basati su MSP430 che utilizzano Energia IDE e CCS seguendo il link.
Perché abbiamo bisogno di interruzioni?
Gli interrupt sono necessari per salvare l'overhead di polling in un sistema integrato. Vengono chiamati quando le attività con priorità più alta devono essere eseguite anticipando l'attività in esecuzione. Può anche essere utilizzato per riattivare la CPU dalle modalità a basso consumo. Quando viene risvegliato dalla transizione del fronte di un segnale esterno attraverso una porta GPIO, l'ISR viene eseguito e la CPU torna nuovamente alla modalità a basso consumo.
Tipi di interrupt in MSP430
Gli interrupt in MSP430 rientrano nei seguenti tipi:
- Ripristino del sistema
- Interruzione non mascherabile
- Interruzione mascherabile
- Interruzioni vettoriali e non vettoriali
Ripristino del sistema:
Può verificarsi a causa della tensione di alimentazione (Vcc) e di un segnale basso nel pin RST / NMI con la modalità di ripristino selezionata e può anche verificarsi a causa di motivi come l' overflow del timer watchdog e la violazione della chiave di sicurezza.
Interruzione non mascherabile:
Questi interrupt non possono essere mascherati dalle istruzioni della CPU. Una volta che l'interrupt generale è abilitato, l'interrupt non mascherabile non può essere deviato dall'elaborazione. Questo è generato da sorgenti come i guasti dell'oscillatore e un fronte assegnato manualmente all'RST / NMI (in modalità NMI).
Interruzione mascherabile:
Quando si verifica un interrupt e se può essere mascherato da un'istruzione della CPU, si tratta di un interrupt mascherabile. Non è necessario che siano sempre esterni. Dipendono anche dalle periferiche e dalle loro funzioni. Gli interrupt della porta esterna utilizzati qui rientrano in questa categoria.
Interruzioni vettoriali e interruzioni non vettoriali:
Vectored: in questo caso, i dispositivi che interrompono ci forniscono la sorgente dell'interruzione passando l'indirizzo del vettore dell'interruzione. Qui l' indirizzo dell'ISR è fisso e il controllo viene trasferito a quell'indirizzo e l'ISR si occupa del resto.
Non vettoriale: qui tutte le interruzioni hanno ISR comune. Quando si verifica un interrupt da una sorgente non vettoriale, il controllo viene trasferito all'indirizzo comune, a cui condividono tutti gli interrupt non vettoriali.
Interrompere il controllo del programma in MSP430
Quando si verifica l'interrupt, MCLK viene attivato e la CPU viene richiamata dallo stato OFF. Poiché il controllo del programma viene trasferito all'indirizzo ISR dopo il verificarsi dell'interrupt, i valori nel contatore del programma e nel registro di stato vengono spostati nello stack.
Consecutivamente, il registro di stato viene cancellato, cancellando così il GIE e terminando la modalità a basso consumo. L'interrupt con la priorità più alta viene selezionato ed eseguito inserendo l'indirizzo del vettore di interrupt nel contatore del programma. Prima di arrivare al nostro codice di esempio di interrupt GPIO MSP430, è importante comprendere il funzionamento dei registri di porta coinvolti.
Registri delle porte per il controllo GPIO su MSP430:
PxDIR: è un registro di controllo della direzione delle porte. Consente al programmatore di selezionare specificamente la sua funzione scrivendo 0 o 1. Se un pin è selezionato come 1, allora agisce come un'uscita. Considerare la porta 1 come una porta a 8 bit e se i pin 2 e 3 devono essere assegnati come porte di uscita, il registro P1DIR deve essere impostato con il valore 0x0C.
PxIN: è un registro di sola lettura ei valori correnti nella porta possono essere letti utilizzando questo registro.
PxOUT: questo particolare registro può essere utilizzato per scrivere direttamente i valori sulle porte. Questo è possibile solo quando il registro pullup / pulldown è disabilitato.
PxREN: è un registro a 8 bit utilizzato per abilitare o disabilitare il registro pullup / pulldown. Quando un pin è impostato come 1 in entrambi i registri PxREN e PxOUT, il pin particolare viene sollevato.
PxDIR |
PxREN |
PxOUT |
Config. I / O |
0 |
0 |
X |
Ingresso con resistenze disabilitate |
0 |
1 |
0 |
Ingresso con pulldown interno abilitato |
0 |
1 |
1 |
Ingresso con pullup interno abilitato |
1 |
X |
X |
Output - PxREN non ha effetto |
PxSEL e PxSEL2: poiché tutti i pin in MSP430 sono multiplexati, la particolare funzione deve essere selezionata prima di utilizzarla. Quando entrambi i registri PxSEL e PxSEL2 sono impostati come 0 per un particolare pin, viene selezionato l'I / O generico. Quando PxSEL è impostato su 1, viene selezionata la funzione periferica primaria e così via.
PxIE: Abilita o disabilita gli interrupt per un particolare pin in una porta x.
PxIES: Seleziona il fronte al quale viene generato un interrupt. Per 0 viene selezionato un fronte di salita e per 1 viene selezionato un fronte di discesa.
Circuito MSP430 per testare interrupt GPIO
Di seguito è mostrato il circuito MSP430 utilizzato per testare il nostro codice di esempio di interrupt MSP430.
La massa della scheda viene utilizzata per mettere a terra sia il LED che il pulsante. I lati diagonalmente opposti del pulsante sono terminali normalmente aperti e vengono collegati quando il pulsante viene premuto. Un resistore è collegato prima del LED per evitare l'elevato consumo di corrente da parte del LED. Di solito vengono utilizzati resistori bassi nell'intervallo 100ohm - 220ohm.
Usiamo 3 codici diversi per ottenere una migliore comprensione degli interrupt della porta. I primi due codici utilizzano lo stesso circuito del diagramma del circuito 1. Immergiamoci nel codice. Dopo aver effettuato i collegamenti, la mia configurazione è simile a questa.
Programmazione MSP430 per interrupt
Il programma completo di interrupt MSP430 è disponibile in fondo a questa pagina, la spiegazione del codice è la seguente.
La riga sotto interrompe il funzionamento del timer watchdog. Il timer watchdog di solito esegue due operazioni. Uno sta impedendo al controller di loop infiniti resettando il controller e l'altro è che innesca eventi periodici utilizzando il timer integrato. Quando un microcontrollore viene ripristinato (o acceso), è in modalità timer e tende a ripristinare l'MCU dopo 32 millisecondi. Questa riga impedisce al controller di farlo.
WDTCTL = WDTPW + WDTHOLD;
L'impostazione del registro P1DIR sul valore 0x07 imposta la direzione di pin0, pin1 e pin2 come output. Impostando P1OUT a 0x30 si configura un ingresso con resistori pullup interni abilitati su pin4 e pin5. L'impostazione di P1REN su 0x30 abilita il pullup interno su questi pin. P1IE abilita l'interrupt, dove P1IES seleziona la transizione da alto a basso come fronte di interrupt su questi pin.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
La riga successiva abilita la modalità a basso consumo e abilita il GIE nel registro di stato in modo che gli interrupt possano essere ricevuti.
__bis_SR_register (LPM4bits + GIE)
Il contatore del programma viene impostato con l'indirizzo del vettore della porta 1 utilizzando la macro.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
Il codice seguente alterna ciascuno dei LED collegati a pin0, pin1, pin2 uno per uno.
if (count% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; count ++; } else if (count% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; count ++; } altro { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; count ++; }
Schema del circuito 2:
Allo stesso modo, proviamo un pin diverso per comprendere molto meglio il concetto. Quindi qui il pulsante è collegato al pin 2.0 invece che al pin 1.5. il circuito modificato è il seguente. Anche in questo caso questo circuito viene utilizzato per testare il programma di interruzione del pulsante MSP430.
Qui la porta 2 viene utilizzata per l'input. Quindi è necessario utilizzare un vettore di interrupt diverso. P1.4 e P2.0 prendono gli ingressi.
Poiché la porta 2 è utilizzata solo per l'ingresso, P2DIR è impostato a 0. Per impostare il pin0 della porta 2 come ingresso con resistenze di pull-up interne abilitate, i registri P2OUT e P2REN devono essere impostati con un valore di 1. Per abilitare il interrupt sul pin0 della porta 2 e anche per selezionare il bordo dell'interrupt, P2IE e P2IES vengono impostati con un valore di 1. Per resettare il flag nella porta 2, P2IFG viene azzerato, in modo che il flag possa essere reimpostato sul occorrenza dell'interruzione.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Quando la sorgente di interrupt proviene dalla porta 1, il LED collegato al pin1 della porta 1 si accende. Quando la sorgente di interrupt appartiene alla porta 2, il LED collegato al pin2 della porta 1 si accende.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; per (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; for (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Caricamento del programma su MSP430 da CCS
Per caricare il progetto nel launchpad ed eseguirne il debug, seleziona il progetto e fai clic sull'icona di debug nella barra degli strumenti. In alternativa, premi F11 o fai clic su RunàDebug per entrare in modalità debug.
Una volta attivata la modalità di debug, premere il pulsante di esecuzione di colore verde per eseguire liberamente il codice caricato nell'MCU. Ora, quando si preme il pulsante, l'interruzione viene innescata dal cambio di fronte, provocando il cambiamento di stato del LED.
Programma di interruzione su MSP430
Dopo che il codice è stato caricato con successo, possiamo testarlo semplicemente usando il pulsante. Lo schema del LED cambierà in base al nostro programma ogni volta che viene data un'interruzione utilizzando il pulsante.
La lavorazione completa la trovate nel video linkato di seguito. Spero ti sia piaciuto il tutorial e hai imparato qualcosa di utile. Se hai domande, lasciale nella sezione commenti o usa i nostri forum per altre domande tecniche.