arduino
interrupts
Zoeken…
Syntaxis
digitalPinToInterrupt (pen); // converteert een pin-ID naar een interrupt-ID, voor gebruik met
attachInterrupt()
endetachInterrupt()
.attachInterrupt (digitalPinToInterrupt (pin), ISR, modus); // aanbevolen
attachInterrupt (onderbreken, ISR, modus); // niet aangeraden
detachInterrupt (digitalPinToInterrupt (pen));
detachInterrupt (interrupt);
noInterrupts (); // schakelt interrupts uit
interrupts (); // schakel interrupts opnieuw in nadat
noInterrupts()
is aangeroepen.
parameters
Parameter | Notes |
---|---|
onderbreken | Id van de onderbreking. Niet te verwarren met pincode. |
ISR | Onderbrekingsroutine. Dit is de methode die wordt uitgevoerd wanneer de onderbreking optreedt. |
mode | Wat zou de onderbreking moeten activeren. Een van LAAG, VERANDEREN, TOENEMEN of VALLEN. Due boards laten ook HOOG toe. |
Opmerkingen
Interrupt Service Routines (ISR's) moeten zo kort mogelijk zijn, omdat ze de uitvoering van het hoofdprogramma onderbreken en dus tijdafhankelijke code kunnen verknoeien. Over het algemeen betekent dit in de ISR dat u een vlag instelt en verlaat, en in de hoofdprogrammalus controleert u de vlag en doet u wat die vlag hoort te doen.
U kunt delay()
of millis()
niet gebruiken in een ISR omdat die methoden zelf afhankelijk zijn van interrupts.
Onderbreken bij indrukken van knop
Dit voorbeeld gebruikt een drukknop (tact-schakelaar) bevestigd aan digitale pin 2 en GND, met behulp van een interne pull-up weerstand, zodat pin 2 HOOG is als de knop niet wordt ingedrukt.
const int LED_PIN = 13;
const int INTERRUPT_PIN = 2;
volatile bool ledState = LOW;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(INTERRUPT_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), myISR, FALLING); // trigger when button pressed, but not when released.
}
void loop() {
digitalWrite(LED_PIN, ledState);
}
void myISR() {
ledState = !ledState;
// note: LOW == false == 0, HIGH == true == 1, so inverting the boolean is the same as switching between LOW and HIGH.
}
Een gotcha met dit eenvoudige voorbeeld is dat drukknoppen de neiging hebben om te stuiteren, wat betekent dat bij het indrukken of loslaten, het circuit meer dan eens wordt geopend en gesloten voordat het zich in de definitieve gesloten of open toestand vestigt. Dit voorbeeld houdt daar geen rekening mee. Als gevolg hiervan kan het indrukken van de knop de LED meerdere keren schakelen, in plaats van één keer verwacht.