Onderbrekingen zijn een krachtig kenmerk van microcontrollers waarmee u gebeurtenissen asynchroon kunt verwerken. In tegenstelling tot peiling, die continu op gebeurtenissen controleert, reageren onderbreekt onmiddellijk wanneer een specifieke gebeurtenis plaatsvindt, zoals een knopdruk of een timer -overloop. Deze zelfstudie zal u begeleiden door interrupts te begrijpen en te gebruiken met Arduino.
Wat u nodig hebt
- Arduino Uno (of een compatibel bord)
- Drukknop
- Weerstand van 10K-OHM (voor vervolgkeuzelijst)
- LED- en 220-OHM-weerstand (optioneel)
- Breadboard en jumper draden
- Arduino Ide geïnstalleerd op uw computer
Stap 1: Wat zijn onderbrekingen?
Een interrupt stopt de uitvoering van het hoofdprogramma tijdelijk om een specifiek evenement af te handelen. Zodra het evenement is verwerkt, wordt het programma hervat waar het was gebleven. Onderbrekingen worden beheerd met behulp van speciale functies die worden genoemd Interrupt Service Routines (ISRS).
Soorten onderbrekingen in Arduino
- Externe onderbrekingen: Gevestigd door gebeurtenissen op specifieke pennen (bijv. Pin 2 of 3 op Arduino Uno).
- PIN Wijziging onderbrekingen: Gevestigd door een verandering op een digitale pin.
- Timer onderbreekt: Gevestigd door timer -overloop of vergelijken wedstrijden.
Stap 2: Externe onderbrekingen gebruiken
De Arduino UNO ondersteunt externe interrupts op pennen 2 en 3. U kunt deze interrupts configureren om te activeren:
- Stijgen: Signaal gaat van laag naar hoog.
- Vallen: Signaal gaat van hoog naar laag.
- WIJZIGING: Signaalveranderingen status (laag tot hoog of hoog tot laag).
- LAAG: Signaal blijft laag.
Voorbeeldcode: een knop detecteren Druk op de knop
Dit voorbeeld schakelt een LED in wanneer een knop is aangesloten op pin 2 wordt ingedrukt.
#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
}
Uitleg
-
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
: Configureert de interrupt.-
pin
: De onderbrekingspen (bijv. Pin 2 of 3 op Arduino Uno). -
ISR
: De routine voor interrupt services om uit te voeren. -
mode
: De triggersconditie (RISING
,FALLING
,CHANGE
, ofLOW
).
-
-
digitalPinToInterrupt(pin)
: Converteert een pincode naar zijn onderbrekingsnummer.
Stap 3: Interrupts met pin -wijzigingen gebruiken
Met pin -wijzigingsonderbrekingen kunt u wijzigingen op elke digitale pin detecteren. Dit vereist extra bibliotheken, zoals Enable Interrupt.
Voorbeeldcode: pin wijzigen 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
}
Bibliotheekinstallatie
Installeer de onderbrekingen Enable Interrupt Bibliotheek via de Arduino Library Manager.
Stap 4: Timer onderbreekt
Timer -onderbrekingen zijn nuttig voor het plannen van taken met precieze intervallen. Verwijs naar de Arduino Timer Tutorial Voor meer informatie over het configureren van timeronderbrekingen.
Voorbeeld: knipperen een LED met 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
}
Stap 5: Best practices voor het gebruik van onderbrekingen
- Houd ISR's kort: Vermijd vertragingen of complexe berekeningen in ISR's om een snelle respons te garanderen.
- Vermijd seriële communicatie in ISR's: Seriële functies werken mogelijk niet betrouwbaar in een ISR.
-
Gebruik
volatile
voor gedeelde variabelen: Mark -variabelen gedeeld tussen ISRS en het hoofdprogramma alsvolatile
Om compiler -optimalisatieproblemen te voorkomen. - Debounce -ingangen: Behandel Debounce Logic in software of hardware voor lawaaierige signalen zoals knopdrukken.
-
Schakel onderbrekingen uit tijdens kritieke secties: Gebruik
noInterrupts()
Eninterrupts()
om kritieke codesecties te beschermen.
Toepassingen van onderbrekingen
- Handeling knop drukt zonder peiling
- Rotary Encoders lezen
- Timing kritieke gebeurtenissen (bijv. Nauwkeurige motorbesturing)
- Periodieke taken plannen
- Reageren op externe signalen (bijv. Sensoren, communicatie -gebeurtenissen)
Problemen oplossen
- Onderbreken niet triggeren: Zorg ervoor dat de juiste pincode en modus zijn geconfigureerd.
- Onstabiel gedrag: Debounce lawaaierige signalen en vermijd lange ISR's.
- Conflicten met bibliotheken: Sommige bibliotheken gebruiken intern onderbrekingen (bijv. Servo, PWM). Zorg voor geen conflict met uw code.
Conclusie
Onderbrekingen maken responsieve en efficiënte afhandeling van gebeurtenissen mogelijk in Arduino -projecten. Door te leren externe, pin -verandering en timer -onderbrekingen te gebruiken, kunt u robuuste en precieze toepassingen maken. Experimenteer met verschillende soorten onderbrekingen om uw projecten te verbeteren en de prestaties te optimaliseren!