🛠 Sortir des sentiers : registres AVR et interruption externe
Objectifs
Programmer le ATmega32U4 au niveau des registres : configurer une interruption externe sur front descendant (registres EICRA et EIMSK), écrire une routine de service (ISR) courte, et comprendre le motif du drapeau volatile plutôt que du travail long en ISR. Sur le Micro, les interruptions externes sont disponibles sur les broches 0, 1, 2, 3 et 7.
Matériel
- 1 Arduino Micro + câble micro-USB
- 1 bouton poussoir entre la broche 3 et GND (la broche 3 porte l'interruption externe INT0 ; pull-up interne activée par le code)
- La LED embarquée (broche 13) sert de témoin
Code complet
// Interruption externe sur front descendant, a la main (sans attachInterrupt).
// Broche 3 du Micro = INT0. On configure les registres puis on écrit l'ISR.
volatile bool événement = false; // drapeau partage ISR -> boucle
void setup {
DDRB &= ~(1 << DDB0); // sens entrée de la broche 13 cote port B
EIMSK &= ~(1 << INT0); // INT0 desactive pendant la config
EICRA = (1 << ISC01) | (0 << ISC00); // INT0 sur front descendant
EIMSK |= (1 << INT0); // autoriser INT0
// Broche 3 : entrée + pull-up (le noyau Arduino gere le pull via PORT)
pinMode(3, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
sei; // autorisation globale des interruptions
Serial.begin(9600);
}
ISR(INT0_vect) { // executee sur chaque front descendant
événement = true; // travail minimal : lever un drapeau
}
void loop {
if (événement) {
événement = false;
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
Serial.println("INT0 : front descendant detecte");
}
}
Vérification attendue
Chaque appui (front descendant) bascule la LED 13 et imprime une ligne ; le moniteur reste réactif car seule une bascule de drapeau se produit dans l'ISR. En approchant le doigt du bouton câblé long, on peut voir des déclenchements parasites : c'est réel, d'où le pull-up et l'anti-rebond côté boucle si nécessaire.
Erreurs fréquentes
- Faire delay ou Serial.println dans l'ISR : l'ISR bloque le temps système (millis) et corrompt la sortie série ; ne lever qu'un drapeau.
- Oublier volatile sur le drapeau partagé : le compilateur optimise la lecture en boucle et l'événement semble perdu.
- Oublier sei : EIMSK armé mais interruptions globalement masquées, rien ne se passe.
- Penser que les broches 0/1 sont de bonnes entrées d'interruption ici : elles servent à Serial1 (RX/TX) ; préférer 2, 3 ou 7.
- Attention aux particularités connues du bootloader Caterina : il execute des operations SPM interruptions activees et peut laisser une interruption armee en quittant (issues noyau AVR #122 et #218) ; réinitialiser proprement EIMSK dans setup.
Autres tutoriels pour cette carte
- Faire clignoter la LED embarquée (et comprendre les LED TX/RX)
- Lire un bouton avec une résistance de pull-up interne
- Lire un capteur analogique sur le convertisseur 10 bits
- Transformer le Micro en clavier USB (HID) avec bouton de sécurité
- Pont Serial vers Serial1 : passerelle USB vers TTL
- Piloter un servo moteur avec le PWM et un potentiomètre
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinoclavier-auto-tape.inoArduinosouris-cercle.inoArduinotelecommande-media.inoArduinobouton-clic-souris.inoArduino