leo qualcosa nella tua forma non funziona: 1.0/(F_CPU/1024.0/256.0)
dici essere il numero di overflow al secondo, ma a me sembrano più la durata di un overflow, infatti a 8Mhz ottengo 0.032768, e a 16MHz ottengo 0.016384..
il numero di overflow al secondo pare essere solo (F_CPU/1024.0/256.0)
mi puoi dare conferma?
edit: come fai a dire che essendo potenze di 2 le cifre decimali non andranno mai oltre le 6?
riedit: per evitare di passare dai float ho ideato:
duration = F_CPU;
secondsRapresented=1;
while(duration%262144!=0){
duration*=10;
secondsRapresented+=10;//the number of seconds duration rapresent
}
overflows = duration/262144;
ora sappiamo che ogni tot "overflows" sono trascorsi "secondsRapresented" secondi.
quindi l'interrupt diventa
counterT++;
if (counterT>=overflows+delta){//if one hour is passed
timestamp+= secondsRapresented;//add a hour to timestamp
counterT-=overflows+delta; //remove one hour from counter
}
notare il ritorno in auge del delta, settabile a mano
e il calcolo del timestamp diventa:
return timestamp + map( counterT, 0, overflows+delta, 0, secondsRapresented );
infine abbiamo di nuovo il delta:
boolean swRTC::setDelta(unsigned long deltaT) {
if ( delta<=overflows)
return false;
delta=deltaT;
return true;
}
allego la libreria, ma non è testata (ma le modifiche dalla mia originale son solo queste), so solo che compila, ma dovrebbe essere corretta. Riaggiunto il setDelta().
ora diventa un poco più macchinoso settare il delta a mano, perchè bisogna conoscere sia il valore di overflow che di secondsRapresented; forse si può semplificare un pò ma ora son stanco
swRTClesto.zip (6.08 KB)