apire bene i delay e i flussi.
Nel codice di Arduino esiste un flusso principale del programma, ripetuto ininterrottamente. Il loop(). Tutto quello che è lì dentro viene ripetuto continuamente. Questo per scelta dei progettisti, che hanno strutturato un sketch in 2 blocchi distinti, setup() e loop(). Setup() viene eseguito solo 1 volta, il loop() sempre.
Siccome non c'è attesa tra un'istruzione e l'altra, può capitare di avere la necessità di attendere un certo lasso di tempo tra l'esecuzione di un'azione e la successiva. E' stato perciò pensato al delay(), una funzione che attende x millisecondi.
Il tutto però sempre inserito nel loop().
Anzi se qualcuno sa darmi consigli per capire flusso, delay e problematiche legate a questo. Ad esempio se chiamo una funzione nel loop, è sincrona o asincrona?
Cosa intendi per sincrono/asincrono?
Se intendi eseguito nel flusso principale, tutto quello che è scritto in linguaggio Arduino è sincrono. Ma sarebbe più corretto dire "seriale". Una istruzione dietro l'altra, ecco come viene eseguito il codice Arduino.
Se hai un loop() così strutturato:
loop() {
funzione1();
funzione2();
}
funzione2 sarà eseguito sempre e soltanto dopo funzione1. Dopo funzione2 sarà sempre eseguita funziona1 perché loop() è ciclico.
Esiste qualcosa di asincrono a parte gli interrupt?
Ad esser sinceri a livello di SW non esiste nulla di asincrono, ossia eseguito alternativamente a qualcos'altro. Questo perché l'Atmega non è dotato di multitasking per cui anche per eseguire un interrupt viene bloccata l'esecuzione del codice principale. Il micro infatti salva lo stato dei registri, esegue la routine di interrupt, e poi torna ad eseguire il programma dell'utente dal punto in cui era stato interrotto.
A livello di HW esiste un modulo asincrono, il timer 2, che può funzionare con una sorgente di clock differente da quella del clock di sistema, lavorando quindi anche a frequenze differenti ed anche quando il micro è in sleep. Ma non penso c'entri molto con quello che volevi sapere.
Gli interrupt interrompono anche un delay? La seriale continua a bufferizzare tranquillamente anche se sono in un delay vero?
Gli interrupt bloccano anche un delay. La funzione delay altro non fa che controllare che il contatore interno dei millisecondi (agganciato al timer 0 e letto tramite la funzione millis()) sia avanzato del valore passato come parametro, ossia sia trascorso il tempo richiesto. Ma per far ciò è interrotta continuamente dall'interrupt che incrementa il contatore del timer 0, nonché da altri interrupt. Un altro interrupt è proprio quello che gestisce i dati in arrivo sulla seriale ed in partenza su di essa. Tutte operazioni eseguite in background, quindi ad un livello inferiore rispetto a quello del codice utente. Ma io non mi azzarderei a definire un interrupt un'operazione asincrona perché, come detto, in realtà interrompi l'esecuzione dello sketch e poi la riprendi in un secondo tempo.
Chi mi sa dare consigli di dove trovare documentazione ben fatta su questa problematica con esempi?
Grazie
Cerca su internet, leggi un sacco su timer, interrupt, guarda il datasheet e sperimenta.