A megszakítások a mikrovezérlők hatékony tulajdonsága, amely lehetővé teszi az események aszinkron módon történő kezelését. A szavazással ellentétben, amely folyamatosan ellenőrzi az eseményeket, a megszakítások azonnal reagálnak, amikor egy adott esemény bekövetkezik, például egy gombnyomás vagy egy időzítő túlcsordulása. Ez az oktatóanyag vezeti Önt az Arduino -val való megszakítások és a megszakítások használatán keresztül.
Mire lesz szüksége
- Arduino UNO (vagy egy kompatibilis tábla)
- Nyomógomb
- 10K-OHM ellenállás (a legördülő konfigurációhoz)
- LED és 220-OHM ellenállás (opcionális)
- Kenyérlemez és jumper vezetékek
- Arduino IDE telepítve a számítógépére
1. lépés: Mik a megszakítások?
A megszakítás ideiglenesen megállítja a főprogram végrehajtását egy adott esemény kezelésére. Az esemény feldolgozása után a program folytatódik, ahol abbahagyta. A megszakításokat az úgynevezett speciális funkciókkal kezelik Megszakítja a szolgáltatási rutinokat (ISRS).
A megszakítások típusai Arduinóban
- Külső megszakítások: Az események által konkrét csapok (például 2. vagy 3. érintkezője az Arduino UNO -n).
- Pin Change megszakítások: Bármely digitális tűvel történő változás váltja ki.
- Az időzítő megszakítja: Az időzítő túlcsordulása vagy összehasonlítása a mérkőzések összehasonlításával.
2. lépés: Külső megszakítások használata
Az Arduino UNO támogatja a külső megszakításokat a 2. és a 3. csapon. Ezeket a megszakításokat konfigurálhatja, hogy bekapcsolja:
- FELKELÉS: A jel alacsonyról magasra megy.
- ESŐ: A jel magasról alacsonyra megy.
- VÁLTOZÁS: A jel megváltoztatja az állapotot (alacsony vagy magas vagy alacsony).
- ALACSONY: A jel továbbra is alacsony.
Példa kód: A gombnyomás észlelése nyomja meg
Ez a példa egy LED -et vált, amikor a 2. érintkezőhöz csatlakoztatott gombot megnyomják.
#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
}
Magyarázat
-
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
: Konfigurálja a megszakítást.-
pin
: A megszakító csap (például a 2. vagy a 3. érintkező az Arduino UNO -n). -
ISR
: A végrehajtás megszakító szolgáltatási rutinja. -
mode
: A kiváltási feltétel (RISING
,FALLING
,CHANGE
, vagyLOW
).
-
-
digitalPinToInterrupt(pin)
: Konvertálja a PIN -kódot megszakító számára.
3. lépés: A PIN -kódváltás megszakításai használata
A PIN -kódváltás megszakítások lehetővé teszik a változások észlelését bármely digitális csapon. Ehhez további könyvtárakra van szükség, például EngedélyezésInEnterrupt.
Példa kód: PIN -kódváltás megszakítás
#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
}
Könyvtári telepítés
A PIN -kódolás megszakításainak használatához telepítse a EngedélyezésInEnterrupt Könyvtár az Arduino könyvtárkezelőn keresztül.
4. lépés: Az időzítő megszakítja
Az időzítő megszakításai hasznosak a feladatok ütemezéséhez pontos időközönként. Lásd a Arduino időzítő bemutatója Az időzítő -megszakítások konfigurálásával kapcsolatos részletek.
Példa: egy LED pislogása az Timer1 megszakításával
#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
}
5. lépés: A megszakítások használatának legjobb gyakorlatai
- Tartsa rövid ISRS -t: Kerülje a késéseket vagy az összetett számításokat az ISR -kben a gyors válasz biztosítása érdekében.
- Kerülje a soros kommunikációt az ISRS -ben: Lehet, hogy a soros funkciók nem működnek megbízhatóan az ISR -en belül.
-
Használat
volatile
megosztott változókhoz: Jelölje meg az ISR -k és a fő program között megosztott változókvolatile
A fordító optimalizálási problémáinak elkerülése érdekében. - Elebemutató inputok: Kezelje a szoftverek leírási logikáját vagy hardverét olyan zajos jelekhez, mint a gombnyomások.
-
Tiltsa le a megszakításokat a kritikus szakaszok során: Használat
noInterrupts()
ésinterrupts()
A kritikus kódszakaszok védelme.
A megszakítások alkalmazásai
- Kezelő gomb megnyomja a szavazás nélkül
- Rotary kódolók olvasása
- Időzítés kritikus események (például pontos motorvezérlés)
- Periódusos feladatok ütemezése
- Reagálás a külső jelekre (például érzékelők, kommunikációs események)
Hibaelhárítás
- Megszakítás, nem indítva: Győződjön meg arról, hogy a megfelelő PIN és az üzemmód konfigurálva van -e.
- Instabil viselkedés: A zajos jeleket adja meg, és kerülje el a hosszú ISR -eket.
- Konfliktusok a könyvtárakkal: Egyes könyvtárak megszakításokat használnak belsőleg (például szervo, PWM). Gondoskodjon arról, hogy ne ütközzen a kóddal.
Következtetés
A megszakítások lehetővé teszik az események reagáló és hatékony kezelését az Arduino projektekben. Ha megtanulja a külső, PIN -kód és az időzítő megszakításait, robusztus és pontos alkalmazásokat hozhat létre. Kísérletezzen különféle típusú megszakításokkal a projektek javítása és a teljesítmény optimalizálása érdekében!