- Pourquoi avons-nous besoin d'une interruption?
- Types d'interruption dans MSP430
- Contrôle du programme d'interruption dans MSP430
- Circuit MSP430 pour tester l'interruption GPIO
- Programmation du MSP430 pour les interruptions
- Téléchargement du programme sur MSP430 depuis CCS
- Programme d'interruption sur MSP430
Considérez une simple montre numérique qui est programmée pour vous montrer simplement l'heure, imaginez maintenant que vous voulez changer son fuseau horaire. Qu'est-ce que tu ferais? Vous appuyez simplement sur un bouton qui passe au menu qui vous permet de modifier le fuseau horaire. Ici, le système ne peut pas prédire votre interruption externe à ses processus de chronométrage et ne peut pas vous demander d'attendre car il est occupé à incrémenter la valeur des secondes sur votre montre. C'est là que les interruptions sont utiles.
Les interruptions ne doivent pas toujours être externes; cela peut aussi être interne. La plupart du temps, une interruption intégrée facilite également la communication entre deux périphériques de la CPU. Considérez qu'une minuterie préréglée est réinitialisée et qu'une interruption est déclenchée lorsque l'heure atteint la valeur dans le registre de minuterie. Le gestionnaire d'interruption peut être utilisé pour initier les autres périphériques comme DMA.
Dans ce tutoriel, nous avons utilisé les interruptions externes sur MSP430 pour basculer entre différentes LED. Lorsqu'une interruption externe est donnée par le changement d'état à l'aide d'un bouton-poussoir, la commande est transférée (préemptée) à l'ISR et il fait le nécessaire. Pour connaître les bases comme la configuration de l'environnement CCS pour le tableau de bord MSP430G2, suivez ce lien pour démarrer avec MSP430 en utilisant CCS car nous n'entrerons pas dans les détails dans ce tutoriel. Consultez également les autres didacticiels basés sur MSP430 utilisant Energia IDE et CCS en suivant le lien.
Pourquoi avons-nous besoin d'une interruption?
Des interruptions sont nécessaires pour économiser la surcharge d'interrogation dans un système embarqué. Ils sont appelés lorsque les tâches avec une priorité plus élevée doivent être exécutées en anticipant la tâche en cours d'exécution. Il peut également être utilisé pour réveiller le processeur des modes de faible consommation. Lorsqu'il est réveillé par la transition de front d'un signal externe via un port GPIO, l'ISR est exécuté et le CPU revient à nouveau en mode faible consommation.
Types d'interruption dans MSP430
Les interruptions du MSP430 appartiennent aux types suivants:
- Réinitialisation du système
- Interruption non masquable
- Interruption masquable
- Interruptions vectorielles et non vectorisées
Réinitialisation du système:
Cela peut se produire en raison de la tension d'alimentation (Vcc) et d'un signal faible dans la broche RST / NMI avec le mode de réinitialisation sélectionné et peut également se produire pour des raisons telles que le dépassement de la minuterie du chien de garde et la violation de la clé de sécurité.
Interruption non masquable:
Ces interruptions ne peuvent pas être masquées par les instructions du CPU. Une fois l'interruption générale activée, l'interruption non masquable ne peut pas être détournée du traitement. Ceci est généré par des sources telles que les défauts de l'oscillateur et un front donné manuellement au RST / NMI (en mode NMI).
Interruption masquable:
Lorsqu'une interruption se produit et si elle peut être masquée par une instruction CPU, alors il s'agit d'une interruption masquable. Ils ne doivent pas toujours être externes. Ils dépendent également des périphériques et de leurs fonctions. Les interruptions de port externe utilisées ici relèvent de cette catégorie.
Interruptions vectorielles et interruptions non vectorisées:
Vectorisé: dans ce cas, les périphériques qui interrompent nous fournissent la source de l'interruption en passant l'adresse du vecteur d'interruption. Ici, l' adresse de l'ISR est fixe et le contrôle est transféré à cette adresse et l'ISR s'occupe du reste.
Non vectoriel: ici toutes les interruptions ont un ISR commun. Lorsqu'une interruption se produit à partir d'une source non vectorisée, le contrôle est transféré à l'adresse commune, à laquelle se partagent toutes les interruptions non vectorielles.
Contrôle du programme d'interruption dans MSP430
Lorsque l'interruption se produit, MCLK est activé et la CPU est rappelée à partir de l'état OFF. Lorsque la commande du programme est transférée à l'adresse ISR après l'occurrence de l'interruption, les valeurs dans le compteur de programme et le registre d'état sont déplacées vers la pile.
Consécutivement, le registre d'état est effacé, effaçant ainsi le GIE et mettant fin au mode basse consommation. L'interruption avec la priorité la plus élevée est sélectionnée et exécutée en plaçant l'adresse du vecteur d'interruption dans le compteur de programme. Avant d'arriver à notre code d'exemple d'interruption GPIO MSP430, il est important de comprendre le fonctionnement des registres de port impliqués.
Registres de ports pour le contrôle GPIO sur MSP430:
PxDIR: C'est un registre de contrôle de direction de port. Il permet au programmeur de sélectionner spécifiquement sa fonction en écrivant 0 ou 1. Si une broche est sélectionnée comme 1, alors elle agit comme une sortie. Considérez le port 1 comme un port 8 bits, et si les broches 2 et 3 doivent être affectées comme ports de sortie, alors le registre P1DIR doit être défini avec la valeur 0x0C.
PxIN: C'est un registre en lecture seule et les valeurs actuelles dans le port peuvent être lues à l'aide de ce registre.
PxOUT: Ce registre particulier peut être utilisé pour écrire des valeurs directement sur les ports. Ceci n'est possible que lorsque le registre pullup / pulldown est désactivé.
PxREN: C'est un registre 8 bits utilisé pour activer ou désactiver le registre pullup / pulldown. Lorsqu'une broche est définie sur 1 dans les registres PxREN et PxOUT, la broche particulière est tirée vers le haut.
PxDIR |
PxREN |
PxOUT |
Configuration E / S |
0 |
0 |
X |
Entrée avec résistances désactivées |
0 |
1 |
0 |
Entrée avec conversion interne activée |
0 |
1 |
1 |
Entrée avec pullup interne activé |
1 |
X |
X |
Sortie - PxREN n'a aucun effet |
PxSEL et PxSEL2: Comme toutes les broches du MSP430 sont multiplexées, la fonction particulière doit être sélectionnée avant de l'utiliser. Lorsque les registres PxSEL et PxSEL2 sont mis à 0 pour une broche particulière, alors l'E / S à usage général est sélectionnée. Lorsque le PxSEL est défini sur 1, la fonction périphérique principale est sélectionnée, et ainsi de suite.
PxIE: Il active ou désactive les interruptions pour une broche particulière dans un port x.
PxIES: Il sélectionne l'arête à laquelle une interruption est générée. Pour 0, un front montant est sélectionné et pour 1, un front descendant est sélectionné.
Circuit MSP430 pour tester l'interruption GPIO
Le circuit MSP430 utilisé pour tester notre exemple de code d' interruption MSP430 est illustré ci-dessous.
La masse de la carte est utilisée pour mettre à la terre la LED et le bouton. Les côtés opposés en diagonale du bouton-poussoir sont des bornes normalement ouvertes et se connectent lorsque le bouton-poussoir est enfoncé. Une résistance est connectée avant la LED pour éviter la forte consommation de courant de la LED. Habituellement, des résistances basses de l'ordre de 100ohm à 220ohm sont utilisées.
Nous utilisons 3 codes différents pour mieux comprendre les interruptions de port. Les deux premiers codes utilisent le même circuit que dans le schéma de circuit 1. Plongeons-nous dans le code. Une fois les connexions établies, ma configuration ressemble à ceci.
Programmation du MSP430 pour les interruptions
Le programme d'interruption MSP430 complet se trouve au bas de cette page, l'explication du code est la suivante.
La ligne ci-dessous arrête le chronomètre du chien de garde. La minuterie Watchdog effectue généralement deux opérations. L'un empêche le contrôleur de boucles infinies en réinitialisant le contrôleur et l'autre est qu'il déclenche des événements périodiques à l'aide de la minuterie intégrée. Lorsqu'un microcontrôleur est réinitialisé (ou mis sous tension), il est en mode minuterie et a tendance à réinitialiser le MCU après 32 millisecondes. Cette ligne empêche le contrôleur de faire cela.
WDTCTL = WDTPW + WDTHOLD;
Le réglage du registre P1DIR sur la valeur 0x07 définit le sens de la broche0, de la broche1 et de la broche2 comme sortie. Régler le P1OUT sur 0x30 le configure comme une entrée avec des résistances de rappel internes activées sur les broches 4 et 5. Le réglage de P1REN sur 0x30 active le pullup interne sur ces broches. P1IE active l'interruption, où P1IES sélectionne la transition haut vers bas comme front d'interruption sur ces broches.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
La ligne suivante active le mode basse consommation et active le GIE dans le registre d'état afin que les interruptions puissent être reçues.
__bis_SR_register (LPM4bits + GIE)
Le compteur de programme est défini avec l'adresse du vecteur du port 1 à l'aide de la macro.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
Le code ci-dessous fait basculer chacune des LED connectées aux broches 0, 1 et 2 une par une.
si (compte% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; count ++; } sinon si (compte% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; count ++; } else { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; count ++; }
Schéma de circuit 2:
De même, essayons une épingle différente pour mieux comprendre le concept. Donc ici, le bouton poussoir est connecté à la broche 2.0 au lieu de la broche 1.5. le circuit modifié est le suivant. Encore une fois, ce circuit est utilisé pour tester le programme d' interruption de bouton MSP430.
Ici, le port 2 est utilisé pour l'entrée. Il faut donc utiliser un vecteur d'interruption différent. P1.4 et P2.0 prennent les entrées.
Comme le port 2 n'est utilisé que pour l'entrée, P2DIR est défini sur 0. Pour définir la broche 0 du port 2 comme entrée avec des résistances de rappel internes activées, les registres P2OUT et P2REN doivent être définis avec une valeur de 1. Pour activer le interrompre sur la broche0 du port 2 et également pour sélectionner le bord de l'interruption, P2IE et P2IES sont définis avec une valeur de 1. Pour réinitialiser le drapeau dans le port 2, P2IFG est effacé, de sorte que le drapeau peut être remis à nouveau sur le occurrence de l'interruption.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Lorsque la source d'interruption provient du port 1, la LED connectée à la broche 1 du port 1 s'allume. Lorsque la source d'interruption appartient au port 2, la LED connectée à la broche 2 du port 1 s'allume.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; pour (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; pour (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Téléchargement du programme sur MSP430 depuis CCS
Pour charger le projet sur le tableau de bord et le déboguer, sélectionnez le projet et cliquez sur l'icône de débogage dans la barre d'outils. Sinon, appuyez sur F11 ou cliquez sur RunàDebug pour entrer dans le mode de débogage.
Une fois que le mode de débogage est entré, appuyez sur le bouton d'exécution de couleur verte pour exécuter librement le code chargé dans le MCU. Désormais, lorsque le bouton poussoir est enfoncé, l'interruption est déclenchée par le changement de front, provoquant ainsi le changement d'état de la LED.
Programme d'interruption sur MSP430
Une fois le code téléchargé, nous pouvons le tester en utilisant simplement le bouton poussoir. Le motif des LED changera selon notre programme chaque fois qu'une interruption est donnée à l'aide du bouton poussoir.
Le travail complet peut être trouvé dans la vidéo ci-dessous. J'espère que vous avez apprécié le tutoriel et appris quelque chose d'utile. Si vous avez des questions, laissez-les dans la section des commentaires ou utilisez nos forums pour d'autres questions techniques.