Was sind die häufigsten Fehler und Lösungen (Troubleshooting) bei Interrupts?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

Hier sind einige häufige Probleme und deren mögliche Lösungen:

  • Der Interrupt wird nicht ausgelöst: Überprüft die Pin-Nummer und die Verkabelung.
  • Mehrfache Auslösung bei einem Tastendruck: Implementiert eine Entprellung wie im folgenden Code gezeigt:
// Taster-Interrupt mit Entprellung (ISR-sicher)
const int buttonPin = 4;
const int ledPin = 2;

volatile bool buttonPressed = false;    // Flag für den Taster
bool ledState = false;
unsigned long lastHandledTime = 0;
const unsigned long debounceDelay = 50;

void IRAM_ATTR handleButtonPress() {
  buttonPressed = true;  // Nur das Flag setzen, keine Logik in der ISR
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);    // Taster-Pin mit internem Pullup-Widerstand
  pinMode(ledPin, OUTPUT);             // LED als Ausgang
  attachInterrupt(digitalPinToInterrupt(buttonPin), handleButtonPress, FALLING);  // Interrupt bei fallender Flanke
}

void loop() {
  if (buttonPressed) {
    unsigned long currentTime = millis();
    if ((currentTime - lastHandledTime) > debounceDelay) {
      ledState = !ledState;           // LED-Zustand umschalten
      lastHandledTime = currentTime;  // Zeit merken
    }
    buttonPressed = false;            // Flag zurücksetzen
  }

  digitalWrite(ledPin, ledState);     // LED anpassen
}

// Erklärung: 
// Die ISR setzt nur ein Flag. Die eigentliche Entprellung und Verarbeitung 
// passiert im loop(). Das macht den Code ISR-sicher und verhindert Probleme 
// mit millis() oder digitalWrite() im Interrupt.
  • Die LED reagiert nicht: Stellt sicher, dass die LED-Pin-Nummer korrekt ist und die LED richtig herum eingesetzt ist.
  • Der Code kompiliert nicht: Überprüft, ob alle benötigten Bibliotheken installiert sind und die Syntax korrekt ist.