swRTC

tnx leo, domani vedo di implementare il tuo suggerimento nel codice, ci son certamente molti modi per fare la cosa ma senza un suggerimento non so proprio da cosa partire, poi faccio errori stupidi perche' non so programmare

tipo son impazzito con un semplice if perche' scrivevo: if (valavvio == 1) { avvio = 0; digitalWrite(motordx, HIGH); } invece di: if (valavvio == 1){ avvio = 0; digitalWrite(motordx, HIGH); } mi serve un corso di parentesi =(

La posizione della parentesi non è influente, può stare sulla stessa riga dell'if oppure sotto, è una questione stilistica. Io preferisco sulla riga ma tanti la mettono sotto perché si allinea con quella di chiusura.

leo72: La posizione della parentesi non è influente, può stare sulla stessa riga dell'if oppure sotto, è una questione stilistica. Io preferisco sulla riga ma tanti la mettono sotto perché si allinea con quella di chiusura.

ci son diventato scemo, se la parentesi era sotto, il codice non andava come avrebbe dovuto... mi incasino + con le parentesi che con il resto :sweat_smile:

leo72: Beh, allora si torna a quello che avevo detto in un altro thread, ossia che usando il modulo RTC puoi collegare un quarzo da 32768 Hz esterno. Ci studierò sopra.

bene, anzi male, vedo che mi è venuto un altro attacco di calimerite acuta se, per prendere in cosiderazione il mio discorso, lo ha dovuto ribadire lesto =( =(

Michele Michele... :D Ti avevo già risposto.

Tu chiedi:

Quindi il timer che stai usando è già predisposto per il quarzo dedicato? Cioè carico la tua libreria e collego il quarzo orologio ai pin predisposti e funziona?

Io rispondo:

La libreria così com'è funziona con clock a 1/8/16 MHz. Come detto, è precisa se si usa un quarzo esterno.

Sì, sì, l'ho capito dopo aver premuto il clic del mouse :blush: Mi era sfuggito il particolare oscillatore interno/oscillatore esterno, quindi parlando di quarzi pensavo a quello specifico, ma giustamente a doverlo mettere tanto vale usare quello per il micro. A questo punto conviene prevedere una batteria "bottone" backup per il solo micro (tipo quella dell'RTC, al limite anche il condensatorone invece della batteria) quando non è alimentato, e si risolve anche la perdita di data, tanto sappiamo che messo in sleep non consuma una pitocchia. Ma l'RTC specifico come funziona? è un banale generatore di impulsi precisi o ha un calendario settabile e poi se la vede lui? Ne ho diversi e di diversi tipi ma non li ho mai usati.

Un "vero" RTC (DS1397, PCF8563, ecc) è un'implementazione hardware di ciò che ho fatto io in software. Il micro ha dei registri interni in cui memorizza ore, minuti, secondi, giorno, mese, anno che incrementa ad intervalli regolari, scanditi dal suo clock. Ovviamente anche questo in caso di assenza di alimentazione si resetta e va reimpostato. Una volta impostata l'ora, se non succedono problemi, l'RTCva per la sua strada.

La scelta del quarzo a 32768 non è casuale, dato che con un prescaler a 128 ed un contatore ad 8 bit (2^8=256) si ha un colpo di clock esattamente ogni secondo, dato che 32768/128=256 e 256/256=1.

ho dato un'occhiata allo schema equivalente del quarzo http://en.wikipedia.org/wiki/Crystal_oscillator quindi se da una parte gli dai 5v, dall'altra avrai un'impulso ogni tot in base alla frequenza. Ora se leo72 anzichè usare l'interrupt sul timer lo usasse su un pin, e anzichè aumentare un secondo ogni interrupt lo facesse ogni 32768, avremmo un'RTC perfetto, con arduino che può lavorare a qualsiasi frequenza > 32768(direi almeno 100kHz), al costo di un misero pin.

Sarebbe da studiare. Anche in previsione dell'uso su un Attiny85, che è un DIL8 come gli RTC più comuni. Sarebbe carino avere un RTC che faccia anche qualcosa in più di contare l'ora :D

leo72:
Sarebbe da studiare. Anche in previsione dell’uso su un Attiny85, che è un DIL8 come gli RTC più comuni. Sarebbe carino avere un RTC che faccia anche qualcosa in più di contare l’ora :smiley:

il solito aguzzino, li spremi come limoni sti tiny, quando ti vedono cominciano a muovere i pin tipo millepiedi, ma dove vanno, con 8 scarpe di metallo? :disappointed_relieved:

]:smiley:

