Arduino - przerywa
Przerwania zatrzymują bieżącą pracę Arduino tak, że można wykonać inną pracę.
Przypuśćmy, że siedzisz w domu i rozmawiasz z kimś. Nagle dzwoni telefon. Przestajesz rozmawiać i podnosisz telefon, aby porozmawiać z dzwoniącym. Po zakończeniu rozmowy telefonicznej wróć do rozmowy z tą osobą, zanim zadzwonił telefon.
Podobnie możesz myśleć o głównej rutynie jako o rozmowie z kimś, dzwonek telefonu powoduje, że przestajesz rozmawiać. Procedura obsługi przerwań to proces rozmowy telefonicznej. Po zakończeniu rozmowy telefonicznej wracasz do swojej głównej rutyny czatowania. Ten przykład wyjaśnia dokładnie, w jaki sposób przerwanie powoduje działanie procesora.
Program główny działa i wykonuje jakąś funkcję w obwodzie. Jednak gdy wystąpi przerwanie, program główny zatrzymuje się, podczas gdy wykonywana jest inna procedura. Po zakończeniu tej procedury procesor wraca do procedury głównej.
![](https://post.nghiatu.com/assets/tutorial/arduino/images/interrupt.jpg)
Ważne funkcje
Oto kilka ważnych funkcji dotyczących przerwań -
Przerwania mogą pochodzić z różnych źródeł. W tym przypadku używamy przerwania sprzętowego, które jest wyzwalane przez zmianę stanu na jednym z pinów cyfrowych.
Większość konstrukcji Arduino ma dwa przerwania sprzętowe (nazywane „przerwaniem0” i „przerwaniem1”) podłączone na stałe do cyfrowych styków I / O, odpowiednio, 2 i 3.
Arduino Mega ma sześć przerwań sprzętowych, w tym dodatkowe przerwania (od „przerwania2” do „przerwania5”) na stykach 21, 20, 19 i 18.
Procedurę można zdefiniować za pomocą specjalnej funkcji zwanej „Procedura obsługi przerwania” (zwykle nazywanej ISR).
Możesz zdefiniować procedurę i określić warunki na zboczu narastającym, opadającym lub obu. W tych szczególnych warunkach przerwanie byłoby obsługiwane.
Możliwe jest automatyczne wykonywanie tej funkcji za każdym razem, gdy zdarzenie ma miejsce na pinie wejściowym.
Rodzaje przerwań
Istnieją dwa rodzaje przerwań -
Hardware Interrupts - Występują w odpowiedzi na zdarzenie zewnętrzne, takie jak wysoki lub niski pin przerwania zewnętrznego.
Software Interrupts- Występują w odpowiedzi na polecenie przesłane w oprogramowaniu. Jedynym rodzajem przerwań obsługiwanym przez „język Arduino” jest funkcja attachInterrupt ().
Używanie przerwań w Arduino
Przerwania są bardzo przydatne w programach Arduino, ponieważ pomagają w rozwiązywaniu problemów z synchronizacją. Dobrym zastosowaniem przerwania jest odczyt enkodera obrotowego lub obserwacja wejścia użytkownika. Ogólnie rzecz biorąc, ISR powinien być tak krótki i szybki, jak to tylko możliwe. Jeśli twój szkic używa wielu ISR, tylko jeden może działać naraz. Inne przerwania będą wykonywane po zakończeniu bieżącego w kolejności zależnej od ich priorytetu.
Zwykle zmienne globalne są używane do przesyłania danych między ISR a głównym programem. Aby upewnić się, że zmienne współdzielone między ISR a głównym programem są poprawnie aktualizowane, zadeklaruj je jako nietrwałe.
Składnia instrukcji attachInterrupt
attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board
attachInterrupt(pin, ISR, mode) ; //recommended Arduino Due, Zero only
//argument pin: the pin number
//argument ISR: the ISR to call when the interrupt occurs;
//this function must take no parameters and return nothing.
//This function is sometimes referred to as an interrupt service routine.
//argument mode: defines when the interrupt should be triggered.
Poniższe trzy stałe są wstępnie zdefiniowane jako prawidłowe wartości -
LOW wyzwalanie przerwania, gdy pin jest niski.
CHANGE wyzwalanie przerwania za każdym razem, gdy pin zmienia wartość.
FALLING za każdym razem, gdy pin przechodzi z wysokiego na niski.
Example
int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.
void setup() {
pinMode(13, OUTPUT); //set pin 13 as output
attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
//interrupt at pin 2 blink ISR when pin to change the value
}
void loop() {
digitalWrite(13, state); //pin 13 equal the state value
}
void blink() {
//ISR function
state = !state; //toggle the state when the interrupt occurs
}