Arduino avbryter handledning

Arduino Interrupts Tutorial

Avbrott är ett kraftfullt inslag i mikrokontroller som gör att du kan hantera händelser asynkront. Till skillnad från omröstning, som kontinuerligt kontrollerar för händelser, avbryter avbrott omedelbart när en specifik händelse inträffar, till exempel en knapptryckning eller en timeröverflöde. Denna handledning kommer att vägleda dig genom att förstå och använda avbrott med Arduino.


Vad du behöver

  1. Arduino Uno (eller ett kompatibelt bräde)
  2. Tryckknapp
  3. 10k-ohm motstånd (för neddragningskonfiguration)
  4. LED och 220-ohm-motstånd (valfritt)
  5. Breadboard och jumpertrådar
  6. Arduino Ide installerad på din dator

Steg 1: Vad är avbrott?

Ett avbrott stoppar tillfälligt huvudprogrammets genomförande för att hantera en specifik händelse. När evenemanget har behandlats återupptas programmet där det slutade. Avbrott hanteras med specialfunktioner som kallas Avbrottstjänstrutiner (ISR).

Typer av avbrott i Arduino

  1. Externa avbrott: Utlöses av händelser på specifika stift (t.ex. stift 2 eller 3 på Arduino UNO).
  2. PIN -ändringsavbrott: Utlöses av en förändring på alla digitala stift.
  3. Timeravbrott: Utlöses av timeröverflöden eller jämför matchningar.

Steg 2: Använd externa avbrott

Arduino UNO stöder externa avbrott på stift 2 och 3. Du kan konfigurera dessa avbrott för att utlösa på:

  • STIGANDE: Signalen går från låg till hög.
  • FALLANDE: Signalen går från högt till lågt.
  • ÄNDRA: Signaländringar tillstånd (låg till hög eller hög till låg).
  • LÅG: Signalen förblir låg.

Exempelkod: Upptäck en knapptryck

Detta exempel växlar en LED när en knapp som är ansluten till stift 2 trycks in.

#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
}

Förklaring

  • attachInterrupt(digitalPinToInterrupt(pin), ISR, mode): Konfigurerar avbrottet.
    • pin: Avbrottsstiftet (t.ex. stift 2 eller 3 på Arduino UNO).
    • ISR: Avbrottsservicrutinen att utföra.
    • mode: Utlösande tillstånd (RISING, FALLING, CHANGEeller LOW).
  • digitalPinToInterrupt(pin): Konverterar ett stiftnummer till sitt avbrottsnummer.

Steg 3: Att använda stiftbyte avbrott

Stiftändringsavbrott låter dig upptäcka ändringar på alla digitala stift. Detta kräver ytterligare bibliotek, till exempel Aktivera ingripande.

Exempelkod: PIN -ändringsavbrott

#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
}

Biblioteksinstallation

För att använda stiftändringsavbrott, installera Aktivera ingripande Bibliotek via Arduino Library Manager.


Steg 4: Timer avbryter

Timeravbrott är användbara för att schemalägga uppgifter med exakta intervall. Hänvisa till Arduino timer handledning För information om hur du konfigurerar timeravbrott.

Exempel: Blinkande en LED med timer1 -avbrott

#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
}

Steg 5: Bästa metoder för att använda avbrott

  1. Håll ISR: er kort: Undvik förseningar eller komplexa beräkningar i ISR ​​för att säkerställa snabbt svar.
  2. Undvik seriekommunikation i ISR: er: Seriella funktioner kanske inte fungerar pålitligt inuti en ISR.
  3. Använda volatile För delade variabler: Markvariabler delade mellan ISRS och huvudprogrammet som volatile För att förhindra kompilatoroptimeringsproblem.
  4. Debous -ingångar: Hantera debous -logiken i programvara eller hårdvara för bullriga signaler som knapptryck.
  5. Inaktivera avbrott under kritiska avsnitt: Använda noInterrupts() och interrupts() för att skydda kritiska kodavsnitt.

Ansökningar av avbrott

  1. HANTERING -knapptryckningar utan omröstning
  2. Läser roterande kodare
  3. Tidpunkt för kritiska händelser (t.ex. exakt motorstyrning)
  4. Schemaläggningsperiodiska uppgifter
  5. Reagerar på externa signaler (t.ex. sensorer, kommunikationshändelser)

Felsökning

  • Avbrott inte utlöser: Se till att rätt stift och läge är konfigurerade.
  • Instabilt beteende: Debous bullriga signaler och undvik långa ISR: er.
  • Konflikt med bibliotek: Vissa bibliotek använder avbrott internt (t.ex. servo, PWM). Se till att ingen konflikt med din kod.

Slutsats

Avbrott möjliggör lyhörd och effektiv hantering av händelser i Arduino -projekt. Genom att lära dig att använda extern, stiftbyte och timeravbrott kan du skapa robusta och exakta applikationer. Experimentera med olika typer av avbrott för att förbättra dina projekt och optimera prestanda!

Lämna en 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.