Void loop rallentamenti

Sto sviluppandop un'applicazione..... tutto bene per ora, lcd funziona, pwm pure, rilevamento temperature e rpm bene, seriale perfetta, ma mi trovo in difficoltà coi pulsanti! Questi vengono letti (come stato) con ritardi tra 2 e 5 secondi, con conseguente impossibilità di usarli! Chiedo: nel void loop non c'è nessun delay, però chiamo altre void dove ci sono dei delay..... i ero convinto che ogni void lavorasse par i 'fatti suoi', ma evidentemente non è così! Come faccio? per visualizzare messaggi su un lcd dei ritardi mi servono, e per per altri input e output! Grazie!

i delay(***) durante il programma arrestano le operazioni sequenziali è un dato di fatto che si trovino nel void loop o in altri void routines, quindi per me non deve esserne usato nemmeno uno, è facile perdere qualche evento esterno mentre sei in attesa, anche mettere delay(1) prima di chiudere il client mi fa girare un po' i ball, i for () sono una perdita enorme di tempo quando sono tante le cose che da fare in un ciclo loop, devi usare i timer quindi gli interrupt, anche la scelta della scheda arduino più adatta alle tue esigienze è importante, la mega ha diversi timer gestibili separatamente, dipende tutto da quello che vuoi fare conoscendo quali sono i limiti di un Atmel, se non ti bastano, devi rivolgerti a processori più potenti. Comunque senza conoscere il tuo listato e quello che vuoi fare, indicativamente ti posso dire che i ritardi timer vanno tutti inseriti nel loop () che poi richiameranno le routine o funzioni specifiche

ciao

Qui spiega l'uso di millis per fare la funzione delay senza però bloccare l'esecuzione del programma:

http://arduino.cc/en/Tutorial/BlinkWithoutDelay e qui:

http://zuccala.blogspot.com/2010/01/multitasking-arduino-millis-parte-1.html

....la cosa mi si complica.... ma dovrei saltarci fuori! Grazie ad entrambi!

ivan64:

Chiedo: nel void loop non c’è nessun delay, però chiamo altre void dove ci sono dei delay… i ero convinto che ogni void lavorasse par i ‘fatti suoi’, ma evidentemente non è così! …

È la stessa cosa: Tu hai una TV e un telecomando, quando quardi un canale non vedi l’altro e non puoi vedere la bella ragazza che fanno vedere sul canale che non guardi.

Arduino esegue lo sketch in modo uno dopo l’altro. Se chiami una funzione viene eseguita quella e il programma aspetta finche la funzione é terminata per proseguire con la funzione sucessiva.

Arduino non fa multitasking dove il tempo di esecuzione é diviso su piú programmi /processi.

Ciao Uwe

ero convinto che ogni void lavorasse par i 'fatti suoi'

...che ogni funzione lavorasse...

"void" è un tipo di dato, quindi se presa alla lettera quella frase è priva di senso! :-)

Le funzioni vengono eseguite in modo sequenziale. No multitasking, no multithreading, no nutin'.

Una strada percorribile è eseguire diverse funzioni in modo temporizzato. Mi faccio un po' di pubblicità e ti segnalo SimpleTimer (la trovi cercando nel playground), e ovviamente anche la altre librerie presenti nella stessa sezione.

"void" significa che un funziona non da un valore di ritorno. Se da un valore di ritorno ( con return(); ) deve essere dichiarato di che tipo é il valore di ritorno. esempio:

int miafunzione(int valore)
{
valore++;
return (valore)
}

e se usi la funzione:

risultato = miafunzione(1);

Ciao Uwe