Arduino - interrompe
Gli interrupt interrompono il lavoro corrente di Arduino in modo che sia possibile eseguire altri lavori.
Supponi di essere seduto a casa a chattare con qualcuno. All'improvviso squilla il telefono. Smetti di chattare e alzi il telefono per parlare con il chiamante. Quando hai finito la tua conversazione telefonica, torni a chattare con la persona prima che squilli il telefono.
Allo stesso modo, puoi pensare alla routine principale come chattare con qualcuno, il telefono che squilla ti fa smettere di chattare. La routine di interruzione del servizio è il processo di conversazione al telefono. Quando la conversazione telefonica finisce, torni alla tua routine principale di chat. Questo esempio spiega esattamente come un interrupt fa agire un processore.
Il programma principale è in esecuzione ed esegue alcune funzioni in un circuito. Tuttavia, quando si verifica un'interruzione, il programma principale si interrompe mentre viene eseguita un'altra routine. Al termine di questa routine, il processore torna di nuovo alla routine principale.
Caratteristiche importanti
Ecco alcune caratteristiche importanti sugli interrupt:
Gli interrupt possono provenire da varie fonti. In questo caso, stiamo utilizzando un interrupt hardware che viene attivato da un cambiamento di stato su uno dei pin digitali.
La maggior parte dei progetti Arduino ha due interrupt hardware (denominati "interrupt0" e "interrupt1") collegati rispettivamente ai pin di I / O digitali 2 e 3.
Arduino Mega ha sei interrupt hardware inclusi gli interrupt aggiuntivi (da "interrupt2" a "interrupt5") sui pin 21, 20, 19 e 18.
È possibile definire una routine utilizzando una funzione speciale chiamata "Interrupt Service Routine" (generalmente nota come ISR).
È possibile definire la routine e specificare le condizioni sul fronte di salita, sul fronte di discesa o su entrambi. A queste condizioni specifiche, l'interrupt sarebbe servito.
È possibile che tale funzione venga eseguita automaticamente, ogni volta che si verifica un evento su un pin di ingresso.
Tipi di interruzioni
Esistono due tipi di interruzioni:
Hardware Interrupts - Si verificano in risposta a un evento esterno, come un pin di interrupt esterno che va alto o basso.
Software Interrupts- Si verificano in risposta a un'istruzione inviata nel software. L'unico tipo di interrupt supportato dal "linguaggio Arduino" è la funzione attachInterrupt ().
Utilizzo degli interrupt in Arduino
Gli interrupt sono molto utili nei programmi Arduino in quanto aiutano a risolvere i problemi di temporizzazione. Una buona applicazione di un interrupt è leggere un codificatore rotante o osservare un input dell'utente. In generale, un ISR dovrebbe essere il più breve e veloce possibile. Se il tuo schizzo utilizza più ISR, solo uno alla volta può essere eseguito. Altri interrupt verranno eseguiti al termine di quello corrente in un ordine che dipende dalla priorità che hanno.
In genere, le variabili globali vengono utilizzate per trasferire i dati tra un ISR e il programma principale. Per assicurarsi che le variabili condivise tra un ISR e il programma principale siano aggiornate correttamente, dichiararle come volatili.
sintassi dell'istruzione 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.
Le seguenti tre costanti sono predefinite come valori validi:
LOW per attivare l'interrupt ogni volta che il pin è basso.
CHANGE per attivare l'interrupt ogni volta che il pin cambia valore.
FALLING ogni volta che il perno va dall'alto verso il basso.
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
}