sketch per calcolo frequenza non va su display

infatti il discorso di non usare il delay() nella ISR non e' solo prassi, e' obbligatorio perche' il delay di arduino usa un interrupt per incrementare

Dai testa, non facciamo confusione. Lo sai, perché lo so che lo sai oppure ricordo male io.
Comunque delay non usa interrupt e non disabilita gli interrupt globali, quindi si può usare ovunque e si comporta allo stesso modo sia che si trovi in una ISR o nel loop, cioè sta li a ciclare per tot ms, ciò impegna (monopolizza) il micro a fare solo questa cosa.

Sostanzialmente il delay non si usa mai, se non per pochi ms e se non ci fosse sarebbe meglio.
Il delay nella ISR si comporta come se farcissimo la ISR di codice che richiede ad esempio 1 secondo per essere eseguito. Visto che dentro un ISR tutti gli interrupt non funzionano, gli eventi hardware vengono persi per 1 secondo.

Ecco perché il codice di una ISR deve essere snello ed essenziale.

la delayMicroseconds() funziona, mentre la delay() no
:wink:

delay() and millis() both rely on interrupts, they will not work while an ISR is running. delayMicroseconds(), which does not rely on interrupts, will work as expected.

Ho visionato il codice proprio adesso e non mi ricordavo che delay() usa la funzione micros(), forse all'inizio non era così. delayMicroSeconds invece è simile al _delay_us della avrlibc, solo che al tempo c'èra un bug nella avrlibc e allora hanno usato una routine dedicata.
Chi volesse usare un delay in ms può fare ricorso alla _delay_ms(t) presente nella avrlibc che adesso funziona correttamente.

Le cose stanno come le ha descritte Testato.
Scusate per il disguido, riassumo per correttezza.
millis(), delay(), Serial.print, lcd.print se connesso via I2c non funzionano dentro una funzione utente agganciata ad un interrupt tramite attachInterrupt.
Invece delayMicroSeconds può essere usata ma con parsimonia.

Ciao.