- Per què necessitem interrupcions?
- Tipus d'interrupció a MSP430
- Interrompre el control del programa a MSP430
- Circuit MSP430 per provar la interrupció GPIO
- Programació MSP430 per a interrupcions
- Carregant el programa a MSP430 des de CCS
- Programa d'interrupció a MSP430
Penseu en un simple rellotge digital que estigui programat per mostrar-vos només el temps; ara imagineu-vos que voleu canviar la seva zona horària. Què faries? Simplement premeu un botó que canvia al menú que us permetrà canviar la zona horària. Aquí, el sistema no pot predir la vostra interrupció externa als processos de manteniment del temps i no us pot demanar que espereu, ja que està ocupat incrementant el valor dels segons al rellotge. Aquí és on les interrupcions són útils.
Les interrupcions no sempre han de ser externes; també pot ser intern. La majoria de vegades en una interrupció incrustada també facilita la comunicació entre dos perifèrics de la CPU. Penseu que es restableix un temporitzador preestablert i es produeix una interrupció quan el temps arriba al valor del registre del temporitzador. El gestor d'interrupcions es pot utilitzar per iniciar altres perifèrics com DMA.
En aquest tutorial, hem utilitzat les interrupcions externes del MSP430 per canviar diferents LED. Quan es produeix una interrupció externa pel canvi d'estat mitjançant un polsador, el control es transfereix (preventivament) a l'ISR i fa el necessari. Per conèixer els conceptes bàsics com la configuració de l'entorn CCS per al llançador MSP430G2, seguiu aquest enllaç per començar a utilitzar MSP430 amb CCS perquè no entrarem en els detalls d'aquest tutorial. Consulteu també altres tutorials basats en MSP430 mitjançant Energia IDE i CCS seguint l’enllaç.
Per què necessitem interrupcions?
Calen interrupcions per guardar la despesa general de votació en un sistema incrustat. Es convoquen quan es necessiten executar les tasques amb més prioritat prenent prèviament la tasca en execució actual. També es pot utilitzar per activar la CPU des de modes de consum baix. Quan es desperta per la transició de vora d'un senyal extern a través d'un port GPIO, l'ISR s'executa i la CPU torna de nou al mode de baixa energia.
Tipus d'interrupció a MSP430
Les interrupcions de MSP430 es troben en els tipus següents:
- Restabliment del sistema
- Interrupció no enmascarable
- Interrupció enmascarable
- Interrupcions vectoritzades i no vectoritzades
Restabliment del sistema:
Pot produir-se a causa de la tensió d’alimentació (Vcc) i a causa d’un senyal baix en el pin RST / NMI amb el mode Restabliment seleccionat i també pot produir-se per motius com el desbordament del temporitzador de vigilància i la violació de la clau de seguretat.
Interrupció no enmascarable:
Aquestes interrupcions no poden ser emmascarades per les instruccions de la CPU. Un cop habilitada la interrupció general, la interrupció no emmascarable no es pot desviar del processament. Això és generat per fonts com ara les falles de l’oscil·lador i una vora que s’ofereix manualment al RST / NMI (en mode NMI).
Interrupció enmascarable:
Quan es produeix una interrupció i si pot ser emmascarada per una instrucció de la CPU, és la interrupció enmascarable. No han de ser sempre externs. També depenen dels perifèrics i de les seves funcions. Les interrupcions de port externs que s’utilitzen aquí pertanyen a aquesta categoria.
Interrupcions vectoritzades i interrupcions no vectoritzades:
Vectoritzat: en aquest cas, els dispositius que interrompen ens proporcionen l'origen de la interrupció passant l'adreça del vector d'interrupció. Aquí es fixa l' adreça de l'ISR i el control es transfereix a aquesta adreça i l'ISR s'encarrega de la resta.
No vectoritzat: aquí totes les interrupcions tenen un ISR comú. Quan es produeix una interrupció des d'una font no vectoritzada, el control es transfereix a l'adreça comuna, a la qual comparteixen totes les interrupcions no vectoritzades.
Interrompre el control del programa a MSP430
Quan es produeix la interrupció, MCLK s'activa i la CPU es torna a trucar des de l'estat OFF. A mesura que el control del programa es transfereix a l’adreça ISR després de l’aparició de la interrupció, els valors del comptador del programa i el registre d’estat es mouen a la pila.

De manera consecutiva, s’esborra el registre d’estats, eliminant així el GIE i finalitzant el mode de baixa energia. La interrupció amb la màxima prioritat es selecciona i s’executa col·locant l’adreça del vector d’interrupció al comptador del programa. Abans d’arribar al nostre codi d’exemple d’interrupció GPIO MSP430, és important entendre el funcionament dels registres de ports que hi participen.
Registres de ports per al control GPIO a MSP430:
PxDIR: és un registre de control de direcció de port. Permet al programador seleccionar específicament la seva funció escrivint 0 o 1. Si es selecciona un pin com a 1, actua com a sortida. Considereu que el port 1 és un port de 8 bits i, si els pins 2 i 3 s’han d’assignar com a ports de sortida, el registre P1DIR s’ha d’establir amb el valor 0x0C.
PxIN: és un registre de només lectura i els valors actuals del port es poden llegir mitjançant aquest registre.
PxOUT: aquest registre en particular es pot utilitzar per escriure valors als ports directament. Això només és possible quan es desactiva el registre desplegable / desplegable.
PxREN: és un registre de 8 bits que s’utilitza per habilitar o desactivar el registre de desplegament / desplegable. Quan un pin es defineix com a 1 tant al registre PxREN com a PxOUT, el pin concret es tira cap amunt.
|
PxDIR |
PxREN |
PxOUT |
Configuració d'E / S |
|
0 |
0 |
X |
Entrada amb resistències desactivades |
|
0 |
1 |
0 |
Entrada amb desplegable intern activat |
|
0 |
1 |
1 |
Entrada amb arrencada interna activada |
|
1 |
X |
X |
Sortida: PxREN no té cap efecte |
PxSEL i PxSEL2: Com que tots els pins del MSP430 estan multiplexats, cal seleccionar la funció particular abans d’utilitzar-la. Quan els registres PxSEL i PxSEL2 s'estableixen com a 0 per a un pin concret, se selecciona la E / S de propòsit general. Quan el PxSEL s'estableix com a 1, se selecciona la funció perifèrica principal, etc.
PxIE: habilita o desactiva les interrupcions d'un pin concret en un port x.
PxIES: Selecciona la vora en què es genera una interrupció. Per a 0, se selecciona una vora ascendent i per a 1 es selecciona una vora descendent.
Circuit MSP430 per provar la interrupció GPIO
A continuació es mostra el circuit MSP430 utilitzat per provar el nostre codi d’ exemple d’interrupció MSP430.

