Układy ARDUINO umożliwiają obsługę przerwań zewnętrznych oraz wewnętrznych. Przerwania wewnętrzne wykorzystywane są do obsługi komunikacji szeregowej, odliczania czasu, zliczania impulsów itp. Przerwania zewnętrzne mogą być wykorzystywanie do komunikacji z różnymi układami podłączonymi do układu ARDUINO. W zależności od wykorzystanego układu ARDUINO do dyspozycji projektanta pozostają przynajmniej dwa źródła przerwań. Poniżej przedstawiono tabelę przerwań dla typowych układów ARDUINO:
Układ | int.0 | int.1 | int.2 | int.3 | int.4 | int.5 |
---|---|---|---|---|---|---|
ARDUINO UNO | pin 2 | pin 3 | ||||
ARDUINO MEGA | pin 2 | pin 3 | pin 21 | pin 20 | pin 19 | pin 18 |
Obsługa przerwania polega na odłożeniu aktualnie wykonywanego kodu, wykonania zdefiniowanych dla danego przerwania akcji i powrocie do wykonywania programu właściwego. Oznacza to, że należy poinformować system co ma zostać wykonane po wystąpieniu przerwania.
attachInterrupt()
Funkcja attachInterrupt() umożliwia przypisanie funkcji o podanej nazwie do odpowiedniego przerwania zewnętrznego. Składnia funkcji podana została poniżej:
attachInterrupt(przerwanie, funkcja_obsługi, wywołanie);
Przerwanie to numer obsługiwanego przerwania, drugi parametr określa nazwę zdefiniowanej funkcji obsługi przerwania, trzeci parametr określa kiedy przerwanie ma zostać wywołane. Dopuszczalne wartości podano w tabeli poniżej:
Nazwa | Opis |
---|---|
LOW | przerwanie wywołane zostanie, gdy pin będzie miał stan niski |
HIGH | przerwanie wywołane zostanie, gdy pin będzie miał stan wysoki |
CHANGE | przerwanie wywołane zostanie, gdy stan pinu zmieni się |
FALLING | przerwanie wywołane zostanie, gdy stan pinu zmieni się z wysokiego na niski |
RISING | przerwanie wywołane zostanie, gdy stan pinu zmieni się z niskiego na wysoki |
Przykład wykorzystania przerwania zewnętrznego przedstawiono poniżej:
#define pin 13
volatile int stan = LOW;
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop()
{
digitalWrite(pin, stan);
}
void blink() // funkcja obsługi przerwania
{
stan = !stan;
}
jak widać na przykładzie wykorzystano przerwanie int.0 do sterowania pinem 13. Funkcja blink() została przypisana do przerwania z parametrem CHANGE, co oznacza, że dowolna zmiana stanu pinu odpowiedzialnego za przerwanie int.0 spowoduje wywołanie funkcji. W efekcie zmienna stan zmieni swoją wartość na przeciwną. Warto zwrócić uwagę na zastosowanie przy deklaracji zmiennych volatile, co informuje kompilator o konieczności odświeżenia wartości zmiennej stan po zakończeniu obsługi przerwania. (Dokładniejszy opis w artykule o typach zmiennych).
detachInterrupt()
Czasami zdarza się, że chcemy wykorzystać przerwanie w programie do obsługi kilku urządzeń zewnętrznych w zależności od okoliczności (np. zmiana odczytu danych). Funkcja detachInterrupt() umożliwia rozłączenie zdefiniowanej funkcji jako funkcji obsługującej przerwanie. Możliwe jest wtedy przypisanie nowej funkcji obsługi przerwania. Składnia funkcji detachInterrupt() ogranicza się do podania numeru przerwania:
detachInterrupt(0); //rozłączenie przerwania 0
interrupts(), noInterrupts()
Funkcje interrupts(), noInterrupts() umożliwiają globalne zarządzanie systemem przerwań. Domyślnie przerwania w ARDUINO są włączone, co oznacza, że równolegle z głównym programem mogą wykonywać się dodatkowe funkcje. Czasami zdarza się jednak, że należy wykonać określoną akcję z pewnością, że żadna obsługa przerwania jej nie zakłóci. W takim wypadku za pomocą funkcji noInterrupts() można wyłączyć przerwania, a następnie za pomocą interrupts() ponownie włączyć. Poniższy przykład przedstawia sposób wykorzystania opisywanych funkcji:
void loop()
{
// instrukcje programu
noInterrupt();
// sekcja krytyczna wymagająca wyłączenia przerwań
interrupt();
// instrukcje programu
}