Przerwania w Arduino (interrupts)
Układ Arduino Uno pozwala na obsługę przerwań wewnętrznych(software) i dwóch przerwań zewnętrznych(hardware) za pomocą napięć na pinach 2 (int.0) i 3 (int.1).
Przerwania działają nawet w czasie trwania funkcji delay.
Zmienne używane wewnątrz przerwań muszą być globalne i z atrybutem volatile, aby kompilator nie uprościł kodu podczas kompilacji.
Zazwyczaj używa się 1 z 3 trybów wywołania przerwania:
RISING: when the pin transits from LOW to HIGH.
FALLING: when the pin transits from HIGH to LOW.
CHANGE: when the pin transits from LOW to HIGH or HIGH to LOW
Dodanie przerwania:
attachInterrupt(digitalPinToInterrupt(pin), ISRmethod, mode);
Przerwania są domyślnie włączone, ale można je wyłączać i włączać za pomocą metod:
noInterrupt();
interrupt();
Za pomocą metody detachInterrupt(digitalPinToInterrupt(pin)) można rozłączyć zdefiniowaną funkcję i przypisać inną.
Przykład programu przełączającego wbudowaną LED podczas trwania delay
const byte buttonPin = 2;
volatile bool state = false;
void setup() {
pinMode(13, OUTPUT);
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), checkSwitch, FALLING);
}
void loop() { }
void checkSwitch() {
if(digitalRead(buttonPin)==false)
{
state = !state;
digitalWrite(13, state);
}
}
Przykład programu z użyciem przerwań do sekwencyjnej zmiany diod LED
volatile int counter = 0;
void setup()
{
DDRD = B00111000;
attachInterrupt(digitalPinToInterrupt(2), turnOutput, RISING);
}
void turnOutput()
{
PORTD = B00000000;
if(counter == 3){
counter = 0;
return;
}
counter++;
digitalWrite(counter+2, HIGH);
}
void loop(){}