### Exercices sur les interruptions du MSP430
---
#### **Exercice 1 : Programme avec interruptions**
Écrivez un programme qui allume une LED connectée à P1.4 lors d’un appui sur un bouton branché sur
P2.3 (front montant). Le microcontrôleur doit être en mode LPM3 entre les interruptions. Assumez une
résistance pull-down externe sur P2.3.
<details>
<summary>Correction</summary>
```c
#include <msp430g2553.h>
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Désactiver le watchdog
P1DIR |= BIT4; // P1.4 en sortie (LED)
P2DIR &= ~BIT3; // P2.3 en entrée (bouton)
P2IE |= BIT3; // Activer les interruptions sur P2.3
P2IES &= ~BIT3; // Interruption sur front montant (pull-down)
P2IFG &= ~BIT3; // Effacer le drapeau de P2.3
__BIS_SR(GIE | LPM3_bits); // Activer les interruptions + mode LPM3
#pragma vector = PORT2_VECTOR
__interrupt void bouton_ISR(void) {
P1OUT ^= BIT4; // Inverser l'état de la LED
P2IFG &= ~BIT3; // Effacer le drapeau de P2.3
```
</details>
---
#### **Exercice 2 : Gestion des rebonds**
Modifiez la routine d’interruption de l’exercice 1 pour gérer les rebonds du bouton avec une
temporisation de 10 ms.
<details>
<summary>Correction</summary>
```c
#pragma vector = PORT2_VECTOR
__interrupt void bouton_ISR(void) {
volatile int i;
for (i = 0; i < 10000; i++); // Temporisation anti-rebonds (~10 ms)
if (P2IN & BIT3) { // Vérifier si le bouton est toujours pressé
P1OUT ^= BIT4; // Inverser la LED
P2IFG &= ~BIT3; // Effacer le drapeau
}
```
</details>
---
### QCM sur les interruptions du MSP430 (20 questions)
---
**1. Quel est l’avage principal des interruptions par rapport au polling ?**
A) Réduction de la consommation d’énergie
B) Meilleure gestion des entrées analogiques
C) Simplification du matériel
D) Aucun avantage
**Réponse : A**
---
**2. Quel registre active les interruptions pour une broche spécifique (ex. P1.0) ?**
A) P1IFG
B) P1IE
C) P1IES
D) P1DIR
**Réponse : B**
---
**3. Que se passe-t-il si le bit GIE est à 0 ?**
A) Toutes les interruptions sont désactivées
B) Seules les interruptions non masquables sont activées
C) Le microcontrôleur passe en mode LPM3
D) Les drapeaux d’interruption sont effacés
**Réponse : A**
---
**4. Comment configurer une interruption sur front descendant pour P1.2 ?**
A) P1IES |= BIT2
B) P1IES &= ~BIT2
C) P1IE |= BIT2
D) P1IFG |= BIT2
**Réponse : A**
---
**5. Quel vecteur d’interruption est associé au Port 1 ?**
A) FFE4h
B) FFE6h
C) FFF2h
D) FFEAh
**Réponse : A**
---
**6. Que contient un vecteur d’interruption ?**
A) La valeur du drapeau d’interruption
B) L’adresse de la routine d’interruption
C) Le numéro de la broche concernée
D) Le registre de configuration
**Réponse : B**
---
**7. Quel mode LPM désactive le DCO ?**
A) LPM0
B) LPM1
C) LPM3
D) LPM4
**Réponse : C**
---
**8. Pourquoi faut-il éviter les boucles dans les routines d’interruption ?**
A) Pour économiser la mémoire
B) Pour ne pas retarder d’autres interruptions
C) Pour éviter les conflits de registres
D) Pour réduire la fréquence d’horloge
**Réponse : B**
---
**9. Comment effacer manuellement le drapeau d’interruption de P1.0 ?**
A) P1IFG |= BIT0
B) P1IFG &= ~BIT0
C) P1IE &= ~BIT0
D) P1IES &= ~BIT0
**Réponse : B**
---
**10. Que fait l’instruction `__BIS_SR(LPM3_bits)` ?**
A) Active le mode basse consommation LPM3
B) Désactive les interruptions
C) Réinitialise le microcontrôleur
D) Active le watchdog timer
**Réponse : A**
---
**11. Que se passe-t-il si deux interruptions surviennent simultanément ?**
A) Elles sont traitées par ordre de priorité
B) Elles sont ignorées
C) Le microcontrôleur redémarre
D) Seule la première est traitée
**Réponse : A**
---
**12. Quel périphérique permet de réveiller le MSP430 depuis un mode LPM ?**
A) Le watchdog timer
B) Un timer configuré
C) Une interruption GPIO
D) Toutes ces réponses
**Réponse : D**
---
**13. Quelle directive associe une routine à un vecteur d’interruption ?**
A) `#include <vector>`
B) `#pragma vector=PORT1_VECTOR`
C) `__interrupt void`
D) `#define VECTOR`
**Réponse : B**
---
**14. Quel est le rôle de P1REN ?**
A) Activer les résistances internes
B) Configurer les entrées/sorties
C) Activer les interruptions
D) Définir le sens du front
**Réponse : A**
---
**15. Que signifie un drapeau IFG à 1 ?**
A) L’interruption est activée
B) Un événement a été détecté
C) Le microcontrôleur est en mode LPM
D) La routine d’interruption est en cours
**Réponse : B**
---
**16. Comment désactiver une interruption sur P1.3 ?**
A) P1IE &= ~BIT3
B) P1IFG &= ~BIT3
C) P1DIR &= ~BIT3
D) P1IES &= ~BIT3
**Réponse : A**
---
**17. Quelle instruction permet de quitter le mode LPM3 dans une ISR ?**
A) `__BIC_SR(LPM3_bits)`
B) `__BIS_SR(GIE)`
C) `__BIC_SR_IRQ(LPM3_bits)`
D) `__BIS_SR_IRQ(LPM3_bits)`
**Réponse : C**
---
**18. Quel registre contrôle le sens des fronts pour les interruptions GPIO ?**
A) P1IE
B) P1IES
C) P1IFG
D) P1REN
**Réponse : B**
---
**19. Quel est l’inconvénient du polling ?**
A) Consommation élevée
B) Réponse lente aux événements
C) Nécessite plus de mémoire
D) A et B
**Réponse : D**
---
**20. Que fait `P1OUT ^= BIT6` dans une ISR ?**
A) Allume la LED
B) Éteint la LED
C) Inverse l’état de la LED
D) Lit l’état de la LED
**Réponse : C**
---
**Fin des QCM**