|

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

Projekt na tinkercad

Zastosowanie przerwań w arduino
Zastosowanie przerwań w arduino
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

Projekt na tinkercad

przerwania z arduino przełączanie sekwencyjne diod led
przerwania z arduino przełączanie sekwencyjne 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(){}

Podobne wpisy

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *