Arduino onderbreekt tutorial

Arduino Interrupts Tutorial

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

  1. Arduino Uno (of een compatibel bord)
  2. Drukknop
  3. Weerstand van 10K-OHM (voor vervolgkeuzelijst)
  4. LED- en 220-OHM-weerstand (optioneel)
  5. Breadboard en jumper draden
  6. 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

  1. Externe onderbrekingen: Gevestigd door gebeurtenissen op specifieke pennen (bijv. Pin 2 of 3 op Arduino Uno).
  2. PIN Wijziging onderbrekingen: Gevestigd door een verandering op een digitale pin.
  3. 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, of LOW).
  • 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

  1. Houd ISR's kort: Vermijd vertragingen of complexe berekeningen in ISR's om een ​​snelle respons te garanderen.
  2. Vermijd seriële communicatie in ISR's: Seriële functies werken mogelijk niet betrouwbaar in een ISR.
  3. Gebruik volatile voor gedeelde variabelen: Mark -variabelen gedeeld tussen ISRS en het hoofdprogramma als volatile Om compiler -optimalisatieproblemen te voorkomen.
  4. Debounce -ingangen: Behandel Debounce Logic in software of hardware voor lawaaierige signalen zoals knopdrukken.
  5. Schakel onderbrekingen uit tijdens kritieke secties: Gebruik noInterrupts() En interrupts() om kritieke codesecties te beschermen.

Toepassingen van onderbrekingen

  1. Handeling knop drukt zonder peiling
  2. Rotary Encoders lezen
  3. Timing kritieke gebeurtenissen (bijv. Nauwkeurige motorbesturing)
  4. Periodieke taken plannen
  5. 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!

Laat een reactie achter

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.