Problemi con fading.

Buon giorno a tutti.
Sto sviluppando un progetto forse un po' troppo per le mie capacità di programmatore basiche; praticamente vorrei fare una centralina che generi tre fade con durata variabile (con possibilità di fade a salire o fade a scendere) e che partano in tre momenti diversi ed indipendenti.
Per far questo ho utilizzato:
-arduino mega
-lcd 4X20
-pulsanti vari
-RTC DS1307

Il programma prevede due menu molto semplici, uno per regolare l'ora, ed uno per impostare i fade (attualmente implementati solo due, ma quando risolvo l'inghippo diventeranno tre); nel menù fade imposto l'ora d'inizio e la durata.
Praticamente il programma lavora così: quando raggiunge l'ora impostata per il fade, inizia a lavorare il PWM un step alla volta, della durata impostata (pr esempio: 1 minuto=60000ms 60000/255= ogni step lo deve fare ogni 235ms circa). Il problema è che non lo fa, nel senso che i tempi sono sbagliati, dopo un minuto è ancora li che sta incrementando.
Ho provato le sezioni di programma separatamente e funziona perfettamente, ma messe insieme perde dei colpi.
AnalogWrite agisce anche sul PWM?
Qualche aiuto?
Grazie.

AnalogWrite su pin digitale è utilizzato appositamente per generare PWM
Se metti il codice forse possiamo aiutarti maggiormente.

Problema: essendo la prima volta che posto, ho un problema.
Mi dice che con il codice il post supera i 9000 caratteri....
Come faccio a mandare il codice???

Ci fai uno zip e lo alleghi cliccando sul link sotto all'editor dove scrivi il messaggio, non è presente nella risposta rapisarapida, devi per forza cliccare sul bottone reply
[edit]
puoi allegare anche il file .ini non serve zipparlo se vuoi
[/edit]

Ok,provo di allegare il file.ini
Chiedo scusa se è scritto male, ma non sono un programmatore…
Questa è l’ultima versione del mio sketch, in cui uso la libreria <MsTimer2.h> per avere un timer tarato a 1ms, che mi serve per contare i ms di ogni step_fade.
Ho usato altri metodi, mai millis ad altre librerie “timer”, ma tutte non hanno sortito l’effetto voluto.
Se potete aiutarmi anche con altre idee…
Grazie.

prova_rtc_fade_up_lib_new6.ino (15.4 KB)

Non sono sicuro di aver capito, il tuo timer scatta ogni mS e esege il metodo fade_sub, dentro al metodo incrementi sempre le variabili collegate al fade e le utilizzi nell'analogWrite. In tutto il metodo non c'è controlli del tempo trascorso e quindi non verifichi se il tempo di fade / 255 è trascorso dall'ultimo fade.
Detto questo non conoscendo la libreria che stai utilizzando può darsi che utilizzi un timer del micro per far scattare il metodo (nel tuo caso fade_sub) e questo potrebbe scattare più volte mentre stai facendo altre operazioni (Es. analogWrite) quindi potrebbero anche saltarti i controlli fade_step1==255 e quindi non scire mai dal tuo ciclo in modo corretto.
Per verificare la cosa potresti sostituire fade_step1==255 con fade_step1>=255 ma solo come prova in quanto se in questo stato inizia a funzionare devi rivedere il funzionamento per tener conto del tempo trascorso tra un tick del timer e l'altro e incrementare solo se il tempo trascorso è corretto (nel tuo caso 235ms tra un incremento e l'altro se il fade deve durare un minuto)
Una curiosità per aver necessità di tale precisione a cosa applichi il fade?

Grazie fabpolli.
In realtà la libreria che ho usato l'ho trovata in rete, e praticamente un timer programmabile, il quale chiama una routine alla fine del time programmato.
Io l'ho impostato ad un msec per comodità, in modo che posso gestire tre timing diversi (ho sempre un timer free running che cadenzia il tempo 1mS); si la l'idea di principio è: faccio partire il timer a 1ms ed incremento un registro, lo confronto con il timing/step impostato se uguale, allora incrementa lo step del fading. Ad ogni step resetta il registro in modo da prendere sempre lo stesso tempo. Questo mi permette di poter gestire i tre timing separati.
Il problema è che se provo il blocco di programma del timer da solo gira alla precisione, ma se lo introduco con il confronto si perde....
Sulla precisione ti dico che ho già trovato una scappatoia, nel senso che se entro il time impostato più la durata fade non ha ancora terminato, lo mando alto o basso forzatamente....ma per una questione di principio (a volte mi impunto) voglio capire perchè non fa quello che dovrebbe fare per bene....
Se hai altre idee, anche senza la libreria, io sono tutto orecchie...
Inizialmente avevo anche provato con i soli millis, ma il risultato è uguale...
Grazie ancora dell'aiuto...