Arduino megszakítja az oktatóanyagot

Arduino Interrupts Tutorial

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

  1. Arduino UNO (vagy egy kompatibilis tábla)
  2. Nyomógomb
  3. 10K-OHM ellenállás (a legördülő konfigurációhoz)
  4. LED és 220-OHM ellenállás (opcionális)
  5. Kenyérlemez és jumper vezetékek
  6. 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

  1. Külső megszakítások: Az események által konkrét csapok (például 2. vagy 3. érintkezője az Arduino UNO -n).
  2. Pin Change megszakítások: Bármely digitális tűvel történő változás váltja ki.
  3. 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, vagy LOW).
  • 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

  1. 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.
  2. 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.
  3. Használat volatile megosztott változókhoz: Jelölje meg az ISR -k és a fő program között megosztott változók volatile A fordító optimalizálási problémáinak elkerülése érdekében.
  4. Elebemutató inputok: Kezelje a szoftverek leírási logikáját vagy hardverét olyan zajos jelekhez, mint a gombnyomások.
  5. Tiltsa le a megszakításokat a kritikus szakaszok során: Használat noInterrupts() és interrupts() A kritikus kódszakaszok védelme.

A megszakítások alkalmazásai

  1. Kezelő gomb megnyomja a szavazás nélkül
  2. Rotary kódolók olvasása
  3. Időzítés kritikus események (például pontos motorvezérlés)
  4. Periódusos feladatok ütemezése
  5. 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!

Hagyj egy megjegyzést

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.