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
- Arduino Uno (oder eine kompatible Karte)
- Druckknopf
- 10K-OHM-Widerstand (für Pulldown-Konfiguration)
- LED und 220-OHM-Widerstand (optional)
- Breadboard- und Jumper -Drähte
- 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
- Externe Interrupts: Ausgelöst durch Ereignisse an bestimmten Stiften (z. B. Pin 2 oder 3 auf Arduino uno).
- Pinänderung unterbricht: Ausgelöst durch eine Änderung an jedem digitalen Pin.
- 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
, oderLOW
).
-
-
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
- Halten Sie ISRS kurz: Vermeiden Sie Verzögerungen oder komplexe Berechnungen in ISRs, um eine schnelle Reaktion sicherzustellen.
- Vermeiden Sie serielle Kommunikation in ISRs: Serielle Funktionen funktionieren möglicherweise nicht zuverlässig in einem ISR.
-
Verwenden
volatile
Für gemeinsame Variablen: Markieren Sie die zwischen ISRS und dem Hauptprogramm geteilten Variablen alsvolatile
Um Compiler -Optimierungsprobleme zu verhindern. - Inputs entdecken: Behandeln Sie die Logik der Entbrüche in Software oder Hardware für laute Signale wie Taste -Drücken.
-
Deaktivieren Sie Interrupts in kritischen Abschnitten: Verwenden
noInterrupts()
Undinterrupts()
zum Schutz kritischer Codeabschnitte.
Anwendungen von Interrupts
- Handhabungstaste ohne Abfragen
- Lesen von Rotary -Encodern
- Timing kritische Ereignisse (z. B. präzise Motorkontrolle)
- Planung regelmäßiger Aufgaben
- 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!