attachInterrupt()

[Külső meszakítások]

Leírás

Digitális kivezetések megszakításokkal

Az attachInterrupt() első paramétere egy megszakítási szám. Általában a digitalPinToInterrupt(pin)-t kell használnia a tényleges digitális kivezetésnek az adott megszakítási számra való lefordításához. Például, ha a 3-as kivezetéshez csatlakozik, használja a digitalPinToInterrupt(3) paramétert az attachInterrupt() első paramétereként.

Kártya Megszakításokhoz használható digitális kivezetések

Uno, Nano, Mini, egyéb 328 alapú

2, 3

Uno WiFi Rev.2, Nano Every

minden digitális kivezetés

Mega, Mega2560, MegaADK

2, 3, 18, 19, 20, 21 (20 & 21 kivezetés nem használhatók megszakításokhoz, mivel I2C kommunikációra használják őket)

Micro, Leonardo, egyéb 32u4-alapú

0, 1, 2, 3, 7

Zero

minden digitális kivezetés, kivéve a 4-es

MKR család kártyái

0, 1, 4, 5, 6, 7, 8, 9, A1, A2

Nano 33 IoT

2, 3, 9, 10, 11, 13, A1, A5, A7

Nano 33 BLE, Nano 33 BLE Sense

minden kivezetés

Due

minden digitális kivezetés

101

minden digitális kivezetés (Csak a 2-es, 5-ös, 7-es, 8-as, 10-es, 11-es, 12-es, 13-as kivezetések működnek a CHANGE funkcióval)

Megjegyzések és figyelmeztetések

Megjegyzés
A csatolt függvényen belül a delay() nem fog működni, és a millis() által visszaadott érték nem növekszik. A funkció közben kapott soros adatok elveszhetnek. Minden változót, amelyet a csatolt függvényen belül módosít, volatile-nak kell deklarálnia. További információért tekintse meg az alábbi, ISR-ekről szóló részt.

Megszakítások használata

A megszakítások hasznosak arra, hogy a dolgok automatikusan megtörténjenek a mikrovezérlő programokban, és segíthetnek megoldani az időzítési problémákat. A megszakítás használatának jó feladatai közé tartozhat a forgó kódoló olvasása vagy a felhasználói bemenet figyelése.

Ha azt szeretné elérni, hogy egy program mindig elkapja a forgó kódoló impulzusait, hogy soha ne hagyjon ki egyetlen impulzust sem, akkor nagyon bonyolult lenne olyan programot írni, amely bármi másra is képes, mert a programnak folyamatosan le kell kérdeznie az érzékelő vonalait a kódolóhoz, hogy impulzusokat fogjon, amikor azok előfordulnak. Más érzékelők is hasonló interfész-dinamikával rendelkeznek, például megpróbálják beolvasni a hangérzékelőt, amely megpróbálja elkapni a kattanást, vagy egy infravörös résérzékelőt (fotó-megszakító), amely megpróbálja elkapni a lehulló érmét. Mindezen helyzetekben egy megszakítás felszabadíthatja a mikrokontrollert, hogy más munkát végezzen, miközben nem hiányzik a bemenet.

A megszakítási szolgáltatási rutinokról (ISR)

Az ISR-ek olyan speciális függvények, amelyeknek van néhány egyedi korlátja, amelyekkel a legtöbb más funkció nem rendelkezik. Az ISR-nek nem lehet paramétere, és nem adhat vissza semmit.

Általában az ISR-nek a lehető legrövidebbnek és leggyorsabbnak kell lennie. Ha a vázlat több ISR-t használ, akkor egyszerre csak egy futhat le, a többi megszakítás az aktuális befejezése után hajtódik végre, a prioritásuktól függően. A millis() megszakításokra támaszkodik a számoláshoz, így soha nem fog növekedni az ISR-en belül. Mivel a delay() működéséhez megszakítások szükségesek, nem fog működni, ha ISR-en belül hívják. A micros() eleinte működik, de 1-2 ms után hibásan kezd viselkedni. A delayMicroseconds() nem használ számlálót, így a szokásos módon fog működni.

Általában globális változókat használnak az adatok továbbítására az ISR és a fő program között. Annak biztosítása érdekében, hogy az ISR és a fő program között megosztott változók megfelelően frissüljenek, deklarálja azokat volatile-nek.

volatile

A megszakításokkal kapcsolatos további információkért lásd Nick Gammon jegyzeteit.

Szintaxis

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) (ajánlott)
attachInterrupt(interrupt, ISR, mode) (nem ajánlott)
attachInterrupt(kivezetés, ISR, mode) (Nem ajánlott. Ezenkívül ez a szintaxis csak az Arduino SAMD kártyákon, az Uno WiFi Rev2-n, a Due-n és a 101-en működik.)

Paraméterek

interrupt: a megszakítás száma. Engedélyezett adattípusok: int.
pin: az Arduino kivezetés száma.
ISR: a megszakításkor hívandó ISR; ez a függvény nem vehet fel paramétereket és nem ad vissza semmit. Ezt a funkciót néha megszakítási szolgáltatási rutinnak nevezik.
mode: meghatározza, hogy mikor kell a megszakítást kiváltani. Négy állandó van előre definiálva érvényes értékként:

  • LOW a megszakítás kiváltása, amikor a kivezetés alacsony,

  • CHANGE a megszakítás kiváltása, amikor a kivezetés értéke megváltozik,

  • RISING kivált, amikor a kivezetés alacsonyról magasra változik,

  • FALLING kivált, amikor a kivezetés magasról alacsonyra vált.

A Due, Zero és MKR1000 kártyák lehetővé teszik még:

  • HIGH a megszakítás kiváltása, amikor a kivezetés magas.

Visszatérési érték

Nincs.

Példa

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
  state = !state;
}

Megszakítás számok

Általában a digitalPinToInterrupt(pin)-t kell használnia, ahelyett, hogy egy megszakítási számot közvetlenül a vázlatba helyezne. A megszakításokkal ellátott speciális kivezetések és a megszakítási számhoz való hozzárendelésük kártyatípusonként eltérő. A megszakítási számok közvetlen használata egyszerűnek tűnhet, de kompatibilitási problémákat okozhat, ha a vázlat egy másik kártyán fut.

A régebbi vázlatok azonban gyakran tartalmaznak közvetlen megszakítási számokat. Gyakran a 0-s számot (a 2-es digitális kivezetéshez) vagy az 1-es számot (a 3-as digitális kivezetéshez) használták. Az alábbi táblázat a különböző kártyákon elérhető megszakítás kivezetéseket mutatja.

Vegye figyelembe, hogy az alábbi táblázatban a megszakítási számok az attachInterrupt()-nak átadandó számra vonatkoznak. Történelmi okokból ez a számozás nem mindig felel meg közvetlenül az ATmega chip megszakítási számozásának (pl. az int.0 az ATmega2560 chipen az INT4-nek felel meg).

Kártya int.0 int.1 int.2 int.3 int.4 int.5

Uno, Ethernet

2

3

Mega2560

2

3

21

20

19

18

32u4 alapú (pl. Leonardo, Micro)

3

2

0

1

7

Uno WiFi Rev.2, Due, Zero, MKR család és 101 kártyák esetén a megszakítási szám = kivezetés szám.

Lásd még