Tutti oramai sanno cos’è un Arduino, ovvero di come un dispositivo di prototipizzazione elettronica rapida abbia semplificato i test e la realizzazione di molti circuiti, avvicinando un gran numero di non addetti ai lavori, al mondo dell’elettronica. Arduino si è imposto per la sua semplicità d’utilizzo e la sua community, che in una sorta di effetto valanga si allarga in continuazione. Tuttavia l’IDE di sviluppo, consigliata ed usata dalla maggior parte degli utenti per la scrittura degli sketch, proprio in nome della semplicità, non permette di sfruttare appieno tutte le periferiche a bordo dei micro-controllori appartenenti alla famiglia Arduino, limitando pertanto le funzioni della scheda. Un esempio su tutti è dato dalle periferiche di timing che normalmente tutti i micro-controllori montano, ma (a meno di particolari librerie) sono totalmente trasparenti all’IDE. In questo articolo ci occuperemo di dare le indicazioni necessarie per l’utilizzo di tali periferiche, usate per la generazione di interrupt.
Cos’è un Interrupt
Usando un micro-controllore un generico utente può in modo semplice e veloce configurare un proprio sistema embedded, scrivendo una logica che sfrutta le periferiche interne a quest’ultimo o a dispositivi esterni. Realizzando ad esempio un interruttore crepuscolare, l’utente collegherà un sensore di luminosità al convertitore ADC del micro-controllore, e nel caso in cui il valore d’uscita di quest’ultimo sia maggiore/minore di una determinata soglia, il micro-controllore provvederà ad accendere/spegnere una lampada collegata mediante, ad esempio, un relè.
Quando si scrive un codice come quello di questo esempio, normalmente si procede in modo verticale, ovvero, il codice è sequenziale: prima si legge il sensore di luce, dopo si confronta il suo valore con una soglia prestabilita e successivamente si accende o meno la lampada (il tutto ripetuto in un loop infinito), tuttavia in alcune applicazioni può essere fondamentale eseguire alcune operazioni in istanti prefissati di tempo indipendentemente da tutte le altre operazioni presenti nel programma. Ad esempio, in un cronometro il micro-controllore deve occuparsi della gestione dei tasti, della gestione del display ma soprattutto del conteggio del tempo. In questi casi una logica sequenziale è fallace in quanto se ad esempio si vuole fissare per il cronometro una risoluzione di 1 ms, ma il micro-controllore impiega 6 ms per il controllo del display, non sarà mai possibile scrivere sul display stesso il tempo esatto, in quanto il tempo impiegato dal micro-controllore per la gestione del display inficia il conteggio stesso dei millisecondi che passano, e quindi il tempo mostrato sul display non sarà mai esatto. In questi casi si ha la necessità di operare in modo orizzontale ovvero di eseguire le operazioni in modo parallelo. Poiché un micro-controllore normalmente non dispone dell’hardware adatto ad eseguire operazioni parallele (due o più core che fanno operazioni diverse contemporaneamente), si utilizzano in questi casi le periferiche di timing.
Le periferiche di timing vengono utilizzate dal micro-controllore per la generazione di interrupt ad istanti prefissati di tempo; quando un interrupt viene generato il micro-controllore congela le operazioni che stava normalmente eseguendo e corre ad eseguire quelle associate all’interrupt. In questo modo si garantisce l’esecuzione delle istruzioni connesse all’interrupt in istanti prefissati di tempo. Tornando all’esempio del cronometro, il modo migliore di agire in questo caso è quello di far gestire i tasti ed il display al micro-controllore dentro un loop infinito e di affidare l’incremento del contatore del tempo ad una funzione connessa ad un [...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2704 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
Molto interessante questo articolo. L’utilizzo degli interrupt apparentemente semplice non lo è affatto! Soprattutto quando si tratta di gestire più sensori in un tipico ambiente IoT.
Articolo interessante e completo, almeno per quanto riguarda i timer.
Gli interrupt dei timer sono essenziali quando si vuole operare in real time, come nei sistemi di controllo. Cosa che sui PC non è più possibile (o è limitata a tempi relativamente grandi) da quando si è passati dal vecchio DOS a Windows.