Seda saate teha väliste katkestustega. Enamik Arduinosid toetab seda siiski piiratud arvul tihvtidel. Lisateavet leiate dokumendist saidi attachInterrupt ()
kohta.
Eeldades, et kasutate Unot, võiksite seda teha järgmiselt:
void pinChanged () {//...}väldi seadistamist () {pinMode (2, INPUT); attachInterrupt (0, pinChanged, CHANGE);} void loop () {}
See kutsub pinChanged ()
alati, kui välisel katkestusel 0 tuvastatakse muudatus. Uno-s vastab GPIO pin 2-le. Väline katkestuste numeratsioon on teistel tahvlitel erinev, seetõttu on oluline kontrollida asjakohast dokumentatsiooni.
Sellel lähenemisel on siiski piiranguid. Kohandatud funktsiooni pinChanged ()
kasutatakse katkestusteenusena (ISR). See tähendab, et ülejäänud kood (kõik koodis loop ()
) on kõne sooritamise ajal ajutiselt peatatud. Olulise ajastuse katkestamise vältimiseks peaksite püüdma teha ISR-id võimalikult kiiresti.
Samuti on oluline märkida, et teie ISR-i ajal ei toimu muid katkestusi. See tähendab, et kõik, mis tugineb katkestustele (nt põhifunktsioonid delay ()
ja millis ()
), ei pruugi selle sees korralikult töötada.
Lõpuks kui teie ISR peab visandis muutma mõnda globaalset muutujat, tuleks need tavaliselt deklareerida kui volatile
, nt:
volatile int someNumber;
See on oluline, sest see ütleb kompilaatorile, et väärtus võib ootamatult muutuda, seega peaks olema ettevaatlik ja ärge kasutage selle aegunud koopiaid / vahemälusid.