Arduino keskeyttää opetusohjelman

Arduino Interrupts Tutorial

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

  1. Arduino UNO (tai yhteensopiva lauta)
  2. Painike
  3. 10K-OHM-vastus (alasvetokokoonpanoon)
  4. LED- ja 220-OHM-vastus (valinnainen)
  5. Leipälevy- ja hyppyjohdot
  6. 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

  1. Ulkoiset keskeytykset: Tapahtumat tietyillä nastailla (esim. Tappi 2 tai 3 Arduino UNO: lla).
  2. Pin Change keskeyttää: Minkä tahansa digitaalisen PIN -koodin muutos laukaisee.
  3. 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, CHANGEtai LOW).
  • 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ä

  1. Pidä ISRS lyhyenä: Vältä ISRS: n viivästyksiä tai monimutkaisia ​​laskelmia nopean vastauksen varmistamiseksi.
  2. Vältä sarjaviestintää ISRS: ssä: Sarjatoiminnot eivät välttämättä toimi luotettavasti ISR: n sisällä.
  3. Käyttää volatile jaetuille muuttujille: Mark -muuttujat jaetut ISRS: n ja pääohjelman välillä volatile Kääntäjien optimointikysymysten estämiseksi.
  4. Dewance -tulot: Käsittele dekoiton logiikkaa ohjelmistossa tai laitteissa meluisilla signaaleilla, kuten painikkeen painikkeella.
  5. Poista keskeytykset käytöstä kriittisten osien aikana: Käyttää noInterrupts() ja interrupts() Kriittisten koodiosien suojaamiseksi.

Keskeytykset

  1. Käsittelypainikkeen painikkeet ilman kyselyä
  2. Pyörän kooderien lukeminen
  3. Kriittiset tapahtumat (esim. Tarkka moottorin ohjaus)
  4. Aikataulut määräajoin
  5. 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!

Jätä kommentti

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.