Da provare... Scusa perche' forse mi sono perso un po' nei post: sacrifico PWM 10 e 11 e ottengo un RTC preciso?

Sì. Però devi avere un buon quarzo esterno. Bisogna verificare la precisione del risuonatore dell’Arduino UNO, se cioè nel lungo periodo sfalsa di molto il calcolo del tempo.

Perdi il PWM su 10/11 perché la swRTC usa il timer2/INT2, che gestisce il PWM su quei pin.

Hai avuto occasione di testare su 2009 e diecimila?

Non ho le schede.

PS: stavo cercando di fare il porting della libreria sui Tiny ma ho riscontrato un bug nel core Tiny. In pratica il bug sembra affliggere la dichiarazione della funzione della gestione dell'interrupt. ISR(TIMER1_OVF_vect)

genera questo errore nel terminale dell'IDE di Arduino:

core.a(wiring.c.o): In function 'init':
/home/percorso/alla/cartella/Arduino/arduino-tiny-022/hardware/tiny/cores/tiny/wiring.c:234: multiple definition of '__vector_4'
sketch_sep27b.cpp.o:sketch_sep27b.cpp:36: first defined here

In pratica sembra che la definizio dell'interrupt gli dia noia. __vector_4 è il vettore interrupt nella interrupt table da usare per un interrupt di overflow sul timer 1 ($0004).

Alla riga 234 del file tiny/wiring.c c'è solo la funzione per attivare gli interrupt (sei):

void init(void)
{
  // this needs to be called before setup() or some functions won't work there
  sei();

Bah... indagherò un altro po'.

Ho la diecimila e la 2009 (ma non ho la UNO) dovrei testarlo...

Se potessi verificarlo te ne sarei grato.

leo72: Se potessi verificarlo te ne sarei grato.

Dovrei proprio farlo, anche per smettere di farmi deprimere dal multicoso, come forse sai :|

leo, stavo provando a caricare uno sketch con il tuo swrtc su un atmega8a standalone, non ci riesco, al 99,9% son impedito io, ma dal log degli errori mi segna tutti riferimenti alla libreria, e' incompatibile con l'at8a? visto che lo avevo volevo usarlo... tanto per sapere

C:\Users\reizel\Downloads\arduino-0022\libraries\swRTC\swRTC.cpp: In member function 'void swRTC::setTimer()': C:\Users\reizel\Downloads\arduino-0022\libraries\swRTC\swRTC.cpp:62: error: 'TIMSK2' was not declared in this scope C:\Users\reizel\Downloads\arduino-0022\libraries\swRTC\swRTC.cpp:63: error: 'OCIE2A' was not declared in this scope C:\Users\reizel\Downloads\arduino-0022\libraries\swRTC\swRTC.cpp:63: error: 'OCIE2B' was not declared in this scope C:\Users\reizel\Downloads\arduino-0022\libraries\swRTC\swRTC.cpp:67: error: 'TCCR2A' was not declared in this scope C:\Users\reizel\Downloads\arduino-0022\libraries\swRTC\swRTC.cpp:68: error: 'TCCR2B' was not declared in this scope C:\Users\reizel\Downloads\arduino-0022\libraries\swRTC\swRTC.cpp:68: error: 'WGM22' was not declared in this scope C:\Users\reizel\Downloads\arduino-0022\libraries\swRTC\swRTC.cpp: In member function 'void swRTC::startRTC()': C:\Users\reizel\Downloads\arduino-0022\libraries\swRTC\swRTC.cpp:169: error: 'TIMSK2' was not declared in this scope C:\Users\reizel\Downloads\arduino-0022\libraries\swRTC\swRTC.cpp: In member function 'void swRTC::stopRTC()': C:\Users\reizel\Downloads\arduino-0022\libraries\swRTC\swRTC.cpp:176: error: 'TIMSK2' was not declared in this scope

Test ? Testato, la uno perde piu di due sec al giorno sul mio nixie. Testero' standalone con quarzo. i quarzi vengono venduti con la tolleranza dichiarata, per esigenze piu toste esistono i quarzi termocompensati. Leo ma quando mi dici di questa libreria ? Ho rischiato di perderla :)

La metto a lavoro, ricordi che ti chiesi fare i mesi ?

due domande - e' difficile modificarla per supportare i 20mhz ? - in modalità sleep, michele, il micro continua ad andare a 16mhz, altrimenti sbaglierebbe l'orario ? - se in sleep non sbaglia lOrario quanti mA consuma piu o meno? - dobbiamo calcolare quanto regge una batteria tipo la cr2032 - anche io devo usarla sugli 8A