L'INTERRUPT, come si può immaginare dal nome stesso, è un' INTERRUZIONE; siamo nel mondo dei microprocessori, del software, quindi si tratta di una INTERRUZIONE DI PROGRAMMA.
Sembra quasi un non-senso: scrivo un programma perché funzioni e poi lo interrompo...
E invece no, si tratta di una tecnica di programmazione di uso estremamente comune che consente di gestire molte cose che succedono attorno al microprocessore intervenendo in tempi molto stretti ma, soprattutto, senza perdere tempo a controllare la presenza o meno di segnali che non hanno la minima parvenza di ripetitività temporale o, peggio, la cui frequenza di ripetizione può variare da pochi minuti a qualche settimana.
Non avete idea di quali segnali possono comportarsi così? No? E il campanello di casa vostra ?
Ecco, avete capito: in occasione di qualche campagna elettorale suona ogni pochi minuti, quando invece desiderereste qualcuno con cui scambiare quattro chiacchiere perché vi sentite soli... passano giorni interi, anche SETTIMANE, senza che nessuno lo faccia suonare, neanche qualcuno che porta la “pubblicità in cassetta” !
Un segnale simile, per il nostro PIC, è il segnale di “PRONTO” del convertitore di segnali Analogico → Digitale: non sempre impiega lo stesso, identico tempo a preparare il numero binario corrispondente alla tensione presente sul piedino di ingresso; a volte ci mette 8 microsecondi, a volte 10, a volte 7, e così via; io non perderei tempo ad aspettarlo, potrebbe anche succedere che i 10 microsecondi si trasformino, qualche volta, in 50: e allora quanto tempo devo preventivare ?
Non ne preventivo neanche uno, di microsecondi: imposto un bit che, in concomitanza con il compimento delle operazioni di conversione mi “avverta”
Nel PIC, questo avvertimento consiste proprio nell' INTERRUZIONE del programma in corso, vediamo come.
Nella memoria, la sequenza di istruzioni che costituisce il programma occupa tutta una serie di “posti”, le “locazioni”, una istruzione per ciascuna locazione; ad ogni locazione corrisponde un indirizzo FISICO: una certa istruzione, scritta ad un certo punto della sequenza, occuperà la locazione che ha un certo indirizzo; bene; finché il programma non subirà modifiche, quell'istruzione risiederà SEMPRE ALLO STESSO INDIRIZZO.
Sembra insignificante, ma non è così.
Ora proviamo a pensare che tutta la sequenza di quello che il programma deve fare occupi le locazioni dalla 300 alla 450; le istruzioni relative al compimento della conversione, invece, si trovano dalla 500 alla 550.
Mentre il programma gira, le istruzioni tra la 300 e la 450 vengono eseguite un'innumerevole quantità di volte finché, ad un certo punto, avviene la conversione A/D: quando ?
Non ce ne importa un fico secco.
Nel momento in cui si completa la conversione, il processore, con mezzi propri, interni, salva l'indirizzo della locazione della PROSSIMA ISTRUZIONE del programma principale (supponiamo stesse eseguendo l'istruzione presente nella locazione di indirizzo 393: salverà il numero 394, in un posto particolare, che conosce lui conosce bene), completa l'istruzione in corso (avrebbe potuto essere appena iniziata) e poi esegue un salto, cioè sostituisce il numero 394 (che sarebbe stato già pronto) con il numero 500.
A questo punto, ovviamente, la prossima istruzione che verrà decodifica per l'esecuzione sarà proprio la prima dedicata alla conversione A/D, poi avanti, fino alla 550.
Qui ci sarà un'istruzione particolare, insostituibile, nel PIC si scrive con la parola RETFIE che vuol dire RETurn From IntErrupt, ovvero ritorno dall'interruzione.
Questa istruzione fa eseguire un “salto di ritorno”, andando a prelevare l'indirizzo salvato in precedenza, cioè quel numero 394.
E' ovvio che non basta questo: ci saranno altre “cose di contorno” da salvare prima e ripristinare dopo, ma abbiamo capito, spero, qual'è il momento per farlo; vi assicuro che le prime volte non riuscite a salvare tutto ciò che serve, vi dimenticherete qualcosa: ve ne accorgerete quando vedrete che il vostro programma si comporta in modo strano, niente paura: un po' di pazienza e poi riuscirete a capire cosa non va e a rimediare.
La cosa più importante di tutte da capire, ora, è che non sempre il completamento della conversione potrà avvenire quando il programma si trova a “transitare” in corrispondenza dell'istruzione scritta nella locazione 393; una volta sarà la 321, una volta la 449, una volta la 351, e... insomma abbiamo capito una cosa importantissima: possiamo gestire cose che avvengono in tempi COMPLETAMENTE SLEGATI da quelli del programma principale e a sincronizzarle con “lui” in modo quasi perfetto (di perfetto, su questa terra, non c'è nulla) o comunque, in modo “armonico”, tale da avere il funzionamento che ci aspettavamo.
Se volete qualche informazione in più, provate a leggere questo articolo, è sempre roba mia, quindi sapete a chi tirare i pomodori...