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
- Arduino Uno (eller ett kompatibelt bräde)
- Tryckknapp
- 10k-ohm motstånd (för neddragningskonfiguration)
- LED och 220-ohm-motstånd (valfritt)
- Breadboard och jumpertrådar
- 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
- Externa avbrott: Utlöses av händelser på specifika stift (t.ex. stift 2 eller 3 på Arduino UNO).
- PIN -ändringsavbrott: Utlöses av en förändring på alla digitala stift.
- 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
,CHANGE
ellerLOW
).
-
-
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
- Håll ISR: er kort: Undvik förseningar eller komplexa beräkningar i ISR för att säkerställa snabbt svar.
- Undvik seriekommunikation i ISR: er: Seriella funktioner kanske inte fungerar pålitligt inuti en ISR.
-
Använda
volatile
För delade variabler: Markvariabler delade mellan ISRS och huvudprogrammet somvolatile
För att förhindra kompilatoroptimeringsproblem. - Debous -ingångar: Hantera debous -logiken i programvara eller hårdvara för bullriga signaler som knapptryck.
-
Inaktivera avbrott under kritiska avsnitt: Använda
noInterrupts()
ochinterrupts()
för att skydda kritiska kodavsnitt.
Ansökningar av avbrott
- HANTERING -knapptryckningar utan omröstning
- Läser roterande kodare
- Tidpunkt för kritiska händelser (t.ex. exakt motorstyrning)
- Schemaläggningsperiodiska uppgifter
- 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!