La terra del tauler s’utilitza per connectar a terra tant el LED com el botó. Els costats diagonalment oposats del polsador normalment són terminals oberts i es connecten quan es prem el polsador. Es connecta una resistència abans del LED per evitar l’alt consum de corrent del LED. Normalment s’utilitzen resistències baixes en el rang de 100ohm a 220ohm.
Utilitzem 3 codis diferents per obtenir una millor comprensió de les interrupcions del port. Els dos primers codis utilitzen el mateix circuit que al diagrama de circuits 1. Anem a submergir-nos en el codi. Després de fer les connexions, la meva configuració té aquest aspecte.

Programació MSP430 per a interrupcions
El programa complet d’ interrupció MSP430 es pot trobar a la part inferior d’aquesta pàgina; l’explicació del codi és la següent.
La línia següent atura el funcionament del temporitzador del gos de vigilància. El temporitzador de gossos de vigilància sol realitzar dues operacions. Un impedeix que el controlador faci infinits bucles restablint el controlador i l’altre és que desencadena esdeveniments periòdics mitjançant el temporitzador incorporat. Quan un microcontrolador es reinicia (o s’encén), es troba en mode temporitzador i tendeix a restablir l’MCU després de 32 milions de segons. Aquesta línia impedeix que el controlador faci això.
WDTCTL = WDTPW + WDTHOLD;
Si definiu el registre P1DIR al valor 0x07, es defineix la direcció de pin0, pin1 i pin2 com a sortida. Si configureu el P1OUT a 0x30 es configura una entrada amb resistències internes de tracció activades al pin4 i al pin5. L'establiment de P1REN a 0x30 permet l'extracció interna d'aquests pins. P1IE habilita la interrupció, on P1IES selecciona la transició alta a baixa com a vora d’interrupció d’aquests pins.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
La línia següent habilita el mode de baixa consum i habilita el GIE al registre d'estat perquè es puguin rebre les interrupcions.
__bis_SR_register (LPM4bits + GIE)
El comptador del programa s’estableix amb l’adreça del vector port 1 mitjançant la macro.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
El codi següent commuta cadascun dels LED connectats al pin0, pin1, pin2 un per un.
if (compte% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; comptar ++; } else if (compte% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; comptar ++; } else { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; comptar ++; }
Diagrama de circuits 2:
De la mateixa manera, provem un altre pin per entendre el concepte molt millor. Per tant, aquí el botó està connectat al pin 2.0 en lloc del pin 1.5. el circuit modificat és el següent. Un cop més, aquest circuit s’utilitza per provar el programa d’ interrupció del botó MSP430.

Aquí s'utilitza el port 2 per a l'entrada. Per tant, s’ha d’utilitzar un vector d’interrupció diferent. P1.4 i P2.0 prenen les entrades.
Com que el port 2 només s’utilitza per a l’entrada, P2DIR s’estableix com a 0. Per configurar el pin0 del port 2 com a entrada amb les resistències de tracció internes activades, els registres P2OUT i P2REN s’han d’establir amb un valor 1. interrupt al pin0 del port 2 i també per seleccionar la vora de la interrupció, P2IE i P2IES es defineixen amb un valor de 1. Per restablir el senyalador al port 2, es buida P2IFG, de manera que es pugui tornar a establir el senyalador al ocurrència de la interrupció.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Quan la font d’interrupció prové del port 1, el LED connectat al pin1 del port 1 s’encén. Quan la font d’interrupció pertany al port 2, el LED connectat al pin2 del port 1 s’encén.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; per a (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; per a (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Carregant el programa a MSP430 des de CCS
Per carregar el projecte al launchpad i depurar-lo, seleccioneu-lo i feu clic a la icona de depuració de la barra d'eines. Com a alternativa, premeu F11 o feu clic a RunàDebug per entrar al mode de depuració.

Un cop introduït el mode de depuració, premeu el botó d'execució del color verd per executar lliurement el codi carregat a l'MCU. Ara, quan es prem el botó polsador, la interrupció es produeix pel canvi de vora, provocant així el canvi en l'estat del LED.

Programa d'interrupció a MSP430
Després de penjar correctament el codi, el podem provar simplement amb el botó polsador. El patró de LED canviarà segons el nostre programa cada vegada que es produeixi una interrupció mitjançant el polsador.

El funcionament complet es pot trobar al vídeo enllaçat a continuació. Espero que us hagi agradat el tutorial i hàgiu après alguna cosa útil. Si teniu cap pregunta, deixeu-les a la secció de comentaris o utilitzeu els nostres fòrums per a altres qüestions tècniques.
