libreria RTC

ho appena scaricato la libreria SWRTC:http://www.leonardomiliani.com/2011/swrtc-un-orologio-in-tempo-reale-via-software/?lang=en poi l'ho caricata.

premetto che nn ho la shield RTC, e mi domando come faccia a funzionare comunque????????????? :astonished: :astonished: ovviamente se tolgo l'alimentazione nn funziona, ma nn riesco a spiegarmi come faccia a funzionare anche senza la shield..

Perche è una SWrtc, ovvero un RTC emulato via software. Se togli l'alimentazione il conteggio si ferma, ovviamente, e riparte da i valori impostati in fase di compilazione. Se ti serve un RTC che mantenga l'orario devi prendere un RTC hardware con batteria di backup.

quindi dipende dalla libreria??

Si, quella è specifica per l'RTC software. Per quelli hardware dipende dal modello che acquisti Esempio --> http://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit Lib --> https://github.com/adafruit/RTClib

Come ti potrà spiegare meglio il suo autore (è Leo, il moderatore del forum), la libreria sfrutta i contatori [u]interni[/u] di Arduino (timer).

Opportunamente configurati, i timer possono contare gli impulsi del clock a 16MHz ed emettere un interrupt allo scadere del conteggio programmato.

Se il conteggio, ad esempio, termina dopo un secondo, ecco un potente sistema per ottenere una routine che incrementa ogni secondo una variabile.

se io volessi andare ad aggiurgere dei pulsanti per poter modificare l'orario come posso fare? perchè sto provando da un po ma nn riesco a capire come poterlo implemantare allo sketch..

ma va a sfruttare delle funzioni millis(); o delay();??

Ogni libreria salva il valore dell'ora e dei minuti (suppongo che i secondi non ti interessino) in delle variabili. Alla pressione del pulsante non devi fare altro che incrementarle o decrementarle. Nel caso dell'RTC sarebbe opportuno bloccare il conteggio, aggiornare la variabile e poi farlo ripartire. Non posso essere più specifico in quando le librerie sono tutte diverse, ma generalmente funzionano nello stesso modo.

Erik86: ma va a sfruttare delle funzioni millis(); o delay();??

No, ne in un caso ne nell'altro. Nel caso della SWrtc di Leo sfrutta il timer interno del micro, nel caso degli RTC è un micro esterno che effettua il conteggio.

dovrei pensare bene prima di parlare, ho trovato il modo di aggiungere il pulsante e quindi nel caso mancasse l'alimentazione andrei a reimpostare l'orario.. grazie ragazzi per la spiegazione della libreria ora mi è chiarissimo il concetto..

la libreria swRTC che ho scaricato ieri, per puro caso ho visto che puo funzionare anche senza shield (ovviamente se tolgo tensione si resetta e devo reimpostarlo). al momento voglio propio provare ad usarlo in quest'ultimo modo, ma sono incappato in un problema.. su i pin PWM 3 e 11 ho due led... il problema che da quando ho inserito la libreria rtc nel programma non funzionano più, dopo svariate prove ho notato che se cancello (rtc.startRTC()smiley-wink e carico nuovamente il programma funzionanano e ovviamente l'orologio nn funziona.. però non capisco il perchè i led non funzionino..????!!!

La swRTC per funzionare usa un timer interno dell'ATmega328P, anche il PWM usa un timer. Se il timer è lo stesso, cosa probabile, le due funzioni inteferiscono quindi o funziona una o l'altra o forse nessuna delle due. All'interno della libreria ci dovrebbe essere la possibilità di cambiare timer. Chiedi nel caso a Leo72, autore della libreria.

infatti sono andato subito a vedere cosa si poteva fare, infatti ho trovato la parte riguardante lo start, è che nn sapevo poi cosa fare… XD XD XD

//start the software RTC
void swRTC::startRTC() {
setTimer();
counterT = 0;
#if defined (ATMEGAx8) || defined (ATMEGA644) || defined (ATMEGAx0)
TCNT2 = starter;
TIMSK2 |= (1<<TOIE2);
#elif defined (ATMEGA8)
TCNT2 = starter;
TIMSK |= (1<<TOIE2);
#elif defined (ATTINYx5) || defined (ATTINYx313)
TCNT0 = starter;
TIMSK |= (1<<TOIE0);
#elif defined (ATTINYx4)
TCNT0 = starter;
TIMSK0 |= (1<<TOIE0);
#endif
SREG |= (1<<SREG_I);
isRunning=true;
}

void swRTC::stopRTC() {
#if defined (ATMEGAx8) || defined (ATMEGA644) || defined (ATMEGAx0)
TIMSK2 &= ~(1<<TOIE2);
#elif defined (ATMEGA8)
TIMSK &= ~(1<<TOIE2);
#elif defined (ATTINYx5) || defined (ATTINYx313)
TIMSK &= ~(1<<TOIE0);
#elif defined (ATTINYx4)
TIMSK0 &= ~(1<<TOIE0);
#endif
SREG &= ~(1<<SREG_I);
isRunning = true;
}

questa a mio avviso è la parte incriminata…
che si può fare?

Erik86: che si può fare?

PaoloP: Chiedi nel caso a Leo72, autore della libreria.

:stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:magari vedendolo sapevi darmi qualche consiglio.. comunque gli ho gia mandato una mail devo solo aspettare..