Come gestire un interrupt con la Raspberry Pi Pico

In un precedente articolo, utilizzando Arduino UNO avevamo parlato degli interrupt, spiegando cosa sono e come gestirli. Anche la Raspberry Pi Pico, come la maggior parte dei microcontrollori è in grado di gestire gli interrupt. Utilizzando il linguaggio Micropython questa operazione diventa molto semplice.

Questo meccanismo è molto utile perché sostituisce il meccanismo di polling che in un microcontrollore può essere molto svantaggioso. Ad esempio se devo controllare ciclicamente lo stato di un ingresso non posso mettere il microcontrollore in sleep mode perchè andrei a fermare il controllo del pin mentre un interrupt viene gestito dall’hardware e quindi è possibile superare questo limite.

Nel caso della Pico, programmata usando Micropython non sono sicuro se questa funzione sia disponibile anche quando il microcontrollore è in sleep mode.

Gestire le interruzioni

Come accade per Arduino dobbiamo definire una funzione (che verrà richiamata quando avviene l’evento di interrupt) e definire un pin capace di gestire l’interrupt.

Nello schema seguente viene mostrato come ho eseguito i collegamenti di un circuito di test.

Pico irq

Mentre il codice seguente descrive le istruzioni necessarie a gestire l’interrupt:

import machine
import utime

#definisco il pin 0 come ingresso
#su questo pin è collegato un pulsante con una
#resistenza di pull down
button = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_DOWN)
#definisco il pin 1 come uscita
#su questo pin collego un led e una resistenza da 330 ohm
led = machine.Pin(1, machine.Pin.OUT)

#definisco una funzione che verrà richiamata quando
#viene scatenato l'interrupt
def ev_handler(pin):
    print("bottone premuto")
    
#associo al pin in ingresso la funzione di interrupt
#l'evento videne generato usando il parametro RISING
button.irq(trigger=machine.Pin.IRQ_RISING, handler=ev_handler)

#loop che fa blinkare il led
while True:
    led.toggle()
    utime.sleep(1)

Dopo le dichiarazione dei pi e della funzione il codice entra nel ciclo while ed esegue continuamente la commutazione del pin 1. Non appena premiamo il pulsante collegato al pin 0 viene generato un evento che interrompe il ciclo e richiamata la funzione ev_handler(). Terminata l’esecuzione del codice nella funzione ev_handler() viene ripresa l’esecuzione del codice del ciclo while().

Da notare che l’interruzione non è asincrona quindi il codice nella funzione ev_handler() deve essere il più rapido possibile per non impattare sul codice del ciclo while().