🛠 Sortir des sentiers : registres AVR et interruption externe

Arduino Micro · avance · Schéma : IMG-micro-avance-1-micro-registres-avr-interruption.svg — Bouton sur la broche 3 d'une Arduino Micro déclenchant une interruption externe, registre EICRA configuré sur front descendant, LED de la broche 13 allumée depuis la routine d'interruption

Objetivos

Programar el ATmega32U4 a nivel de registros: configurar una interrupción externa por flanco de bajada (registros EICRA y EIMSK), escribir una rutina de servicio (ISR) breve, y comprender el patrón de usar una bandera volatile en lugar de realizar trabajo largo dentro de la ISR. En la placa Micro, las interrupciones externas están disponibles en los pines 0, 1, 2, 3 y 7.

Material

Código completo

// Interruption externe sur front descendant, a la main (sans attachInterrupt).
// Broche 3 du Micro = INT0. On configure les registres puis on ecrit l'ISR.
volatile bool evenement = false;   // drapeau partage ISR -> boucle

void setup {
  DDRB  &= ~(1 << DDB0);          // sens entree 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 : entree + 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
  evenement = true;               // travail minimal : lever un drapeau
}

void loop {
  if (evenement) {
    evenement = false;
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    Serial.println("INT0 : front descendant detecte");
  }
}

Verificación esperada

Cada pulsación (flanco de bajada) alterna el estado del LED 13 e imprime una línea; el monitor permanece reactivo porque solo se produce un cambio de bandera dentro de la ISR. Al acercar el dedo al botón con cableado largo, se pueden observar disparos parásitos: esto es real, de ahí la necesidad del pull-up y de la gestión antirrebote en el bucle principal si es necesario.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales