Cosa sono e come utilizzare gli interrupt

Un interrupt (interruzione) è un evento che viene generato in presenza di una variazione di livello su un particolare pin della board Arduino. Questo evento viene gestito direttamente dal microcontrollore ed è controllabile via software tramite delle apposite istruzioni. Quando viene scatenata una interruzione è possibile eseguire del codice in modo automatico, interrompendo momentaneamente il normale flusso di codice all’interno del blocco loop().

L0 schema seguente illustra il concetto

Gestione Interrupt

La variazione di stato del segnale applicato all’Arduino può essere gestita in vari modi, a seconda del parametro utilizzato per la gestione dell’interrupt. La tabella seguente mostra i parametri che determinano come deve essere generata l’interruzione.

ZeroA+BB+2B
IDLE100mA100mA360mA200mA230mA
Riproduzione Video Full HD140mA140mA420mA240mA290mA

di seguito viene esposto lo schema del circuito che ho realizzato per testare questa funzione. Un generatore di segnali ad onda quadra è stato collegato al pin3 della board Arduino mentre sul pin8 è stato collegato un oscilloscopio. Il segnale presente sul pin8 è funzione di quello presente sul pin3 come vedremo dal codice di esempio.

Schema per testare la funzione interrupts

Per testare questa funzione possiamo usare lo sketch seguente

int pin = 8;
//Notare l'uso di 'volatile'
volatile int state = LOW;

void setup()
{
  //definisco il pin8 come uscita
  pinMode(pin, OUTPUT);
  //inizializzo l'uscita a livelo basso
  digitalWrite(pin, LOW);
  //Creo un gestore di interrupt e lo associo al pin3
  attachInterrupt(1, GestInt, LOW);
}

void loop()
{
  //fai qualcosa...
  delay(10);
}

void GestInt()
{
  state = !state;
  digitalWrite(pin, state);
}

 

Il codice gestisce gli interrupt generati dal segnale in ingresso. Quandosi verifica un’interruzione, viene eseguita automaticamente la funzione GestInt(), che permette di cambiare lo stato del pin8, rilevabile con l’oscilloscopio. I grafici sottostanti, illustrano il comportamento dei segnali a seconda del parametro utilizzato per generare l’interrupt.

Il primo parametro, LOW, genera una serie di interruzioni ogni qualvolta il segnale applicato al pin3 rimane basso. La funzione GestInt() viene eseguita a una frequenza di circa 47,6KHz

Interrupt con parametro uguale a LOW

Quando invece selezioniamo il parametro CHANGE, l’interruzione viene generata ogni volta che il segnale applicato al pin3 passa dal valore basso a quello alto e viceversa. La funzione GestInt() genera sul pin8 lo stesso segnale applicato al pin3.

Interrupt con parametro uguale a CHANGEUtilizzando invece il parametro RISING, l’interruzione viene generata solamente sui fronti di salita del segnale applicato sul pin3. La funzione GestInt() viene eseguita con una frequenza dimezzata rispetto al segnale applicato al pin3

Interrupt con parametro uguale a RISING

Infine impiegando il parametro FALLING, gli interrupt verranno generati quando il segnale applicato sul pin3 passa da alto a basso. Anche in questo caso la funzione GestInt() viene eseguita con una frequenza dimezzata rispetto al segnale applicato al pin3

Interrupt con parametro uguale a FALLING

Riepilogando i pin dell’arduino sensibili alle variazioni di segnale sono i pin2 e pin3 che rispettivamente vengono specificati nella funzione attachInterrupt come 0 e 1. Nella funzione attachInterrupt , oltre a specificare il pin  che vogliamo monitorare dobbiamo specificare il nome della funzione da eseguire quando si scatena l’interruzione e il modo in cui l’interruzione deve essere interpretata.
La variabili state viene dichiarata utilizzando l’attributo volatile, questo perchè la funzione gestita dall’interrupt viene eseguita in contemporanea al blocco loop() ed è necessario che in fase di compilazione la variabile sia caricata nella RAM.