Funziona "static" durante Interrupt?

Devo conservare il valore di una variabile durante diversi Interrupt hardware sul Pin2. In pratica devo contare gli Interrupt, e ad ognuno di essi il contatore diminuisce di una unità, ma ovviamente il contatore deve conservare il valore tra un Int e l'altro (e non azzerarsi continuamente).

Dichiarare static la variabile del contatore, funziona se infilato dentro una ISR? No eh...?

Devi usare una variabile globale di tipo volatile. Così la puoi usare all'interno delle ISR e in tutte le altre parti del programma. Essendo globale, non perde il valore quando il tuo codice è uscito dalla ISR

Si, di solito uso "volatile", ma non ho mai avuto necessità di conservare il valore tra le diverse ISR. Cmq mi serve solo dentro la ISR per contare gli interrupt. Non la uso "fuori".

Allora mi assicuri che volatile tiene il suo valore tra una ISR e l'altra eh! Dopo cena provo...

Thanks! :grin:

BaBBuino: Dichiarare static la variabile del contatore, funziona se infilato dentro una ISR? No eh...?

Static serve solo per le variabili locali, se la dichiari in questo modo viene inizializzata solo la prima volta che richiama la funzione dove si trova e non viene distrutta alla sua uscita, mantiene inalterato il suo valore al successivo rientro nella funzione. Volatile è un modo per avvisare il compilatore che quella variabile può cambiare il suo valore mentre stai eseguendo una funzione, p.e. per effetto di un interrupt, il che forza il compilatore a rileggerne il suo valore ogni volta che viene utilizzata, questa cosa ha un impatto negativo sulle ottimizzazione che esegue il compilatore pertanto è buona cosa limitare al minimo possibile le variabili di tipo volatile. Nel tuo caso devi utilizzare una variabile globale di tipo volatile come ti ha detto Leo.

Per conservare un dato all'interno di una funzione, hai 2 modi: o dichiari una variabile locale (quindi interna alla sola ISR) di tipo "static" (e questo vale anche all'interno di una ISR) oppure la crei a livello globale. A livello globale, va indicata come "volatile": questo serve per informare il compilatore che la variabile potrebbe essere modificata in più punti diversi del programma, e per evitare problemi di aggiornamento, con volatile il compilatore non ne ottimizza l'uso. Essendo però globale, conversa il suo valore anche quando lasci la ISR, anche se poi la usi solo nella ISR.

Entrambe le soluzioni dovrebbero essere adatte al tuo scopo, quindi.

EDIT: uops... ci siamo accavallati.