Quando un interrupt dovrebbe essere usato al posto di un controllo in loop()?

Buonpomeriggio,

mi chiedevo quando l'istruzione di interrupt dovrebbe essere usata invece che in un check nel loop(). Mi spiego meglio, potrei controllare l'input di un PIN cliclicamente nella funzione loop() per eseguire azioni, oppure potrei anche istanziare un interrupt di sistema.

Quali sono le differenze sostanzialmente?

La differenza in parole semplici e che anziché guardare continuamente il telefono senza distrarsi nell'attesa di ricevere una telefonata, attivi la suoneria, questa nel caso della MCU equivale ad associare un evento ad una porzione di codice (routine di interrupt) che viene eseguita quando l'evento si presenta. Nota che c'è una sola CPU, per cui mentre si esegue codice nella routine di interrupt il loop verrà interrotto per tutto il tempo che la routine di interrupt impegna la CPU. Quindi evita che la routine di interrupt monopolizzi la CPU per troppo tempo. Normalmente si prende nota dell'evento e poi si gestisce questo nel loop.

Ciao.

Devi impiegare un interrupt ogniqualvolta devi catturare un evento (tipicamente una variazione di livello di un pin) che si verifica più velocemente del tempo che impiega il loop per fare un giro. E quanto tempo impiega il loop per fare un giro? Purtroppo dipende. E non solo dal numero delle istruzioni, ma anche dal loro tipo. Si parla sempre di microsecondi, ma ad esempio, un'istruzione analogRead() ne impiega parecchi.

In caso di pulsanti mi preoccuperei molto di più del rimbalzo del contatto, mentre nel caso di un decoder rotativo la cattura di TUTTI gli impulsi oltre una certa velocità di rotazione implica l'uso degli interrupt. Ma anche in questo caso, se l'encoder viene girato a mano e la perdita di un impulso non è tassativa, si può fare il check all'interno di un ragionevole loop.

Ciao, P.

Lo si utilizza per un evento che non vuoi/puoi perdere, perchè magari non ripetitivo e molto breve. Potresti non riuscire a leggerlo facendo polling su un pin.

es: un pulsante lo puoi leggere in polling (evento lento) il pin collegato ad una fotocellula di un fotofinish lo leggi con interrupt (per bloccare il timer nell'istante esatto del passaggio)

Dipende comunque da quanto è lungo il tempo di loop, non c'è una regola precisa

edit: sovrapposto con pgiagno ma ormai avevo scritto :)

Grazie per le chiare risposte =)