L’utilizzo di interrupts sul Raspberry RP2040 consente di “interrompere” il codice in esecuzione al verificarsi di un determinato evento esterno.
Le capacità I/O (Input Output) di Pico superano di gran lunga la maggior parte dei microcontrollori. Questi includono PWM ad alta velocità, pin IO che possono avere il proprio hardware di elaborazione e, cosa forse più impressionante, ci sono due core (processori) nel microcontrollore RP2040 di Pico.
Interrupt
Finora, quando abbiamo avuto bisogno di rilevare se un pulsante fosse stato premuto, abbiamo inserito codice simile nel loop eterno:
1 2 3 4 |
while True: if bottone.value() == 0: # fai qualcosa sleep(0.2) # funzionalita anti-rimbalzo |
Questo modo di fare le cose è chiamato polling, perché continuiamo a controllare ripetutamente lo stato dell’ingresso digitale finché non leggiamo uno 0, che indica la pressione di un pulsante. Un tale sistema funziona bene per un programma semplice, dove non succede nient’altro che l’accensione e lo spegnimento di un LED. La situazione cambia in modo drastico se invece utilizzassimo il ciclo per fare qualcosa di molto pesante, magari leggere il valore di un sensore e visualizzarlo su un display. In tal caso ci sarebbe il rischio che si verifichi una pressione molto rapida del pulsante mentre il codice è occupato a fare qualcos’altro, e che quindi la pressione non venga riconosciuta.
Per situazioni come questa, puoi usare gli interrupt. È possibile specificare un ingresso digitale che provoca un’interruzione. Come suggerisce il nome, quando viene rilevato un interrupt, qualsiasi codice attualmente in esecuzione viene sospeso e viene eseguita una routine di servizio di interruzione (ISR). Al termine dell’ISR, il programma riprende da dove era stato interrotto.
Diamo un’occhiata a un esempio. L’interruzione viene attivata dalla variazione della tensione di un ingresso digitale, ad esempio quando viene premuto un interruttore. Per provarlo, basta collegare un interruttore tra GP12 e GND, utilizzando una breadboard.
Ora lanciamo il seguente programma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from machine import Pin from utime import sleep bottone = Pin(12, Pin.IN, Pin.PULL_UP) def handle_button(ignore): print('BOTTONE PREMUTO') bottone.irq(handle_button, Pin.IRQ_FALLING) i = 0 while True: i += 1 print(i) sleep(0.2) |
Il codice che vogliamo venga eseguito dopo un’interruzione viene inserito in una funzione. Il metodo irq (richiesta di interruzione) su button associa la funzione di gestione delle interruzioni (handle_button in questo caso) al pin bottone. Vogliamo che l’interruzione avvenga quando il pulsante del pin di input passa da alto a basso (cioè quando viene premuto per la prima volta) e quindi il secondo parametro di irq è impostato su Pin.IRQ_FALLING. Se si desidera che l’interruzione avvenga quando il pulsante viene rilasciato, anziché quando viene premuto, specificare IRQ_RISING.
Provate a cambiare il valore e notate l’effetto della modifica quando il programma viene eseguito. Se il progetto richiede più di un interrupt, è ancora possibile associare altri pin ad altre funzioni del gestore di interrupt.
Questo, in breve, il funzionamento degli interrupts a eventi sul Raspberry PI RP2040. In un prossimo articolo parleremo di interrupt temporizazzati.
(Fonte: Programming the Pico)
Join our groups on Telegram…