Keskeytykset ovat mikrokontrollerien tehokas ominaisuus, jonka avulla voit käsitellä tapahtumia asynkronisesti. Toisin kuin kysely, joka tarkistaa jatkuvasti tapahtumia, keskeytykset reagoivat välittömästi, kun tietty tapahtuma tapahtuu, kuten painikkeen painike tai ajastimen ylivuoto. Tämä opetusohjelma opastaa sinua ymmärtämään ja käyttämään keskeytyksiä Arduinon kanssa.
Mitä tarvitset
- Arduino UNO (tai yhteensopiva lauta)
- Painike
- 10K-OHM-vastus (alasvetokokoonpanoon)
- LED- ja 220-OHM-vastus (valinnainen)
- Leipälevy- ja hyppyjohdot
- Arduino IDE asennettu tietokoneellesi
Vaihe 1: Mitä keskeytykset ovat?
Keskeytys pysäyttää väliaikaisesti pääohjelman suorittamisen tietyn tapahtuman käsittelemiseksi. Kun tapahtuma on käsitelty, ohjelma jatkuu missä se lähti. Keskeytyksiä hallitaan käyttämällä erityisiä toimintoja, joita kutsutaan Keskeytyspalveluohjelmat (ISRS).
Arduinon keskeytykset
- Ulkoiset keskeytykset: Tapahtumat tietyillä nastailla (esim. Tappi 2 tai 3 Arduino UNO: lla).
- Pin Change keskeyttää: Minkä tahansa digitaalisen PIN -koodin muutos laukaisee.
- Ajastin keskeyttää: Ajastimen ylivuodot tai vertaa otteluita.
Vaihe 2: Ulkoisten keskeytyksien käyttäminen
Arduino UNO tukee ulkoisia keskeytyksiä nastaissa 2 ja 3. Voit määrittää nämä keskeytykset käynnistämään:
- Nouseva: Signaali menee matalasta korkeaan.
- Putoaminen: Signaali menee korkeasta matalaan.
- MUUTTAA: Signaalimuutos tila (matalasta korkeaan tai korkeaan alhaiseen).
- MATALA: Signaali pysyy alhaisena.
Esimerkki Koodi: Painikkeen havaitseminen Paina
Tämä esimerkki vaihtaa LED -levyn, kun painiketta 2 on painettu painiketta.
#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
}
Selitys
-
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
: Määrittää keskeytyksen.-
pin
: Keskeytystappi (esim. Tappi 2 tai 3 Arduino UNO: lla). -
ISR
: Suoritettava keskeytyspalvelu rutiini. -
mode
: Laukaiseva tila (RISING
,FALLING
,CHANGE
taiLOW
).
-
-
digitalPinToInterrupt(pin)
: Muuntaa PIN -luvun keskeytyksen numeroon.
Vaihe 3: PIN -muutoksen keskeytykset
PIN -muutoksen keskeytykset antavat sinun havaita muutokset missä tahansa digitaalisessa PIN -koodissa. Tämä vaatii lisäkirjastoja, kuten Ottaa käyttöön.
Esimerkki koodi: PIN -vaihtaminen keskeytys
#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
}
Kirjaston asennus
Jos haluat käyttää PIN -muutoksen keskeytyksiä, asenna Ottaa käyttöön Kirjasto Arduino Library Manager -sovelluksen kautta.
Vaihe 4: Ajastin keskeyttää
Ajastimen keskeytykset ovat hyödyllisiä tehtävien aikataulussa tarkalla väliajoin. Katso Arduino -ajastinopetusohjelma Lisätietoja ajastimen keskeytyksistä.
Esimerkki: LED: n vilkkuminen ajastintatkin kanssa
#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
}
Vaihe 5: Parhaat käytännöt keskeyttämisen käytöstä
- Pidä ISRS lyhyenä: Vältä ISRS: n viivästyksiä tai monimutkaisia laskelmia nopean vastauksen varmistamiseksi.
- Vältä sarjaviestintää ISRS: ssä: Sarjatoiminnot eivät välttämättä toimi luotettavasti ISR: n sisällä.
-
Käyttää
volatile
jaetuille muuttujille: Mark -muuttujat jaetut ISRS: n ja pääohjelman välillävolatile
Kääntäjien optimointikysymysten estämiseksi. - Dewance -tulot: Käsittele dekoiton logiikkaa ohjelmistossa tai laitteissa meluisilla signaaleilla, kuten painikkeen painikkeella.
-
Poista keskeytykset käytöstä kriittisten osien aikana: Käyttää
noInterrupts()
jainterrupts()
Kriittisten koodiosien suojaamiseksi.
Keskeytykset
- Käsittelypainikkeen painikkeet ilman kyselyä
- Pyörän kooderien lukeminen
- Kriittiset tapahtumat (esim. Tarkka moottorin ohjaus)
- Aikataulut määräajoin
- Reagointi ulkoisiin signaaleihin (esim. Anturit, viestintätapahtumat)
Vianetsintä
- Keskeyttää ei laukaista: Varmista, että oikea nasta ja tila on määritetty.
- Epävakaa käyttäytyminen: Poista meluisat signaalit ja vältä pitkiä ISR: itä.
- Konfliktit kirjastojen kanssa: Jotkut kirjastot käyttävät keskeytyksiä sisäisesti (esim. Servo, PWM). Varmista, ettei ole ristiriitoja koodisi kanssa.
Johtopäätös
Keskeytykset mahdollistavat reagoivan ja tehokkaan tapahtumien käsittelyn Arduino -projekteissa. Oppimalla käyttämään ulkoista, nastamuutosta ja ajastin keskeytyksiä, voit luoda vankkoja ja tarkkoja sovelluksia. Kokeile erityyppisiä keskeytyksiä projektien parantamiseksi ja suorituskyvyn optimoimiseksi!