Programmazione interrupts sul Raspberry RP2040 1/2

Interrupts Raspberry RP2040

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:

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.

Interrupt RP2040 1

Ora lanciamo il seguente programma:

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…

… and don’t forget our social channels!

Definire ciò che si è non risulta mai semplice o intuitivo, in specie quando nella vita si cerca costantemente di migliorarsi, di crescere tanto professionalmente quanto emotivamente. Lavoro per contribuire al mutamento dei settori cardine della computer science e per offrire sintesi ragionate e consulenza ad aziende e pubblicazioni ICT, ma anche perche’ ciò che riesco a portare a termine mi dà soddisfazione, piacere. Così come mi piace suonare (sax, tastiere, chitarra), cantare, scrivere (ho pubblicato 350 articoli scientfici e 3 libri sinora, ma non ho concluso ciò che ho da dire), leggere, Adoro la matematica, la logica, la filosofia, la scienza e la tecnologia, ed inseguo quel concetto di homo novus rinascimentale, cercando di completare quelle sezioni della mia vita che ancora appaiono poco ricche.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.