Arduino Interrupts Tutorial

Arduino Interrupts Tutorial

Interrupts sind ein leistungsstarkes Merkmal von Mikrocontrollern, mit denen Sie Ereignisse asynchron behandeln können. Im Gegensatz zu Umfragen, die kontinuierlich nach Ereignissen prüft, reagieren Interrupts sofort, wenn ein bestimmtes Ereignis auftritt, wie z. Dieses Tutorial führt Sie durch das Verständnis und die Verwendung von Interrupts mit Arduino.


Was Sie brauchen werden

  1. Arduino Uno (oder eine kompatible Karte)
  2. Druckknopf
  3. 10K-OHM-Widerstand (für Pulldown-Konfiguration)
  4. LED und 220-OHM-Widerstand (optional)
  5. Breadboard- und Jumper -Drähte
  6. Arduino IDE ist auf Ihrem Computer installiert

Schritt 1: Was sind Interrupts?

Ein Interrupt hält die Ausführung des Hauptprogramms vorübergehend an, um ein bestimmtes Ereignis zu verarbeiten. Sobald die Veranstaltung verarbeitet wurde, wird das Programm dort fortgesetzt, wo es aufgehört hat. Interrupts werden unter Verwendung von speziellen Funktionen verwaltet, die genannt werden Interrupt Service Routinen (ISRS).

Arten von Interrupts in Arduino

  1. Externe Interrupts: Ausgelöst durch Ereignisse an bestimmten Stiften (z. B. Pin 2 oder 3 auf Arduino uno).
  2. Pinänderung unterbricht: Ausgelöst durch eine Änderung an jedem digitalen Pin.
  3. Timer unterbricht: Durch Timerüberläufe ausgelöst oder vergleichen Sie Übereinstimmungen.

Schritt 2: Verwenden externer Interrupts

Die Arduino Uno unterstützt externe Interrupts auf den Stiften 2 und 3.. Sie können diese Interrupts konfigurieren, um auszulösen:

  • AUFSTAND: Signal geht von niedrig nach hoch.
  • Fallend: Signal geht von hoch nach niedrig.
  • ÄNDERN: Signaländerungen Zustand (niedrig bis hoch oder hoch bis niedrig).
  • NIEDRIG: Signal bleibt niedrig.

Beispielcode: Erkennen einer Taste Drücken Sie drücken

Dieses Beispiel schaltet eine LED um, wenn eine mit Pin 2 angeschlossene Taste gedrückt wird.

#define buttonPin 2 // Interrupt pin
#define ledPin 13   // Built-in LED

volatile bool ledState = false; // Shared variable between ISR and main code

void handleInterrupt() {
  ledState = !ledState; // Toggle LED state
  digitalWrite(ledPin, ledState);
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // Enable internal pull-up resistor
  pinMode(ledPin, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(buttonPin), handleInterrupt, FALLING); // Trigger on button press
}

void loop() {
  // Main loop does nothing; interrupt handles the LED
}

Erläuterung

  • attachInterrupt(digitalPinToInterrupt(pin), ISR, mode): Konfiguriert den Interrupt.
    • pin: Der Interrupt -Pin (z. B. Pin 2 oder 3 auf Arduino uno).
    • ISR: Die Routine für Interrupt -Dienstleistungen zur Ausführung.
    • mode: Die Auslöserbedingung (RISING, FALLING, CHANGE, oder LOW).
  • digitalPinToInterrupt(pin): Umwandelt eine PIN -Nummer in die Interrupt -Nummer.

Schritt 3: Verwenden von Pin -Änderungs -Interrupts

Mit den Interrupts mit PIN -Änderung können Sie Änderungen an jedem digitalen PIN erkennen. Dies erfordert zusätzliche Bibliotheken wie z. Aktivieren.

Beispielcode: Pin ändern Interrupt

#include <EnableInterrupt.h>
#define pin 4 // Pin to monitor

void handlePinChange() {
  Serial.println("Pin state changed!");
}

void setup() {
  Serial.begin(9600);
  enableInterrupt(pin, handlePinChange, CHANGE); // Trigger on any state change
}

void loop() {
  // Main loop does nothing; interrupt handles the event
}

Bibliotheksinstallation

Installieren Sie die Interrupts bei PIN -Änderungen, um die zu verwenden Aktivieren Bibliothek über den Arduino Library Manager.


Schritt 4: Timer -Interrupts

Timer -Interrupts sind nützlich für die Planung von Aufgaben in genauen Intervallen. Beziehen Sie sich auf die Arduino Timer Tutorial Einzelheiten zum Konfigurieren von Timer -Interrupts.

Beispiel: Blinken einer LED mit Timer1 Interrupt

#define ledPin 13

void setup() {
  pinMode(ledPin, OUTPUT);

  // Configure Timer1
  noInterrupts(); // Disable interrupts during setup
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;

  OCR1A = 15624; // Compare match value for 1Hz (1-second interval)
  TCCR1B |= (1 << WGM12); // CTC mode
  TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
  TIMSK1 |= (1 << OCIE1A); // Enable Timer1 compare interrupt

  interrupts(); // Enable interrupts
}

ISR(TIMER1_COMPA_vect) {
  digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle LED
}

void loop() {
  // Main loop does nothing; Timer1 handles the LED
}

Schritt 5: Best Practices für die Verwendung von Interrupts

  1. Halten Sie ISRS kurz: Vermeiden Sie Verzögerungen oder komplexe Berechnungen in ISRs, um eine schnelle Reaktion sicherzustellen.
  2. Vermeiden Sie serielle Kommunikation in ISRs: Serielle Funktionen funktionieren möglicherweise nicht zuverlässig in einem ISR.
  3. Verwenden volatile Für gemeinsame Variablen: Markieren Sie die zwischen ISRS und dem Hauptprogramm geteilten Variablen als volatile Um Compiler -Optimierungsprobleme zu verhindern.
  4. Inputs entdecken: Behandeln Sie die Logik der Entbrüche in Software oder Hardware für laute Signale wie Taste -Drücken.
  5. Deaktivieren Sie Interrupts in kritischen Abschnitten: Verwenden noInterrupts() Und interrupts() zum Schutz kritischer Codeabschnitte.

Anwendungen von Interrupts

  1. Handhabungstaste ohne Abfragen
  2. Lesen von Rotary -Encodern
  3. Timing kritische Ereignisse (z. B. präzise Motorkontrolle)
  4. Planung regelmäßiger Aufgaben
  5. Reaktion auf externe Signale (z. B. Sensoren, Kommunikationsereignisse)

Fehlerbehebung

  • Interrupt nicht auslösen: Stellen Sie sicher, dass der richtige Pin und der richtige Modus konfiguriert sind.
  • Instabiles Verhalten: Entdecken Sie laute Signale und vermeiden Sie lange ISRs.
  • Konflikte mit Bibliotheken: Einige Bibliotheken verwenden Interrupts intern (z. B. Servo, PWM). Stellen Sie keinen Konflikt mit Ihrem Code sicher.

Abschluss

Interrupts ermöglichen eine reaktionsschnelle und effiziente Behandlung von Ereignissen in Arduino -Projekten. Wenn Sie lernen, externe, Pin -Änderungen und Timer -Interrupts zu verwenden, können Sie robuste und präzise Anwendungen erstellen. Experimentieren Sie mit verschiedenen Arten von Interrupts, um Ihre Projekte zu verbessern und die Leistung zu optimieren!

Hinterlasse einen Kommentar

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.