Arduino Forum

International => Italiano => Megatopic => Topic started by: leo72 on Sep 26, 2011, 04:09 pm

Title: swRTC
Post by: leo72 on Sep 26, 2011, 04:09 pm
Negli ultimi tempi ho notato che in diversi hanno cercato un modo per implementare in software un RTC, ossia un orologio in tempo reale, con il proprio Arduino. La libreria che ho sviluppato si chiama swRTC e, come dice il nome, serve per creare un RTC software con ore:minuti:secondi e giorno:mese:anno.
La libreria tiene conto degli anni bisestili ma non dell'ora legale.

In allegato trovate un pacchetto ZIP (per portabilità su più SO) da scompattare nella propria cartella delle librerie. Per usare la libreria basta un
Code: [Select]
#include <swRTC.h>
Poi si crea un'istanza della libreria:
Code: [Select]
swRTC rtc;
Prima di poter usare la libreria è necessario impostare la data e l'ora:
Code: [Select]
rtc.stopRTC();
rtc.setTime(ore, minuti, secondi);
rtc.setDate(giorno, mese, anno);
rtc.startRTC();


L'impostazione può essere fatta nel setup con dei valori predefiniti oppure anche durante l'esecuzione dello sketch, se ad esempio si ha un display LCD con il quale interagire con l'utente.

Per recuperare le informazioni sull'ora e sulla data basta usare i seguenti metodi:
Code: [Select]
rtc.getSeconds();
rtc.getMinutes();
rtc.getHours();
rtc.getDay();
rtc.getMonth();
rtc.getYear();


La libreria usa un interrupt basato sull'overflow del contatore incrementato dal timer 2: per questo motivo non interferisce con le funzioni temporali di Arduino quali delay e millis, che sono invece basate sul timer 0. Per contro, si perdono la funzionalità PWM sui pin 10/11 dato che su quei pin essa è gestita proprio dal timer 2.
La libreria è usabile al momento su micro sui micro Atmega8/8A, Atmega48/88/168/328/328 (con e senza core "P" PicoPower), compreso ovviamente le Arduino 2009/UNO, Atmega644/1284, Attiny25/45/85, Attiny24/44/84, Atmega640/1280/1281/2560/2561 (comprese ovviamente le Arduino Mega1280 e Mega2560) e Attiny2313, con clock di 1, 8 e 16 MHz. Altri micro e frequenze saranno aggiunti in seguito.

Alla libreria è allegato anche uno sketch di esempio ed un file README con altre informazioni.

Ringrazio pubblicamente lesto che mi ha dato una mano stanotte a sistemare alcuni problemi di codice.
Piccola precisazione: non sono un programmatore di C navigato (lo uso solo da 1 annetto) per cui se ci sono errori grossolani segnalatemeli pure.

La libreria è in una versione iniziale per cui è da provare sulle "lunghe distanze". Per quel poco che ho potuto verificarla, pare funzionare. Se, dopo le vostre verifiche, la libreria è valida, la includo nel playground così che sia accessibile a tutti.

Introdotto dalla versione 0.8 il deltaT, una correzione per riallineare l'RTC all'ora reale. La funzione accetta un numero che rappresenta il numero di secondi al giorno da sommare o sottrare per correggere gli scostamenti tra il tempo misurato internamente e quelle effettivo.

Dalla versione 0.8.4 la libreria supporta i timestamp, sia con epoca 1900 che 1970 (UNIX) tramite le funzioni getTimestamp e setClockWithTimestamp, rispettivamente per avere un timestamp basato sull'orologio interno e per impostare l'orologio con un timestamp.

La versione 1.0 è la prima versione stabile e completa della libreria. Rispetto alla 0.8.4 è stata aggiunta una funzione per avere il giorno della settimana di uno specifico timestamp.

Dalla versione 1.2.0 è possibile usare il modulo Real-Time Counter integrato in alcune MCU. Basta aggiungere la seguente #define prima dell'inclusione della libreria:

Code: [Select]
#define USE_INTERNAL_RTC
#include "swRTC.h"

AGGIORNAMENTO:
la libreria è stata resa pubblica ed è stato aperto un thread sul forum internazionale:
http://arduino.cc/forum/index.php/topic,80489.0.html

EDIT:
documentazione completa in italiano può essere trovata qui:
http://www.leonardomiliani.com/?p=411

AGGIORNAMENTI:
la libreria funziona sia con l'IDE 1.0 che con le precedenti versioni 0022/0023;

- 1.0.2: contiene un primo fix per il problema dei timestamp calcolati su date successive al 29/02/2012;

- 1.0.3: supporto (tranne che per i micro Attiny) del clock a 4 MHz;

- 1.0.5: nuova funzione getWeekDay e supporto per gli Attiny4313; nuovo sketch di esempio;

- 1.0.6: sistemato un bug nel calcolo del timestamp;

- 1.1.0: setDeltaT ora lavora con gli interi; nuovo metodo getDeltaT;

- 1.1.1: sistemato un bug in setDeltaT;

- 1.1.2: getDelta restituisce il valore di deltaT con il giusto segno

- 1.2.0: ora la libreria supporta il modulo Real-Time Counter presente in alcune MCU

DOWNLOAD:
l'ultima versione è disponibile a questa pagina (http://www.leonardomiliani.com/2011/swrtc-un-orologio-in-tempo-reale-via-software/)
Title: Re: swRTC
Post by: pictux on Sep 26, 2011, 04:29 pm
Grazie Leo72 (e Lesto) per il contributo.
Ho proprio l'occasione di provarlo!


Title: Re: swRTC
Post by: reizel on Sep 26, 2011, 05:01 pm
mi associo con i ringraziamenti, ora da bravo impedito provo e vedo che riesco a fare :smiley-sweat:

ho ordinato dei ds1307 ma per molte delle applicazioni mi basterebbe avere le 24h, quindi sembra perfetta!!!!
Title: Re: swRTC
Post by: Federico_Vanzati on Sep 26, 2011, 05:31 pm
Quote
if (((year % 4) == 0) && ((year % 100) != 0) or ((year % 400) == 0))

funziona lo stesso, quindi figo...ma era voluto? ho visto che nel resto del codice avete usato le classiche || come operando or

Complimenti per l'uso dei timer (per me sono ancora un semi arabo) e anche per il supporto a diverse frequenze di clock  :)

l'unico peccato è che resettando Arduino si perde l'ora, altrimenti sarebbe un perfetto sostituto degli RTC!
Title: Re: swRTC
Post by: reizel on Sep 26, 2011, 05:35 pm
leo!!! dovevi farla 1 mese fa cosi' risparmiavo i soldi dei ds1307!!!  XD

e' perfetta per quello che mi serve, ovvero una mangiatoia per i pesci, a me basta che segni ore e minuti, ora devo solo integrare le accensioni alle ore che voglio e che capisca come inserire piu' allarmi a vari tempi ;)

Title: Re: swRTC
Post by: alexdb on Sep 26, 2011, 05:38 pm
complimenti! molto utile!!
Quote

Altri micro e frequenze saranno aggiunti in seguito.


per caso avete intenzione di fare anche quella per gli attiny85?   :D :D
Title: Re: swRTC
Post by: leo72 on Sep 26, 2011, 05:44 pm
@Federico:
no, effettivamente no.... e la cosa buffa è che non mi ha neanche segnalato l'errore il compilatore... boh..
Ora lo correggo.
PS sul reset:
purtroppo è una implementazione SW per cui ha i suoi limiti.


@reizel:
metti una serie di if e fai un controllo sulle ore e sui minuti.
Code: [Select]
if ((orarioHH1==rtc.getHours()) && (orario1MM==rtc.getSeconds()) { sfamaipesci(); }
if ((orarioHH2==rtc.getHours()) && (orario2MM==rtc.getSeconds()) { sfamaipesci(); }

ecc...

@alexdb:
vorrei per i tiny84/85, e magari mettere anche altre frequenze (4 e 20 MHz)

[EDIT]
ho rimesso online la versione con l'or "giusto (||)  ;)
Title: Re: swRTC
Post by: Federico_Vanzati on Sep 26, 2011, 05:50 pm
Quote
@Federico:
no, effettivamente no.... e la cosa buffa è che non mi ha neanche segnalato l'errore il compilatore... boh..


si, sono rimasto stupito anch'io...i tanti misteri del wiring  :smiley-yell:

Quote
PS sul reset:
purtroppo è una implementazione SW per cui ha i suoi limiti.


Si si, ne sono consapevole, però sono rimasto affascinato dall'uso dei timer e quindi da come risulta leggera la libreria  :D
Title: Re: swRTC
Post by: lestofante on Sep 26, 2011, 06:08 pm

Quote
@Federico:
no, effettivamente no.... e la cosa buffa è che non mi ha neanche segnalato l'errore il compilatore... boh..


si, sono rimasto stupito anch'io...i tanti misteri del wiring  :smiley-yell:

Quote
PS sul reset:
purtroppo è una implementazione SW per cui ha i suoi limiti.


Si si, ne sono consapevole, però sono rimasto affascinato dall'uso dei timer e quindi da come risulta leggera la libreria  :D

Quote
@Federico:
no, effettivamente no.... e la cosa buffa è che non mi ha neanche segnalato l'errore il compilatore... boh..


si, sono rimasto stupito anch'io...i tanti misteri del wiring  :smiley-yell:


secondo me sono stai DEFINEiti and or e not, per rendere il linguaggio più user-friendly (mai capitato di mettere una & o | sola?)

comunque io ho solo risolto un problemino di come far parlare la funzione di interrupt con la libreria, il resto è tutta farina del sacco di leo  :)



Complimenti per l'uso dei timer (per me sono ancora un semi arabo) e anche per il supporto a diverse frequenze di clock  :)

anche per me  :smiley-mr-green:


l'unico peccato è che resettando Arduino si perde l'ora, altrimenti sarebbe un perfetto sostituto degli RTC!

se si stratta solo di una mancanza di corrente/reset limitato, si potrebbe salvare l'ora in eeprom, ma con una scrittura al secondo non credo che abbia una lunga vita.
Title: Re: swRTC
Post by: menniti on Sep 26, 2011, 06:15 pm
Grande Leo  XD XD XD XD
Una sola curiosità: su qualche Topic lamentavi l'imprecisione dei timer, mi pare, a causa della nota imprecisione del quarzo esterno; questa libreria potrebbe essere associata all'uso del quarzo "orologi" da 32,768KHz?
Title: Re: swRTC
Post by: reizel on Sep 26, 2011, 06:21 pm
una prova terra terra per implementare un allarme
lcd 16x2
l'rtc parte alle 12:00:00
alle 12:01:00 accende un led
leo, sai che ti amerei se fossi una donna, o se tu fossi una donna, senti, segnatelo, nella prossima vita me la chiedi e io te la do, vorrei rinascere donna (anche se... lesbica...)... per dirti quanto apprezzo questo tuo lavoro!!!!!!!!!! :smiley-yell:

Code: [Select]
#include <swRTC.h>
swRTC rtc;
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int motordx = 9;
const int motorsx = 8;

void setup() {
   delay(2000);
   rtc.stopRTC();
   rtc.setTime(12,00,00);
   rtc.startRTC();

   lcd.begin(16, 2);
   
   pinMode(motordx, OUTPUT);      
   pinMode(motorsx, OUTPUT);
}

void loop() {
 lcd.setCursor(5, 0);
 lcd.print(rtc.getHours(), DEC);
 lcd.print(":");
 lcd.print(rtc.getMinutes(), DEC);
 lcd.print(":");
 lcd.print(rtc.getSeconds(), DEC);
 lcd.print("  ");
 if ((12==rtc.getHours()) && (1==rtc.getMinutes()) && (0==rtc.getSeconds())) {
 digitalWrite(motordx, HIGH);
 delay(5000);
 digitalWrite(motordx, LOW);
 delay(100);
 digitalWrite(motorsx, HIGH);
 delay(5000);
 digitalWrite(motorsx, LOW);
 }
 }
Title: Re: swRTC
Post by: leo72 on Sep 26, 2011, 06:29 pm
@lesto:
sei troppo buono. Tu sei una CIMA relativamente al C, mi sono accorto quanto io poco conosca questo linguaggio.
Per contro riesco a cavarmela perché con tanti anni di programmazione alle spalle, la logica per risolvere certi problemi ormai ce l'ho nel DNA  ;)

@Mike:
mi lamentavo dell'imprecisione dei contatori relativamente agli oscillatori interni. Ovviamente l'RTC software ha una certa precisione SOLO se si usa un quarzo esterno, anche per clock inferiori ai 16 MHz dell'Arduino. Parlando dell'Arduino, esso ha un oscillatore esterno al posto del quarzo che era presente sulla 2009. Forse quest'ultima scheda potrebbe avere una precisione maggiore rispetto alla UNO. Da verificare.

@reizel:
se io fossi nato donna, non sarei qui con voi ma a farla fruttare come si deve....  $) $)
Title: Re: swRTC
Post by: ratto93 on Sep 26, 2011, 06:37 pm
Leo....
Complimenti :)
la proverò non appena torno a casa :)
Title: Re: swRTC
Post by: menniti on Sep 26, 2011, 06:44 pm

@Mike:
mi lamentavo dell'imprecisione dei contatori relativamente agli oscillatori interni. Ovviamente l'RTC software ha una certa precisione SOLO se si usa un quarzo esterno, anche per clock inferiori ai 16 MHz dell'Arduino. Parlando dell'Arduino, esso ha un oscillatore esterno al posto del quarzo che era presente sulla 2009. Forse quest'ultima scheda potrebbe avere una precisione maggiore rispetto alla UNO. Da verificare.

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?

Quote

@reizel:
se io fossi nato donna, non sarei qui con voi ma a farla fruttare come si deve....  $) $)

finitela entrambi di fare le zoccole :smiley-mr-green:
@ reizel: finalmente è chiaro che quello sballonzolamento continuo è un tuo desiderio di trasformazione fisica, ho sentito che a Casablanca fanno miracoli, in ogni caso alla larga da me ]:D o almeno dalle mie spalle  :D
Title: Re: swRTC
Post by: leo72 on Sep 26, 2011, 06:54 pm
La libreria così com'è funziona con clock a 1/8/16 MHz. Come detto, è precisa se si usa un quarzo esterno. Quindi se la carichi su una Arduino, 2009 o UNO che sia (coi dubbi espressi per l'oscillatore esterno di quest'ultima) va senza problemi. Su un micro in standalone è meglio usare un quarzo esterno, anche se si sta usando il micro a bassa frequenza.
Title: Re: swRTC
Post by: lestofante on Sep 26, 2011, 07:02 pm

@lesto:
sei troppo buono. Tu sei una CIMA relativamente al C, mi sono accorto quanto io poco conosca questo linguaggio.
Per contro riesco a cavarmela perché con tanti anni di programmazione alle spalle, la logica per risolvere certi problemi ormai ce l'ho nel DNA  ;)


il trucco è che non è c, ma c++, insomma la tua non è una libreria ma una classe :)


La libreria così com'è funziona con clock a 1/8/16 MHz. Come detto, è precisa se si usa un quarzo esterno. Quindi se la carichi su una Arduino, 2009 o UNO che sia (coi dubbi espressi per l'oscillatore esterno di quest'ultima) va senza problemi. Su un micro in standalone è meglio usare un quarzo esterno, anche se si sta usando il micro a bassa frequenza.

la cosa più fica da fare, secondo me, sarebbe l'opzione per usare 2 pin a scelta come input per un quarzo esterno da 32,768KHz, però non so come funzionino...
Title: Re: swRTC
Post by: leo72 on Sep 26, 2011, 07:10 pm
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.
Title: Re: swRTC
Post by: duch on Sep 26, 2011, 11:39 pm
Fantastica soluzione, a quel paese il mio rtc hw!!!! :D
Title: Re: swRTC
Post by: reizel on Sep 26, 2011, 11:39 pm
azz, in 2 ore il topic e' andato a in seconda pagina! scrivo per riportarlo in alto visto che e' utilissimo.

allora ho fatto il codice della mia mangiatoia per pesci usando l' swrtc di leo, ora son segnati 9 allarmi che corrispondono a 9 pasti giornalieri

problema: vorrei poter decidere quanti pasti distribuire, ho un rotary switch binario da 0 a 9 collegato su A1-2-3-4 come posso integrare questo tipo di selezione nel codice? ovvero 1 pasto/giorno 2pasti/giorno ... 9 pasti/giorno   mi serve uno spunto, non so come fare...

Code: [Select]
#include <swRTC.h>
swRTC rtc;
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int motordx = 9;
const int motorsx = 8;
const int finecorsadx = 7;
const int finecorsasx = 6;
const int bit1 = A1;
const int bit2 = A2;
const int bit3 = A3;
const int bit4 = A4;
 int avvio = 0;
 int valavvio = 0;
 int valfinecorsadx = 0;
 int valfinecorsasx = 0;

void setup() {
   delay(2000);
   rtc.stopRTC();
   rtc.setTime(20,00,30);
   rtc.startRTC();

   lcd.begin(16, 2);
   
   pinMode(motordx, OUTPUT);      
   pinMode(motorsx, OUTPUT);
   
   pinMode(finecorsadx, INPUT);
   pinMode(finecorsasx, INPUT);
}

void loop() {
 lcd.setCursor(5, 0);
 lcd.print(rtc.getHours(), DEC);
 lcd.print(":");
 lcd.print(rtc.getMinutes(), DEC);
 lcd.print(":");
 lcd.print(rtc.getSeconds(), DEC);
 lcd.print("  ");
 
 if ((6==rtc.getHours()) && (30==rtc.getMinutes()) && (0==rtc.getSeconds())) {
   (avvio = 1);
   }  
 
 if ((8==rtc.getHours()) && (0==rtc.getMinutes()) && (0==rtc.getSeconds())) {
   (avvio = 1);
   }
 
 if ((9==rtc.getHours()) && (30==rtc.getMinutes()) && (0==rtc.getSeconds())) {
   (avvio = 1);
   }
 
 if ((11==rtc.getHours()) && (0==rtc.getMinutes()) && (0==rtc.getSeconds())) {
   (avvio = 1);
   }  
 
 if ((12==rtc.getHours()) && (30==rtc.getMinutes()) && (0==rtc.getSeconds())) {
   (avvio = 1);
   }
 
 if ((14==rtc.getHours()) && (0==rtc.getMinutes()) && (0==rtc.getSeconds())) {
   (avvio = 1);
   }
   
 if ((15==rtc.getHours()) && (30==rtc.getMinutes()) && (0==rtc.getSeconds())) {
   (avvio = 1);
   }  
 
 if ((17==rtc.getHours()) && (0==rtc.getMinutes()) && (0==rtc.getSeconds())) {
   (avvio = 1);
   }
 
 if ((18==rtc.getHours()) && (30==rtc.getMinutes()) && (0==rtc.getSeconds())) {
   (avvio = 1);
   }  
   
   valavvio = avvio;
   
   if (valavvio == 1){
   avvio = 0;
   digitalWrite(motordx, HIGH);
   }

   valfinecorsadx = digitalRead(finecorsadx);
   
   if (valfinecorsadx == HIGH){
   digitalWrite(motordx, LOW);
   delay(50);
   digitalWrite(motorsx, HIGH);
   }
   
   valfinecorsasx = digitalRead(finecorsasx);
   
   if (valfinecorsasx == HIGH){
   digitalWrite(motorsx, LOW);
   }
}

Title: Re: swRTC
Post by: leo72 on Sep 26, 2011, 11:55 pm
Spiega per bene.
Vuoi scegliere quanti pasti distribuire durante il giorno?

Beh, non è difficile. Prepari un array di 9 celle in cui metti l'orario della distribuzione dei 9 pasti e poi scegli la distribuzione dei pasti con l'encoder a rotazione.

Magari avrai:
orariPasti = {6, 8, 10, 12, 14, 16, 18, 20, 22} (è un esempio)
1 solo pasto: orariPasti[3] (le 12)
2 pasti: orariPasti[2] e orariPasti[5] (10 e 16)
3 pasti: (10, 16, 20 )
ecc...
Title: Re: swRTC
Post by: reizel on Sep 27, 2011, 12:47 am
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 =(
Title: Re: swRTC
Post by: leo72 on Sep 27, 2011, 12:49 am
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.
Title: Re: swRTC
Post by: reizel on Sep 27, 2011, 01:51 am

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 :smiley-sweat:
Title: Re: swRTC
Post by: menniti on Sep 27, 2011, 10:42 am

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 =( =(
Title: Re: swRTC
Post by: leo72 on Sep 27, 2011, 10:48 am
Michele Michele...  :D
Ti avevo già risposto.

Tu chiedi:
Quote
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:
Quote
La libreria così com'è funziona con clock a 1/8/16 MHz. Come detto, è precisa se si usa un quarzo esterno.

Title: Re: swRTC
Post by: menniti on Sep 27, 2011, 11:01 am
Sì, sì, l'ho capito dopo aver premuto il clic del mouse :smiley-red:
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.
Title: Re: swRTC
Post by: leo72 on Sep 27, 2011, 12:57 pm
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.
Title: Re: swRTC
Post by: lestofante on Sep 27, 2011, 01:54 pm
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.
Title: Re: swRTC
Post by: leo72 on Sep 27, 2011, 02:24 pm
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
Title: Re: swRTC
Post by: menniti on Sep 27, 2011, 02:37 pm

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

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? :smiley-sad-blue:
Title: Re: swRTC
Post by: leo72 on Sep 27, 2011, 04:08 pm
]:D
Title: Re: swRTC
Post by: FEDERICO on Sep 27, 2011, 10:24 pm
Da provare...
Scusa perche' forse mi sono perso un po' nei post: sacrifico PWM 10 e 11 e ottengo un RTC preciso?
Title: Re: swRTC
Post by: leo72 on Sep 27, 2011, 10:28 pm
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.
Title: Re: swRTC
Post by: FEDERICO on Sep 27, 2011, 11:09 pm
Hai avuto occasione di testare su 2009 e diecimila?
Title: Re: swRTC
Post by: leo72 on Sep 27, 2011, 11:31 pm
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:
Code: [Select]
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):
Code: [Select]
void init(void)
{
  // this needs to be called before setup() or some functions won't work there
  sei();


Bah... indagherò un altro po'.
Title: Re: swRTC
Post by: FEDERICO on Sep 27, 2011, 11:35 pm
Ho la diecimila e la 2009 (ma non ho la UNO) dovrei testarlo...
Title: Re: swRTC
Post by: leo72 on Sep 27, 2011, 11:49 pm
Se potessi verificarlo te ne  sarei grato.
Title: Re: swRTC
Post by: FEDERICO on Sep 27, 2011, 11:57 pm

Se potessi verificarlo te ne  sarei grato.

Dovrei proprio farlo, anche per smettere di farmi deprimere dal multicoso, come forse sai  :|
Title: Re: swRTC
Post by: reizel on Sep 28, 2011, 12:27 am
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
Title: Re: swRTC
Post by: testato on Sep 28, 2011, 12:32 am
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
Title: Re: swRTC
Post by: reizel on Sep 28, 2011, 12:54 am


- anche io devo usarla sugli 8A


io ho provato ma credo ci siano differenze tra un 8A e un 328P che solo un astrobeed riuscirebbe a spiegare :)

io per il futuro mi prendo 328 e basta, l'euro e mezzo risparmiato per un 8A non vale i maggiori problemi

forse c'e' un ritardo sul giorno ma a me non interessa, a me servono le 24h e se vedo che stara troppo gli do un reset al momento giusto e son apposto ]:)
Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 01:00 am
Gli Atmega8 sono diversi dagli Atmega 48/88/168/328. Per ora non sono supportati. Cambiano i registri interni e va adattata la libreria. Non è un grosso problema. Però ora stavo lavorando sui Tiny85, questi sì che sono difficili...

PS:
i 20 MHz, come i 12 MHz, hanno il problema che non sono potenze di 2 come i clock a 1, 4, 8, 16. Per cui il contatore dovrebbe essere inizializzato con un valore decimale affinché torni il calcolo di 1000 colpi di clock = 1 secondo. Ma ovviamente non si può fare perché il contatore accetta solo valori da 0 a 255. Stavo studiando il modo di inserire una correzione affinché i conti tornassero.

Code: [Select]
in modalità sleep, michele, il micro continua ad andare a 16mhz, altrimenti sbaglierebbe l'orario ?
il clock è asincrono, cioè quello che incrementa il timer è slegato da quello della CPU per cui se metti in una delle modalità che ho illustrato che tengono il timer2 attivo, anche se la CPU si ferma l'orologio (dovrebbe) continua(re) ad andare (ancora da verificare, ma oggi sono stato fuori casa quasi tutto il giorno per cui non ho potuto fare molte prove).
Title: Re: swRTC
Post by: lestofante on Sep 28, 2011, 01:07 am

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)


prova a scrivere l'equivalente in assembly


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


i registri dell'atmega8 NON corrispondono con quelli del 128 e 328, se non erro ci sono dei documenti che spiegavano come passare dell'8 al 128: non devi fare altro che seguirli al contrario. O cercare i registri equivalenti a partire dal datasheet

Quote
i 20 MHz, come i 12 MHz, hanno il problema che non sono potenze di 2 come i clock a 1, 4, 8, 16. Per cui il contatore dovrebbe essere inizializzato con un valore decimale affinché torni il calcolo di 1000 colpi di clock = 1 secondo. Ma ovviamente non si può fare perché il contatore accetta solo valori da 0 a 255. Stavo studiando il modo di inserire una correzione affinché i conti tornassero.

se usi i secondi come float (o meglio ancora metti in piedi un sistema a virgola fissa che non perde precisione) ce la puoi fare.
direi che una variabile conta i clock, sapendo che non equivalgono al secondo, ma che ogni X valori equivalgono a Y secondi. Quindi i secondi sono approssimati in base a X, e si "riaggiustano" ogni Y. In questo modo hai dei valori sbagliati rispetto all'ora attuale(di microsecondi), ma l'errore non si accumula col tempo
Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 10:08 am
Intanto ho segnalato il bug del TIMER1_OVF perché secondo me c'è qualcosa che non va nel core Tiny.
http://code.google.com/p/arduino-tiny/issues/detail?id=18

Oggi vedo di integrare gli Atmega8.

@lesto:
sì, penso di inserire una compensazione, un po' come il 29° giorno degli anni bisestili per compensare la differenza fra l'anno solare di 365,25 giorni e quello civile di 365 giorni, che comporta l'aggiunta di 1 giorno ogni 4 anni (0,25*4=1)
Title: Re: swRTC
Post by: reizel on Sep 28, 2011, 11:33 am
leo, quando integri gli atmega8 poi provo io la libreria caricandola su un 8a ^_^

Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 11:45 am
Ecco la versione 0.2.

Novità:


A causa del presunto bug nel Tiny core, sugli Attinyx5 ho dovuto utilizzare il timer 0 al posto del secondo timer. Questo significa la perdita delle funzioni temporali di Arduino delay() e millis(). Per ovviare a questo problema, ho introdotto (solo per gli Attinyx5) una nuova funzione, milliseconds(), che restituisce il numero di millisecondi dall'avvio dell'RTC. Ci sono alcune differenze rispetto a millis() di Arduino:


Chiedo a chi ha l'Atmega8A (reizel) di testare la lib e di dirmi cosa c'è che non va.

PS:
aggiunto un secondo sketch di esempio per provare la funzione milliseconds() sugli Attiny
Title: Re: swRTC
Post by: reizel on Sep 28, 2011, 12:12 pm
leo ho caricato lo sketch con la nuova libreria su un at8a, sai, avevo messo un lcd 16x2 per leggere l'ora, il caricamento e' tutto ok, quindi mi appare l'ora ma non avanzano i secondi, rimane fisso a 12:0:0 che e' l'ora di partenza nello sketch, per qualsiasi prova lascio tutto montato (il mio e' un at8a con fuse per 1MHz)
Title: Re: swRTC
Post by: testato on Sep 28, 2011, 12:43 pm
Anche io ho solo 8A a disposizione, appena posso faccio le prove.
Dopo approfondiamo i test sui mA assorbiti in sleep, su 8A e 328P
Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 02:18 pm
@reizel:
ricontrollo.

Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 02:49 pm
Prova sostituendo i file allegati a quelli della cartella /swRTC e poi fammi sapere. Forse mi ero dimenticato di attivare il supporto per gli Atmega8 nella funzione startRTC.

EDIT: questi sono buoni
Title: Re: swRTC
Post by: reizel on Sep 28, 2011, 03:07 pm
C:\Users\reizel\Downloads\arduino-0022\libraries\swRTC\swRTC.cpp:107:15: error: missing expression between '(' and ')'
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:223: 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:234: error: 'TIMSK2' was not declared in this scope

ho sostituito quei 2 file e ora ho questo errore
Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 03:11 pm
Mi passi per favore il profilo per l'Atmega8 che hai nel file boards.txt?
Io sto andando a "naso" per le prove  :P


Trovato.
Title: Re: swRTC
Post by: reizel on Sep 28, 2011, 03:21 pm
Code: [Select]
##############################################################
atmega.name=Atmega8A standalone (w/ Arduino as ISP) 1MHz
atmega.upload.protocol=stk500
atmega.upload.maximum_size=8192
atmega.upload.speed=19200
atmega.upload.using=arduino:arduinoisp
atmega.bootloader.low_fuses=0xe1
atmega.bootloader.high_fuses=0xdf
atmega.bootloader.path=atmega
atmega.bootloader.file=ATmegaBOOT.hex
atmega.bootloader.unlock_bits=0x3F
atmega.bootloader.lock_bits=0x0F
atmega.build.mcu=atmega8
atmega.build.f_cpu=1000000L
atmega.build.core=arduino


e' quello che mi avete fatto mettere in riferimento a questa discussione http://arduino.cc/forum/index.php/topic,68232.msg502769.html#msg502769 (http://arduino.cc/forum/index.php/topic,68232.msg502769.html#msg502769)
su come usare gli atmega8a

ho caricat il blink e funziona correttamente, con il tempo giusto di 1 sec
Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 03:27 pm
OK. Prova ora con questo .cpp. A me non da errori di compilazione adesso. Va solo testato.
Title: Re: swRTC
Post by: gioscarab on Sep 28, 2011, 03:45 pm
Ciao Leo, davvero complimenti. Che bel lavoro  :smiley-mr-green:
Non mi ricordo ma ho letto da qualche parte che ogni tot giorni cmq c'è un riavvio dei timers e quindi perdita dei dati per gli MCU ATtiny e ATmega, è vero?
Title: Re: swRTC
Post by: reizel on Sep 28, 2011, 03:48 pm
ora e' tutto perfetto, caricato sull'8a e messo in standalone col tuo swRTC

ottimo lavoro! ^_^
Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 03:54 pm

Ciao Leo, davvero complimenti. Che bel lavoro  :smiley-mr-green:
Non mi ricordo ma ho letto da qualche parte che ogni tot giorni cmq c'è un riavvio dei timers e quindi perdita dei dati per gli MCU ATtiny e ATmega, è vero?


Il discorso vale con determinati codici usando la normale funzione millis() di Arduino. Ma la mia libreria è esente da questo bug.

@reizel:
sono contento. Adesso sto lavorando sui Tiny84 ma anche qui è duretta.... hanno 2 timer come i Tiny85 ma diversi da quelli di quest'ultimo.... bast....  :smiley-roll-blue:
Title: Re: swRTC
Post by: testato on Sep 28, 2011, 04:03 pm

Ciao Leo, davvero complimenti. Che bel lavoro  :smiley-mr-green:
Non mi ricordo ma ho letto da qualche parte che ogni tot giorni cmq c'è un riavvio dei timers e quindi perdita dei dati per gli MCU ATtiny e ATmega, è vero?

Il problema non e' sui timers, e nemmeno nella libreria di leo, ne' tantomeno nella funzione millis() stessa, ma sulla variabile che va a contenere i millisecondi, non essendo infinita prima o poi va in overflow.
Usando una unsigned long si arriva a 49 giorni.
Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 04:17 pm
RIbadisco che la mia libreria non ha questo bug dato che funziona come un RTC hardware, aggiornando i registri in maniera tale e quale ad un DS1307 per capirsi.

PS:
ad esser sinceri, anche la swRTC soffre di overflow. Il registro degli anni andrà in overflow nel 16383....  :smiley-yell: :smiley-yell:
Title: Re: swRTC
Post by: lestofante on Sep 28, 2011, 04:26 pm
Quote
Il registro degli anni andrà in overflow nel 16383


lo chiameranno l'epoc bug :)
Title: Re: swRTC
Post by: reizel on Sep 28, 2011, 04:26 pm
provando questo swRTC su un atmega8a standalone (quindi senza quarzi esterni) vedo che perde oltre 30 secondi in 20 minuti, insomma oltre 30 minuti al giorno, quindi direi che serve che l'atmega abbia un quarzo esterno e mai quello interno.

io lo usero' con il classico quarzo da 16MHz che lo rende preciso :.
Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 04:44 pm
Se si vuole una precisione accurata, il quarzo è INDISPENSABILE.
L'oscillatore interno può "sbarellare" anche del 10%.
Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 06:42 pm
Oggi ho lavorato un po' alla libreria. Ho integrato il supporto ai Tinyx4 (24/44/84), all'Atmega644 ed agli Atmega640/1280/2560 (quelli delle Arduino MEGA/MEGA2560 per intendersi).

Stasera faccio delle verifiche e poi pubblico la lib aggiornata.
Title: Re: swRTC
Post by: menniti on Sep 28, 2011, 08:04 pm
Leo, ormai ci sei: attiny_x313, attiny_x61, attiny_x8, così facciamo un lavoro parallelo  ;)
Poi te li testo io, anche se il 2313 penso lo usino diversi utenti.
Chiedo troppo  :smiley-red:?
Title: Re: swRTC
Post by: lestofante on Sep 28, 2011, 09:29 pm
direi che se i test sono positivi, ma testa almeno sulle 24H, poi mettere il tutto su GIT e metterla tra la raccolta di librerie!
Title: Re: swRTC
Post by: gioscarab on Sep 28, 2011, 09:50 pm
Ragazzi il clock interno di fabbrica è regolato con una precisione dichiarata del 10%, la AVR dichiara che si puo' arrivare a 1% regolandolo. Per regolarlo basta cronometrare un'azione fatta dal micro da regolare e poi di conseguenza ritarare fino al risultato desiderato. Il che potrebbe ridurre drasticamente i minuti persi a 3 / 5.
Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 10:08 pm
@gbm:
sì, l'oscillatore interno è una ciofeca.

L'oscillatore interno può "sbarellare" anche del 10%.


Per questo è consigliabile l'uso di un quarzo esterno.

Finiti i micro, penso di dedicarmi all'implementazione del supporto per il quarzo da orologio (32768 Hz).
Title: Re: swRTC
Post by: leo72 on Sep 28, 2011, 10:19 pm

Leo, ormai ci sei: attiny_x313, attiny_x61, attiny_x8, così facciamo un lavoro parallelo  ;)
Poi te li testo io, anche se il 2313 penso lo usino diversi utenti.
Chiedo troppo  :smiley-red:?


Sono diversi datasheet da studiare  :smiley-sweat:
Ci provo.
Title: Re: swRTC
Post by: menniti on Sep 28, 2011, 10:23 pm


Leo, ormai ci sei: attiny_x313, attiny_x61, attiny_x8, così facciamo un lavoro parallelo  ;)
Poi te li testo io, anche se il 2313 penso lo usino diversi utenti.
Chiedo troppo  :smiley-red:?


Sono diversi datasheet da studiare  :smiley-sweat:
Ci provo.

tnx XD
Title: Re: swRTC
Post by: leo72 on Sep 29, 2011, 12:23 am
Ecco la versione 0.4.
Sono stati inseriti gli Attinyx4, l'Atmega644 e gli Atmega1280/2560 (quelli delle Arduino MEGA).

Come al solito, chiedo dei test e dei risconti.
Title: Re: swRTC
Post by: menniti on Sep 29, 2011, 12:29 am

Ecco la versione 0.4.
Sono stati inseriti gli Attinyx4, l'Atmega644 e gli Atmega1280/2560 (quelli delle Arduino MEGA).

Come al solito, chiedo dei test e dei risconti.

Beh, mi pare giusto che la festeggi con 4000 post ;) ultimamente posso testimoniare che gli spam hanno lasciato il posto a tanti interventi utili ed a condivisioni di sperimentazione che ti fanno molto onore. ALTRI MILIONI DI QUESTI POST, AUGURI! XD XD
Title: Re: swRTC
Post by: leo72 on Sep 29, 2011, 12:40 am
Ancora non ci sono, a 4000... ma mi sento come se 3 o 4 post un po' meno seri, prima di andare a letto, posso anche scriverli   ;)
Title: Re: swRTC
Post by: leo72 on Sep 29, 2011, 10:38 am
Versione 0.5 della libreria.
Corretti alcuni bug sulla compilazione per i Mega644.
Ancora da verificare i Tiny84 ed i Mega640/1280/2560: qualcuno ha la Mega per provare?
Title: Re: swRTC
Post by: leo72 on Sep 29, 2011, 11:38 am
Aggiornamento.
La libreria sui Tiny84 sembra non funzionare. Gradirei un feedback da qualcuno che la può provare su questi micro.
A me swRTCled non fa lampeggiare nulla: il led resta fisso acceso.
Title: Re: swRTC
Post by: leo72 on Sep 29, 2011, 11:45 pm
Up.
Mi servono conferme sul problema con i Tiny84.... se qualcuno che ce li ha potesse provare lo sketch swRTCled, gliene sarei grato.

PS:
e se qualcuno vuole provarla anche su una Mega...  :*
Title: Re: swRTC
Post by: menniti on Sep 29, 2011, 11:49 pm
Leo, me lo prendo io l'incarico, ma devi avere alcuni giorni di pazienza, sono alle prese con alcuni lavori da chiudere ed inoltre ormai sono in piena attività lavorativa; se poi ti metti a preparare anche gli altri prometto che mi chiudo un pomeriggio libero e li provo tutti!
Title: Re: swRTC
Post by: leo72 on Sep 30, 2011, 11:01 am
Nuova versione 0.6 della libreria con il supporto preliminare per gli Attiny2313.
Per far funzionare correttamente la libreria bisogna eseguire una piccola modifica al file build_core_options.h contenuto in /hardware/tiny/core/tiny. Bisogna cambiare il valore della riga n°45 da 0 ad 1, in modo da spostare millis sul timer 1: in questo modo non si perdono le funzionalità di delay.

Altra nota, ho scoperto, spulciando le librerie del core Tiny, che sui Tinyx5 la millis è sul timer 1 per cui la swRTC può coesistere su questi micro senza problemi né la necessità di usare rtc.milliseconds come sostituito di millis.

Al momento NON funziona ancora il supporto ai Tinyx4, e non capisco perché. Ciò vale sia usando il timer 0 (8 bit) che il timer 1 (16 bit). Ho scritto agli sviluppatori del core Tiny, aspetto risposta.

Ah, piccola nota dolente per Michele:
NON ho introdotto il supporto ai Tiny861 e Tiny48/88 perché il core Tiny non li supporta né ho trovato in giro delle librerie di supporto. Mi dispiace ma al momento restano fuori (ecco perché tempo fa, quando avevo scoperto i Tiny861, poi non li avevo comprati... un motivo c'era  :smiley-sweat: ).
Title: Re: swRTC
Post by: menniti on Sep 30, 2011, 12:34 pm
:(
Title: Re: swRTC
Post by: leo72 on Oct 01, 2011, 10:41 am
Versione 0.7 della libreria:

* corretto il problema sugli Attinyx4: adesso funziona tutto correttamente
* sistemato il problema di delay/millis sui core Tiny. Adesso la lib swRTC e le funzioni temporali di Arduino (delay/millis/delaymicroseconds) possono coesistere

Allegato alla libreria trovato un file denominato build_core_options.h che dovete sostituire a quello presente in /hardware/tiny/cores/tiny/ affinché la swRTC possa compilare correttamente sugli Attinyx4 e le funzioni temporali di Arduino possano continuare a funzionare su tutti i core Tiny.

RICHIESTA:
ho bisogno di feedback per i Tiny2313 e gli Atmega1280/2560.
Title: Re: swRTC
Post by: testato on Oct 01, 2011, 12:50 pm
peccato non ne abbia, altrimenti iniziavo a scalare i tuoi crediti di Test  :)

pero' appena riprendo in mano il mio progetto nixie prometto test sugli Atmega8A standalone con Optifix lasciato a bordo
Title: Re: swRTC
Post by: ratto93 on Oct 01, 2011, 03:10 pm
ATmega 1280:
In file included from swRTCtest.cpp:1:
C:\Documents and Settings\Ratto\Desktop\ArduOpen_023BB3\ArduOpen_023BB3\libraries\swRTC/swRTC.h:19:2: error: #error Microcontroller not supported

Ora provo con l'ide ufficiale....
Title: Re: swRTC
Post by: leo72 on Oct 01, 2011, 03:14 pm
Uhm.. non vorrei fosse un errore sul riconoscimento dei micro. Ora controllo anch'io.
Title: Re: swRTC
Post by: ratto93 on Oct 01, 2011, 03:18 pm
Stessa cosa.... con l'IDE ufficiale la 0022
Title: Re: swRTC
Post by: leo72 on Oct 01, 2011, 03:21 pm
C'era un file con un piccolo errore.
Usa il file allegato al posto di quello dell'archivio precedente.
Title: Re: swRTC
Post by: leo72 on Oct 01, 2011, 10:45 pm
@ratto:
sì, ma poi? funziona tutto?
Title: Re: swRTC
Post by: ratto93 on Oct 01, 2011, 11:05 pm
Ho un problema mi è andato in bomba l'IDE (Maledetta deframmentazione....)  =(
Domani riscarico tutto l'IDE e riprovo....
mi da un errore assurdo.. non so che dire O.o
Code: [Select]
avrdude: Can't find programmer id "arduino"

Valid programmers are:
  dasa3    = serial port banging, reset=!dtr sck=rts mosi=txd miso=cts [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:776]
  dasa     = serial port banging, reset=rts sck=dtr mosi=txd miso=cts [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:763]
  siprog   = Lancos SI-Prog <http://www.lancos.com/siprogsch.html> [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:750]
  ponyser  = design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:737]
  frank-stk200 = Frank STK200                   [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:702]
  blaster  = Altera ByteBlaster             [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:689]
  ere-isp-avr = ERE ISP-AVR <http://www.ere.co.th/download/sch050713.pdf> [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:679]
  atisp    = AT-ISP V1.1 programming cable for AVR-SDK1 from <http://micro-research.co.th/>  [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:669]
  dapa     = Direct AVR Parallel Access cable [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:658]
  xil      = Xilinx JTAG cable              [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:645]
  futurlec = Futurlec.com programming cable. [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:628]
  abcmini  = ABCmini Board, aka Dick Smith HOTCHIP [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:618]
  picoweb  = Picoweb Programming Cable, http://www.picoweb.net/ [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:608]
  sp12     = Steve Bolt's Programmer        [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:597]
  alf      = Nightshade ALF-PgmAVR, http://nightshade.homeip.net/ [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:581]
  bascom   = Bascom SAMPLE programming cable [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:571]
  dt006    = Dontronics DT006               [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:561]
  pony-stk200 = Pony Prog STK200               [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:549]
  stk200   = STK200                         [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:533]
  bsd      = Brian Dean's Programmer, http://www.bsdhome.com/avrdude/ [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:522]
  pavr     = Jason Kyle's pAVR Serial Programmer [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:514]
  dragon_dw = Atmel AVR Dragon in debugWire mode [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:507]
  dragon_hvsp = Atmel AVR Dragon in HVSP mode  [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:499]
  dragon_pp = Atmel AVR Dragon in PP mode    [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:491]
  dragon_isp = Atmel AVR Dragon in ISP mode   [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:483]
  dragon_jtag = Atmel AVR Dragon in JTAG mode  [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:475]
  jtag2dw  = Atmel JTAG ICE mkII in debugWire mode [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:467]
  jtag2isp = Atmel JTAG ICE mkII in ISP mode [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:459]
  jtag2    = Atmel JTAG ICE mkII            [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:451]
  jtag2fast = Atmel JTAG ICE mkII            [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:443]
  jtag2slow = Atmel JTAG ICE mkII            [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:435]
  jtagmkII = Atmel JTAG ICE mkII            [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:427]
  jtag1slow = Atmel JTAG ICE (mkI)           [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:420]
  jtag1    = Atmel JTAG ICE (mkI)           [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:412]
  jtagmkI  = Atmel JTAG ICE (mkI)           [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:404]
  avr911   = Atmel AppNote AVR911 AVROSP    [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:398]
  avr109   = Atmel AppNote AVR109 Boot Loader [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:392]
  butterfly = Atmel Butterfly Development Board [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:386]
  usbtiny  = USBtiny simple USB programmer  [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:380]
  usbasp   = USBasp, http://www.fischl.de/usbasp/ [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:374]
  avr910   = Atmel Low Cost Serial Programmer [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:368]
  stk500hvsp = Atmel STK500 V2 in high-voltage serial programming mode [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:362]
  stk500pp = Atmel STK500 V2 in parallel programming mode [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:356]
  stk500v2 = Atmel STK500 Version 2.x firmware [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:350]
  stk500v1 = Atmel STK500 Version 1.x firmware [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:344]
  stk500   = Atmel STK500                   [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:338]
  avrisp2  = Atmel AVR ISP mkII             [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:328]
  avrispmkII = Atmel AVR ISP mkII             [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:322]
  avrispv2 = Atmel AVR ISP V2               [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:316]
  avrisp   = Atmel AVR ISP                  [J:\arduino-0022\hardware/tools/avr/etc/avrdude.conf:310]
Title: Re: swRTC
Post by: ratto93 on Oct 01, 2011, 11:09 pm
Edit ho trovato la vecchia 0021 e qui non da errori un attimo e provo....
Title: Re: swRTC
Post by: ratto93 on Oct 01, 2011, 11:27 pm
swRTC FUNZIONA su Seeeduino Mega e quindi anche nell'arduino Mega 1280 del quale condivide il parte del bootloader
XD XD
Domani se riesco provo a tenerlo acceso per una decina di ore di seguito e vediamo se sballa o no.....
Title: Re: swRTC
Post by: leo72 on Oct 01, 2011, 11:30 pm
Se la scheda non ha un quarzo vero e proprio lo sbarellamento è garantito  ;)
Title: Re: swRTC
Post by: ratto93 on Oct 01, 2011, 11:33 pm
Intendi il quarzo da 16Mhz del micro o quello da 32.786khz ? su che pin bisogna applicarlo ?  :smiley-mr-green:
Title: Re: swRTC
Post by: leo72 on Oct 01, 2011, 11:40 pm
Lascia stare il quarzo da 32768.  ;)
Intendo un quarzo che si chiami quarzo, non un risonatore come quello dell'Arduino UNO.
Title: Re: swRTC
Post by: ratto93 on Oct 02, 2011, 08:51 am
Eh sul seeeduino cè un affare che potrebbe essere un quarzo smdo o anche un risuonatore non lo so non ne ho mai visti di simili :)
Title: Re: swRTC
Post by: leo72 on Oct 02, 2011, 09:09 am
Ma intendi quello che si vede in questa foto:
http://www.seeedstudio.com/depot/seeeduino-v221-atmega-328p-p-669.html
Quello è un cristallo, va bene. Oppure quel cosino SMD che ha la UNO? Quest'ultimo è un risonatore e non va bene.
Title: Re: swRTC
Post by: ratto93 on Oct 02, 2011, 09:17 am
No no è totalmente diverso... guarda qui....
http://www.seeedstudio.com/depot/seeeduino-mega-p-717.html?cPath=132_133

è quel cosino bianco davanti il micro anche se il mio cè l'ha da un altra parte  :smiley-roll:
Title: Re: swRTC
Post by: leo72 on Oct 02, 2011, 09:39 am
E' un cristallo SMD.
Quindi va bene.
Title: Re: swRTC
Post by: reizel on Oct 03, 2011, 12:46 am
domanda generica sul codice di un RTC sw o hw che sia

diciamo che predispongo 2 tastini low che mando high quando li premo, come si integra una funzione "aumenta di 1 secondo l'ora attuale" o "diminuisci di un secondo l'ora attuale" ?


altra domanda, gli oscillatori, quelli con 4 piedini, son + precisi dei quarzi? si potrebbero usare invece del quarzo da 16MHz?
Title: Re: swRTC
Post by: lestofante on Oct 03, 2011, 01:29 am

domanda generica sul codice di un RTC sw o hw che sia

diciamo che predispongo 2 tastini low che mando high quando li premo, come si integra una funzione "aumenta di 1 secondo l'ora attuale" o "diminuisci di un secondo l'ora attuale" ?

Code: [Select]
rtc.setTime(rtc.getHours(), rtc.getMinutes(), rtc.getSeconds() + 1);
ma ci potevi arrivare tranquillamente da solo


altra domanda, gli oscillatori, quelli con 4 piedini, son + precisi dei quarzi? si potrebbero usare invece del quarzo da 16MHz?

no! i quarzi son più precisi, ma nulla ti vieta di usare gli oscillatori

da http://it.wikipedia.org/wiki/Oscillatore:
Quote
Oscillatori quarzati: quest'ultima categoria di oscillatori fa uso di un cristallo di quarzo piezoelettrico il cui comportamento viene portato ad essere assimilabile a quello di un circuito LC. Tali oscillatori hanno spiccate qualità di stabilità in frequenza e di stabilità alla temperatura date dalle ottime qualità di oscillatore meccanico proprie dei cristalli piezoelettrici di quarzo. Il più noto è l'oscillatore di Pierce.
Title: Re: swRTC
Post by: reizel on Oct 03, 2011, 01:38 am

Code: [Select]
rtc.setTime(rtc.getHours(), rtc.getMinutes(), rtc.getSeconds() + 1);
ma ci potevi arrivare tranquillamente da solo

grazie, domani lo integro nel mio codice ;)
ci sarei potuto arrivare... ma hai visto il mio avatar? e' un Minion e non brillano certo per intelligenza, altrimenti mettevo un pinguino che programma al pc se c'arrivavo da solo :D
Title: Re: swRTC
Post by: leo72 on Oct 03, 2011, 06:35 am
@reizel:
non confondiamo gli avatar, il pinguino programmatore è mio  XD

PS:
attenzione che mandare avanti o indietro i secondi senza un controllo porta ad uscire dal range di valori accettabili (0-59) col rischio che la funzione restituisca  un bel FALSE perché ha ricevuto in input valori non legali.
Andrebbe controllato se vai fuori di tale range ma con tutta una serie di controlli a catena per verificare gli altri valori.

Mi spiego.
Mettiamo che l'orario sia 12:34:29
Togliendo un secondo, non succede nulla di grave: passi a 12:34:28
Se però l'orario è 12:34:00, cosa fai? Se non intervenieni con un controllo, i secondi diventano 254 perché io uso un byte e se ad byte con valore 0 togli 1 vai a 254 (255-1) mi pare. Oppure scali anche i minuti? Quindi 12:33:59?

Ma se tale operazione, per tuo masochismo la vuoi fare alle 00:00:00 del 1° gennaio?
Avresti 00:00:254 (perché essendo valori byte, 0-1=(255-1)=254
Allora dovresti mettere i secondi a 59 e scalare di 1 anche i minuti... ma avresti i minuti a 254. Allora dovresti mettere i minuti a 59 e scalare di 1 l'ora... Stessa cosa: 254 che devono diventare 23 e scalare di 1 i giorni. Ma sei al 1°, quindi il giorno diventa 0. Allora devi scalare di 1 il mese e mettere come giorno l'ultimo giorno del mese... ma sei a gennaio, quindi 1-1=0. Allora devi andare a dicembre (12), mettere 31 come giorno e scalare di 1 l'anno!

Ecco cosa succede a scalare di 1 secondo!  XD
Title: Re: swRTC
Post by: reizel on Oct 03, 2011, 11:42 am
ovvio che il pinguino programmatore e' tuo! io ho il beota dallo sguardo beota, infatti non so programmare...

azz, e io volevo togliere solo un secondo se serviva... torno alla mia prima scelta, ovvero dare un reset alle 12.00.00 ogni tanto, cosi' da far ripartire l'orologio alle 12.00

tanto l'rtc va su una mangiatoia e devo comunque controllare che ci sia mangime nel contenitore ogni tot giorni

(sto facendo questa cavolo di mangiatoia per i pesci, all'inizio avevo motoriduttore con motorino in continua e finecorsa, tutto andava "teoricamente" ma mi si creavano disturbi tanto forti da resettare o freezare il micro, alla fine ho ripiegato su un miniservo, ma rimane il sistema "meccanico" prendicibo/versacibo che non mi fa dormire la notte, tante idee ma mancano strumenti e materiali per realizzarle... finisce che faccio un accrocchio... )
Title: Re: swRTC
Post by: menniti on Oct 03, 2011, 12:01 pm
mangiati i pesci e risolvi alla fonte, se hai dubbi etici chiedi a Leo, che quanto a mangiare animali ha una teoria piuttosto esplicita. :smiley-yell:
Title: Re: swRTC
Post by: leo72 on Oct 03, 2011, 12:08 pm
Se si muove, vuol dire che si può mangiare  :smiley-yell:
Title: Re: swRTC
Post by: astrobeed on Oct 03, 2011, 12:11 pm

Se si muove, vuol dire che si può mangiare  :smiley-yell:


Pure se è brutto, peloso e con tante zampe ?
Title: Re: swRTC
Post by: menniti on Oct 03, 2011, 12:15 pm
Bleah, Astrobeed, hai rovinato la poesia di un momento, pensa che stavo immaginando Leo antropofago :smiley-eek-blue:
Title: Re: swRTC
Post by: leo72 on Oct 03, 2011, 12:15 pm
In alcuni paesi mangiano anche gli insetti, non credo che una persona sana di mente mangi del veleno di proposito. Quindi si tratta tutto di come prepararlo e di come presentarlo  :P

Dalle mie parti (sono di Firenze) si usava il cervello fritto: non avete idea di quante merende ho fatto da ragazzino col cervello fritto! Anche adesso si usano il lampredotto e la trippa, che sono stomaci dei ruminanti. A chi non piace la trippa (alla fiorentina)? Ci sono piatti fatti con interiora di animali, insomma c'è solo da sbizzarrirsi.

E se non credete a me, credete alla natura. Abbiamo denti da erbivori (i molari, piatti e larghi, per macinare le cose) ma anche da carnivori (gli incisivi per tagliare la carne, i canini per strapparla): perché devo limitarmi a mangiare soja e legumi?  :smiley-yell:

PS: ho appena mangiato pappardelle sul cinghiale...  XD
Title: Re: swRTC
Post by: reizel on Oct 03, 2011, 01:06 pm
l'uomo sarebbe frugivoro, poi che ci mangiamo qualsiasi cosa e' un altro discorso, pure il mio cane e' carnivoro ma mangia pure olive sott'olio, insalata, patate cotte ma non fritte e si beve il caffe' se glielo diamo ]:D si un cane/lavandino :P

buone le trippe, il cinghiale pero' lo sceglierei come ultimo pasto da tanto e' buono
Title: Re: swRTC
Post by: leo72 on Oct 03, 2011, 01:11 pm
L'uomo era frugivoro quando era scimmia, ma non adesso. :D
Dillo agli americani-tutti-hotdog-e-hamburger  :smiley-yell:

Io sono rossociccivoro perché mangio prevalentemente ciccia rossa... non toglietemi la bistecca perché potrei... mordere  ]:D

E ora basta sennò si va OT (che bello...  :D )
Title: Re: swRTC
Post by: lestofante on Oct 03, 2011, 03:46 pm
leo credi sia possibile riadattare la libreria per basarsi o aggiungere il timestamp dal 1 gennaio 1900? In questo modo la matematica delle date diventa molto più semplice
Title: Re: swRTC
Post by: testato on Oct 03, 2011, 03:47 pm
dalle mie parti ancora resiste l'usanza di mangiare il sangue di maiale.
io e il mio babbo lo mangiamo una sola volta all'anno, con gli spaghetti.
E' il mio piatto preferito in assoluto  :)
Title: Re: swRTC
Post by: leo72 on Oct 03, 2011, 03:54 pm
@lesto:
spiega il concetto  :D

@testato:
il sangue di maiale è uno di quei componenti di diversi piatti. A Firenze esistono i roventini, che sono sangue di maiale fritto, il buristo, un salume a base di sangue di maiale (tipo sanguinaccio). Poi, sai come si dice: del maiale non si butta via nulla  :smiley-yell:
Title: Re: swRTC
Post by: lestofante on Oct 03, 2011, 04:06 pm
http://en.wikipedia.org/wiki/System_time
Title: Re: swRTC
Post by: reizel on Oct 03, 2011, 05:49 pm
leo, ho inserito nel mio sketch la funzione "aggiungi un secondo" "togli un secondo" , non si incasina, se tolgo indiscriminatamente arriva a zero e rimane zero, se aggiungo aggiunge fino al 59esimo secondo e di piu' .
direi che e' un ottima cosa :)
Title: Re: swRTC
Post by: lestofante on Oct 03, 2011, 05:59 pm
per aggiungere un secondo puoi basarti sulle funzioni già presenti sulla libreria, per toglierlo vorrei vedere il codice che hai scritto

edit: la libreria dovrebbe accorgersi di un inserimento di dati non corretto. E rifiutare il dato o fare i giusti calcoli per metterlo in pari con la libreria
Title: Re: swRTC
Post by: testato on Oct 03, 2011, 06:23 pm
Leo sto' iniziando or ora all'implementazione della tua libreria nel mio aggeggio a valvole.
Volevo chiedere, ma tu aggiorni il primo allegato del primo post quando fai le modifiche ?
perche' ho visto che hai allegato una nuova versione il 1 ottobre, ma l'edit del primo post e' settembre.
E' buona norma tenere il primo post sempre con la versione aggiornata.

p.s. firenze e' eccelsa sul cibo, e l'uso del sangue di maiale lo conferma. Ho fatto un corso molto lungo a firenze, mi sembra di un mese, alla ebneuro, ed ho mangiato da Dio. Grandi fiorentine  :)
Title: Re: swRTC
Post by: gioscarab on Oct 03, 2011, 06:23 pm
mi permetto un ot
il nome è bellissimo, mega onomatopeico, sembra il suono di una mega scivolata e relativo tonfo finale su pavimento scivoloso.
Title: Re: swRTC
Post by: reizel on Oct 03, 2011, 06:32 pm

per aggiungere un secondo puoi basarti sulle funzioni già presenti sulla libreria, per toglierlo vorrei vedere il codice che hai scritto


ho detto che non so programmare, quindi ho messo un +1 -1 senza bounce (quindi aggiunge o toglie molto + di qualche unita')

Code: [Select]
 
  if (valpiuunsec == HIGH){
    rtc.setTime(rtc.getHours(), rtc.getMinutes(), rtc.getSeconds() + 1);
    }
 
  if (valmenounsec == HIGH){
    rtc.setTime(rtc.getHours(), rtc.getMinutes(), rtc.getSeconds() - 1);
    }


cosi' come e' scritto arriva a zero in pochi clik del pulsante, o arriva a 59 se aggiungo, ma l'rtc non si blocca assolutamente
Title: Re: swRTC
Post by: leo72 on Oct 03, 2011, 07:36 pm
@lesto:
gli darò un'occhiata dopo cena

@gbm:
il nome sarebbe l'abbreviativo di softwareRealTimeClock. Però ho letto acronimi peggiori  :D

@reizel (e lesto):
tu non te ne accorgi ma le funzioni rtc.setTime e rtc.setDate restituiscono un valore TRUE o FALSE.
Se le usi come comandi (ossia rtc.setTime(xx,xx,xx)) non hai restituzione di valori, se fai un check con
Code: [Select]
if (!rtc.setTime(xx,xx,xx) {
  //ERRORE
}

ricevi FALSE se hai passato valori non validi per i parametri, per cui se tenti di assegnare più di 59 ai secondi, semplicemente non aggiorni l'ora.

Title: Re: swRTC
Post by: testato on Oct 03, 2011, 09:09 pm
leo hai saltato le mie domande per errore o volutamente ?  :)
Title: Re: swRTC
Post by: menniti on Oct 03, 2011, 09:19 pm

leo hai saltato le mie domande per errore o volutamente ?  :)

dillo chiaramente che invidi la mia Sindrome Calimero :D
Title: Re: swRTC
Post by: leo72 on Oct 03, 2011, 10:37 pm

leo hai saltato le mie domande per errore o volutamente ?  :)

Quando mi sono ricordato che lo avevo fatto stavo già spengendo il PC. Scusa  :smiley-sweat:


Leo sto' iniziando or ora all'implementazione della tua libreria nel mio aggeggio a valvole.
Volevo chiedere, ma tu aggiorni il primo allegato del primo post quando fai le modifiche ?
perche' ho visto che hai allegato una nuova versione il 1 ottobre, ma l'edit del primo post e' settembre.
E' buona norma tenere il primo post sempre con la versione aggiornata.

E' vero. Per ora avevo infilato via via le versioni modificate in fondo al thread.

Quote

p.s. firenze e' eccelsa sul cibo, e l'uso del sangue di maiale lo conferma. Ho fatto un corso molto lungo a firenze, mi sembra di un mese, alla ebneuro, ed ho mangiato da Dio. Grandi fiorentine  :)

Le fiorentine qui da noi sono le donne di Firenze. Solo voi di "fuori" chiamate così la bistecca. Per noi è la "bistecca", quella cosa che in altre parti d'Italia è una misera braciola un po' più alta del normale e stracotta. Che se la dai ad un vero fiorentino te la tira "ni'muso" (nel viso) e ti dice "questa soletta tu te la mangi te, ha'capiho nanni?!?" ("questa soletta te la mangi tu, hai capito, bello?")  XD
Title: Re: swRTC
Post by: Maurotec on Oct 03, 2011, 10:55 pm
Quote
Le fiorentine qui da noi sono le donne di Firenze. Solo voi di "fuori" chiamate così la bistecca. Per noi è la "bistecca", quella cosa che in altre parti d'Italia è una misera braciola un po' più alta del normale e stracotta. Che se la dai ad un vero fiorentino te la tira "ni'muso" (nel viso) e ti dice "questa soletta tu te la mangi te, ha'capiho nanni?!?" ("questa soletta te la mangi tu, hai capito, bello?")  smiley-lol


oh bischerio di un bischero, ma tu sei fiorentino heee.  :smiley-sweat:

Ho un ricordo bellissimo di Firenze, malgrado ci sia stato per motivi di salute, arrivati la sera alle 8 io mio papà mia sorella e mio zio ed io ovviamente con la mantibola rotta in tre pezzi fino a mezzanotte eravamo ancora in giro.
Mi ricordo l'ingresso dell'ospedale immenso, sedia e carrozzine a non finire. Mi ricordo una simpatica e instancabile signora che faceva le pulizie nelle stanze, che mi diceva, "suvvia un ne nulla un ne nulla". Ricordo una strada ciottolata, dove dice che un tempo sui marciapiedi uscivano i banchetti da lavoro.

Sono stato a Taranto, Napoli, Roma ma firenze mi è rimasta nel cuore per sempre.

Ciao.

Title: Re: swRTC
Post by: leo72 on Oct 03, 2011, 10:58 pm

leo credi sia possibile riadattare la libreria per basarsi o aggiungere il timestamp dal 1 gennaio 1900? In questo modo la matematica delle date diventa molto più semplice

Ecco perché non mi tornava... avevi scritto 1900, ma il System Time parte dal  1970 XD
E' anche chiamato Unix Time, se non ricordo male, perché è un formato introdotto con Unix.
Cmq è un calcolo un po' comlicato perché deve tener conto degli anni bisestili, dell'ora solare, longitudine ecc..
Potrei approssimare ma, domanda: su un microcontrollore ad 8 bit che lavora per la maggior parte in stand-alone gestendo led e servo, a cosa può servire?  :smiley-sweat:
Title: Re: swRTC
Post by: leo72 on Oct 03, 2011, 11:02 pm

Ho un ricordo bellissimo di Firenze, malgrado ci sia stato per motivi di salute, arrivati la sera alle 8 io mio papà mia sorella e mio zio ed io ovviamente con la mantibola rotta in tre pezzi fino a mezzanotte eravamo ancora in giro.

Eh?!?
E che c'eri venuto a fare a Firenze con la mandibola rotta?

Quote

Mi ricordo l'ingresso dell'ospedale immenso, sedia e carrozzine a non finire.

Ma era in città oppure in periferia?

Quote

Mi ricordo una simpatica e instancabile signora che faceva le pulizie nelle stanze, che mi diceva, "suvvia un ne nulla un ne nulla".

E te gli dovevi rispondere: "Un n'è nulla perché l'è la mia. Se l'era la sua un lo diceva!"  :smiley-yell:

Quote

Ricordo una strada ciottolata, dove dice che un tempo sui marciapiedi uscivano i banchetti da lavoro.

Uhm.. forse allora eri in centro. Santa Maria Nuova, per caso?

Quote

Sono stato a Taranto, Napoli, Roma ma firenze mi è rimasta nel cuore per sempre.
Ciao.

Un buon motivo per tornarci  ;)
Ma non ora, che è invasa dai turisti e fa alquanto schifo. Meglio una stagione morta, come novembre oppure febbraio/marzo.
Title: Re: swRTC
Post by: Maurotec on Oct 03, 2011, 11:31 pm
Quote
E che c'eri venuto a fare a Firenze con la mandibola rotta?


E già che c'èro venuto a fare? ma sai qui a palermo (meno male che mia sorella è infermiera) mi volevano sostituire un condilo con uno artificiale, ma c'è possibilità di rigetto ecc. Allora gira e rigira, andiamo al Careggi (non sono sicuro) e li mi hanno bloccato la mandibola con un filo di acciaio per un mese, un mese per la riabilitazione e poi tutto a posto. Comunque vicino l'ospedale c'èra la Caritas, ora non sono sicuro che la strada con il ciottolato fosse li vicino l'ospedale. Tutto questo è successo quasi fine 1992.

Quote
E te gli dovevi rispondere: "Un n'è nulla perché l'è la mia. Se l'era la sua un lo diceva!"  smiley-yell

ahaha, fantastico l'accento toscano, io tendo facilmente a prendere l'accento e la cadenza del luogo ma a firenze non è stato così.

Quote
Un buon motivo per tornarci  smiley-wink

Credimi ci penso almeno 4 5 volte l'anno, voglio andare in quella piazza immenza che non so come si chiama (gnurant) circondata dagli edifici storici, e ci voglio tornare di notte perchè è stupenda.

Ciao.
Title: Re: swRTC
Post by: testato on Oct 04, 2011, 06:53 pm
primi test su Atmega8A

Fallisce la compilazione dell'esempio swRTCmillis
Code: [Select]
swRTCmillis.cpp: In function 'void setup()':
swRTCmillis:14: error: 'class swRTC' has no member named 'milliseconds'
swRTCmillis.cpp: In function 'void loop()':
swRTCmillis:18: error: 'class swRTC' has no member named 'milliseconds'
swRTCmillis:19: error: 'class swRTC' has no member named 'milliseconds'
Title: Re: swRTC
Post by: testato on Oct 04, 2011, 06:55 pm
secondo test atmega8A

usando l'esempio swRTCtest se chiudo la finestra del serial monitor e la riapro l'orario parte dal settaggio iniziale.
In pratica si resetta il micro aprendo e chiudendo il serial monitor (lampeggia il led L come quando premi reset manuale).
A bordo c'e' Optifix
Title: Re: swRTC
Post by: menniti on Oct 04, 2011, 06:59 pm

secondo test atmega8A

usando l'esempio swRTCtest se chiudo la finestra del serial monitor e la riapro l'orario parte dal settaggio iniziale.
Si resetta l'atmega gia' solo chiudendo e riaprendo il serial monitor ?


Sì, l'apertura del serial monitor fa attivare la linea DTR dell'8u2 o dell'FT232RL, è normale.
Title: Re: swRTC
Post by: leo72 on Oct 04, 2011, 07:03 pm

primi test su Atmega8A

Fallisce la compilazione dell'esempio swRTCmillis
Code: [Select]
swRTCmillis.cpp: In function 'void setup()':
swRTCmillis:14: error: 'class swRTC' has no member named 'milliseconds'



Ho tolto la funzione milliseconds() da qualche giorno. Forse ho lavorato su una versione che ancora ce l'aveva. Uhm.... il casino di lavorare da 3 PC diversi...  :smiley-roll-sweat:
Title: Re: swRTC
Post by: testato on Oct 04, 2011, 07:22 pm
a questo servono i test :)
quando aggiorni il file nel primo post batti un colpo

per il reset non lo sapevo, grazie menniti

continuo l'implementazione
Title: Re: swRTC
Post by: leo72 on Oct 04, 2011, 07:25 pm
L'ho messo aggiornato ieri sera (vers. 0.7), controlla se ci sono ancora i problemi con la milliseconds.
Title: Re: swRTC
Post by: testato on Oct 04, 2011, 07:53 pm
io della 0,7 parlo
l'ho scaricato un'ora fa :)

non ho capito una cosa, intendi togliere la funzione millisecondi ? o ripararla ?
Title: Re: swRTC
Post by: leo72 on Oct 04, 2011, 10:09 pm
Ah, non avevo capito  :smiley-sweat:

La funzione milliseconds() non serve più perché ho modificato il core Tiny affinché le funzioni temporali dei micro non si sovrappongano sul timer usato dalla swRTC: in poche parole, funzionano entrambe senza modifiche.

Adesso guardo il problema segnalato....
Title: Re: swRTC
Post by: menniti on Oct 04, 2011, 10:12 pm
Forse l'orologio viene settato in setup, ecco perché ad ogni reset riparte da lì
Title: Re: swRTC
Post by: leo72 on Oct 04, 2011, 10:16 pm
Certamente.

Si combinano le 2 cose, ossia il reset che il sistema manda ogni qualvolta viene aperta la seriale (compreso il monitor seriale dell'IDE) con la "base di partenza" fornita dal setup().
Perché l'ho messo? Per il semplice fatto che senza di esso l'orologio non viene settato e non parte, mentre in quel modo si ha sì una "base di partenza" sempre uguale ma per lo meno l'orologio viene attivato ed inizia a funzionare.
Title: Re: swRTC
Post by: menniti on Oct 04, 2011, 10:19 pm
Ah, già, dimenticavo che NON stai usando un circuito esterno, allora è un cavolo di problema, ovvio che non puoi stare a memorizzare in eprom, perché peraltro non puoi prevedere quando si toglie l'alimentazione; però la tua eccellente lib va vista in un'ottica stand-alone con tanto di batteria tampone e micro in sleep, allora il problema non si pone più :)

EDIT: forse in sleep non funziona più il timer che ti serve, magari non il pwr_down...
Title: Re: swRTC
Post by: leo72 on Oct 04, 2011, 10:24 pm
Difatti devi pensare ad un progetto standalone con batteria tampone.

PS:
non ho provato ancora lo sleep con la libreria ma usando il POWER_SAVE il timer 2 non viene spento.
Title: Re: swRTC
Post by: leo72 on Oct 04, 2011, 11:10 pm
Ho tolto lo sketch di esempio swRTCmillis: non poteva funzionare, non essendoci più la funzione milliseconds()  :smiley-sweat:
Title: Re: swRTC
Post by: menniti on Oct 05, 2011, 12:31 am

Ho tolto lo sketch di esempio swRTCmillis: non poteva funzionare, non essendoci più la funzione milliseconds()  :smiley-sweat:

ci sta tutto Leo, stai facendo un lavoro spettacolare, e non lo fai certo stando a panciolle a casa; che caspita! anche un'automa commetterebbe errori in questa situazione ed il tuo manco un errore è, ma solo una banale dimenticanza che, peraltro, è esterna alla lib.
Tanto di cappello, maestro! XD XD XD
Title: Re: swRTC
Post by: testato on Oct 05, 2011, 08:04 pm
Testato sulle mie valvole,

ho fatto una prova veloce solo su prima cifra ora, seconda cifra minuti, seconda cifra secondi (piloto singolarmente in multiplex i 6 valori)

volevo sapere dove e' il tasto DONAZIONE  :)

non solo funziona, ma funziona meglio dello sketch precedente nel senso che e' piu' veloce, e questo mi migliora lo sfarfallamento delle cifre, addirittura e' eliminato del tutto (sono rimasto impressionato in quanto gli anodi li piloto in pulsata senza ancora il filtraggio quindi un leggero sfarfallamento e' normale, ma non sapevo quanto era il normale e quanto era dovuto allo sketch)
la tua libreria e' mooolto piu' veloce del mio vecchio orologio nel loop.

Complimenti.  :)


P.S.1: ma come gestisce i vari micro ? credevo lo dovessi specificare io nel listato, invece lo carico su 328P e su 8A e funziona sempre bene :)

Title: Re: swRTC
Post by: leo72 on Oct 05, 2011, 10:04 pm
Per le donazioni puoi farmele il 23/10 direttamente brevi manu  XD

Sulla velocità è normale dato che qui la funzione di aggiornamento dell'RTC è slegata dal codice utente ma è a sé stante, per cui la sua esecuzione diventa trasparente. E tu non devi far altro che leggere l'ora, non anche aggiornarla, dal tuo sketch.

Per la compilazione, il "segreto" sta nelle direttive del compilatore. Se osservi nel sorgente vedrai che ci sono diversi #define e defined(). Con quelli analizzo il tipo e la frequenza del micro e do "direttive" al compilatore su quali parti di codice compilare. In  pratica, viene creato uno sketch "ad hoc" cucito sul micro di destinazione.
Title: Re: swRTC
Post by: testato on Oct 05, 2011, 10:07 pm
ma io non ci saro' il 23, mannaggia  =(

Come mai il comando rtc.stopRTC(); non esce in rosso nell'IDE, mentre rtc.startRTC(); esce in rosso, insieme a tutti gli altri. chi decide i colori dell'ide ?
Title: Re: swRTC
Post by: leo72 on Oct 05, 2011, 10:09 pm
Intendi che non viene evidenziato come parola chiave?
Forse ho dimenticato di definire stopRTC come tale.
(ps: a me pare in arancione, non in rosso)
Title: Re: swRTC
Post by: testato on Oct 05, 2011, 10:17 pm
si, non appare in arancione

quindi ti ho trovato un altro bug :)
e poi dicono che i test non servono  :)
Title: Re: swRTC
Post by: leo72 on Oct 05, 2011, 10:26 pm
Ho controllato. Non è una mia dimenticanza ma un bug dell'IDE perché stopRTC è nell'elenco delle nuove parole chiave che l'IDE dovrebbe evidenziare durante la scrittura. Non so perché non lo fa.
Title: Re: swRTC
Post by: testato on Oct 05, 2011, 11:11 pm
hai la 1.0 installata ? potremmo provare con quella

a proposito hai testato la libreria con la 1.0 ? appena finisco il codice la provo anche io
Title: Re: swRTC
Post by: leo72 on Oct 05, 2011, 11:13 pm
La 1.0 non la uso ancora.
Title: Re: swRTC
Post by: testato on Oct 05, 2011, 11:41 pm
un piccolo aiuto per favore,

con la tua libreria l'anno e' a 4 cifre, a me serve a 2 cifre.
per dividere i giorni e i mesi in singole cifre ho usato questo:
Code: [Select]
  D1=(int)rtc.getDay() / 10;  
 D2=(int)rtc.getDay() - D1 * 10;


pero' con l'anno non funziona in uanto non mi servono le prime due ma le ultime due.

mi potresti dire come si fa ?

inoltre c'e' qualche tabella da tenere di riferimento per fare queste operazioni di selezione ?
grazie

capirai infatti che non ho capito come funziona, cioe' per la prima cifra prendendo come esempio le ore 23
23/10 =2,3 quindi prendendo solo la prima cifra capisco che ho il 2 che mi serve

pero' poi con la seconda operazione non mi trovo:
23-2,3*10 = 207 da dove esce invece la seconda cifra 3 che mi serve ?
Title: Re: swRTC
Post by: leo72 on Oct 06, 2011, 12:15 am
Riprendendo il tuo esempio:

Code: [Select]
   D1=(int)rtc.getDay() / 10;   
  D2=(int)rtc.getDay() - D1 * 10;



metti
Code: [Select]

byte D1, D2; //basta byte, tanto i giorni non sono mai magg. di 31
  D1=rtc.getDay()/10;
  D2=rtc.getDay()-(D1*10);


Usando il tipo byte non hai problemi di arrotondamento dato che viene fatto in automatico.
Per cui con 23 hai:
D1=parte_intera(23/10)=2
D2=23-(2*10)=23-20=3

Quote

pero' con l'anno non funziona in uanto non mi servono le prime due ma le ultime due.

mi potresti dire come si fa ?

Premesso che io tendo sempre a scrivere un algoritmo che sia adatto al caso che sto esaminando, visto che tuo hai implementato un orologio "vero", l'anno sarà quello corretto. Per cui si può partire dal presupposto che sia sempre maggiore di 2000.
Quindi fai anno=rtc.getYear()-2000;
e poi riprendi l'esempio più sopra  XD
Title: Re: swRTC
Post by: testato on Oct 06, 2011, 12:44 am
grazie,
ogni volta se come l'accensione di una torcia al buoi  :)

avevo gia' implementato il trucco della sottrazione del 2000, nel mio caso va bene, ma volendo invece fare le cose piu' seriamente, quindi estrapolare le ultime due cifre da un numero generico formato da 4, e' difficile da fare ? si devono mettere in campo le stringhe ?

p.s. lo lascio in funzione tutta la notte, domani mattina vedo se ha perso secondi
Title: Re: swRTC
Post by: testato on Oct 06, 2011, 01:16 am
BRUTTO SEGNO, ha perso 8 secondi in 4 minuti  :smiley-eek-blue:

Atmega8A con quarzo esterno da 16MHz
Title: Re: swRTC
Post by: lestofante on Oct 06, 2011, 01:58 am

pero' con l'anno non funziona in uanto non mi servono le prime due ma le ultime due.


le ultime due cifre sono il RESTO della divisione dell'anno per 100 no?

e il resto della divisione si ottiene con l'operatore matematico % (che in arduino funziona SOLO CON I NUMERI INTERI!)

quindi si fa:
Code: [Select]

int annoDueCifre=annoQuattroCifre % 100;


facile, veloce (bhe meno che sottrarre 2000), funzionale in ogni secolo positivo
Title: Re: swRTC
Post by: leo72 on Oct 06, 2011, 06:36 am

BRUTTO SEGNO, ha perso 8 secondi in 4 minuti  :smiley-eek-blue:

Atmega8A con quarzo esterno da 16MHz

Uhm. Potresti pubblicare il codice per capire se ci può essere qualcosa che influisce il contatore?
Title: Re: swRTC
Post by: testato on Oct 06, 2011, 08:14 am
grazie leo per avermi insegnato quest'altra cosa :)

per il discorso precisione ourtroppo confermo, persi 10 minuti durante la notte, siamo sulla mezz'ora al giorno  :)

metto in test, sulla uno standard, quindi con il 328P il solo tuo codice di test, ti faccio sapere oggi i risultati
Title: Re: swRTC
Post by: leo72 on Oct 06, 2011, 08:28 am
Ok. Aspetto i tuoi dati.
Se si riesce a capire lo scarto medio si potrebbe provare anche ad inserire una correzione software.
Title: Re: swRTC
Post by: testato on Oct 06, 2011, 06:03 pm
eccomi di ritorno da lavoro.

sulla Uno abbiamo perso 1 minuto in 10 ore, molto meno dell'ATmega8A standalone, ma cmq inaccettabile, siamo sui 2 minuti al giorno e quindi 1 ORA  :smiley-eek-blue: al mese

la considerazione mia quindi e' che se anche sul mio orologio con 8A ci sono influenze del codice o chissa' cosa altro, tipo una incompatibilita' con 8A, il tutto passa in secondo piano in quanto 1 ORA al mese non e' accettabile.

Dimmi che altri test posso fare, nel frattempo metto a lavorare un altro test, metto l'8A sulla UNO e lo uso solo con lo sketch di esempio, in questo modo capiamo se si comporta ugualmente su 8A e 328P, partendo dalla situazione standard del tuo sketch di esempio

Aggiungo una domanda, visto che per fare il test si deve lasciare la seriale attiva, quindi che stampa una volta al secondo i dati (c'e' il delay 1000 nello sketch di esempio), non e' che la seriale gli da fastidio ? Purtroppo non possiamo chiudere l finestra del serial monitor, perche' riaprendola, per cntrollare di quanto sbaglia, si resetterebbe
Title: Re: swRTC
Post by: testato on Oct 06, 2011, 06:26 pm
Primo risultato da tenere in considerazione, l'Atmega8A montato sulla UNO, con il solo sketch di esempio, e la seriale aperta, perde 2 secondi al minuto, i calcoli seppur approssimativi si ritrovano con i 10 minuti persi nella notte sullo stand alone.

Quindi il primo risultato da tenere i considerazione e':
- l'8A non risponde come il 328P

Chi ha un 8A puo' fare velocissimamente una controprova, perche' essendo rilevante l'errore, gia' in 10 minuti vedi nettamente e chiaramente l'errore.

Leo ma tu non hai l'8A ?

Rimesso in test il 328P sulla UNO per verifica
Title: Re: swRTC
Post by: leo72 on Oct 06, 2011, 06:57 pm
Non ho un 8A.
L'alternativa alla seriale per vedere l'ora è quella di usare un display LCD.

Tieni presente una cosa: rispetto ad un RTC vero e proprio, la swRTC è una SIMULAZIONE di un RTC. Significa che quando il timer va in overflow (1 volta ogni millisecondo) chiama un interrupt per aggiornare un contatore che segna i millisecondi. Quando arriva a 1000, vuol dire che è passato 1 secondo ed aggiorna tutti gli altri registri a catena. Seppur veloci, queste operazioni portano via un minimo di tempo di calcolo. Tale tempo è quello che influisce sul delta temporale, ossia è quello che fa rallentare il conteggio..

Per fare le cose fatte BENE, bisognerebbe prendere la versione in assembly della libreria, calcolare tutti i tempi che impiegano le singole istruzioni ad essere eseguite e fare la somma ottenendo il delta da sottrarre. Ma ciò esula dalla precisione richiesta alla libreria.

Un'alternativa potrebbe essere quella di aggiornare i registri non dopo 1000 ms ma dopo 998/999 ms, per compensare con quel ms in meno la differenza che si registra in più alla lunga.
Title: Re: swRTC
Post by: lestofante on Oct 06, 2011, 07:01 pm
se non erro la uno usa un risonatore...io uso questi cristalli: http://it.rs-online.com/web/p/cristalli/5476070/
stasera provo
Title: Re: swRTC
Post by: testato on Oct 06, 2011, 07:37 pm
Verificata riproducibilita' sulla UNO con 328P e sketch di esempio

Persi 6 secondi in un'ora, circa 2 minuti e mezzo al giorno quindi piu' di un'ora al mese

Atmega8A: 120s/h
Atmega328P: 6s/h

- Quali sono gli obiettivi della liberia ?
- Prima di correggere l'errore si puo' fare rispondere allo steso modo entrambi ?

@ lesto: la UNO usa un risuonatore che e' meno preciso, pero' ha gia' i fori per modificarla a quarzo+cond. Cmq il mio standalone e' con quarzo.

Metto in test il quarzo con 328P, cosi' abbiamo in mano anche la differenza QvsRS
Title: Re: swRTC
Post by: testato on Oct 06, 2011, 08:00 pm
sto' eseguendo il test senza la seriale aperta, quindi ci togliamo anche questo dubbio.

fra un ora i risultati
Title: Re: swRTC
Post by: lestofante on Oct 06, 2011, 08:10 pm

sto' eseguendo il test senza la seriale aperta, quindi ci togliamo anche questo dubbio.

fra un ora i risultati


la seriale HW e la NewSoftSerial fanno largo uso di interrupt... forse meglio usare la SoftSerial che non li usa.

edit: e passa il codice per le prove, è inutile se usiamo tutti codice differente!!
Title: Re: swRTC
Post by: testato on Oct 06, 2011, 08:39 pm
sto' usando lo sketch di esempio,
quello inserito nella libreria  :)
Title: Re: swRTC
Post by: testato on Oct 06, 2011, 09:29 pm
OTTIMI RISULTATI

il 328P in standalone con quarzo non ha perso nessun secondo in piu' di un'ora.

dobbiamo pero' valutare la questione seriale, cioe' e' vero che ho tenuto la finestra del serial monitor chiusa, pero' nello sketch ho lasciato i comandi di print, proprio per poter leggere lla fine del test.
Quindi mi chiedo, il tenere la finestra aperta influisce rispetto a non tenerla, oppure il micro non sa se e' aperta o meno ?

Metto in test per tutta la notte il 328 standalone con lo sketch reale
Title: Re: swRTC
Post by: lestofante on Oct 06, 2011, 09:56 pm
il micro non sa se aperta o meno, e credo che gli interrupt funzionino solo per la parte in lettura.
Title: Re: swRTC
Post by: leo72 on Oct 06, 2011, 10:14 pm
La seriale è gestita dall'HW sugli Atmega328. Se invece si usa la NewSoftSerial allora viene usato un interrupt per la ricezione, cosa che non avviene con la SoftwareSerial.


OTTIMI RISULTATI

il 328P in standalone con quarzo non ha perso nessun secondo in piu' di un'ora.


E' il prerequisito che ho posto fin da subito. La libreria è precisa tanto più è preciso il generatore di clock usato. Difatti ho detto subito che la libreria non è nata per essere usata con l'oscillatore interno o con il risonatore della UNO ma con un cristallo a tutti gli effetti.

Quote

dobbiamo pero' valutare la questione seriale, cioe' e' vero che ho tenuto la finestra del serial monitor chiusa, pero' nello sketch ho lasciato i comandi di print, proprio per poter leggere lla fine del test.
Quindi mi chiedo, il tenere la finestra aperta influisce rispetto a non tenerla, oppure il micro non sa se e' aperta o meno ?


Al 328 io credo poco gliene importi. E' un problema del PC.
Title: Re: swRTC
Post by: testato on Oct 07, 2011, 08:32 am
Allora il test notturno su piu' di 10 ore ha perso 5 secondi
Questo test e' stato fatto senza nessuna stampa seriale.

Quindi con risuonatore (UNO)
Atmega8A:  120s/h     48min/giorno
Atmega328P:  6s/h       2,4min/giorno

Con quarzo (2009 o standalone)
Atmega8A:   120s/h     48min/giorno
Atmega328P:   0,5s/h  12sec/giorno


Metto in test di nuovo 328P standalone quarzo per lungo tempo

Nel frattempo non potresti guardare il discorso 8A ? e' troppo l'errore, non possono esserci errori nella libreria che riguardano solo l'8A ?
Title: Re: swRTC
Post by: leo72 on Oct 07, 2011, 09:20 am
No, il setup dell'Atmega8A è giusto.
Però vedendo i tempi, che sono identici fra risonatore interno e quarzo esterno, mi viene da pensare che tu non abbia settato i fuse per usare il quarzo esterno.
Title: Re: swRTC
Post by: sid86 on Oct 07, 2011, 09:28 am
Ciao a tutti! mi aggiungo anche io..
ho provato la libreria su un seeeduino (ATMega168). L'ho lasciato lavorare per quasi 13 ore con serial monitor aperto e ha "guadagnato" 3 minuti! Mi spiego: era indietro di 2 sec rispetto all'orologio del pc e ora si trova avanti di 3 min..sempre rispetto all'orologio del pc..
Title: Re: swRTC
Post by: ratto93 on Oct 07, 2011, 09:58 am
come detto in precedenza la rutine che prevede la seriale porta via tempo...
E se si usasse sprintf? ho letto in giro che è un pò più efficiente...
Title: Re: swRTC
Post by: leo72 on Oct 07, 2011, 10:02 am
Si potrebbe introdurre un deltaT per correggere il tempo tra quello calcolato e quello effettivamente misurato. Così uno lascia andare la swRTC per 1 giorno con il suo sketch e dopo 24 ore misura lo scostamento ed inserisce il deltaT.
Title: Re: swRTC
Post by: ratto93 on Oct 07, 2011, 10:05 am
si è vero però.. a lungo andare sbarellerebbe comunque... tieni conto comunque del fatto che il clock cambia anche solo in base alla temperatura :)
Title: Re: swRTC
Post by: leo72 on Oct 07, 2011, 10:12 am
Sì ma fermiamoci un attimo e ragioniamo:

1) la swRTC è un'alternativa ad un RTC vero e proprio. Può essere usata al posto dell'RTC esterno quando non si ricerca la massima precisione possibile e si vuole mantenere un circuito semplice oppure non conviene usare un RTC (prendi un Tiny85: già ha solo 5 pin, se devo impiegarne anche 2 per comunicare con l'RTC, poi ci faccio poco).
2) se vuoi un'alta precisione, allora ti prendi un RTC e tagli la testa al toro.
3) se ti metti a guardare anche la temperatura, allora ti prendi quei quarzi "termocosati" di cui si parlava giorni fa in un'altra discussione che però costano 30€ l'uno (se non mi ricordo male).

Insomma, tutto è relativo a cosa devi fare.
Se si riesce ad ottenere uno scostamento di qualche secondo al mese la cosa è più che accettabile: siamo a mezzo minuto l'anno, possiamo starci. Certo, perdere 1 minuto al giorno è improponibile.

PS:
non dimentichiamoci che anche gli RTC sbarellano, non è che sono perfetti. Sono influenzati anch'essi dalla temperatura, da eventuali errori di montaggio, dalla qualità/capacità del quarzo ecc..
Title: Re: swRTC
Post by: ratto93 on Oct 07, 2011, 10:16 am
Leo la mia era solo una considerazione :)
il tuo lavoro è ottimo e non voglio sminuirlo ci mancherabbe altro !
Title: Re: swRTC
Post by: leo72 on Oct 07, 2011, 10:19 am
Il mio era un'analisi della swRTC e delle situazioni in cui usarla, dei pro e dei contro.

Non ho preso il tuo post come una critica ma ho voluto spiegare i motivi per cui più di tanto non possiamo chiedergli.

Oggi provo ad introdurre il deltaT. Così vediamo se con una "taratura" software riusciamo a cavarne fuori qualcosa di più preciso.
Title: Re: swRTC
Post by: lestofante on Oct 07, 2011, 11:14 am
fai che deltaT sia dinamico... più tardi implemento un timestamp basico, e ci tiro fuori qualche operazione sulle date :)

edit: dinamico nel senso impostabile con una funzione
Title: Re: swRTC
Post by: leo72 on Oct 07, 2011, 11:19 am

fai che deltaT sia dinamico...
edit: dinamico nel senso impostabile con una funzione

Ovvio, altrimenti non ha nessuna utilità.

Quote

più tardi implemento un timestamp basico, e ci tiro fuori qualche operazione sulle date :)

Ok
Title: Re: swRTC
Post by: lestofante on Oct 07, 2011, 05:08 pm
NON sono assolutamente certo che funzioni, il codice non è stato testato... in particolare sono sti cavolo di anni bisestili a farmi impazzire, propongo di riscrivere il calendario con precisione infinitesimale.

Code: [Select]
unsigned long swRTC::getTimeStampFrom1900(){
  unsigned long time;
  time = getYear()*365; //find day from year
 
  //One revolution of the Earth is not 365 days but accurately 365.2422days.It is leap year that adjusts this decimal fraction.
  float leapDayAdjust = (getYear()-1900.0)*0.2422;
  time += (int)leapDayAdjust; //add lead days
 
  for (int i=0; i < getMonth(); i++){
    time = time + daysPerMonth[i]; //find day from month
  }
  time = ( time + getDay() ) * 24; //find hour from day
  time = ( time + getHours() ) * 60; //find minute from hours
  time = ( time + getMinutes() ) * 60; //find seconds from minute
  time += getSeconds(); // add seconds
 
  return time;
}

boolean swRTC::setTimeStampFrom1900(unsigned long time){
  int year = time/365.2422;
  float remaining = time-year*365.2422;
 
  if (remaining>=365.2422)
    return false;//my math is wrong!
 
  if (year<1900)
    return false;//year not supported!
 
  int month=0;
  while (remaining > daysPerMonth[month]){
    remaining -= daysPerMonth[month];
    month++;
  }
  month++;//because month 0 doesn't exist
  if (month>12)
    return false;//my math is wrong!
 
  int day = remaining/(60*60*24);
  remaining = remaining-day*(60*60*24);
 
  if (remaining>=(60*60*24))
    return false;//my math is wrong!
 
  int hours = remaining/(60*60);
  remaining = remaining-hours*(60*60);
 
  if (remaining>=(60*60))
    return false;//my math is wrong!
 
  int minutes = remaining/(60);
  remaining = remaining-minutes*(60);
 
  if (remaining>=60)
    return false;//my math is wrong!
   
  setDate(day, month, year);
  setTime(remaining, minutes, hours);
}
Title: Re: swRTC
Post by: lestofante on Oct 07, 2011, 05:09 pm
per le operazioni matematiche basta sommare  e sottrarre i timestamp!
Title: Re: swRTC
Post by: leo72 on Oct 07, 2011, 05:24 pm
Non si può contare dal 1970? Di solito nei computer si calcola da quella data (è l'inizio dell'era Unix).
Title: Re: swRTC
Post by: lestofante on Oct 07, 2011, 06:52 pm

Non si può contare dal 1970? Di solito nei computer si calcola da quella data (è l'inizio dell'era Unix).


la unix timestamp NON conta ESATTAMENTE il numero di secondi da quella data, ma tiene conto di alcuni sfasi temporali.

traduzione: prima vediamo se il codice fin'ora è giusto, poi aggiungiamo il resto.

p.s. basta cambiare le 2 ricorrenze di "1900" in "1970"
Title: Re: swRTC
Post by: leo72 on Oct 07, 2011, 07:00 pm
OK.
Stasera faccio il merge. Adesso stavo lavorando sulla mia stazioncina meteo. Ho cambiato pannello solare e batterie ed ora sto rivedendo tutto per le nuove tensioni in gioco.
Title: Re: swRTC
Post by: testato on Oct 07, 2011, 07:24 pm

No, il setup dell'Atmega8A è giusto.
Però vedendo i tempi, che sono identici fra risonatore interno e quarzo esterno, mi viene da pensare che tu non abbia settato i fuse per usare il quarzo esterno.

Attenzione, quando parlo di risuonatore intendo quello esterno della UNO, usato al posto del quarzo, quindi sul micro non si deve cambiare nulla.
Title: Re: swRTC
Post by: testato on Oct 07, 2011, 07:28 pm

come detto in precedenza la rutine che prevede la seriale porta via tempo...
E se si usasse sprintf? ho letto in giro che è un pò più efficiente...

Nei miei test ho verificato che la seriale non influisce, e poi Leo ha detto (se ho capito bene) che essendo una seriale Hardware il micro non se ne accorge proprio se sta' stampando sul serial monitor o meno
Title: Re: swRTC
Post by: testato on Oct 07, 2011, 08:19 pm

PS:
non dimentichiamoci che anche gli RTC sbarellano, non è che sono perfetti. Sono influenzati anch'essi dalla temperatura, da eventuali errori di montaggio, dalla qualità/capacità del quarzo ecc..

Io credo che l'obiettivo e' restare nelle tolleranze del quarzo. In questo momento la condizione migliore e' 328P su quarzo reale, e siamo a 12,5 secondi al giorno. assolutamente troppo.

Il mio quarzo e' questo : http://www.vanlong.com/download/HC49S.pdf

che nella peggiore delle ipotesi, sommando l'errore di frequenza e l'errore di stabilita', sarebbero 100ppm
Title: Re: swRTC
Post by: leo72 on Oct 07, 2011, 10:44 pm
Te pensa anche a questo, e cioè che all'interno di un micro ci sono diversi interrupt. Ad esempio, io uso un interrupt per l'aggiornamento dei registri. Ma durante il funzionamento di un micro altri interrupt ne interrompono il lavoro: anche se brevi, microsecondi o giù di lì, sono tutte interruzioni che, sommate, danno luogo ad un certo scarto rispetto al tempo reale. Spero con l'introduzione del delta di poter diminuire tale scarto.
Title: Re: swRTC
Post by: testato on Oct 07, 2011, 11:23 pm
attendiamo fiduciosi
prontissimo a test.

domani mattina posto i risultati su un test di lunga durata :)
Title: Re: swRTC
Post by: leo72 on Oct 08, 2011, 12:57 am
Nel 1° post trovate la versione 0.8.
E' stato introdotto il Timestamp, una funzione che restituisce il numero di secondi a partire dal 1° gennaio di un particolare anno. Di default l'epoca è 1900 ma si può cambiare tale valore passando l'anno come parametro alla funzione.

E' stato introdotto il deltaT, una correzione per recuperare lo scarto tra il tempo calcolato e il tempo reale: il deltaT rappresenta il numero di millisecondi da aggiungere o da sottrarre al contatore interno. Ad esempio, rtc.setDeltaT(-1) indica alla libreria di togliere 1 ms al contatore. Ciò significa che l'overflow si verificherà non più raggiunto il 1000° ms ma raggiunto il (1000-deltaT) 999°. In altre parole 1 secondo per il micro durerà 999 ms invece che 1000 ms.
Il setDeltaT può assumere valori compresi fra -128 e +128.

@lesto:
ho (per ora) omesso la funzione per passare da timestamp a data perché non mi sembrava una funzione essenziale per la libreria: la appesantiva senza aggiungere funzionalità utili. Almeno secondo il mio punto di vista...
Mi dispiace solo che tu abbia passato qualche ora a scrivere quel codice.
Title: Re: swRTC
Post by: lestofante on Oct 08, 2011, 02:26 am
a parte che ripeto il codice è da testare pesantemente. l'unico vantaggio che apporta sarà la facile operazione tra date: esempio puoi sottrare una data ad un'altra per sapere il tempo trascorso, lavorando con i secondi che è mooolto più comodo che incastrandosi tra anni bisestili e mesi da 28, 30, e 31 giorni :)
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 09:28 am
Fatto test lungo ancora con la ver 0.7.1 usando il tuo sketch di esempio, quindi con i comandi serial print
il risultato e' peggiorato a 0,71s all'ora, 17sec al giorno
mentre iol mio precedente test era senza il serial print, leggendo direttamente l'orario sulle valvole.

Possiamo quindi affermare che il serialprint influisce sulla precisione ?

ricapitolando:
---------------------------
Quindi con risuonatore esterno + serialprint
Atmega8A:  120s/h     48min/giorno
Atmega328P:  6s/h       2,4min/giorno

Con quarzo + serialprint
Atmega8A:     120s/h     48min/giorno
Atmega328P:  0,71s/h    17sec/giorno

Con quarzo senza serialprint
Atmega8A:     120s/h     48min/giorno
Atmega328P:   0,5s/h  12sec/giorno



Quale diavolo potrebbe essere la spiegazione dello sballamento assurdo del atmega8A ?
i fuse usati sono quelli di default scelti dall'Optiloader, cioe':
Code: [Select]
Lock: 2F FFE000  Low: BF FFA000  High: CC FFA800
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 10:11 am
Code: [Select]
This function has been introduced to adjust the counter with particular sketches that can use other interrupt functions, i.e. NewSoftSerial library or delay().


la verita' sarebbe : non so perche' la mia libreria sbaglia, quindi vedete di correggerla manualmente  ]:)

mettendo da parte gli skerzi io cambierei approccio

1) la libreria dovrebbe dare un risultato perfetto tranne per la questione della precisione del quarzo, quindi le possibili cause di ritardo dovute al funzionamento stesso della libreria (interrupt, ecc) dovrebbero essere analizzate e gestite. Cioe' usando il solo sketch di esempio devo ritrovarmi nelle tolleranze dell'oscillatore esterno usato. Quindi dovbresti calcolare i ms che si perdono nel calcolo, ed aggiungerli in modo fisso nella libreria. Perche' i calcoli quelli sono, fissi matematicamente.

2) il DeltaT e' giusto che ci sia ma deve appunto essere venduto come calibrazione manuale da usare per il resto delle variabili, cioe' il mio quarzo fa schifo ? lo correggo manualmente, voglio usare la UNO che fa ancora piu' schifo ? la correggo manualmente. Uso un codice che va ad influenzare ? Lo correggo manualmente

Ma ripeto, con la sola libreria ed usando lo sketch di esempio ed accontentandomi della tolleranza dell'oscillatore scelto, non dovrei dover usare il deltaT

p.s. mi fai un esempio pratico di valore da usare per il deltaT per correggere il mio 0,5s/h ? Sarebbe comodo avere l'esempio di calcolo nel readme.
grazie dell'immenso lavoro che stai facendo (e grazie anche a lesto)
Title: Re: swRTC
Post by: leo72 on Oct 08, 2011, 11:14 am
No, non è come dici.
Non è che ho inserito il deltaT perché non riesco a correggere il problema, ho messo il deltaT perché il problema NON è correggibile.

Come lavora la libreria? Usa una variabile il cui incremento è agganciato ad un timer. Il timer è indipendente da tutto, ha un suo clock, aggiorna un suo contatore e viaggia senza problemi (ammesso che il quarzo sia preciso). Quando entrano quindi in gioco gli scostamenti di cui parlo? Nel momento in cui il timer manda in overflow il suo contatore e richiama la routine di interrupt relativa per aggiornare la variabile usata per contare i millisecondi. In questo momento entra in campo la legge n°1 della robotica  ;) Ossia, un interrupt non è interrompibile. Se nel momento in cui viene chiamato l'interrupt per aggiornare la variabile dei ms è in esecuzione un altro interrupt, il primo resta in attesa. Quindi si perde un certo tempo che, seppur minimo, sulla lunga distanza si fa sentire. Ora, considera che in un micro ci possono essere molti interrupt, alcuni di natura hardware (servono al micro stesso per interagire con le sue periferiche) altri di natura software, sono cio èintrodotti dall'utente stesso, volente o nolente: ad esempio, quando richiami la funzione millis() per leggere quanti millisecondi sono passati dall'avvio del micro, richiami una funzione che legge un contatore incrementato da un overflow basato sul timer 0. Il timer 0 è basato sugli interrupt.

Se usi una libreria potresti usare un interrupt per gestire alcune cose. I cambi di stato su un pin sono basati sugli interrupt. Ecc...

Detto questo, puoi capire come una precisione assoluta la swRTC non potrà mai avercela perché essa è inserita in un contesto diverso da un RTC puro: in quest'ultimo tipo di micro, infatti, l'HW fa solo l'aggiornamento dei registri temporali quindi è tarato appositamente per questo compito. Un microcontrollore fa tantissime altre cose, cose che possono sfalsare la precisione della libreria.

Ora, se noi introduciamo una correzione, possiamo cercare di avvicinarci ad una buona precisione del calcolo del tempo. Tale correzione è empirica e va stabilita con misurazioni. Tali misurazioni sono interne al micro oppure esterne. Se sono interne, le segue la libreria stessa ma per far ciò ha bisogno di un vero RTC per tararsi correttamente. Inoltre la taratura dipende dallo sketch, perché come ho detto ogni programma usa cose differenti per cui anche il deltaT cambia da sketch a sketch. Ma se devi usare un RTC esterno allora cade l'utilità della swRTC.
Se invece la correzione è esterna, è l'utente stesso che misura lo scostamento tra il tempo indicato dalla libreria e quello effettivamente trascorso ed applica un valore deltaT appropriato.

Nel tuo caso, se il ritardo è di 500 ms/ora significa che è di 8,3 ms al minuto, ossia di 0,14 ms al secondo. Applicando un deltaT di -1 hai uno scarto di 0,04ms/secondo, che sono circa 3450 ms/giorno, ossia 3 secondi al giorno. Non è male, considerando poi che alcune fluttuazioni sono introdotte da fluttuazioni dell'alimentazione, variazioni della temperatura ecc...
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 11:30 am
mettamola cosi, tu potresti introdurre una correzione alla libreria per quanto riguarda l'utilizzo con il solo tuo sketch di esempio. lo sketch tu lo sai come e' fatt, sai come e' fatta la libreria, sai come funziona il micro, e quindi potresti aggiungerci la correzione.
Cioe' potresti creare una libreria che "con il solo sketch di esempio", sarebbe ESATTA al netto della precisione quarzo.

questo comporta un certo lavoro per capire di preciso di quanto devi correggerla, ma non ha senso fare questo lavoro, perche' ? perche' la tua libreria non verrra' mai usata solo con il tuo sketch, ma verra' inserita in altri sketch, e quindi vuoi per l'oscillatore usato, vuoi per lo sketch che fa x cose, una correzione serve sempre.

credo pero' che se non serve molto tempo a calcolare la correzione esatta per far funzionare bene il solo sketch, sarebbe cmq un passo avanti.
ti faccio un esempio, in questo momento io non so di quanto sbaglia la libreria e di quanto sbaglia il quarzo, mentre con la correzione di cui parlo saprei che l'errore sarebbe sol sul quarzo

p.s. il mio quarzo e' dichiarato +-50ppm sulla precisione frequenza e +-50 sulla stabilita', quindi al masdsimo sono 100ppm (parti per milione), quanti secondi sarebbero ?
Title: Re: swRTC
Post by: leo72 on Oct 08, 2011, 11:38 am
Non è così semplice. La correzione andrebbe bene per il MIO micro, per il MIO quarzo e per il MIO circuito di prova.
Messo un micro differente, un altro quarzo (con altri condensatori), un circuito differente, non tornerebbe più. Anche un RTC vedi che a volte dà problemi di sfasamento.
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 11:57 am
sulle altre variabili sono daccordo, ma perche' dici che il micro stesso varia la situazione ? non deve limitarsi a fare delle operazioni matematiche ? che saranno uguali su tutti i micro ?

mi fai capire come si fa il calcolo sui ppm ? grazie
Title: Re: swRTC
Post by: leo72 on Oct 08, 2011, 12:04 pm
Il micro è un circuito composto da milioni di transistor. Non sono fotocopie, sono costruiti uno ad uno: le tolleranze dei singoli componenti moltiplicati per i milioni di esemplari possono dare adito a qualche differenza, seppur minima, nei tempi. Uno stesso quarzo può dare un valore di 20 ppm inferiore al valore teorico come un altro darlo di 20 ppm superiore.

Alla fine hai 2 micro che vanno ognuno per la sua strada  :D
Fai una prova: prendi 3 micro (uguali per modello oppure no), montali su una breadboard ed impostali per usare l'oscillatore interno. Poi collegaci un led e carica su ognuno lo sketch Blink e dai l'alimentazione. Vedrai come dopo pochi secondi ogni led lampeggia sfasato rispetto agli altri!

Io ho fatto questa prova con un Tiny84, un Tiny85 ed un Mega644...
Ho detto di prendere l'oscillatore, ma se rifai la prova con 3 quarzi e con i micro impostati per lavorare con il clock esterno, e lasci i 3 micro andare, dubito che dopo un po' di ore i lampeggi siano ancora sincronizzati.

PS:
il calcolo dei ppm si fa su un campione di quarzi, si misura lo scostamento minimo e massimo misurato e si mette in vendita il prodotto dicendo che può andare da un minimo ad un massimo. Non è che ti misurano lo scostamento di ogni singolo pezzo  :P
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 12:16 pm
ma cosi' imbrogli :)
usando l'oscillatore interno su 3 micro diversi sfasa, ma perche' e' la sezione dell'oscillatore la piu' critica.
usando 3 micro su 3 quarzi diversi sfasa, sono i 3 quarzi diversi ad essere critici
ma quello che dico io e' che usando 3 micro diversi sullo stesso quarzo lo sfasamento e' dettato solo dal quarzo, e che le differenze interne del micro non influiscono.

da questa base parto per il discorso di una libreria esatta.
Non dimentichiamoci che qui parliamo di 12 secondi al giorno, e non e' giustificato da nulla secondo me.

per la questione del ppm intendevo se per favore mi dici, perche' non ci arrivo, a capire un quarzo da 100ppm quanti secondi al giorno mi puo' sballare.
Fidandoci della tolleranza dichiarata dalla fabbrica possiamo poi dire che la tua libreria sbaglia di X

cioe' se 100ppm significano 11 secondi al giorno allora la tua libreria e' perfetta, ma se significano 1 secondo al mese c'e' qualcosa che non va
Title: Re: swRTC
Post by: leo72 on Oct 08, 2011, 12:50 pm
E' l'esatto opposto. Usando 3 micro differenti e lo stesso quarzo, le differenze sono dettate dai micro e non dal quarzo. Per cui ogni micro va riallineato con il deltaT.
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 01:01 pm
si ma vedrai che non ci sono differenza.

sta ritornando il mio problema di comunicazione :)

io dico che il micro sballa di un valore infinitesimale rispetto al problema del quarzo , e se capiamo a quanto corrusponde lo sfasamento di 100ppm possiamo affermarlo facendo dei test

ho applicato il deltaT ma ora sballa alla grande, ho scritto bene il codice ?

il mio va indietro di 12sec/giorno quindi ho applicato +4
Code: [Select]
void setup()
{
 // per SoftWare RealTimeClock
   delay(2000);
   rtc.stopRTC();
   rtc.setTime(12,45,00);   //<<<<<<---------------------------------------------REGOLAZIONE ORA
   rtc.setDate(8,10,2011); //<<<<<<---------------------------------------------REGOLAZIONE DATA
   rtc.setDeltaT (4);      //<<<<<<---------------------------------------------CALIBRAZIONE (+1 = + 3450 ms/giorno)
   rtc.startRTC();
 


A che servono quei 2 secondi di delay all'inizio ?
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 01:11 pm
SPETTA MA E' AL CONTRARIO

cioe' il mio orologio va indietro e quindi devo usare valori negativi.

hai sbagliato a scrivere l'help :)
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 02:45 pm
non mi ritrovo, ho messo -4 come deltaT ed ora va maledettamente avanti.

ho capito bene la conversione che hai detto ? il valore 1 corrisponde a 3450ms al giorno ?
questa conversione e' valida solo con quarzo da 16MHz o e' slegato da esso ?
Title: Re: swRTC
Post by: leo72 on Oct 08, 2011, 02:57 pm
La funzione accetta numeri da -128 a +128. Il numero esprime i millisecondi da sommare aritmeticamente al contatore dei millisecondi per influenzare il controllo su quando aggiornare il tempo:

IF (contatore>(999+deltaT)) THEN aggiorna_tempo

Quindi l'help è giusto, sei tu che hai frainteso  :smiley-yell:
Se sommi un valore negativo è ovvio che lo sottrai, ossia scrivere 999+(-1) equivale a 999-1

Se tu dichiari deltaT=4 allora l'aggiornamento del tempo verrà fatto ogni 1004 ms. Ciò introduce un ritardo di 14 secondi ogni ora!

Per 12 secondi al giorno (in più, immagino, non lo specifichi), devi calcolare quant'è lo scostamento al secondo.
12 s=12000 ms ogni 24 ore -> 500 ms/ora
Da qui calcoli i ms per secondo di scarto, ossia: 500/1 h=500/3600=0,14ms/s
Il valore più prossimo per deltaT è 1 perché la libreria non tratta valori decimali. Però così hai 1 contro 0,14, capisco che così la libreria introduce un errore nel verso opposto.

Vedrò casomai stasera di introdurre un deltaT sul secondo, in modo da poter avere una precisione migliore usando sempre interi (più veloci da calcolare rispetto ad un float).
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 03:23 pm
I test falli fare a chi lo fa di mestiere  :)

sbagli, c'e' una doppia inversione nel ragionamento da fare, la mente e' debole per arrivarci, io supero la mente con test reali  :smiley-yell:

Code: [Select]
If your RTC is faster than the real time, try adjusting deltaT with negative values, if your RTC is slower, try deltaT with positive vlues.


ecco il tuo help, rileggilo, e' sbagliato.
Il mio RTC e' slower, cioe' va indietro rispetto al reale, quindi non devo usare deltaT positivi, ma negativi, infatti sottraendo a 1000 il delta -1 faccio in modo che l'RTC corra in avanti rispetto al tempo reale, perche' segnera' 1SECONDO un millisecondo prima
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 04:39 pm
anche questo calcolo qui e' sbagliato secondo me
Nel tuo caso, se il ritardo è di 500 ms/ora significa che è di 8,3 ms al minuto, ossia di 0,14 ms al secondo. Applicando un deltaT di -1 hai uno scarto di 0,04ms/secondo, che sono circa 3450 ms/giorno, ossia 3 secondi al giorno.

con -1 correggo di 1ms/sec = 60ms/min = 3600ms/h

quindi la correzione e' inutilizzabile, troppo grossa, perche' il minimo che puo' fare e' correggere di un minuto e mezzo al giorno
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 06:10 pm
Confermo i miei calcoli,

sono corso in avanti di 6 secondi in 2 ore

deltat -1 significa portare in avanti l'orologio di:
-1 = 1ms/s 60ms/min 3600ms/h 86s/day 1,44min/giorno
mentre a me servono solo 12sec al giorno
Title: Re: swRTC
Post by: leo72 on Oct 08, 2011, 06:27 pm
Hai ragione per quanto riguarda l'help perché la prima versione della formula prevedeva una sottrazione e l'help l'avevo messo in base a quello. Poi ho visto che la cosa non era logica (se più lento devi sommare... crea confusione, come è poi successo) ho cambiato la formula.

Hai ragione anche sui calcoli. Vabbè, oggi non è giornata...  :smiley-sweat:
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 06:38 pm
tranquillo, capita, vale per tutte le volte che mi hai corretto tu a me, e sono state tante  :)

a questo punto io credo che l'unica cosa che resta da fare e' aumentare il margine di correzione almeno di 10000 volte, in modo da poter arrivare a fare calibrazioni di 0,0086 sec/giorno 8,6ms/giorno 258ms/mese 0,25sec/mese

se e' troppo oneroso si ci puo' accontentare di una magnitudo in meno, aumentando di solo 1000 volte il potere di correzione siamo sui 2,5sec al mese, vanno bene lo stesso
Title: Re: swRTC
Post by: Maurotec on Oct 08, 2011, 08:42 pm
Chi ha un oscilloscopio potrebbe anche misurare la frequenza di oscillazione del quarzo, probabilmente vedrà valori diversi in base a dove e come è montato il quarzo. A questi livelli montare un quarzo su breadboard e molto diverso da montarlo su mille fori, penso anche che basti avvicinare la mano al quarzo per avere delle variazioni della frequenza.

Ciao.
Title: Re: swRTC
Post by: menniti on Oct 08, 2011, 08:51 pm
Vi ricordo che stanno lavorando ad un RTC funzionante esclusivamente via software.
Title: Re: swRTC
Post by: testato on Oct 08, 2011, 10:32 pm
mauro tutti i miei test non sono se breadboard, ma su standlaone con PCB e quarzo, i test con risuonatore sono sulla UNO, e vanno molto peggio, ma con questo discorso della calibrazione manuale si riuscira' ad avere un orologio preciso in qualsiasi condizione, perche' ogn'uno si calibrera' il proprio.
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 09:17 am
Oggi vorrei affrontare la questione batteria di backup.

dal datasheet ritengo che la modalita' sleep adatta alla tua libreria sia la "Power Save", e' la pie' potente fra le 4 che tengono attivo il Timer 2 (la power-down lo spegne)

Mi chiedevo quindi come gira il fumo ?
sia la cpu che la flash sono spente, ma il timer continua ad andare avanti, cioe' continua ad andare in overflow ad ogni ms giusto ?
Ma dove viene memorizzato il cnteggio ? nel timer2 c'e' un registro "infinito" che tiene quindi il conteggio e che va in owerflow dopo 16383 anni?

tutto giusto ?
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 11:09 am
Il timer 2 usa un registro HW da 8 bit, quindi il massimo che può contenere è 255.
Con clock sull'ordine dei MHz, capisci che il registro va in overflow in pochissimo tempo. Per ovviare a questo si usa il prescaler, che è un divisore del clock di sistema. Ad esempio un prescaler di 256 significa che per ottenere un colpo di clock del timer 2 (e quindi un aggiornamento del suo registro) occorrono 256 colpi di clock del sistema. In pratica, è un divisore: il clock del timer è dato da Clock_sistema/prescaler.

Detto questo, quando il registro va in overflow (è calcolato per farlo 1 volta ogni millisecondo), il micro esce dallo sleep perché gli interrupt sono eventi che risvegliano dagli stati di risparmio energetico.

A questo punto, se hai delle istruzioni da eseguire, le esegui, altrimenti rimetti a nanno il micro.

PS:
sto per mettere online la versione 0.8.1. Ha un deltaT differente rispetto a prima, calcolato su secondi/giorno. Quindi, per correggere il tuo scostamento di 12 secondi/giorni, devi dare semplicemente rtc.setDeltaT(-12).
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 01:22 pm
Quindi ogni ms svegli il micro e andro' ad aggiornare lOrario nella flash ?. Ma con un micro che si sveglia e fa il suo lavoro mille volte al secondo non avrei risparmi secondo me
Per il delta t ritengo che la risoluzione di un secondo al giorno sia troppo bassa. Se il mio orologio sbaglia di mezzo secondo al giorno non e' correggibile, e sarebbero 15 sec al mese.
Io credo che almeno devi scendere di un livello, e quindi per 12,5 secondi poter scrivere deltaT -125
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 03:05 pm
Il risparmio che puoi ottenere è già molto, non credere. Considera che 1 intero millisecondo di stop per un micro è molta roba  ;)

Intanto va visto se la logica del nuovo deltaT funziona. Se funziona, non è difficile aumentarlo di un ordine di grandezza.
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 04:49 pm
appena la posti la provo.

per il discorso Sleep quindi che devo fare ? una ISR con dentro rtc.getSeconds() ?

questo automaticamente scrivera' nella flash sia ora che data ?

e' la prima volta che uso gli interrupt quindi scusa le banali domande
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 06:12 pm
La lib è già online da un paio d'ore (ecco perché preferivo inserirla nell'ultimo post piuttosto che nel primo, perché in questa maniera passano inosservati gli aggiornamenti  :P ).

Non capisco cosa vuoi fare.
Anche questa frase è sibillina:
Quote
andro' ad aggiornare lOrario nella flash

L'ora non l'aggiorni nella flash. Le variabili stanno in RAM.
Title: Re: swRTC
Post by: lestofante on Oct 09, 2011, 06:46 pm

La lib è già online da un paio d'ore (ecco perché preferivo inserirla nell'ultimo post piuttosto che nel primo, perché in questa maniera passano inosservati gli aggiornamenti  :P ).


aggiorna il primo post e mettile anche nell'ultimo :P
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 06:55 pm
pero' poi non sai piu' quante volte e' stata scaricata, la cosa migliore e' postarla nel primo post ed annunciarlo con un nuovo post.

l'idea e' quella di mettere una batteria di backup. logicamente mettendo una batteria bottone da 40mAh, tipo la CR2032 sul micro funzionante regolarmente con la tua libreria durerebbe 10sec

quindi l'idea e' di mettere in sleep il micro quando stacco l'orologio dalla presa di corrente, le altre parti sarebbero del tutto spente, solo il micro non deve perdere la data.

quindi voglio misurare la corrente assorbita in modalita' normale e quella assorbita in sleep. se non c'e' molta differenza a causa del fatto che la tua libreria risveglia il micro ogni millesimo di secondo vuol dire che la tua libreria non puo' essere usata con bat di backup.

credo che normalmente il micro assorbe sulle 200mA, e con uno sleep di 1 ms non credo purtroppo che assorba molto meno.

per il discorso del funzionamento parlavo della Flash perche' credevo che la ram venisse spenta in sleep, invece resta sempre accesa ?
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 07:03 pm
Scherzi? Se assorbisse 200 mA senza nulla di collegato sarebbe una cosa GRAVE.  :smiley-sweat:
I 200 mA sono il massimo di corrente che può transitare all'interno del micro, non ciò che consuma stando fermo.
In modalità operativa consumerà sui 10/20 mA, senza nulla di collegato. Se lo metti in sleep il consumo sarà di qualche uA.

Cmq, non è difficile fare ciò che dici. Basta mettere un partitore di tensione per vedere quando lo stacchi dalla presa del muro. Tutto resta da vedere a quanto lo alimenti ed a quanto lavora. A 5V o a 3,3V? A quanti MHz lavora?
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 07:17 pm
meglio, non ho fatto ancora prove di corrente, cmq quello su cui non mi ritrovo, e spero di sbagliarmi, e che un micro fatto funzionare 1000 volte al secondo passa da un assorbimento di mA ad uno di uA

Per la questione tecnic gia' avevo pensato al partitore, non ho nessun problema visto che lo alimento direttamente a 230V senza isolamento dalla rete  :)

funziona a 5V 16MHz, ma questo non influisce visto che in condizione di sleep avrebbe solo la batteria da 3V

stavo pensando che forse e' piu' comodo il megacondensatore, perche' resta sempre carico visto che si ricarica quando c'e' tensione.
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 07:18 pm
Devi ragionare con la velocità di esecuzione del processore, che non è misurabile in secondi o millisecondi ma in microsecondi e nanosecondi.
Title: Re: swRTC
Post by: menniti on Oct 09, 2011, 07:27 pm


La lib è già online da un paio d'ore (ecco perché preferivo inserirla nell'ultimo post piuttosto che nel primo, perché in questa maniera passano inosservati gli aggiornamenti  :P ).


aggiorna il primo post e mettile anche nell'ultimo :P

+1, così chi apre per la prima volta il Topic ha l'opera (Maestro Leo, è l'unico termine adatto al Suo prezioso lavoro XD) a portata di mano; chi, come noi, segue la discussione in religioso silenzio (salvo interventi indispensabili :smiley-red:) se la trova a portata di mano ad ogni aggiornamento. Vorrei solo dire, a proposito dello sleep, che si potrebbe attivare la modalità Power_save, che lascia attivo il timer 2 e che permette comunque un buon risparmio.
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 07:35 pm
cioe' se ho capito intendi che e' vero che ogni ms si risveglia, ma resta sveglio per quasi niente, quindi e' come se stesse spento, e' questo il concetto ?
il quanto tempo resta aceso ogni millisecondo dipende da cosa deve fare il micro. visto che nel mio caso deve solo aggiornare l'ora con la tua libreria, quanto tempo ci mette ?

hai qualche link pratico per fare quello che mi serve ? cioe' in modalita' sleep non deve fare nulla presente nel lopp (tipo non mi serve che legga la temperatura), ma deve solo non perdere l'orario con la tua libreria.
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 07:38 pm
Sei svogliato  :)


Vorrei solo dire, a proposito dello sleep, che si potrebbe attivare la modalità Power_save, che lascia attivo il timer 2 e che permette comunque un buon risparmio.


dal datasheet ritengo che la modalita' sleep adatta alla tua libreria sia la "Power Save", e' la pie' potente fra le 4 che tengono attivo il Timer 2 (la power-down lo spegne)
Title: Re: swRTC
Post by: menniti on Oct 09, 2011, 07:43 pm

Sei svogliato  :)


Vorrei solo dire, a proposito dello sleep, che si potrebbe attivare la modalità Power_save, che lascia attivo il timer 2 e che permette comunque un buon risparmio.


dal datasheet ritengo che la modalita' sleep adatta alla tua libreria sia la "Power Save", e' la pie' potente fra le 4 che tengono attivo il Timer 2 (la power-down lo spegne)


E' vero, il mio intervento era riferito a questo:

Quindi ogni ms svegli il micro e andro' ad aggiornare lOrario nella flash ?. Ma con un micro che si sveglia e fa il suo lavoro mille volte al secondo non avrei risparmi secondo me
Per il delta t ritengo che la risoluzione di un secondo al giorno sia troppo bassa. Se il mio orologio sbaglia di mezzo secondo al giorno non e' correggibile, e sarebbero 15 sec al mese.
Io credo che almeno devi scendere di un livello, e quindi per 12,5 secondi poter scrivere deltaT -125

avrò capito male....
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 09:11 pm
metto in test la nuova lib con il -12
a domani mattina i risultati

piccola cosa, nell'help hai scritto su quali arduino vengono usati i vari micro, a questo punto nella sezione atmega8 specifica che viene usato su ArduinoNG
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 09:22 pm
FERMI TUTTI

l'orario non avanza con la 0.8.1
Title: Re: swRTC
Post by: menniti on Oct 09, 2011, 09:33 pm

FERMI TUTTI

l'orario non avanza con la 0.8.1

Sì ma non è che devi urlare così, d'improvviso, perentoriamente, ci fai prendere un colpo.
La vita procede lo stesso, anche se il clock non cammina, magari scopri che hai fatto uno sbaglio, e ci hai fatti morire di paura per nulla  :smiley-eek-blue:
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 09:49 pm
scusate per l'urlo, ci tenevo a fare un altro test questa notte, per servire la causa  :)

ho fatto altre prove, con delta positivi funziona, con delta negativi non avanza l'orario

testato sia sulla UNO (quindi risuonatore) che sullo standalone quarzato

rtc.setDeltaT (-12);  
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 09:59 pm
Oh... è vero... avevo provato con delta positivi e poi implementato quelli negativi.. :*
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 10:04 pm
OK. Era una bischerata. Sistemato. Già che ci sono vedo se implemento la correzione con secondi con decimali.
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 10:10 pm
ok, cosi' inserisco direttamente -125 perche' a me e' proprio 12,5secondi
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 10:19 pm
Dunque, questa è la versione 0.8.2.
Il deltaT adesso accetta valori da -600.0 a +600.0 secondi.
Ad esempio, introducendo 12.5 si vuol indicare una correzione giornaliera di 12 secondi virgola 5, ossia +12500 ms.

Title: Re: swRTC
Post by: testato on Oct 09, 2011, 10:24 pm
niente da fare

va velocissima dopo la prima decina di secondi che va bene mette il turbo :)

rtc.setDeltaT (-12.5); 
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 10:31 pm
problema sempre solo sul ramo negativo. dopo 5 secondi parte col turbo,
con delta positivi tutto ok
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 10:33 pm
A me va regolare... perché?
Ho messo deltaT(-12.5) e viaggia regolare.
Con la precedente versione ti do ragione, dopo qualche secondo iniziava a saltare di 3 secondi ma con la 0.8.2 a me va pulita.
La sto testando sull'Arduino e leggo l'ora sulla seriale (uso lo sketch di serie, insomma)
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 10:36 pm
l'ho testata col mio sketch finale,ora faccio prove col test di esempio
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 10:39 pm
15:22:41  26/9/2011
15:22:42  26/9/2011
15:22:45  26/9/2011
15:22:48  26/9/2011
15:22:51  26/9/2011
15:22:54  26/9/2011
15:22:57  26/9/2011
15:23:0  26/9/2011
15:23:3  26/9/2011
15:23:6  26/9/2011
15:23:9  26/9/2011
15:23:12  26/9/2011
15:23:15  26/9/2011
15:23:18  26/9/2011
15:23:21  26/9/2011
15:23:24  26/9/2011
15:23:27  26/9/2011
15:23:30  26/9/2011
15:23:33  26/9/2
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 10:41 pm
invece con delta positivi utto ok:
15:22:41  26/9/2011
15:22:42  26/9/2011
15:22:43  26/9/2011
15:22:44  26/9/2011
15:22:45  26/9/2011
15:22:46  26/9/2011
15:22:47  26/9/2011
15:22:48  26/9/2011
15:22:49  26/9/2011
15:22:50  26/9/2011
15:22:51  26/9/2011
15:22:52  26/9/2011
15:22:53  26/9/2011
15:22:54  26/9/2011
15:22:55  26/9/2011
15:22:56  26/9/2011
15:22:57  26/9/2011
15:22:58  26/9/2011
15:22:59  26/9/2
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 10:47 pm
Ho solo leggermente cambiato due bischerate. A me va perfettamente, come si vede dallo screenshot allegato.
Comunque riscarica questa versione e provala.
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 10:56 pm
ecco, ora si

la metto in test, ricordati di aggiornare anche la versione sul primo post
a domani mattina i risultati

notte
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 10:57 pm
Ecco, appunto... secondo me hai scaricato la versione sul primo post quando ancora io non l'avevo aggiornata per cui ha rifatto il download della stessa libreria  :D
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 11:04 pm
bha, infatti vorrei sapere chi ti ha suggerito di mettere in due posti diversi lo stesso file  :)

la cosa migliore e' che la posti solo nel primo topic, e nel topic invece lo scrivi solo, dicendo "Scaricate la nuova" ma senza allegarla, non me lo invento io, fanno tutti cosi' :)

vado a ninna. notte
Title: Re: swRTC
Post by: testato on Oct 09, 2011, 11:09 pm
ultimo messaggio odierno
noto una cosa strana, ci sono degli spikes sui numeri delle valvle, che non ho mia visto prima, cioe' improvvisamente i numeri cambiano improvvisamente, e poi ritornano normali, tipo sono a 22, diventa 11 e poi ritorna 22, ma velocissimamente

domani verifico con la vecchia liberria se lo fa.
per ora guardiamo il discorso preisione.
notte
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 11:15 pm
Cosa strana. Anche perché la modifica non tocca l'aggiornamento dei secondi ma opera prima, sul contatore dei millisecondi.
Title: Re: swRTC
Post by: lestofante on Oct 09, 2011, 11:25 pm
se sati usando i float è possibile, a causa della perdita di precisione intrinseca dei numeri a virgola mobile. Dovresti implementare i numeri a virgola fissa, o ancora meglio non usarli proprio.

Per esempio un secondo contatore che ragiona al minuto o all'ora, più è grande l'intervalli di tempo, maggiore è la precisione.

con il delta setti la durata in millisecondi di un'ora, normalmente è di 1000*60*60=3600000, a cui sommi o sottrai il delta. (chiamamolo deltaOra)

per ottenere i secondi, fai contatore%deltaOra, per i minuri contatore%(deltaOra/60).

noterai che i minuti e i secondi, nel caso peggiore, saranno giusti solo allo scoccare dell'ora: però almeno l'errore non si accumula.
Title: Re: swRTC
Post by: leo72 on Oct 09, 2011, 11:35 pm
Ma io i float li uso solo in fase di accettazione dell'input da parte dell'utente, poi, proprio per evitare i problemi dati dall'uso di numeri in virgola mobile su una CPU pensata per operare con interi, converto in quest'ultimo tipo di dati.
Title: Re: swRTC
Post by: lestofante on Oct 09, 2011, 11:50 pm
ho visto ora che usi un metodo particolare, me lo spieghi al volo? sono un pò fuso :)
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 12:06 am
Dunque, mi baso calcolando la correzione giornaliera in millisecondi, data dal deltaT passato dall'utente. Prendiamo ad esempio il valore di testato, -12.5 secondi.

In pratica, per evitare di applicare la correzione tutta insieme, che si vedrebbe perché sull'orologio apparirebbe uno sgraziato salto temporale, prendo la correzione e la spalmo su tutto il giorno calcolando ogni quanti secondi devo applicare una correzione. Per fare questo converto prima il valore passato in un intero moltiplicando per 10, così prendo solo la prima cifra decimale, poi divido per il numero di secondi di un giorno (86400, moltiplicato per 10 per allinearlo con il valore di deltaT). Questo rappresenta l'intervallo in secondi tra una correzione e la successiva. Vale a dire che se devo applicare -12.5 secondi al giorno devo applicare 1 secondo ogni 6912 secondi:
(86400*10)/(12.5*10)
Prendo la parte intera e poi il segno che mi dirà se devo sommare o sottrarre tale valore.
Questo secondo lo spalmo sui millisecondi, per cui 1 secondo ogni 6912 secondi equivale a dire 1 ms ogni 6912 ms.
Ecco quindi che quando aggiorno il contatore decremento anche il contatore dei ms usato per applicare la correzione. Arrivato a zero, aggiungo o sottraggo il ms al contatore (controllando prima se non lo mando in overflow, in questo caso la correzione si fa al giro successivo).
Title: Re: swRTC
Post by: lestofante on Oct 10, 2011, 12:15 am

Dunque, mi baso calcolando la correzione giornaliera in millisecondi, data dal deltaT passato dall'utente. Prendiamo ad esempio il valore di testato, -12.5 secondi.

In pratica, per evitare di applicare la correzione tutta insieme, che si vedrebbe perché sull'orologio apparirebbe uno sgraziato salto temporale, prendo la correzione e la spalmo su tutto il giorno calcolando ogni quanti secondi devo applicare una correzione. Per fare questo converto prima il valore passato in un intero moltiplicando per 10, così prendo solo la prima cifra decimale, poi divido per il numero di secondi di un giorno (86400, moltiplicato per 10 per allinearlo con il valore di deltaT). Questo rappresenta l'intervallo in secondi tra una correzione e la successiva. Vale a dire che se devo applicare -12.5 secondi al giorno devo applicare 1 secondo ogni 6912 secondi:
(86400*10)/(12.5*10)
Prendo la parte intera e poi il segno che mi dirà se devo sommare o sottrarre tale valore.
Questo secondo lo spalmo sui millisecondi, per cui 1 secondo ogni 6912 secondi equivale a dire 1 ms ogni 6912 ms.
Ecco quindi che quando aggiorno il contatore decremento anche il contatore dei ms usato per applicare la correzione. Arrivato a zero, aggiungo o sottratto il ms al contatore (controllando prima se non lo mando in overflow, in questo caso la correzione si fa al giro successivo).


ok, è lo stesso sistema del contatore%deltaOra :-)
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 12:17 am
Ma più fine perché lavora su millisecondi. Se tu ogni 6.9s hai un secondo che dura 999 ms non te ne accorgi neanche  XD
Title: Re: swRTC
Post by: lestofante on Oct 10, 2011, 12:36 am
nono, il % fa proprio in modo che l'errore si "smussi"...
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 08:06 am
mmmmm stranamente ho una situazione peggiorata,
persi 12secondi in 9 ore

pero' stanotte ci sono stati sbalzi di tensione, lo so perche' ho sentito l'ups attaccarsi e staccarsi. Rifaccio un test lungo tenendolo attaccato all'ups.
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 08:57 am
Considera che il codice è stato modificato aumentando la lunghezza della routine di interrupt rispetto a prima, per cui i calcoli che avevi fatto potrebbero non essere più validi.
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 10:35 am
cioe' stai dicendo che la libreria senza delta ha cambiato il suo grado di precisione ?
e quindi prima mi rifaccio un test senza delta, e poi se necessario lo applico ?
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 10:56 am
La libreria CON delta è differente rispetto a prima perché nell'interrupt adesso c'è anche il calcolo del delta. Sono poche righe di codice ma su tempi dell'ordine del giorno anche 10 ns in più a ciclo possono farsi sentire.
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 11:17 am
capisci che cosi' non ne usciamo.
stai dicendo che siamo passati ad una regolazione a spanne ?

la trafila dovrebbe essere questa: metto in test l'orologio SENZA delta per 24 ore, mi segno quanti secondi sballa, e poi uso come deltaT i secondi di cuji prima.

se poi mi servono 12.5 ma non devo scrivere 12.5 per XXX cause, allora non diciamo che quelli sono secondi, diciamo che e' un numero senza nessuna unita' di misura da usare a tentativi
Title: Re: swRTC
Post by: menniti on Oct 10, 2011, 11:21 am
Eh, come la vuoi farcita sta torta! :P
Intanto sta cercando il modo per arrivare ad una regolazione funzionante, poi cercherà di trasformare la tecnica in un algoritmo col quale si possano usare i valori "diretti", dai tempo al tempo, se vede che non hai mai messo mano a questo tipo di programmazione, tu pensa a testare che Lui farà la sua parte, abbi pazienza e le cose andranno a meraviglia, se le case che producono RTC hardware non lo fanno fuori prima  8)
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 11:39 am
@Testato:
la regolazione a spanne era anche quella di prima  ;)
Cmq nulla ti vieta di provare la nuova versione senza definire un deltaT. Controlla lo sfasamento e poi applica il deltaT.

@Menniti:
questi clienti diventano sempre più esigenti. Meno male che pagano $), altrimenti la pazienza era già finita  :smiley-sweat:
Title: Re: swRTC
Post by: menniti on Oct 10, 2011, 11:55 am

@Menniti:
questi clienti diventano sempre più esigenti. Meno male che pagano $), altrimenti la pazienza era già finita  :smiley-sweat:

Testato è noto per pagare SOLO sotto forma di test :smiley-yell:, una sorta di pagamento in natura, certo è migliore di quelli come me che pretendono tutto senza pagare niente, ma in entrambi i casi con questi "pagamenti" non mangi, ecco perché poi ti cibi della qualsiasi forma vivente, maremma affamata :D
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 12:02 pm
Visto che si parla di mangiare....  :smiley-yell:
Sulle Dolomiti ho imparato un detto BELLISSIMO:
"A mezzogiorno, cotto o non cotto... si mangia!"  XD XD

Quindi vi saluto e vado a sgranocchiare qualcosa  :P
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 04:41 pm
purtroppo confermati i test di stanotte, nel test pomeridiano persi 8 secondi in 8 ore con delta -12.5

faccio partire un test senza delta
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 06:03 pm
Dimentica per un attimo -12.5, questo valore andava bene prima dell'introduzione del delta.
Adesso devi rifare un test lungo e capire lo scostamento giornaliero dell'attuale libreria. Poi vediamo di intervenire col delta.

Può essere che la funzione vada rivista come può essere che (visto il codice differente) sia da trovare un nuovo valore.
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 06:11 pm
yep, infatti gia partito un test lungo.
per ora, ad un'ora di distanza, nessuno scostamento e senza delta  :)

visto che la tua libreria non ha senso senza la batteria di backup e l'uso di un pin di interrupt per l'attivazione dello sleep, si potrebbe integrare il tutto, o cmq scrivere una documentazione semplice che spieghi il da farsi.

Ad esempio io devo liberare il pin 2 o 3 per l'interrupt di blackout, e quindi cambiare anche l'hardware, per fortuna che ho liberi altri 3 pin, e poi si deve dire come connettere la batteria, usando almeno 2 diodi per gestire la direzione del flusso
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 06:14 pm

yep, infatti gia partito un test lungo.
per ora, ad un'ora di distanza, nessuno scostamento e senza delta  :)

visto che la tua libreria non ha senso senza la batteria di backup e l'uso di un pin di interrupt per l'attivazione dello sleep, si potrebbe integrare il tutto, o cmq scrivere una documentazione semplice che spieghi il da farsi.

Ad esempio io devo liberare il pin 2 o 3 per l'interrupt di blackout, e quindi cambiare anche l'hardware, per fortuna che ho liberi altri 3 pin, e poi si deve dire come connettere la batteria, usando almeno 2 diodi per gestire la direzione del flusso


Ok. E poi c'è qualcos'altro che ti devo fare?  XD
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 06:21 pm
ti faro' sapere :)

e poi fino a prova contraria el cose le FACCIO io nel senso fisico del termine, tu le PENSI  :)
Title: Re: swRTC
Post by: lestofante on Oct 10, 2011, 07:02 pm
wow, che macello!

allora, visto che a quanto pare l'interrupt è vitale, ho riscritto mezza libreria per avere un interrupt mignon!!

infatti ora è:

Code: [Select]
//interrupt-driven routine to update the software clock
#if defined (ATMEGAx8) || defined (ATMEGA8) || defined (ATMEGA644) || defined (ATMEGAx0)
ISR(TIMER2_OVF_vect) {
TCNT2 = starter;
#elif defined (__AVR_ATtiny2313__)
ISR(TIMER0_OVF_vect) {
TCNT0 = starter;
#elif defined (ATTINYx4) || defined (ATTINYx5)
ISR (TIM0_OVF_vect) {
TCNT0 = starter;
#endif
counterT++;

if (counterT>=hourDurationMS){//if one hour is passed
  timestamp+= 3600L;//add a hour to timestamp
  counterT-=hourDurationMS; //remove one hour from counter
}
}


ho tolto il deltaT, che è stato prontamente sostituito con hourDurationMS (ovvero la durata di un giorno in millisecondi, unsigned long, se server maggiore precisione possiamo arrivare fino a 2 mesi, ovvero l'overflow di un unsigned long che conta i millisecondi!)

come si può notare ora il tutto si basa sul timestamp, e quindi ho sistemato (erano buggatissime) le funzioni di trasformazione delle date.
ecco la libreria modificata ( e semplificata):

in allegato il file:
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 08:27 pm
avro' capito il 10%, quindi scusate cazzate.

allora il discorso dell'interrupt a cui facevo riferimento serve in modo che quando manca la corrente elettrica che alimenta arduino, il micro vada in sleep, in modo da consumare meno corrente possibile dalla batteria a bottone di backup posta ad alimentare il solo micro.
La rilevazione della mancanza di corrente la intendevo fare spedendo semplicemente i 5v di alimentazione di arduino sul pin digitale 2 (INT0). All'inizio avevo pensato di rilevare con un partitore la 230V, ma poi sono arrivato a questa soluzione piu' efficace.

Con la libreria versione Leo questo non e' possibile ?
Title: Re: swRTC
Post by: lestofante on Oct 10, 2011, 08:31 pm

avro' capito il 10%, quindi scusate cazzate.

allora il discorso dell'interrupt a cui facevo riferimento serve in modo che quando manca la corrente elettrica che alimenta arduino, il micro vada in sleep, in modo da consumare meno corrente possibile dalla batteria a bottone di backup posta ad alimentare il solo micro.
La rilevazione della mancanza di corrente la intendevo fare spedendo semplicemente i 5v di alimentazione di arduino sul pin digitale 2 (INT0). All'inizio avevo pensato di rilevare con un partitore la 230V, ma poi sono arrivato a questa soluzione piu' efficace.

Con la libreria versione Leo questo non e' possibile ?



sì che è possibile. La mia modifica nasce per tentare di rendere il timer molto più preciso.
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 08:58 pm
ottimo, visto che parlavi di interrupt credevo ti riferissi al mio caso.

sto' facendo i primi test sul discorso Sleep,
la prova l'ho fatta cosi', il micro messo su breadboard con solo quarzo, la pullup del reset, e tenendolo connesso solo ad arduino con i due cavetti sulla seriale

il consumo durante il normale funzionamento e' 13mA.

vi aggiorno con i consumi sleep
Title: Re: swRTC
Post by: lestofante on Oct 10, 2011, 09:34 pm
col sistema che uso possiamo usare un timer più lento senza problemi, ma non so se si può fare, mai lavorato coi timer
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 09:39 pm
Il Power save fa scendere i consumi a 1,45mA

ma il problema e' che li' rimane inchiodato, non se ne esce piu'.

Leo se ho capito bene tu hai detto che l'overflow stesso del timer 2 ad ogni millisecondo risveglia il micro, e quindi io ho solo inserito lo sleep nel Loop, dicendogli che per 5 secondi voglio l'orario e per 5 lo sleep. ma non se ne esce.
Title: Re: swRTC
Post by: lestofante on Oct 10, 2011, 09:48 pm
dipende dagli sleep, credo che alcuni siano insensibili ai timer
Title: Re: swRTC
Post by: arduaudio on Oct 10, 2011, 10:04 pm
Super complimenti, ma riesco a usarla insieme alla SD? Occupa i pin 10/11 mi pare.... Accidenti!
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 10:04 pm
non occupa 10.11, ne blocca solo il pwm
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 10:08 pm
@lesto:
non ho ancora visto come hai strutturato la lib, gli darò un'occhiata. Se poi è a posto la sostituisco alla mia.

@testato:
stai facendo un po' di confusione  :D
I timer non puoi "rallentarli" ma puoi solo scegliere il prescaler, cioè il divisore del clock di sistema per l'aggiornamento del contatore del timer. Questa scelta non è però fatta "a caso" ma deve rispecchiare alcune formule che si basano sul clock del microcontrollore. Quindi i valori che trovi vengono calcolati per avere overflow perfetti, ogni millisecondo.

Detto questo, anche la modalità di sleep non è selezionabile fra tutte quelle disponibili perché la Power-down arresta tutti i timer, compreso il timer 2. Il timer 2 funziona solo in modalità IDLE  e Power-Save.

Poi non puoi selezionare uno sleep "a tempo". Il micro messo in sleep... dorme! Per risvegliarlo serve un evento particolare, come un interrupt. Quindi ogni ms l'interrupt sull'overflow del contatore del timer 2 risveglia il micro. A questo punto devi usare nel loop un contatore e visualizzare l'orario per 5 secondi e per 5 no. Non puoi fare altrimenti.

PS @lesto:
Quote
quindi ho sistemato (erano buggatissime) le funzioni di trasformazione delle date

addirittura le mie funzioni erano "buggatissime"?  :P
Title: Re: swRTC
Post by: arduaudio on Oct 10, 2011, 10:12 pm
Perfetto... si può avere il timestamp?
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 10:13 pm
io non faccio mai confusione, a limite non vengo capito, ma questo dipende dai Vs limiti  :) (si scherza sempre)
infatti di questa storia dei rallentamenti io non c'entro, non ne so nulla. sto solo facendo i test per lo sleep.

se timers2 risveglia da solo il micro perche' questo non funziona ?
se ne va in sleep e non ne esce piu'
Code: [Select]
#include <avr/sleep.h>
#include <swRTC.h>
swRTC rtc;

unsigned long reset_timer = millis();  

void setup() {
 //  delay(2000);
   rtc.stopRTC();
   rtc.setTime(15,22,00);
   rtc.setDate(26,9,2011);
   rtc.startRTC();
   Serial.begin(19200);
   
}

void loop() {
 
 
  if (millis() > reset_timer + 10000)
 {
  reset_timer=millis();
 }
 
 else if(millis() > reset_timer + 5000)
 {
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);  
  sleep_enable();        
  sleep_mode();            
  sleep_disable();                            
 }
   
   else
  {
   Serial.print(rtc.getHours(), DEC);
   Serial.print(":");
   Serial.print(rtc.getMinutes(), DEC);
   Serial.print(":");
   Serial.print(rtc.getSeconds(), DEC);
   Serial.print("  ");
   Serial.print(rtc.getDay(), DEC);
   Serial.print("/");
   Serial.print(rtc.getMonth(), DEC);
   Serial.print("/");
   Serial.println(rtc.getYear(), DEC);
   delay(1000);
  }
}


a questo punto forse ha ragione lesto, sul fatto che lo sleep non viene risvegliato dagli interrupt timers
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 10:16 pm

se timers2 risveglia da solo il micro perche' questo non funziona ?


Forse non ti capisce neanche lei  :smiley-yell: :smiley-yell:
Devo dare un'occhiata al codice e provarlo.
Title: Re: swRTC
Post by: lestofante on Oct 10, 2011, 10:19 pm
@leo72: nono, non le tue, le mie per il timestamp!

senti, mi sai dire cosa devo cambiare per poter settare il prescaler? così lo metto al massimo (credo 255, giusto?), poi faccio un piccolo programma lato PC che controlla la sincronizzazione del tempo in automatico, tirando fuori il corretto valore di durata dell'ora in ms (o meglio, aumentando il prescaler in "interrupt")

Quote
se timers2 risveglia da solo il micro perche' questo non funziona
ù
non credo che lo risvegli...

credo che
Code: [Select]
sleep_disable();     ki devi inserire nella ISR del timer2, all'interno della libreria
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 10:23 pm
a questo punto lo credo anche io, perche' il mio codice dovrebbe funzionare in pesenza di un rsveglio da timer2.

nel frattempo che aspettiao il parere di leo mi leggo il datasheet su questo discorso.

ripeto che questo non e' un "mio" problema, ma un pezzo fondamentale della libreria, perche' senza sleep e batteria di backup la libreria e' inutile
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 10:31 pm
nel frattempo posto i dati della corrente, magari michele che ci ha lavorato po' dire se sono nella media:
Code: [Select]
normale 13mA
powersave 1,45mA
powerdown 0,12mA
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 10:33 pm
@lesto:
il prescaler lo calcola già la libreria e non va toccato, altrimenti salta ogni cosa. (c'è il codice apposito dove calcola il prescaler ed il valore iniziale del contatore).
Inoltre considerando che il micro lavora con frequenze di MEGAhertz, non puoi neanche pensare di avvicinarti ad un overflow ogni ora.

@testato:
ancora non ho dato un'occhiata a nulla. Sto aspettando che si addormentino i figlioli per trasferirmi al mio PC, adesso sono col portatile e sto solo leggendo il forum.
Cmq sleep_disable() non va nella ruotine di gestione dell'interrupt ma subito dopo sleep_mode().
Inoltre set_sleep_mode(SLEEP_MODE_PWR_SAVE);   e sleep_enable(); vanno messi in setup(), non devono essere impostati ogni volta.
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 10:39 pm

Sto aspettando che si addormentino i figlioli

I miei 3 si sono addormentati or ora, ed anche la moglie e' andata  :)


Cmq sleep_disable() non va nella ruotine di gestione dell'interrupt ma subito dopo sleep_mode().

Ed infatti io cosi' ho fatto, vedi sketch
Quote

Inoltre set_sleep_mode(SLEEP_MODE_PWR_SAVE);   e sleep_enable(); vanno messi in setup(), non devono essere impostati ogni volta.

ok questo lo faro', ma per l'esempio che ho allegato, usato solo per test, non influisce

p.s. a che srvono i 2 secondi di delay nel tuo sketch di esempio ? li ho tolti e funziona lo stesso
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 10:42 pm


Sto aspettando che si addormentino i figlioli

I miei 3 si sono addormentati or ora, ed anche la moglie e' andata  :)

La moglie "regge" ma io sono svicolato via  :smiley-yell:

Quote


Cmq sleep_disable() non va nella ruotine di gestione dell'interrupt ma subito dopo sleep_mode().

Ed infatti io cosi' ho fatto, vedi sketch

Era riferito all'intervento di lesto  ;)

Quote

Quote

Inoltre set_sleep_mode(SLEEP_MODE_PWR_SAVE);   e sleep_enable(); vanno messi in setup(), non devono essere impostati ogni volta.

ok questo lo faro', ma per l'esempio che ho allegato, usato solo per test, non influisce

Bene.
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 10:47 pm
Purtroppo c'e' da dire una cosa, se si confermano i consumi, con il powersave una gigantesca CR2032 durerebbe solo 27ore, e questo non sarebbe superabile.
Se viene meno il discorso della batteria la libreria potra essere usata solo in contesti dove c'e' certezza di energia elettrica, ed in genere agli orologi viene chiesto come primo parametro il mantenere l'ora in mancanza di energia
Title: Re: swRTC
Post by: lestofante on Oct 10, 2011, 10:50 pm

@lesto:
il prescaler lo calcola già la libreria e non va toccato, altrimenti salta ogni cosa. (c'è il codice apposito dove calcola il prescaler ed il valore iniziale del contatore).
Inoltre considerando che il micro lavora con frequenze di MEGAhertz, non puoi neanche pensare di avvicinarti ad un overflow ogni ora.


questo è il bello: non mi serve assolutamente un overflow all'ora, anzi l'ideale è avvicinarsi il più possibile al secondo (altrimenti abbiamo una perdita di precisione in cambio di un risparmio quasi nullo di ampere). Per ogni valore di clock ci calcoliamo il prescaler che più si avvicina al secondo, e quanti interrupt richiama ogni ORA (se non al giorno o al MESE!). In oltre farò anche un piccolo programma che monitora il clock rispetto al PC e "sputa" in risposta il miglior valore di interrupt all'ora (o giorno o a mese), con tanto di errore minimo e massimo (giusto per capire QUANTO ci si possa fidare del clock che si sta usando).

Poi possiamo pensare allo sleep, quando avremo tutti i mezzi per controllare che la cosa non influenzi le prestazioni della libreria!
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 10:59 pm
@lesto:
intanto che ti dico se è possibile fare una versione "al secondo" per tutti i micro e per tutte le frequenze, puoi spiegarmi come funziona la routine dell'interrupt?
Cosa aggiorni? Cosa sottrai? Non ho capito come funziona counterT.
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 11:04 pm
per la questione Sleep il datasheet pende dalla parte di Leo, fortunatamente  :)

Code: [Select]
If Timer/Counter2 is enabled, it will keep running during sleep. The device can wake up from
either Timer Overflow or Output Compare event from Timer/Counter2 if the corresponding
Timer/Counter2 interrupt enable bits are set in TIMSK2, and the Global Interrupt Enable bit in
SREG is set.


Quindi il timer overflow deve buttare giu' dal letto il micro, probabile errore quindi nel mio codice che ho allegato
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 11:06 pm
Però stiamo parlando di 328, tu hai un Atmega8, non so se è la stessa cosa.

Adesso proverò a fare un test sul mio Arduino, poi ti faccio sapere.
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 11:17 pm
A me lo sleep funziona:
Code: [Select]
#include <swRTC.h>
#include <avr/interrupt.h> //per usare gli interrupt
#include <avr/sleep.h> //per mettere in letargo il micro

swRTC rtc;
byte secondi;
boolean fatto;

void setup() {
    delay(2000);
    set_sleep_mode(SLEEP_MODE_PWR_SAVE);   // setta registri per il modo sleep
    sleep_enable();                        // abilita la sleep all'uso

    rtc.stopRTC();
    rtc.setTime(15,22,35);
    rtc.setDate(26,9,2011);
    rtc.startRTC();
    secondi=rtc.getSeconds();
    fatto=false;
    Serial.begin(19200);
   
}

void loop() {
    byte temp;
   
    sleep_mode();           // mette in letargo il micro
    sleep_disable();        // esce dal letargo e riporta il micro a piena operatività

    temp=rtc.getSeconds();
    if (secondi!=temp) {
        secondi=temp;
        fatto=true;
        Serial.print(rtc.getHours(), DEC);
        Serial.print(":");
        Serial.print(rtc.getMinutes(), DEC);
        Serial.print(":");
        Serial.print(rtc.getSeconds(), DEC);
        Serial.print("  ");
        Serial.print(rtc.getDay(), DEC);
        Serial.print("/");
        Serial.print(rtc.getMonth(), DEC);
        Serial.print("/");
        Serial.println(rtc.getYear(), DEC);
    } else {
        fatto=false;
    }
}
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 11:32 pm
tutti i test lifaccio su arduino UNO proprio per avere riferimenti comuni, poi dopo semmai alla fine vedro' come si coporta l'8A,

spetta vedo una cosa diversa, io non ho messo il define dell'interrupt, perche' credevo servisse solo se si usa linterrupt esterno su IN0-1.

ora provo subito
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 11:38 pm
Funziona anche senza, anzi non è necessario: è un rimasuglio di un copia/incolla perché ho unito 2 sketch.
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 11:41 pm
Niente,
scusa prova direttamente il mio esempio, e' fatto per avere due verifiche in una, e cioe' aprendo la seriale ti accorgi che:
- va in sleep quando non scrive piu' l'ora
- esce dallo sleep perche' riparte a scrivere l'ora
- guardando l'orario ti devi ritrovare nonostante per 5 secondi non abbia scritto

Code: [Select]
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <swRTC.h>
swRTC rtc;

unsigned long reset_timer = millis();  

void setup() {
   delay(2000);
   rtc.stopRTC();
   rtc.setTime(15,22,00);
   rtc.setDate(26,9,2011);
   rtc.startRTC();
   Serial.begin(19200);
   
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);   // setta registri per il modo sleep
  sleep_enable();                        // abilita lo sleep per l'uso
   
}

void loop() {
 
 
  if (millis() > reset_timer + 10000)
 {
  reset_timer=millis();
 }
 
 else if(millis() > reset_timer + 5000)
 {
  sleep_mode();            
  sleep_disable();                            
 }
   
   else
  {
   Serial.print(rtc.getHours(), DEC);
   Serial.print(":");
   Serial.print(rtc.getMinutes(), DEC);
   Serial.print(":");
   Serial.print(rtc.getSeconds(), DEC);
   Serial.print("  ");
   Serial.print(rtc.getDay(), DEC);
   Serial.print("/");
   Serial.print(rtc.getMonth(), DEC);
   Serial.print("/");
   Serial.println(rtc.getYear(), DEC);
   delay(1000);
  }
}
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 11:43 pm
Muore dopo 3 secondi:
15:22:0 - data
15:22:1 - data
15:22:2 - data
morte....
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 11:45 pm
Il mio sketch a me funziona. Tu dici "Niente". Cioè? Non gira? Si blocca?
Sennò è un problema di IDE. C'è qualcosa tra me e te di differente. E servirebbe la prova di un terzo per capire cosa.
Title: Re: swRTC
Post by: testato on Oct 10, 2011, 11:49 pm
il fatto che muore dopo 3 secondi e' OK, infatti se vedi e' fatto per restare operativo per 5 secondi (ne segna solo 3 perche' c'e' il tuo delay a 2 secondi, a porpositoa  ch serve ?)

dopo questi 3 secondi deve fermarsi la stampa, e deve stare ferma per 5 secondi, perche' in power down la seriale e' disabilitata, dopo deve pero' ripartire a stampare, senza perdere la data, invece non lo fa

il tuo anche a me funziona, quindi perche' questo non va ?
Title: Re: swRTC
Post by: leo72 on Oct 10, 2011, 11:50 pm
PS:
riguardando il tuo sketch mi pare che ci sia qualcosa di non logico nella gestione dell'if su quel contatore agganciato a millis e l'uso dello sleep. Secondo me il blocco del tuo codice parte da lì.
Title: Re: swRTC
Post by: testato on Oct 11, 2011, 12:04 am
mmm

se intendi la struttura dell'IF funziona perche' la uso regolarmente. il valvolare in test al mio fianco usa proprio quella struttura.

invece mi viene in mente una cosa, ma MILLIS e' legato al timer1, forse il timer1 e' spento durante power-save ?

infatti il tuo sketch non usa millis ma usa il uo stesso orologio prendendo seconds
Title: Re: swRTC
Post by: leo72 on Oct 11, 2011, 12:11 am
No, millis è agganciato sul timer 0. Cmq è spento, senz'altro. Con il power-save va solo il timer 2.
Allora è lì il problema.
Title: Re: swRTC
Post by: testato on Oct 11, 2011, 12:34 am
ottimo, risolta anche questa.
Resta il.fatto che Quasi 2mA sono troppi. Michele dacci un segno.
Title: Re: swRTC
Post by: lestofante on Oct 11, 2011, 12:41 am

@lesto:
intanto che ti dico se è possibile fare una versione "al secondo" per tutti i micro e per tutte le frequenze, puoi spiegarmi come funziona la routine dell'interrupt?
Cosa aggiorni? Cosa sottrai? Non ho capito come funziona counterT.


partiamo dal presupposto che il tempo è lineare, molto comodo perchè ci puoi giocare sopra di proporzioni.
ho anche detto che ora tutto si basa sul timestamp, ed infatti è così.
ho parlato di durata di un'ora in millisecondi (1000*60*60) perchè per ora funziona così, ma il termine corretto sarebbe "durata di un arco di tempo sufficientemente lungo in interrupt", per semplicità ora la chiamo X.
L'arco di tempo sufficientemente lungo vuol dire: più è grande meglio è, ma non deve superare il secondo altrimenti poi si perde di precisione sul timestamp, ovvero non lo vedremmo aggiornarsi di secondo in secondo ma solo una volta ogni tanto (il che potrebbe anche essere implementato, volendo, in teoria tutto si basa sul prescaler e overflow della variabile counterT).
Da notare che deltaT sparisce dai settaggi nella mia libreria, perchè dato che lavoravo con in mente l'ora sapevo che X=3600 (ovvero il numero di secondi che compone un'ora), e X+deltaT è uguale alla variabile hourDurationMS. In pratica deltaT è l'errore in numero interrupt all'ora.
Attenzione, la variabile che io chiamo timestamp, in realtà sarebbe da chiamare "timestamp sincronizzato", ovvero l'attuale tempo trascorso in secondi aggiornato ogni X+deltaT interrupt di X/1000, quindi timestamp è possiede il numero di secondi GIÀ CORRETTI trascorsi.
Se però aggiornassimo questo timestamp ogni secondo, non esiste un valore deltaT numero intero che permetta una sufficiente precisione per l'errore che abbiamo rilevato.
Quindi, nonostante timestamp possieda i secondi, verrà aggiornata solo ogno X+deltaT interrupt di X (quindi già comprende la correzione deltaT)

quindi countT ne deriva essere il "numero di interrupt trascorsi dall'ultimo aggiornamento del timestamp sincronizzato". Quindi countT NON possiede la correzione di deltaT.

Ora abbiamo un timestamp sincronizzato (ma non aggiornatissimo, anzi si aggiorna una volta ogni X+deltaT, hourDurationMS di un'ora nel caso della mia libreria) e un countT che possiede il numero di interrupt dall'ultimo aggiornamento. come facciamo a sapere il "timestamp sincronizzato e aggiornato al secondo"?

semplicemente così:
Code: [Select]
timestamp + map( counterT, 0, hourDurationMS, 0, 3600 );

ovvero il timestamp sincronizzato + counterT che moltiplica la proporzione tra X+deltaT(che ricordiamo essere in millisecondi) e X/1000(ovvero la durata che dovrebbe avere gli interrupt che abbiamo considerato IN SECONDI), quindi in pratica applichiamo la correzione deltaT in modo proporzionale (quindi in modo che non ci siano "salti anomali" nel conteggio) a counterT, ma senza modificare counterT (altrimenti rischi di applicarci più volte la correzione creando un bel macello)

come si nota la mia libreria per ora è pensata per lavorare in ore, quindi considera X+deltaT=hourDurationMS, e X=3600000 (ovvero 1000*60*60), quindi anche deltaT è l'errore iun millisecondi all'ora
se notate, nel setup ho settato hourDurationMS a 18000000: questo perchè per testare la libreria l'ho fatta correre al doppio della velocità per debuggarla più in fretta (e vi assicuro che il debug è stato lungo, almeno un'ora reale per via dei bug nelle funzioni di conversione), in pratica è come se avessi messo deltaT a -18000000.

um, mi rendo conto che la spiegazione è un po' incasinata, ma spero che sia sufficientemente esaustiva.
Title: Re: swRTC
Post by: leo72 on Oct 11, 2011, 12:43 am
@testato:
Se fosse un'auto, direi che è un "consumo combinato".
Cioè, se guardi il datasheet, a 20 MHz/5V il consumo in "active" è di 12 mA (pag. 507) mentre in Power-save è di 0.1 mA con clock a 4 MHz (possiamo ipotizzare 4 volte tanto con clock a 16 MHz?) (pag. 514).

Inoltre ti ricordi di spengere l'ADC prima dello sleep?
ADCSRA &= ~(1 << ADEN); //spenge l'ADC

Dal datasheet (pag. 512), senza il modulo ADC consuma il 22% in meno.

@lesto:
stavo postando mentre tu hai pubblicato il "papiro", ora lo leggo  ;)
Title: Re: swRTC
Post by: leo72 on Oct 11, 2011, 09:29 am
Ok. L'ho letto stamattina perché stanotte era davvero tanta roba  8)

Cmq non ci ho capito gran che, l'importante è che il concetto sia chiaro a te  :P

Riprendiamo il discorso, cosa vorresti quindi fare con il prescaler?
Vuoi un overflow al secondo? Non si può fare. Non col timer 2, che ha un contatore ad 8 bit. Serve il contatore a 16 bit del timer 1.
Però questo vale solo alcuni micro. Ad esempio il Tiny85 non ha un contatore a 16 bit, quindi la modifica non ci girerebbe.
Title: Re: swRTC
Post by: leo72 on Oct 11, 2011, 01:25 pm
Torno sul discorso sleep+swRTC.

La cosa non è fattibile. Facendo un test col codice che vi ho postato, potete notare come il led lampeggi più lentamente rispetto al semplice lampeggio dato dallo scandire della libreria, segno che i cicli di clock necessari al micro per uscire completamente dallo sleep e riattivare tutte le periferiche così come quelli per entrare in sleep spengendo le periferiche si fanno sentire eccome.

A questo punto mi sento di dire che la swRTC è utile solo se non serve un'estrema precisione, se si ha la necessità di usare un solo micro per fare tutto e se si ha a disposizione un'alimentazione non di emergenza.
Se questi requisiti non sono soddisfatti, la swRTC non fa per voi. Mi dispiace ammetterlo essendo la swRTC una mia creatura, ma è così.  :smiley-roll-sweat:
Title: Re: swRTC
Post by: lestofante on Oct 11, 2011, 01:55 pm

Riprendiamo il discorso, cosa vorresti quindi fare con il prescaler?
Vuoi un overflow al secondo? Non si può fare. Non col timer 2, che ha un contatore ad 8 bit. Serve il contatore a 16 bit del timer 1.
Però questo vale solo alcuni micro. Ad esempio il Tiny85 non ha un contatore a 16 bit, quindi la modifica non ci girerebbe.


voglio un interrupt che più -si avvicini- al secondo.

Quote
La cosa non è fattibile. Facendo un test col codice che vi ho postato, potete notare come il led lampeggi più lentamente rispetto al semplice lampeggio dato dallo scandire della libreria, segno che i cicli di clock necessari al micro per uscire completamente dallo sleep e riattivare tutte le periferiche così come quelli per entrare in sleep spengendo le periferiche si fanno sentire eccome.

possiamo lavorare su un deltaT dinamico, calcoliamo il deltaT in sleep, e poi ci serve un modo per sapere se stiamo entrando o uscendo dallo sleep (magari facciamo che gli sleep non li fai direttamente ma devi chiamare un metodo della libreria, che poi è una classe?)
Title: Re: swRTC
Post by: menniti on Oct 11, 2011, 02:20 pm

Torno sul discorso sleep+swRTC.

La cosa non è fattibile. Facendo un test col codice che vi ho postato, potete notare come il led lampeggi più lentamente rispetto al semplice lampeggio dato dallo scandire della libreria, segno che i cicli di clock necessari al micro per uscire completamente dallo sleep e riattivare tutte le periferiche così come quelli per entrare in sleep spengendo le periferiche si fanno sentire eccome.

A questo punto mi sento di dire che la swRTC è utile solo se non serve un'estrema precisione, se si ha la necessità di usare un solo micro per fare tutto e se si ha a disposizione un'alimentazione non di emergenza.
Se questi requisiti non sono soddisfatti, la swRTC non fa per voi. Mi dispiace ammetterlo essendo la swRTC una mia creatura, ma è così.  :smiley-roll-sweat:

Non ti riconosco più :(
Nessuno ti sta mettendo fretta, a parte Testato che testa in continuazione per nome e mestiere :D, stai realizzando un lavoro eccezionale, non puoi porgli dei limiti, tantomeno li puoi porre a te stesso; vuol dire che dove non arrivi ti fai aiutare da chi conosce cose che tu non conosci bene o non hai approfondito; quindi calcoli i cicli che si perdono con le operazioni di sleep e metti una correzione del conteggio ad ogni risveglio.
Amico mio, uno come me, checché se ne possa pensar poco o male, non tifa per chiunque, di certo non voglio resta deluso, di "certissimo" non mi devi più costringere a leggere frasi come "è utile solo se" o "Mi dispiace ammetterlo".
Se sei stanco, riprendi la stazione meteo che sta ritornando il bel tempo, e fra qualche giorno ti rimetti al lavoro.
A-LéO Oh Oh, A-LéO OH OH!!!  XD XD XD
Title: Re: swRTC
Post by: leo72 on Oct 11, 2011, 02:40 pm
@Michele:
grazie del tifo però cercavo solo di essere obiettivo. Alla fine, per rendere questa libreria precisa stiamo veramente progettando un RTC.  :smiley-sweat:

@lesto:
Il problema è che con il timer 2 non si può fare. 8 bit non bastano, neanche con il micro a 1 MHz. Se si usa un timer a 16 bit, oltre a tagliar fuori l'Attiny85, non si può usare lo sleep perché disattiva il timer 1.
Title: Re: swRTC
Post by: leo72 on Oct 11, 2011, 02:58 pm
@lesto:
questo codice "dovrebbe" fare un overflow al secondo (va solo su 328). Dico dovrebbe perché il valore di partenza per il contatore del timer 1 teoricamente è giusto, ma in pratica no!
A me pare che vada troppo veloce il lampeggio del led, mentre col valore commentato (che sarebbe la differenza tra 65536 e 49991) vada invece bene... Mah, non ci capisco molto....  :smiley-roll-sweat:

Quote

#include <avr/interrupt.h> //per usare gli interrupt

byte flag=0;
unsigned int CONTATORE=15625; //49911

/*IL CODICE SEGUENTE UTILIZZA IL TIMER1 PER GENERARE UN OVERFLOW OGNI SECONDO */
void setup(){
   pinMode(13, OUTPUT);
   SREG &= ~(1<<SREG_I);
   TIMSK1 &= ~(1<<TOIE1);
   //Prescaler/1024,
   TCCR1B |= (1<<CS12);
   TCCR1B &= ~(1<<CS11);
   TCCR1B &= ~(1<<CS10);
   // Modalità normale: incrementa il contatore fino all'overflow
   TCCR1A &= ~((1<<WGM11) | (1<<WGM10));
   TCCR1B &= ~((1<<WGM12) | (1<<WGM13));
   // Usa il clock intero dell'Atmega come fonte di clock per il prescaler
   ASSR |= (0<<AS2);
   // Attiva un segnale di interrupt all'overflow del contatore
   TIMSK1 |= (1<<TOIE1);
   /*valore iniziale del contatore: 1/(CLOCK_MICRO_IN_HZ/PRESCALER/(65536-VALORE_CONTATORE))=intervallo temporale
   1/(16000000/1024/(65536-49911))=1s   */
   TCNT1H=highByte(CONTATORE);
   TCNT1L=lowByte(CONTATORE);
   //attiva l'interrupt (vedi sotto)
   SREG|=1<<SREG_I;
   
}


/*Routine di interrupt */
ISR(TIMER1_OVF_vect) {
   TCNT1H=highByte(CONTATORE);
   TCNT1L=lowByte(CONTATORE);
   digitalWrite(13, flag?1:0);
   flag^=1;
}


//routine da eseguire per mettere in letargo il micro
void loop() {
   while (true) { }
}


EDIT:
il valore giusto è 15625. Non ci sono storie.
Title: Re: swRTC
Post by: lestofante on Oct 11, 2011, 05:45 pm

@lesto:
Il problema è che con il timer 2 non si può fare. 8 bit non bastano, neanche con il micro a 1 MHz. Se si usa un timer a 16 bit, oltre a tagliar fuori l'Attiny85, non si può usare lo sleep perché disattiva il timer 1.



nono, mi fai il codice col prescaler al massimo a 8 bit e quanto tempo passa tra un interrupt e l'altro?
Title: Re: swRTC
Post by: leo72 on Oct 11, 2011, 05:48 pm
A 16 MHz: 0,016384s
A 1 MHz: 0,262144s

Te l'ho detto, non si può fare col timer 2. Anche usando 1 MHz sei sempre fuori. 8 bit sono troppo pochi.
Title: Re: swRTC
Post by: lestofante on Oct 11, 2011, 05:50 pm

A 16 MHz: 0,016384s
A 1 MHz: 0,262144s

Te l'ho detto, non si può fare col timer 2. Anche usando 1 MHz sei sempre fuori. 8 bit sono troppo pochi.


chissene se non arrivo al secondo, già con
A 16 MHz: 0,016384s
abbiamo meno di 100 risvegli al secondo, ovvero 10 volte di meno! è già un bel risparmio!
Title: Re: swRTC
Post by: testato on Oct 11, 2011, 06:44 pm
innanzitutto faccio anche io i miei incoraggiamenti.
diventare ricchi non e' facile, e con la swRTC lo diventerete  :)
(perlomeno famosi)

io nel frattempo testo, ed i risulati ono buoni.

la 0.8.1 senza sleep perde la meta' delle precedenti, 0,25sec/ora

per ora mi fermo con i test e chiamatemi voi quando serve.

usare lo sleep, e ridurre i consumi in sleep per la batteria di backup resta una priorita', che influisce del 50% sul successo della lib.

nel frattempo faccio prove ad eliminare il piu' possibile, tipo adc ed altro, mi sembra che possiamo tgliere wotcdog, e BDO

dobbiamo scendere di molto i 1,45mA
Title: Re: swRTC
Post by: leo72 on Oct 11, 2011, 08:03 pm

la 0.8.1 senza sleep perde la meta' delle precedenti, 0,25sec/ora

Quale? La mia o quella di lesto? Per capire su quale lavorare.

Quote

usare lo sleep, e ridurre i consumi in sleep per la batteria di backup resta una priorita', che influisce del 50% sul successo della lib.

Va trovato il modo per bilanciare il continuo entra/esci dallo sleep.
Title: Re: swRTC
Post by: testato on Oct 11, 2011, 09:25 pm
scusa non la 081, m la 0.8.2, la tua ultima pubblicata.

per la riduzione dei consumi in sleep credo che sia corretta l'idea di lesto di allungare il piu' possibile l'overflow, in modo da risvegliare meno volte possibile il micro.
Title: Re: swRTC
Post by: leo72 on Oct 11, 2011, 09:44 pm


A 16 MHz: 0,016384s
A 1 MHz: 0,262144s

Te l'ho detto, non si può fare col timer 2. Anche usando 1 MHz sei sempre fuori. 8 bit sono troppo pochi.


chissene se non arrivo al secondo, già con
A 16 MHz: 0,016384s
abbiamo meno di 100 risvegli al secondo, ovvero 10 volte di meno! è già un bel risparmio!


Scusa se rispondo solo adesso. Non avevo visto il tuo replay.
Mi avevi chiesto 1 secondo  :P
Cmq se ti va bene anche così...ma come calibri poi la cosa? E' un valore che "suona male"  :smiley-yell: 0,016384  ]:D

Si potrebbe studiare di ottenere il massimo intervallo tra un overflow e l'altro ma qui entrano poi in gioco le diverse architetture, bisogna vedere se ogni micro supporta lo stesso prescaler massimo ecc... vediamo un po' cosa si tira fuori... se riuscissi ad arrotondarlo a 0,01 andrebbe benissimo. Sarebb 1/100 di secondo. Oppure 0,015... ci studio sopra.
Title: Re: swRTC
Post by: leo72 on Oct 11, 2011, 11:03 pm
Sai qual è il problema? E' che io ottengo numeri che sono potenze di 2 ma che poi danno dei resti se rapportati ad 1.
Ad esempio, posso ottenere un overflow ogni 0,0048-0,0064-0,0128s ecc..
Però se dopo fai 1/0,0048 hai 20,83333333..
Insomma, hai dopo uno scarto che si accumula e che ti sfalsa i calcoli. L'ottimo era ottenere una frazione di secondo perfetta, tipo appunto 0,0125. Ma per questi valori avrei bisogno di un contatore decimale, che non ho.
Title: Re: swRTC
Post by: lestofante on Oct 11, 2011, 11:12 pm
è un valore che va benissimo, come andrebbe benissimo qualsiasi valore: 0,016384 vuol dire esattamente 61.03515625 interupt al secondo, ovvero 6103515625 interrupt ogni 100.000.000 secondi, no? pari a circa 3 anni. Ciò vuol dire che timestamp sarà aumentato di 100.000.000 ogni 3 anni circa, ovvero ogni 6103515625 interrupt+deltaT

un unsigned long arriva a 4,294,967,295, quindi nessun problema, anzi possiamo aumentare ancora il tempo in cui si aggiorna il timestamp (il che aumenta la precisione imponibile tramite deltaT, ovvero la sua granulosità).

l'unico preoblema sono valori che danno parte decimale maggiore di 9 cifre!
Title: Re: swRTC
Post by: leo72 on Oct 11, 2011, 11:29 pm
Ora sono io che non ti seguo. Come pensi di "addirizzare" la cosa?
Title: Re: swRTC
Post by: lestofante on Oct 12, 2011, 12:21 am
ogni volta che countT arriva a 6103515625+deltaT, timestamp viene aumentato di 100.000.000, e countT azzerato.

e la map (che è spiegata nel papiro) diventa

map(contT, 0, 6103515625+deltaT, 0, 100000000);

a cui sommi timestamp per ottenere l'orario corrente (altrimenti ogni 3 anni circa si azzera, con timestamp arrivi a circa 140 anni, ovvero i 136 di overflow di timestamp + 3 anni di countT), quindi:

unsigned long timestampFinale=timestamp+map(contT, 0, 6103515625+deltaT, 0, 100000000);

edit: magari vi chiedete: perchè non aumentare solo di 1 timestamp... certo, l'overflow di timestamp si allontanerebbe fino alla fine dell'universo (o meglio di circa 12884902000 anni)
ma rimane l'overflow della povera variabile timestampFinale, e quindi bosognerebbe usare dei diversi tipi di dato più grandi dell'unsigned long, che però poi vorresti usare per timestamp etc etc.... alla fine arriveresti a creare una variabile di dimensione in byte variabile, e l'unico limite sarebbe il supporto di memorizzazione (prima la ram, poi sposti i calcoli direttamente su SD, e poi il mondo)
io non ho voglia di immischiarmi in una cosa del genere, fatevi bastare 140 anni a partire dal 1900, anzi settando la data di partenza a 2000 o quel che volete....

AZZ! volendo possiamo, lla mezzanotte del 31 dicembre ogni tot anni, spostare la data di riferimento a quella attuale (azzerando anche timestamp)... insomma al massimo arriveremmo all'anno 4,294,967,295, cambiando il tipo di dato che memorizza gli anni in unsigned long!! (ma si perdono gli anni negativi)
Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 12:36 am
Io sarò rinco... sarà l'ora tarda... sarà che sono a lavoro.... ma così tu correggi lo scostamento solo dopo 3 anni. O pare a me?
Title: Re: swRTC
Post by: lestofante on Oct 12, 2011, 12:38 am
no, la map serve apposta per correggere sempre lo sccostamento usando una proporzione (tanto il tempo è lineare). il timestamp serve solo per poter incrementare il tempo misurabile tramite l'RTC, anche se a quanto pare dall'AZZ nell'edit, ho trovato un modo per evitare l'uso di timestamp!

edit: anzi no, timestamp serve lo stesso perchè altrimenti bisogna litigare con i float. un anno in secondi è facilmente calcolabile ed è in numeri interi, in interrupt probabilmente no causa sfaso del deltaT!
Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 12:48 am
Ora non mi ci metto, domattina ti modifico la lib per avere il max intervallo fra 2 interrupt.
Devi avere un valore fisso oppure il codice che hai in mente si adatta a ciò che trova? Nel senso che non si potrà di sicuro avere lo stesso valore per micro con clock diversi, anzi, come hai visto, con clock bassi l'intervallo sarà molto più elevato.
Title: Re: swRTC
Post by: lestofante on Oct 12, 2011, 12:52 am
a me basta che 1/durataDelClock (con durataDelClock in microsec, millisec, sec, è indifferente) non superi le 9 cifre dopo la virgola, poi basta variare un solo valore (il massimo valore raggiungibile da countT)
Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 12:53 am
Ok. Domani ci lavoro. Ora ho poca voglia per i motivi di cui sopra  :smiley-sweat:
Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 10:48 am
@lesto:
in allegato trovi la libreria swRTC2 v. 0.9.
E' un fork della swRTC ma, per praticità, mantengo la numerazione delle versioni già adottate.

Ho riscritto la parte di setup dei timer in modo da applicare il massimo prescaler (1024) per qualsiasi frequenza della CPU e tipologia di micro.
Globalmente hai una variabile di tipo float che si chiama overflows e che contiene il numero di overflow (o chiamate all'interrupt) al secondo, in modo che tu possa adattare la tua routine di aggiornamento del timestamp sapendo questo valore.
Ad esempio, per un micro a 8 MHz, essa contiene 0,032768. Come vedi sono tutti valori inversi di potenze di 2 quindi come numero di cifre decimali non salgono mai oltre le 6.

Ho solo modificato la parte citata. Tutto il resto io non l'ho né toccato né fuso con la swRTClesto che avevi messo online. Se provi la lib così come sicuramente non funzionerà. Però io mi fermo, tu lavora su questa libreria, unifichiamo le cose altrimenti ognuno lavora su versioni differenti  ;)
Quando hai integrato la tua gestione dei timestamp, rimetti online la libreria che la metto nel primo post del thread.

Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 02:17 pm
Ho 2 notizie, una buona  XD ed una cattiva  =(

La buona notizia:
sono riuscito ad usare il modulo RTC dell'Atmega328 con un bel quarzino esterno da orologio da 32768 Hz e clock interno a 8 MHz.
Il modulo RTC (che sta per Real Time Counter) può essere pilotato in maniera asincrona (vuol dire slegato dal clock interno del micro) da un clock esterno. Siccome il modulo è ottimizzato per un quarzo da orologio, si può ottenere un magnifico overflow con periodo di 1 secondo spaccato  :smiley-yell:
Il tutto usando come componente aggiuntivo solo il suddetto quarzino (eventualmente con dei C per stabilizzare il segnale).
C'è un piccolo "ma": tale modulo non è presente su tutti i micro, manca ad esempio sui micro con core Tiny. Quindi si può usare questo metodo solo su Atmega8, Atmegax8, Atmega644, Atmega1280/2560.

La cattiva notizia:
al momento non sono riuscito a far funzionare contemporaneamente lo sleep ed il modulo. Ci sono dei problemi nell'uso di un segnale asincrono per pilotare il timer 2 e nell'uso contemporaneo dello sleep del micro, problemi che al momento non sono in grado di risolvere (sto leggendo il datasheet).
Title: Re: swRTC
Post by: lestofante on Oct 12, 2011, 02:50 pm
scusa, hai provato a usare il normale quarzo a 16MHz e mettere il quarzo da 32768 Hz su altri 2 pin con interrupt esterno? se non erro ad un pin dai 5v fissi e l'altro legge gli interrupt
Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 03:45 pm
Nel tuo modo si deve fare un interrupt software per leggere il quarzo mentre usando il modulo RTC è l'HW che gestisce la cosa per cui il segnale è perfetto.
Title: Re: swRTC
Post by: lestofante on Oct 12, 2011, 03:53 pm
col mio metodo devi gestire un interrupt alla frequenza di 32768 Hz, certo, marai lo elebori con qualche nanosecondo di errore, ma l'errore non si accumula perchè il riferimento è il quarzo.

è vero che viene gestito da software, ma con l'uso di un solo pin e quarzo da 32768 Hz, hai un RTC perfetto, sia che usi l'atmega (o attiny) a 8MHz che a 16MHz, tra l'altro il sistema credo sia compatibile con tutti i micro e tutte le board arduino!
Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 04:39 pm
Faccio delle prove.
Title: Re: swRTC
Post by: menniti on Oct 12, 2011, 04:51 pm
Scusate, ma non vorrei che alla fine del ciclo si avesse, come soluzione, il problema che si voleva risolvere :smiley-mr-green:
Cioè tutto era nato per non usare un RTC+quarzo 32768Hz, se ora si risolve tutto con un quarzo la differenza qual'è? Quella di aver creato un RTC con un tiny invece del PCF o quel che è? Diciamo che integrandolo nel 328 è buona vittoria, a patto di non avere problemi di sleep, altrimenti si torna all'RTC esterno, non fate scherzi! :smiley-sad-blue:
Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 04:59 pm
Sì, infatti. Se la soluzione diventa il reinventare la ruota, alla fine cui prodest?

Cmq non funziona col quarzo ed un interrupt.
Title: Re: swRTC
Post by: lestofante on Oct 12, 2011, 06:59 pm
bhè, se funzionasse avremmo inventato un RTC in grado di eseguire anche del codice a 8/16MHz (il lavoro dell'interrupt è trascurabile)... con la perdita di un solo PIN!

ciò non vuol dire buttare alle ortiche il resto del lavoro, è semplicemente un'aggiunta, e comunque sull'interrupt esterno del cristallo puoi risvegliare il micro, "solo" 32768 volte al secondo

insomma un RTC "intelligente"

secondo wikipedia il circuito equivalente è http://en.wikipedia.org/wiki/Crystal_oscillator#Resonance_modes (vedi a destra), non vedo perchè non dovrebbe funzionare...

ora metto il prescaler massimo alla mia versione e uppo
Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 07:49 pm

ciò non vuol dire buttare alle ortiche il resto del lavoro, è semplicemente un'aggiunta, e comunque sull'interrupt esterno del cristallo puoi risvegliare il micro, "solo" 32768 volte al secondo

Anche di meno, visto che con il prescaler a 1024 il micro si risveglia solo 32 volte in un secondo!

Ora ti dico cosa ho fatto io.
Ho messo il quarzino con 1 pin collegato a +5V e l'altro collegato direttamente al pin D2 del 328 standalone. Il pin D2 è collegato con l'INT0 del micro. Ho quindi messo un attachInterrupt(0, routine, LOW/HIGH/CHANGE)... le ho provate tutte... In routine un semplice lampeggio di un led. E non andava, né in modalità normale né in sleep.
Semplicemente il pin non "sentiva" i livelli di segnale del quarzino.

Title: Re: swRTC
Post by: menniti on Oct 12, 2011, 08:01 pm


ciò non vuol dire buttare alle ortiche il resto del lavoro, è semplicemente un'aggiunta, e comunque sull'interrupt esterno del cristallo puoi risvegliare il micro, "solo" 32768 volte al secondo

Anche di meno, visto che con il prescaler a 1024 il micro si risveglia solo 32 volte in un secondo!

Ora ti dico cosa ho fatto io.
Ho messo il quarzino con 1 pin collegato a +5V e l'altro collegato direttamente al pin D2 del 328 standalone. Il pin D2 è collegato con l'INT0 del micro. Ho quindi messo un attachInterrupt(0, routine, LOW/HIGH/CHANGE)... le ho provate tutte... In routine un semplice lampeggio di un led. E non andava, né in modalità normale né in sleep.
Semplicemente il pin non "sentiva" i livelli di segnale del quarzino.


non è che servono un paio di condensatorini come per i quarzi standard, magari una decina di pico per pin, in modo da alzare un po' i livelli di segnale?
Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 08:06 pm
Uhm.. mi fai una domanda a bruciapelo... a memoria direi... che non me lo ricordo. E se non me lo ricordo, è più facile no che sì.

Cmq fino a domani non posso verificare.
Title: Re: swRTC
Post by: menniti on Oct 12, 2011, 08:23 pm

Uhm.. mi fai una domanda a bruciapelo... a memoria direi... che non me lo ricordo. E se non me lo ricordo, è più facile no che sì.

Cmq fino a domani non posso verificare.

Ho trovato più di uno schema che usa un compensatore (condensatore variabile a vite) da 5-25pF in serie tra l'alimentazione ed il "positivo" del quarzo, credo che serva per la correzione della frequenza, puoi provare con un valore fisso da 18-22.
http://www.danomsk.ru/pdf/459945.pdf (http://www.danomsk.ru/pdf/459945.pdf)
quest'altro invece porta proprio i condensatori tipici da 6pF, anche se li indica come opzionali, quindi puoi tentare
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_DIAGRAM/SCHEMATICPACK/rtc_dongle_schematic.pdf (http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_DIAGRAM/SCHEMATICPACK/rtc_dongle_schematic.pdf)
Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 08:30 pm
Il PCF8563 usa solo un C su OSCO perché su OSCI ce l'ha integrato (lo conosco bene quell'RTC).

Ora che ci ripenso non li avevo montati neanche quando lo avevo collegato ai piedini del 328 perché tanto era una prova al volo, e funzionava lo stesso. Ecco perché poi ho fatto il test senza metterli, semplicemente perché non ce li avevo per le mani  :smiley-sweat:
Title: Re: swRTC
Post by: lestofante on Oct 12, 2011, 08:50 pm
prova a vedere col multimetro, magari non arriva a 3V il segnale del quarzo, e i pin atmega son fatti apposta per vederlo lo stesso (però in effetti.. perchè si collegano 2 pin e non solo 1? vuoi vedere che l'alimentazione va scambiata ad ogni clock?)
Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 08:55 pm
Come ho detto, adesso non posso (non sono a casa  :smiley-roll-blue: ).
La questione dell'1 o 2 pin vale per un vero clock. Ossia, coni fuse puoi dire al micro se usare un quarzo esterno oppure un segnale di clock: nel primo caso si usano 2 pin perché appunto uno alimenta il quarzo e l'altro viene usato per leggere il segnale. Nel secondo caso si usa un pin solo perché basta leggere il segnale, o meglio le variazioni alto/basso del segnale.

Però qui sto usando un quarzo come oscillatore, per avere appunto un segnale alto/basso, e l'alimentazione gliela fornisco io invece del micro. Boh...
Title: Re: swRTC
Post by: testato on Oct 12, 2011, 11:11 pm
Se volete faccio dei test con oscilloscopio per vedere realmente il comportamento del quarzo gestito dai due pin micro ed invece alimentandolo a parte come volta data letto.
Per i condensatori sono obbligatori perché ogni quarzo viene dichiarato poter un certo carico capacitivo. Forse gli rtc reali li integrano nel chip se non sono esterni. Il trucco del compensatore serve per la calibrazione, in pratcica DeltaT lo sostituisce ed e' piu moderno.
Title: Re: swRTC
Post by: leo72 on Oct 12, 2011, 11:14 pm
Se hai un quarzino da orologio, prova mettendolo tra +5V e GND senza C e poi con C. E guarda che segnale esce, per capire che tipo di variazione sul pin devo intercettare.

Title: Re: swRTC
Post by: leo72 on Oct 14, 2011, 09:11 am
Lestuccio mio.... hai fatto le modifiche alla lib?  :smiley-sweat:
Title: Re: swRTC
Post by: testato on Oct 14, 2011, 05:59 pm
Leo ecco il tuo test:
Ho in questo momento la sonda del mio fidato TDS2012 connessa tra pin10 e gnd di arduino Uno (quindi risuonatore ceramico)
rilevo i 16MHz, 70mV p/p, con un offset dc di 600mV

Stessi risultati su uno standalone con quarzo reale
Title: Re: swRTC
Post by: lestofante on Oct 14, 2011, 06:47 pm
no, scusami ma in questi giorni mi sto perdendo nel completare l'elettronica del quadricoso, spero di finirla domani o dopodomani..
Title: Re: swRTC
Post by: menniti on Oct 14, 2011, 07:24 pm

Leo ecco il tuo test:
Ho in questo momento la sonda del mio fidato TDS2012 connessa tra pin10 e gnd di arduino Uno (quindi risuonatore ceramico)
rilevo i 16MHz, 70mV p/p, con un offset dc di 600mV

Stessi risultati su uno standalone con quarzo reale


Ciao, già che ci sei:
Prova a mettere tra il pin 10 e il puntale della sonda un condensatore da 1µF in serie
risultato?
Prova a mettere la sonda su 10:1
risultato?
Title: Re: swRTC
Post by: testato on Oct 14, 2011, 07:42 pm
Mi piace testare, ma non le misure inutili ?
Quello che chiedi non ha senso  :)
Title: Re: swRTC
Post by: menniti on Oct 14, 2011, 07:50 pm

Mi piace testare, ma non le misure inutili ?
Quello che chiedi non ha senso  :)


Io non chiedo mai cose che non hanno senso, piuttosto sto zitto; se poi non ne capisci il significato non è colpa mia. Fai finta di nulla ed ignora il mio post, te ne prego, vivi tranquillo col tuo televisore da 5", è a colori almeno? :D
Title: Re: swRTC
Post by: testato on Oct 14, 2011, 07:52 pm
se vuoi ti spiego l'insulsatezza delle tue richieste, non ho problemi  :)
Title: Re: swRTC
Post by: menniti on Oct 14, 2011, 07:59 pm

se vuoi ti spiego l'insulsaggine delle tue richieste, non ho problemi  :)


No, no, va a finire che mi convinci, mi tengo la mia ignoranza e me le faccio da solo le misure, gli oscilloscopi non mi mancano XD
Title: Re: swRTC
Post by: testato on Oct 14, 2011, 08:09 pm
troppo facile, te lo spiego ugualmente, ne va della tua crescita professionale (a limite restera' utile ad altri)  :)

Condensatore:
gli oscilloscopi hanno il disaccoppiamento DC settabile, che ho usato proprio per poter valutare e comunicare i valori della componente AC e DC. In poche parole il tuo condensatore e' presente e gestibile manualmente anche sugli oscilli 20MHz analogici vecchio stampo

Sonda10:1
Parliamo di un segnale di bassissima tensione, cambiare il rapporto della sonda a 10:1 non ha nessun valore aggiunto. Visto che ho una risoluzione di 2mV sul mio tektronix posso misurare tranquillamente quel valore con 1:1
Title: Re: swRTC
Post by: menniti on Oct 14, 2011, 08:17 pm
Beh, la tua spiegazione conferma il fatto che tu non abbia capito nulla di ciò che ti stavo chiedendo; la prova sta nel fatto che hai pensato che volessi farti usare la sonda 10:1 per aumentare la risoluzione, mi viene il dubbio che tu ti stia confondendo sul suo funzionamento. Il mio dubbio è in tutt'altra direzione, come ho sperimentato giorni fa in una situazione simile, ma non vale la pena stare ad incasinare il Topic, ripeto fai finta che io non ti abbia chiesto nulla, non scherzo. Ciao.
Title: Re: swRTC
Post by: testato on Oct 14, 2011, 08:40 pm
guarda se vuoi io posso tranquillamente farlo il test, anzi ora lo faccio.

Fatto:
con i condensatore non cambia nulla, il segnale e' sempre lo stesso
con il cambio rapporto non cambia nulla, il segnale e' smepre lo stesso

ora pero' mi spieghi perche' lo hai chiesto  :)
Title: Re: swRTC
Post by: menniti on Oct 15, 2011, 12:03 am

guarda se vuoi io posso tranquillamente farlo il test, anzi ora lo faccio.

Fatto:
con i condensatore non cambia nulla, il segnale e' sempre lo stesso
con il cambio rapporto non cambia nulla, il segnale e' smepre lo stesso

ora pero' mi spieghi perche' lo hai chiesto  :)


Non ti credo 8) :P
Appena possibile le faccio io sul serio queste misurazioni, poi ti spiego il motivo, non è detto che cambi qualcosa, infatti ti avevo detto di fare la prova, ma davvero mi pare strano che tu non riscontri differenze.
Title: Re: swRTC
Post by: leo72 on Oct 15, 2011, 12:06 am
Intanto vi aggiorno: anche col C non c'è stato verso di farlo andare, quell'interrupt sul piedino con il quarzo in serie.
Title: Re: swRTC
Post by: testato on Oct 15, 2011, 12:07 am
giuro, le ho fatte.

il segnale e' sempre lo stesso, onda sinusoidale con i valori di cui sopra. fermo restando le conseguenze delle due modifiche, cioe' con il C esterno posso fare la misura anche tenendo l'oscillo su DC logicamente, e con la sonda 10:1 cambia la scala, per il resto e' tutto esattamente simile, ed e' proprio questo che mi aspettavo e che mi ha portato alla prima risposta.

Attendo i tuoi test, ora sono curioso :)

Title: Re: swRTC
Post by: menniti on Oct 15, 2011, 12:22 am
Probabilmente l'hai scritto ma io ormai mi sono perso il filo, il quarzo lo hai collegato dove è previsto da datasheet o stai cercando di utilizzarlo su un altro pin del micro?

@ Testato: ora ti credo... entrambi i tipi di prove servivano per verificare che il segnale non venisse diminuito a causa dell'impedenza della sonda (una volta si chiamava "carico da sonda"); una sonda in configurazione 1:1 ha un'impedenza di 1Mohm, in casi simili tale valore non è elevato come sembra e può incidere negativamente sull'ampiezza del segnale; la sonda messa su 10:1 porta l'impedenza a 10Mohm quindi l'influenza sul segnale diventa quasi nulla, naturalmente sul DSO vedi un'onda dieci volte più piccola, però moltiplicandola x10 facilmente è più ampia di quella misurata originariamente; non sto a spiegare tanto mi capisci benissimo.
La "tecnica" del condensatore in serie non è altro che un trucchetto per non far "sentire" la sonda al segnale, quindi qualcosa di simile alla 10:1, ma a volte anche più efficace.
Lavorando sulla mia barriera ad IR ho incontrato questo problema misurando la frequenza di pilotaggio del LED IR direttamente sull'anodo; per misurare il valore reale sono dovuto appunto ricorrere a quanto ti ho appena spiegato; questa problematica esiste quasi sempre con segnali di bassa intensità in corrente, ecco perché voglio farla questa verifica.
Title: Re: swRTC
Post by: testato on Oct 15, 2011, 12:49 am
ok tutto chiaro,
a questo punto credo che cmq i valori siano confermati, logicamente se vuoi provare anche tu per ulteriore conferma puo' solo far bene.
E con questi valori in gioco credo ci sia ben poco di rilevabile, cioe' x Leo, non ci sono i margini per rilevare l'oscillazione del quarzo senza creare anche un circuito oscillante eserno al  micro.

che poi non ricordo piu' nemmeno io, l'idea che stai seguendo e' usare due quarzi ? uno da 16 ed uno da 0,32 ?
Title: Re: swRTC
Post by: leo72 on Oct 15, 2011, 12:52 am

Probabilmente l'hai scritto ma io ormai mi sono perso il filo, il quarzo lo hai collegato dove è previsto da datasheet o stai cercando di utilizzarlo su un altro pin del micro?

Immagino ti riferisci a me. Erano prove che si facevano io e lesto per usare un quarzo in modalità seriale colelgandolo ad un solo pin del micro e sfruttando l'interrupt sul cambio di stato del pin per avere un clock esattamente di 1Hz. Solo che non riesco a farlo andare così
Title: Re: swRTC
Post by: menniti on Oct 15, 2011, 12:57 am


Probabilmente l'hai scritto ma io ormai mi sono perso il filo, il quarzo lo hai collegato dove è previsto da datasheet o stai cercando di utilizzarlo su un altro pin del micro?

Immagino ti riferisci a me. Erano prove che si facevano io e lesto per usare un quarzo in modalità seriale colelgandolo ad un solo pin del micro e sfruttando l'interrupt sul cambio di stato del pin per avere un clock esattamente di 1Hz. Solo che non riesco a farlo andare così

Sì, certo, dicevo a te; allora se usi un ingresso specifico, quei pin sono collegati internamente ad un amplificatore-squadratore di segnale; se vuoi collegarlo ad un pin qualsiasi allora non puoi usare un quarzo, ma devi usare un oscillatore quarzato, in pratica un mattoncino che contiene sia il quarzo che i componenti attivi, ha 4 pin: due per l'alimentazionee e due da cui ti esce la frequenza nominale con una bella onda quadra a livello logico standard.
Title: Re: swRTC
Post by: lestofante on Oct 15, 2011, 12:58 am
sì, questo casino è nato per vedere la fattibilità del doppio quarzo, che secondo me si sta allontanando, anche se il circuito per rendere rilevabile il quarzo sia di semplice "costruzione" bisogna vedere se è meno costoso di un normale RTC.

avete anticipato la mia risposta. perchè al quarzo servono 2 pin?

ho scaricato la 0.9, stasera son fuso, mi guardo qualche puntata di qualche serie e poi do un'occhiata al codice (spero di cavarmela con un brutale copia/incolla)
Title: Re: swRTC
Post by: testato on Oct 15, 2011, 01:17 am
si fa quel che si puo'  :)

non appena si parlo' di usare un quarzo su un pin strorsi il naso, non avevo mai fatto test su quarzi ma intuivo che i valori in gioco non lo permettevano.
Tutto cioe' che serve ad un quarzo per oscillare e' integrato nei micro, e per questo che lo si puo' attaccare solo su determinati pin.
Non ha senso questa strada perche' al posto di costruire un oscillatore esterno prendi un Rtc.

ha piu' senso a questo punto usare il micro in modalita' 32KHz quarzo + 8MHz interni, oppure lasciarla cosi', con i 16MHz e basta.
Resta il problema batteria backup

io nel frattempo ho ordinato uno schedino RTC da 6 euro che include batteria, 5 anni di autonomia senza corrente, alimentato, e quindi con la batteria a sopperire solo temporanei blackout, si arriva alla naturale morte della stessa  :)

Title: Re: swRTC
Post by: leo72 on Oct 15, 2011, 01:26 am
A me l'idea del quarzo da 32 kHz mi piace.

Io direi comunque una cosa: la libreria va bene così, appena lesto completa i calcoli per tornare dal timestamp all'ora/data, faccio una modifica ed implemento una funzione RTCmodule con la quale si informa la lib che il micro opera con oscillatore interno ed ha disponibile il quarzino esterno, per chi vuole una buona precisione di calcolo e può rinunciare a 2 pin.
Title: Re: swRTC
Post by: lestofante on Oct 15, 2011, 02:27 am
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:

Code: [Select]
  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
Code: [Select]
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:
Code: [Select]
return timestamp + map( counterT, 0, overflows+delta, 0, secondsRapresented );

infine abbiamo di nuovo il delta:
Code: [Select]
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
Title: Re: swRTC
Post by: lestofante on Oct 15, 2011, 03:18 am
bug trovati: i commenti nell'interrupt si riferiscono all'ora, ma sono solo rimasugli del vecchio codice.

l'if in setDelta()
Code: [Select]
if ( delta<=overflows)
è sbagliato, corretto diventa:

Code: [Select]
if ( deltaT<=overflows)
Title: Re: swRTC
Post by: leo72 on Oct 15, 2011, 04:01 pm
Ciao. Stamattina ho avuto da fare (figli a casa), vedo di dare un'occhiata ai tuoi quesiti e di controllare il codice.
Title: Re: swRTC
Post by: leo72 on Oct 15, 2011, 04:18 pm
Allora... è vero. La formula non dà gli overflow ma la loro durata. La formula non è mia, l'ho trovata sul forum ma non mi ricordo male. Probabilmente ho mal interpretato la spiegazione di quello che la mise ma, siccome la usavo solo per i millisecondi, pareva a logica che mi tornasse. Difatti anche quando ho provato il quarzino con il modulo RTC c'era qualcosa che non mi tornava, ricordi?

Detto questo, questo calcolo si può levare, se non ho capito male perché lo hai sostituito con quello con i long, giusto?

Per la questione del delta, che ordini di grandezza raggiungono i numeri con cui lavori? Sapendolo, si potrebbe fare in modo di far inserire all'utente un parametro da riportare poi nel range giusto.
Title: Re: swRTC
Post by: menniti on Oct 15, 2011, 04:27 pm

Per la questione del delta, che ordini di grandezza raggiungono i numeri con cui lavori? Sapendolo, si potrebbe fare in modo di far inserire all'utente un parametro da riportare poi nel range giusto.

cosa buona sarebbe :)
Title: Re: swRTC
Post by: lestofante on Oct 15, 2011, 04:34 pm
giusto, non ci avevo pensato, esattamente come uso la map per cavarci i secondi veri, si può usare la map al contrario per settare il delta!!

Quote
Detto questo, questo calcolo si può levare, se non ho capito male perché lo hai sostituito con quello con i long, giusto?

sì, è stato sostituito con i long perché non mi fido della precisione dei float. potrei tentare di estrarre la matissa, ma poi tutti calcoli in base 2... sbatti

Quote
Per la questione del delta, che ordini di grandezza raggiungono i numeri con cui lavori?


secondsRapresented diventa 1000000 sia 16 che 8 MHz.

però ho trovato un altro bug:

nel while non è
Code: [Select]
secondsRapresented+=10;//the number of seconds duration rapresent

ma

Code: [Select]
secondsRapresented*=10;//the number of seconds duration rapresent
Title: Re: swRTC
Post by: leo72 on Oct 15, 2011, 05:19 pm
Ok. Ecco la libreria, nata dall'integrazione della precedente con le tue ultime modifiche.

Devi spiegarmi a che serve il metodo updateDate perché sinceramente non l'ho capito. Non è chiamato da nulla, non accetta nessun parametro in ingresso. Ho aggiornato anche la revisione delle versioni ed il file Readme (senza updateDate). Ho anche aggiornato il file keywords: adesso colora i nuovi metodi ed oggetti.

PS:
ho tolto i riferimenti al "fork" dato che stiamo lavorando alla stessa libreria, altrimenti si confonde la gente e basta  ;)

PPS:
da PROVARE, ho solo provato la compilazione
Title: Re: swRTC
Post by: lestofante on Oct 15, 2011, 07:08 pm
il metodo updateDate(), a partire dal timestamp aggiorna la struttura "data" (è dichiarata e inizializzata nel file .h). Essendo una struttura pubblica, può essere acceduta (ummm suona male) dall'esterno. Quindi il timestamp è aggiornato real time, la data solo quando serve.
L'ideale sarebbe eliminare quella struttura pubblica, creare un motodo getData() che ritorna una struttura mallocata al momento, ma senza un garbage collector è molto facile che "sprovveduti" della programmazione OO creino garbage.

La soluzione migliore è rendere la struttura privata, utilizzare i classici metodi getOre, etc.. e ognuna di queste funzioni per prima cosa chiama updateTime, e poi la funzione ritorna il valore contenuto nella struttura.
Title: Re: swRTC
Post by: leo72 on Oct 15, 2011, 08:05 pm
Sì, ho visto che è dichiarata nell'header ma non ne capivo la funzione.
Però va messa nel "retrobottega", senz'altro. Per 2 motivi: il primo è quello che hai detto tu, il secondo è perché l'aggiornamento delle variabili di stato va fatto secondo me sempre, perché il programma non può sapere se l'utente quando chiama la funzione di impostazione dell'orologio cambia solo l'ora o la data e se l'ora, durante il cambiamento, influenza anche l'orario.
Title: Re: swRTC
Post by: lestofante on Oct 16, 2011, 01:11 am

il secondo è perché l'aggiornamento delle variabili di stato va fatto secondo me sempre, perché il programma non può sapere se l'utente quando chiama la funzione di impostazione dell'orologio cambia solo l'ora o la data e se l'ora, durante il cambiamento, influenza anche l'orario.


ASSOLUTAMENTE NO!

aggiornare sempre vuol dire aggiornare dall'interrupt, ovvero calcoli inutili che diminuiscono la precisione.

E il programma SA quando l'utente cambia le impostazioni, perché non lo può fare direttamente sulle variabili (se lo fa è un errore, e volendo lo si può rendere rilevabile) ma deve chiamare le opportune funzioni, che quindi si prendono carico di effettuare i giusti cambiamenti (esattamente come le varie get chiamano updateTime(), le set richiameranno qualcosa stile resetTime() o simile)

Quote
Però va messa nel "retrobottega"

sicuramente, e quindi dovrà essere trasformato in un metodo privato della classe, ma potrà essere fatto solo quando anche la struttura "data" sarà privata e accessibile via get
Title: Re: swRTC
Post by: testato on Oct 20, 2011, 04:24 pm
oggi mi e' arrivato l'rtc e stavo cercando info per la sua implementazione, arrivo alla libreria TIME e leggo:
"The Time library adds timekeeping functionality to Arduino with or without external timekeeping hardware"

WITHOUT EXTERNAL HARDWARE ???

Che significa ? Che differenza c'e' con la tua lib ?
Title: Re: swRTC
Post by: testato on Oct 20, 2011, 04:29 pm
TUTTO OK :)

-------------------------
- TimeSerial.pde shows Arduino as a clock without external hardware.
  It is synchronized by time messages sent over the serial port.
  A companion Processing sketch will automatically provide these messages
  if it is running and connected to the Arduino serial port.
--------------------------
Title: Re: swRTC
Post by: testato on Oct 20, 2011, 07:34 pm
spetta spetta, pero' c'e' uno sketch che fa da orologio per arduino, e funziona pure, quindi nella libreria TIME ufficiale gia' esiste la funzione che stai creand tu con la tua lib ?  :smiley-eek-blue: :smiley-eek-blue:

Code: [Select]

/*
* TimeRTC.pde
* example code illustrating Time library with Real Time Clock.
*
*/

#include <Time.h>  
#include <Wire.h>  
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t

void setup()  {
 Serial.begin(9600);
/*  setSyncProvider(RTC.get);   // the function to get the time from the RTC
 if(timeStatus()!= timeSet)
    Serial.println("Unable to sync with the RTC");
 else
    Serial.println("RTC has set the system time");      
*/
}

void loop()
{
  digitalClockDisplay();  
//  delay(1000);
}

void digitalClockDisplay(){
 // digital clock display of the time
 Serial.print(hour());
 printDigits(minute());
 printDigits(second());
 Serial.print(" ");
 Serial.print(day());
 Serial.print(" ");
 Serial.print(month());
 Serial.print(" ");
 Serial.print(year());
 Serial.println();
}

void printDigits(int digits){
 // utility function for digital clock display: prints preceding colon and leading 0
 Serial.print(":");
 if(digits < 10)
   Serial.print('0');
 Serial.print(digits);
}
Title: Re: swRTC
Post by: menniti on Oct 20, 2011, 07:42 pm
Lo dicevo io che finiva che ci mordevamo le chiappe con sta storia :smiley-mr-green:
Non perdiamo di vista che l'obiettivo di Leo era evitare di usare hardware esterno, stai dicendo che lo sketch che hai postato fa diventare Arduino un RTC senza quarzi esterni e quant'altro :smiley-eek-blue:? cosa cavolo dici Willy?
Title: Re: swRTC
Post by: testato on Oct 20, 2011, 08:14 pm
prova a caricarlo e vedi, lanci la seriale e lui inizia a contare dal 1 gennaio 2000 senza null'altro attaccato  :smiley-eek-blue:
Title: Re: swRTC
Post by: leo72 on Oct 20, 2011, 10:11 pm
Beh, è normale visto che funzioni visto che usa millis()... basta dare un'occhiata al suo sorgente.
La swRTC usa invece un timer tutto suo interrupted ha la correzione per allineare il tempo calcolato al tempo reale.
E' un approccio differente ma, secondo me, molto migliore dato che non usa funzioni precostituite di Arduino ma direttamente gli interrupt.
Title: Re: swRTC
Post by: menniti on Oct 20, 2011, 11:43 pm

Beh, è normale visto che funzioni visto che usa millis()... basta dare un'occhiata al suo sorgente.
La swRTC usa invece un timer tutto suo interrupted ha la correzione per allineare il tempo calcolato al tempo reale.
E' un approccio differente ma, secondo me, molto migliore dato che non usa funzioni precostituite di Arduino ma direttamente gli interrupt.

cioè è possibile usarlo mentre sul micro gira un altro software che usa la tua lib come se fosse un RTC esterno, giusto? MI pareva questo l'obiettivo iniziale.
Title: Re: swRTC
Post by: leo72 on Oct 20, 2011, 11:57 pm
Esatto.
La forza di una routine che gira in un interrupt è che è trasparente allo sketch dell'utente. Quest'ultimo può accedere al primo ma è come accedere ad un sistema chiuso.

Immagina di ordinare una pizza per telefono o di fartela in casa. Nel primo caso alzi la cornetta, fai l'ordine, poi torni a lavorare finché non suonano alla porta e te la consegnano. Nel secondo caso, sei costretto ad interrompere ciò che stavi facendo, prendere gli ingredienti, impastare la pizza e metterla in forno, dopodiché tornare periodicamente a vedere se è pronta.
Title: Re: swRTC
Post by: menniti on Oct 21, 2011, 12:11 am

Esatto.
La forza di una routine che gira in un interrupt è che è trasparente allo sketch dell'utente. Quest'ultimo può accedere al primo ma è come accedere ad un sistema chiuso.

Immagina di ordinare una pizza per telefono o di fartela in casa. Nel primo caso alzi la cornetta, fai l'ordine, poi torni a lavorare finché non suonano alla porta e te la consegnano. Nel secondo caso, sei costretto ad interrompere ciò che stavi facendo, prendere gli ingredienti, impastare la pizza e metterla in forno, dopodiché tornare periodicamente a vedere se è pronta.

Leo :smiley-fat: :smiley-fat: :smiley-fat: :smiley-fat: mi vuoi far crepare? hai notato che sono sparito 4 ore? ero tranquillo nel mio lab quando mi arriva LA TELEFONATA dell'anno "scommetto che hai dimenticato il nostro anniversario! ]:D! ]:D", «chi io? fossi matta? e come potrei, dopo SOLI 26 anni? :~ :* :smiley-sad-blue: :smiley-red: :smiley-mr-green:» Stavo giusto per venirti a prendere per andare a cena nel miglior Ristorante della zona, era una sorpresa e me l'hai guastata :smiley-mr-green: :smiley-mr-green:".
Ho rastrellato le mie figliole in fretta e furia, in 3/4 d'ora tutti tirati a lucido, minchia che mangiata, e che conto $) $) $), ora sto scrivendo sdraiato, non riesco a stare seduto, troppa compressione sullo stomaco :smiley-fat: E TU MI PARLI DI PIZZA? ]:D ]:D ]:D
Title: Re: swRTC
Post by: testato on Oct 21, 2011, 12:19 am
Buon anniversario  :

Leo quindi ad esempio se suo usa la Time non sui può usare millis negli scketch perché influenzerebbe anche l' orario ?

Ma come si usa questa Time per RTC esterno? Negli esempi non trovo nulla
Title: Re: swRTC
Post by: menniti on Oct 21, 2011, 12:22 am

Buon anniversario  :

Leo quindi ad esempio se suo usa la Time non sui può usare millis negli scketch perché influenzerebbe anche l' orario ?

Ma come si usa questa Time per RTC esterno? Negli esempi non trovo nulla


Grazie! aggiusta la prima frase che non è molto comprensibile a prima occhiata.
Title: Re: swRTC
Post by: leo72 on Oct 21, 2011, 12:25 am
Condoglianze  XD XD

Cmq mi par di capire che la Time non pregiudichi l'uso di millis perché esegue dei calcoli propri. Poi non so, andrebbe visto meglio il codice.
Title: Re: swRTC
Post by: testato on Oct 21, 2011, 12:33 am
Scusa menny ma sto scrivendo dal cellulare. Leo cmq ha capito la domanda.
Title: Re: swRTC
Post by: menniti on Oct 21, 2011, 12:35 am

Condoglianze  XD XD

sei un vero amico  :*

@ Testato, ora l'ho capita anch'io, ci sono un paio di parole "suo" "sui" ma sono io in piena crocodile-digest e ho poco sangue al cervello :smiley-eek-blue:
Me ne vado a dormire, buonanote ragazzi, a domani XD
Title: Re: swRTC
Post by: testato on Oct 21, 2011, 09:24 pm
Aggiungo il risultato di  un bel test, il mio RTC reale con 1307 ha perso 7 secondi in un giorno, alla faccia della precisione :)
Leo a questo punto credo che la tua libreria potrebbe davvero spaccare se si risolve la questione consumi e si aggiunge il deltaT funzionante
Title: Re: swRTC
Post by: lestofante on Oct 21, 2011, 09:28 pm
hai testato l precisione della libreria modificata che ho postato al messaggio #363
Title: Re: swRTC
Post by: testato on Oct 21, 2011, 09:44 pm
ho smesso i test su questa libreria perche' cmq voglio chiudere questo progetto, altrimenti rimango bloccato su questo, e visto che non posso rinunciare alla batteria di nackup per ora non ci sono sbocchi.
Cioe' la questione consumi e' prioritaria rispetto alla precisione.
Se ci sono sviluppi sulla questione consumi posso ricominciare con i test
Title: Re: swRTC
Post by: leo72 on Oct 21, 2011, 09:52 pm
Adesso sono dietro al problema della UNO che non fa più l'ISP.
Settimana nuova se ho tempo mi rimetto a lavorarci sopra.
Title: Re: swRTC
Post by: testato on Oct 21, 2011, 11:37 pm
Non devi mica giustificarti  :)

Guardando bene questo rtc che ho preso ha un cubetto nero al posto del quarzo e niente condensatori, sarà un ceramico e quindi precisione pessima. Il cinese mi ha.fregato :)

Mi tocca modificarlo, alla fine dei giochi mi costera 15 euro se mi va bene
Title: Re: swRTC
Post by: leo72 on Oct 21, 2011, 11:42 pm

precisione pessima. Il cinese mi ha.fregato :)

Mi tocca modificarlo, alla fine dei giochi mi costera 15 euro se mi va bene

Non per essere monotono... cosa ti aspettavi dalla Cina?  ;)
Title: Re: swRTC
Post by: testato on Oct 21, 2011, 11:50 pm
Certo, ma la colpae' stata mia. Dovevo guardare meglio la foto.
Purtroppo se cerchi in italia un banale schedino rtc servono 25 euro, 50milalire, non ha senso. Se conoscete dove prendere rtc economici in italia fatemelo sapere
Title: Re: swRTC
Post by: leo72 on Oct 21, 2011, 11:57 pm
Io uso i PCF8563. Su Ebay li trovi a poco ma vengono da fuori, Europa o Cina (argh...)
In Italia li trovo solo su alcuni negozi (tipo Elettrowebo RS) ma costicchiano un po' di più.
Title: Re: swRTC
Post by: menniti on Oct 22, 2011, 12:00 am

Certo, ma la colpae' stata mia. Dovevo guardare meglio la foto.
Purtroppo se cerchi in italia un banale schedino rtc servono 25 euro, 50milalire, non ha senso. Se conoscete dove prendere rtc economici in italia fatemelo sapere

Ma tu hai mezzi e capacità per realizzarteli da solo, non ti conviene prendere i chip+quarzi+batterie e farteli su uno stampatino? io ho comprato un po' di roba varia, la mia solità velleità di poter fare tutto :smiley-red:, prima o poi avrò necessità e mi ci metto, ma non credo comprerei mai un RTC già fatto.
Title: Re: swRTC
Post by: gcblack on Oct 22, 2011, 02:00 am
Io ho acquistato questo e funziona bene...

http://www.ebay.it/itm/Modulo-Real-Time-Clock-RTC-I2C-con-DS1307-per-Arduino-/150673411315?pt=Componenti_elettronici_attivi&hash=item2314d5ccf3#ht_1917wt_1057
Title: Re: swRTC
Post by: menniti on Oct 22, 2011, 01:51 pm

Io ho acquistato questo e funziona bene...

http://www.ebay.it/itm/Modulo-Real-Time-Clock-RTC-I2C-con-DS1307-per-Arduino-/150673411315?pt=Componenti_elettronici_attivi&hash=item2314d5ccf3#ht_1917wt_1057


Bello, ho visitato il negozio, mi sa che questo è l'unico articolo a buon prezzo, tutto il resto mi sembra abbastanza caro, ma è una sensazione, non mi sono messo a fare verifiche; comunque è da tener presente, certamente ha un sacco di roba.
Title: Re: swRTC
Post by: testato on Oct 23, 2011, 12:03 am
x leo: si conosco il philips, le funzioni in piu' che ha del 1307 non le avrei usate, il limite resta la precisione, legata al quarzo (vedi sotto)

x menny: si, possiamo farli da solo, oppure ad esempio integrarli sugli standlaone, il problema e' che i singoli pezzi spesso ti costano piu' dello schedino, calcola batteria, portabatteria, quarzo, integrato, resistenze, header. mettici le spese, e vedrai che supueri il rpezzo del rtc gia' montato, e senza sporcarti le mani di acido

x gcblack: e' stato inserito or ora quell'rtc, perche' quanto ho preso il mio in ungheria in itali c'era solo roba da 25 euro. Quello cmq va meglio dle mio perche' ha il quarzo e non il ceramico, ma per un'applicazione come orologio ti va bene ? cioe' quati secondi al giorno perde ? i quarzi economici sono 50ppm, cioe' fai una mezz'ora all'anno, onestamente un orologio che perde 30 minuti all'anno non e' un orologio, il mio con ceramico sta sui 50 ore all'anno  :smiley-eek-blue:

Quale soluzione ? ho preso un 2ppm (1 minuto all'anno) il max3132, dissaldo lo saldero' sullo schedino e mi faccio un orologio come dio comanda   :) (quarzo integrato e termoregolato)

Iniziamo a consigliarlo sul forum, in modo da non far spendere soldi inutili per rtca quarzo che tutto sono tranne RTC.
Le librerie sono compatibili, cioe' lo sostitisci senza toccare il codice.
Se vuoi si puo' anche usare il sensore di temperatura interno
Title: Re: swRTC
Post by: menniti on Oct 23, 2011, 12:47 am

x menny: si, possiamo farli da solo, oppure ad esempio integrarli sugli standlaone, il problema e' che i singoli pezzi spesso ti costano piu' dello schedino, calcola batteria, portabatteria, quarzo, integrato, resistenze, header. mettici le spese, e vedrai che supueri il rpezzo del rtc gia' montato, e senza sporcarti le mani di acido

premesso che oggi si è iscritto al Forum il "Menny" ORIGINALE ]:D, d'ora in poi dovresti rassegnarti ad usare il mio nome correttamente, al minimo per non fare casino ;)
Il mio intervento era perché tu dicevi, ed io ti ho creduto, che uno schedino fatto costava 25 euro, visto questo di 7,50 ovviamente non ha molto senso, poi tutto è relativo; personalmente non credo che metterei uno schedino fatto da altri su un PCB progettato da me, a prescindere dai costi; se qualcosa è realizzabile va integrata nel proprio progetto, se non lo è allora è un altro discorso. In un mio progetto importante mi era stato chiesto, per ragioni dettate da varie opportunità, di prevedere l'installazione di uno schedino di altra natura, mentre io avevo progettato e testato (scusa, ma se ti dai un verbo per alias, prima o poi...) un IC tutto mio; alla fine ho trovato la soluzione di prevedere uno zoccolo per l'innesto opzionale dello schedino, ma senza rinunciare alla mia parte di predispoisizione sul PCB. Quindi, alla fine, è tutto soggettivo.
Title: Re: swRTC
Post by: gcblack on Oct 23, 2011, 01:18 am
Anche a me piace fare le cose da me... Ma se trovo roba pronta a un prezzo onesto ( magari anche inferiore al fai da te) preferisco dedicare il tempo risparmiato ad altro...

X testato: il tempo che perde lo correggo da software e risolvo l'ammanco.. Per il progetto su cui l'ho usato non avevo bisogno di molta precisione...
Title: Re: swRTC
Post by: testato on Oct 23, 2011, 01:35 am
Ho visto l' altro menn :)y, mannaggia, da oggi a ndro' di Menniti XD

gcback io visualizzo direttamente l'orario, avevo pensato di sommare i 7sec alla mezzanotte di ogni giorno, questo vuol dire che dovrei correggere lOrario dell'rtc, oppute tu carichi in una variabile l'orario e poi visualizzi quello ?
Title: Re: swRTC
Post by: gcblack on Oct 23, 2011, 12:42 pm
No.. io non visualizzo l'orario perciò non mi serve la precisione.. Uso l'rtc per far prendere decisioni all'arduino in base all'ora... Cmq se ti interessa quanto perde al giorno faccio un test e ti dico con precisione. ;)
Title: Re: swRTC
Post by: testato on Oct 23, 2011, 06:31 pm
si, grazie, sarebbe utile anche per questa libreria avere dei confronti con rtc reali, io ho fatto molti test il tuo, con quarzo 32K mi manca.
Vedi se riesci a capire il modello del quarzo, cosi' in base ai ppm dichiarati capiamo qunto ci mette di suo e quanto l'ic.

interessante il fatto che non mi ritrovi nemmeno con i consumi, il datasheet del 1307 parla di 500nA, ma sono tantissimi, come mai dichiarano puoi una funzionalita' di 5 anni ?
I miei test con questa libreria e micro in sleep arrivano a 0,12mA, 4 volte in meno dell'rtc ?
ci deve essere un inghippo nel datasheet.
devo misurare la corrente reale assorbita dalla batteria direttamente.
se lo fai anche tu diamo altri due parametri interessanti a leo/lesto
Title: Re: swRTC
Post by: gcblack on Oct 23, 2011, 08:01 pm
Volentieri! Domani lo stacco dal progetto e lo metto in opera, così posto i risultati!
Se mi dai una mano per capire il tipo di quarzo, di quali parametri hai bisogno e cosa ricercare, sono disponibile a fare test. :smiley-mr-green:
Title: Re: swRTC
Post by: menniti on Oct 23, 2011, 08:46 pm

interessante il fatto che non mi ritrovi nemmeno con i consumi, il datasheet del 1307 parla di 500nA, ma sono tantissimi, come mai dichiarano puoi una funzionalita' di 5 anni ?
I miei test con questa libreria e micro in sleep arrivano a 0,12mA, 4 volte in meno dell'rtc ?
ci deve essere un inghippo nel datasheet.

Scusa forse sto capendo male io il ragionamento.
500nA (nanoAmpere) corrispondono a 0,5µA e 0,0005mA
I tuoi 0,12mA, cioè 120µA sono circa 240 volte il consumo dell'RTC hardware, quindi i conti tornano eccome.
Sulla durata di 5 anni della batteria ho forti dubbi; il calcolo lo puoi fare moltiplicando i mAh della batteria x 1.000.000, il risultato lo dividi per 500, ciò che ottieni è il numero di ore teoriche che può durare la batteria alimentando ininterrottamente l'RTC; se poi l'RTC prevede anche l'alimentazione esterna e la batteria fa da backup, allora il discorso cambia completamente, e la durata diventa quella fisiologica della batteria, considerando che in 5 anni una batteria si consuma per normale autoscarica.
Title: Re: swRTC
Post by: gcblack on Oct 23, 2011, 09:30 pm
Per il mio è prevista l'alimentazione 5V e la batteria fà solo da backup...
Title: Re: swRTC
Post by: testato on Oct 23, 2011, 09:49 pm
menniti stai capendo benissimo, sono io che mi sono fuso
ho invertito i meno sei con i meno nove  :)
scusasse

per la durata batteria invece ora mi ci ritrovo, piu' precisamente sarebbero 80.000 ore di autonomia senza alimentazione di backup, cioe' circa 9 anni, che avranno ridotto appunto a 5 anni per l'autoscarica
(calcolando mediamente un 40mAh)

interessante affrontare il discorso dei supercondensatori al posto della batteria, calcolando che essendo un condensatore, durante la presenza di alimentazione allo schedino lui si ricarica, quindi teoricamente avrebbe una durata infinita.
Title: Re: swRTC
Post by: menniti on Oct 23, 2011, 10:34 pm

menniti stai capendo benissimo, sono io che mi sono fuso
ho invertito i meno sei con i meno nove  :)
scusasse

per la durata batteria invece ora mi ci ritrovo, piu' precisamente sarebbero 80.000 ore di autonomia senza alimentazione di backup, cioe' circa 9 anni, che avranno ridotto appunto a 5 anni per l'autoscarica
(calcolando mediamente un 40mAh)

interessante affrontare il discorso dei supercondensatori al posto della batteria, calcolando che essendo un condensatore, durante la presenza di alimentazione allo schedino lui si ricarica, quindi teoricamente avrebbe una durata infinita.


Sì, non ricordo di quant'era quello che avevo visto in una foto in uno dei tanto Topic, ricordo che era grande quando una batteria CR2032, bisognerebbe vedere l'altezza. Anche i condensatori non hanno una durata infinita, ma certamente sarebbe decisamente maggiore di una batteria, a patto ovviamente che il circuito sia sempre alimentato; comunque sia non credo che abbiano un'autonomia chissacché, salvo che qualcuno non dia info maggiori in merito; quindi sarebbe più che altro un anti-blackout (non contro GH_ intendiamoci :smiley-yell:) per le momentanee mancanze di tensione di rete. Nel tuo caso penso che durerebbero molto meno le nixie.
Title: Re: swRTC
Post by: reizel on Oct 24, 2011, 05:15 pm
leo a che versione sei arrivato con il tuo swRTC? perche' io ho quasi finito il mio progettino che lo usa (la mangiatoia per le koi), ora mi son arrivati anche i ds1307 ma usero' il tuo sistema software perche' e' perfetto per il mio scopo ;)

vorrei quasi postarvi il codice se qualcuno lo vuol ottimizzare... basta che non mi diciate che l'ho scritto troppo grezzamente :P
Title: Re: swRTC
Post by: leo72 on Oct 24, 2011, 05:30 pm
E' da qualche giorno che non ci lavoro più perché ho avuto il problema dell'ISP da capire.

Stasera o domani guardo un po' com'è al momento e vedo di completarla, o per lo meno di renderla usabile.

Title: Re: swRTC
Post by: testato on Oct 24, 2011, 05:35 pm

Vorrei quasi postarvi il codice se qualcuno lo vuol ottimizzare... basta che non mi diciate che l'ho scritto troppo grezzamente :P

Posta, tranquillo, come minimo lo hai scritto meglio di me  :)

Per l'alimentazione hai quindi previsto una batteria ricaricabile ?
Title: Re: swRTC
Post by: testato on Oct 24, 2011, 05:41 pm
Sto' notando una cosa strana, il mio RTC si e' stabilizzato, cioe' nei primi 2 giorni ho perso i 7 secondi+7 14sec.

ora ho tenuto spento l'ìarduino e dopo altri 3 giorni mi spettavo l'aumento dell'errore. Invece e' rimasto sui 14sec. Come e' possibile ?
Puo' l'arduino con il suo sketch influenzare l'RTC ?

Mi sembra una cosa strana, l'rtc dovrebbe infiasciarsene se gli viene richiesto o meno l'orario.
Puo' l'invio al monitor seriale influenzare l'rtc ?

Cosa ne pensate ?
Title: Re: swRTC
Post by: reizel on Oct 24, 2011, 05:47 pm
leo, della tua libreria io ero rimasto alla versione 4 o 6, non ricordo, per quello che mi servivano pero' funzionavano perfettamente ;)

testato, ti posto il codice, ma apriro' una discussione quando finisco al 100%
uso 2 rele' per invertire il senso di marcia di un motoriduttore
un potenziometro come encoder per darmi la posizione del motoriduttore
un rotary switch a 10 posizioni per stabilire quanti pasti distribuire al giorno
e un display 16*2 per l'orario (praticamente inutile, infatti voglio farlo removibile e collegarlo solo per controllo)

Code: [Select]
#include <swRTC.h>      //rtc software di leo
swRTC rtc;              //rtc software di leo
#include <LiquidCrystal.h>

LiquidCrystal lcd(A0, A1, A2, A3, 0, 1);  //pin del display 16*2

const int motordx = 9;  //rotazione motore motoriduttore verso destra
const int motorsx = 8;  //rotazione motore motoriduttore verso sinistra
     int pot = A5;     //potenziometro che funziona come encoder per
                       //darmi la posizione angolare del motoriduttore/mangiatoia

const int pasti1 = 5;   //rotary switch, converte
const int pasti2 = 2;   //dieci posizioni decimali
const int pasti4 = 4;   //in codice binario
const int pasti8 = 3;   //su quattro uscite

 int avvio = 0;        //segnale di avvio distribuzione pasto
 int valavvio = 0;     //variabile
 int valpot = 0;       //valore del potenziometro come encoder rotativo
 int valpasti1 = 0;    //valore della variabile del rotary switch
 int valpasti2 = 0;    //  //
 int valpasti4 = 0;    //  //
 int valpasti8 = 0;    //  //

void setup() {
   delay(2000);
   rtc.stopRTC();           //rtc software di leo
   rtc.setTime(12,00,00);   //setto ora di partenza, se anche stara basta che dia un reset a mezzogiorno e riparte
   rtc.startRTC();      

   lcd.begin(16, 2);        //inizializzo lcd
   
   pinMode(motordx, OUTPUT);//rotazione motoriduttore a destra      
   pinMode(motorsx, OUTPUT);//rotazione motoriduttore a sinistra
   
   pinMode(pot, INPUT);     //potenziometro
   
   pinMode(pasti1, INPUT);  //rotary switch
   pinMode(pasti2, INPUT);  //rotary switch
   pinMode(pasti4, INPUT);  //rotary switch
   pinMode(pasti8, INPUT);  //rotary switch
   
   pinMode(A0, OUTPUT);     //display 16*2  
   pinMode(A1, OUTPUT);     //display 16*2
   pinMode(A2, OUTPUT);     //display 16*2      
   pinMode(A3, OUTPUT);     //display 16*2
   pinMode(1, OUTPUT);      //display 16*2      
   pinMode(0, OUTPUT);      //display 16*2

}

void loop() {
 lcd.setCursor(5, 0);
 lcd.print(rtc.getHours(), DEC);
 lcd.print(":");
 lcd.print(rtc.getMinutes(), DEC);
 lcd.print(":");
 lcd.print(rtc.getSeconds(), DEC);
 lcd.print("  ");
 
 valpasti1 = digitalRead(pasti1); //arduino pin 5 vale 1 dal rotary switch
 valpasti2 = digitalRead(pasti2); //arduino pin 2 vale 2 dal rotary switch
 valpasti4 = digitalRead(pasti4); //arduino pin 4 vale 4 dal rotary switch
 valpasti8 = digitalRead(pasti8); //arduino pin 3 vale 8 dal rotary switch
   

 if ((12==rtc.getHours()) && (0==rtc.getMinutes()) && (10==rtc.getSeconds())
 && (valpasti8 == LOW) && (valpasti4 == LOW) && (valpasti2 == LOW) && (valpasti1 == HIGH)) { //1pasti
   (avvio = 1);
   }  
 
 if ((10==rtc.getHours()) && (2==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == LOW) && (valpasti4 == LOW) && (valpasti2 == HIGH) && (valpasti1 == LOW)) { //2pasti
   (avvio = 1);
   }
 
 if ((14==rtc.getHours()) && (2==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == LOW) && (valpasti4 == LOW) && (valpasti2 == HIGH) && (valpasti1 == LOW)) { //2pasti
   (avvio = 1);
   }
 
 if ((9==rtc.getHours()) && (3==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == LOW) && (valpasti4 == LOW) && (valpasti2 == HIGH) && (valpasti1 == HIGH)) { //3pasti
   (avvio = 1);
   }  
 
 if ((12==rtc.getHours()) && (3==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == LOW) && (valpasti4 == LOW) && (valpasti2 == HIGH) && (valpasti1 == HIGH)) { //3pasti
   (avvio = 1);
   }
 
 if ((15==rtc.getHours()) && (3==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == LOW) && (valpasti4 == LOW) && (valpasti2 == HIGH) && (valpasti1 == HIGH)) { //3pasti
   (avvio = 1);
   }
   
 if ((7==rtc.getHours()) && (34==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == LOW) && (valpasti4 == HIGH) && (valpasti2 == LOW) && (valpasti1 == LOW)) { //4pasti
   (avvio = 1);
   }  
 


//HO TAGLIATO PARTE DEL CODICE PERCHE' NON CI STAVA NEL POST...
//sono sempre IF con orari e numero di pasti comunque
 


 if ((17==rtc.getHours()) && (18==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == HIGH) && (valpasti4 == LOW) && (valpasti2 == LOW) && (valpasti1 == LOW)) { //8pasti
   (avvio = 1);
   }  
   
 if ((7==rtc.getHours()) && (49==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == HIGH) && (valpasti4 == LOW) && (valpasti2 == LOW) && (valpasti1 == HIGH)) { //9pasti
   (avvio = 1);
   }
   
 if ((8==rtc.getHours()) && (9==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == HIGH) && (valpasti4 == LOW) && (valpasti2 == LOW) && (valpasti1 == HIGH)) { //9pasti
   (avvio = 1);
   }
 
 if ((9==rtc.getHours()) && (29==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == HIGH) && (valpasti4 == LOW) && (valpasti2 == LOW) && (valpasti1 == HIGH)) { //9pasti
   (avvio = 1);
   }  
   
 if ((10==rtc.getHours()) && (49==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == HIGH) && (valpasti4 == LOW) && (valpasti2 == LOW) && (valpasti1 == HIGH)) { //9pasti
   (avvio = 1);
   }
   
 if ((12==rtc.getHours()) && (9==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == HIGH) && (valpasti4 == LOW) && (valpasti2 == LOW) && (valpasti1 == HIGH)) { //9pasti
   (avvio = 1);
   }  
   
 if ((13==rtc.getHours()) && (29==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == HIGH) && (valpasti4 == LOW) && (valpasti2 == LOW) && (valpasti1 == HIGH)) { //9pasti
   (avvio = 1);
   }  
   
 if ((14==rtc.getHours()) && (49==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == HIGH) && (valpasti4 == LOW) && (valpasti2 == LOW) && (valpasti1 == HIGH)) { //9pasti
   (avvio = 1);
   }
   
 if ((16==rtc.getHours()) && (19==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == HIGH) && (valpasti4 == LOW) && (valpasti2 == LOW) && (valpasti1 == HIGH)) { //9pasti
   (avvio = 1);
   }  
   
 if ((17==rtc.getHours()) && (39==rtc.getMinutes()) && (0==rtc.getSeconds())
 && (valpasti8 == HIGH) && (valpasti4 == LOW) && (valpasti2 == LOW) && (valpasti1 == HIGH)) { //9pasti
   (avvio = 1);
   }  
   
   
   valavvio = avvio;              
   {
      if (valavvio == 1){              //se avvio e' 1 esegui sotto
      avvio = 0;                       //rimetto avvio a 0        
      digitalWrite(motordx, HIGH);     //accendo il motoriduttore facendolo ruotare verso destra "ovvero carico mangime"
      valpot = analogRead(pot);        //leggo la posizione del motoriduttore
      }
      if (valpot >= 800){              //se la posizione del motoriduttore e' questa:
      digitalWrite(motordx, LOW);      //spengo il motoriduttore
      delay(2500);                     //delay per far caricare la mangiatoia di cibo
      digitalWrite(motorsx, HIGH);     //accendo il motoriduttore facendolo ruotare verso sinistra "ovvero scarico mangime"
      }
      valpot = analogRead(pot);        //leggo la posizione del motoriduttore
      if (valpot <= 200){              //se la posizione del motoriduttore e' questa:
      digitalWrite(motorsx, LOW);      //spengo il motoriduttore "ovvero ha scaricato il mangime e finito il ciclo "pasto""
      }
   }  
}

Title: Re: swRTC
Post by: leo72 on Oct 24, 2011, 05:54 pm

Sto' notando una cosa strana, il mio RTC si e' stabilizzato, cioe' nei primi 2 giorni ho perso i 7 secondi+7 14sec.

ora ho tenuto spento l'ìarduino e dopo altri 3 giorni mi spettavo l'aumento dell'errore. Invece e' rimasto sui 14sec. Come e' possibile ?
Puo' l'arduino con il suo sketch influenzare l'RTC ?

Mi sembra una cosa strana, l'rtc dovrebbe infiasciarsene se gli viene richiesto o meno l'orario.
Puo' l'invio al monitor seriale influenzare l'rtc ?

Cosa ne pensate ?



TU parli di un RTC esterno, giusto?
Tu chiedi: potrebbe darsi che le continue letture al micro (considera che se non ottimizzi il codice potresti arrivare anche a fare centinaia, se non migliaia di richieste all'RTC) potrebbero influire sulla sua precisione? Chissà. Bisognerebbe vedere com'è strutturato internamente il micro.
Se ferma temporaneamente il timer per accedere in lettura ai registri, potrebbe darsi che un eccesso di letture alterino il tempo misurato.

Forse si potrebbe usare un doppio approccio, ossia tenere l'ora internamente con la swRTC e poi fare una lettura al giorno per riallineare l'RTC interno con quello esterno, di modo da non dare troppa noia con tante letture.
Title: Re: swRTC
Post by: testato on Oct 24, 2011, 06:05 pm
bella idea, effettivamente per come e' fatta la mia visualizzazione orario le letire non sono parecchie, ma infinite, la lettura e' un continuo perche' alle valvole devo dare in continua il valore da visualizzare.
Se ricori avevo rpobelmi con il sensore digitale di temperatura porprio perche' mi forniva la lettura troppo lentamente, e con il polling avevo buchi di dati, la qualcosa poi risolta restando sul polling ma gentendo il sensore direttamente senza librerie.

Quindi il fatto che le richieste sono continue ed infinite sono obbligatorie, e di certo non voglio cambiare l'hardware.

Con la tua idea potrei appunto correggere tipo ad ogni mezzanotte il valore.
Si dovrebbe gestire anche l'eventuale disconnessione dalla presa di corrente, cioe' la swRTC ripartirebbe da 0 non avendo alimentazione, e mettere un if sullo 00.00.00, quando viene incontrato leggere dall'rtc.

mi faccio un test con serial monitor aperto
Title: Re: swRTC
Post by: leo72 on Oct 24, 2011, 06:11 pm
Sul lato delle nixie non vedo differenze. Invece che interrogare continuamente l'RTC, interroghi continuamente la swRTC ed aggiorni le valvole con l'ora di quest'ultima.

A mezzanote oppure ad un'altra ora del giorno riallinei la swRTC con l'ora dell'RTC.

Sul riavvio la questione non si pone neanche: basta mettere la configurazione della swRTC nel setup() così che ad ogni avvio la swRTC si riallinea sempre e comunque.
Title: Re: swRTC
Post by: testato on Oct 24, 2011, 08:08 pm
bella l'idea del setup, ottimo.

certo che l'rtc se ha anche questo limite non e' una bella cosa.

mi sono reso conto che in realta' il serial monitor lo uso solo durante lo sviluppo, cioe' durante il normale uso l'orario viene letto dall'RTC ma non viene spedito alla seriale.
Quindi per essere sicuri ho montato l'rtc nell'orologio per avere un test reale.

domani mattina riportero' i risultati

Nel frattempo stavo pensando alla gestione automatica dell'ora legale, tu ci hai provato ? volendo restringere il discorso alla sola Italia che ragionamento si dovrebbe fare ?
Title: Re: swRTC
Post by: leo72 on Oct 24, 2011, 10:12 pm
La legge italiana dice che il passaggio c'è l'ultima domenica di marzo e l'ultima domenica di ottobre. Bisogna calcolare il calendario di quei 2 mesi e poi impostare il cambio.

Se ho tempo (e voglia) in questi giorni vedo di rivedere un po' tutta la lib e ci metto anche questo.
Title: Re: swRTC
Post by: testato on Oct 24, 2011, 10:17 pm
e si, il problema e' che capita sempre in giorni diversi, ed anche le domeniche potrebbero essere fino a 5 in un mese.
In piu' volendo lasciare a tutti gli utenti del mondo la gestione dell'ora legale, e' utile non inglobarla solo a livello di libreria, ma tenerla fuori, magari con un esempio apposito per l'italia, in modo che gli utenti internazionali guardando l'esempio possano facilmente adattarlo alla propria ora legale.

certo che dover usare un rtc esterno per "aggiustare" un rtc interno e' un giro astronomico :)

visto che in ogni nazione ci sono ore legali in momenti diversi, in altre non c'e' proprio, si potrebbe pensare ad una libreria gia' solo per la gestione dell'ora legale nel mondo, da tener aggiornata quando le legislazioni dei vari paesi cambiano.
Title: Re: swRTC
Post by: lestofante on Oct 24, 2011, 10:31 pm
x l'europa in teoria la data e l'ora son sempre quelli:

Quote
Il protocollo che regolamenta l'ora legale è il seguente: nell'ultima domenica di marzo, quando scattano le ore 2:00 antimeridiane a Berlino gli orologi vengono spostati avanti di un'ora, cioè l'ora che inizia alle 2:00 e termina alle 3:00 viene soppressa. Nel passaggio inverso (che avviene l'ultima domenica di ottobre), quando scattano le ore 3:00 antimeridiane si riporta l'orologio indietro di un'ora, cioè l'ora che inizia alle 2:00 e termina alle 3:00 viene ripetuta due volte.


secondo me sarebbe da non attivare di default, se attivata con default sullo standard europeo, ma ovviamente con giorno e ora settabili dall'utente. non è difficile da fare, sono solo due IF, ma dovrei rivedere il codice perché crea un poco di casino con la gestione attuale.
Title: Re: swRTC
Post by: leo72 on Oct 24, 2011, 10:34 pm
@testato:
L'aggiornare un RTC interno usando un RTC esterno è un suggerimento che ho dato a te visto che pretendi da una routine interrupt-driven la precisione di un orologio atomico  :P :P

Ora che ti sei accorto che anche gli RTC esterni possono essere fallaci, vedi con un occhio diverso la swRTC.  ;)

La swRTC è un succedaneo di un RTC, non potrà mai avere la stessa precisione. Per contro, permette di aggiustare lo scostamento in modo da rendere lo scarto il più piccolo possibile. Inoltre permette di fare operazioni che un RTC non potrebbe mai visto che è installata all'interno di un micro programmabile.

@lesto:
ho una mezza idea su come farla. Domani vedo se mi "applico"
Title: Re: swRTC
Post by: testato on Oct 24, 2011, 10:39 pm
si infatti, la swRTC ha ripreso vigore nella mia mente :)

x lesto: anche io all'inizio ho pensao ad un paio di if, ma il problema deriva dal fatto che ogni anno i due cambi avvengono in date diverse, ed in settimane diverse.
Non e' che avviene sempre alla 40esima settimana ad esempio, ne' tantomeno in un mese ci sono sempre le stesse settimane.

Di certo non e' difficile per voi, ci mettete poco a risolvere, ma non sono due semplici IF  :)

visto che domenica prossima si cambia l'orario, il sw supererebbe un test reale se fatto in tempo
io sono pronto a testare  :)

x leo: hai usato la parola giusta, si intende per succedaneo un prodotto non sempre inferiore all'altro, infatti non e' vero che la tua libreria non puo' superare la precisione di un RTC, con i miei test abbiamo visto che un 1307 ha errori grossi, (non per colpa sua ma per l'oscillatore usato), e con il concetto di deltaT della tua swRTC si puo' tranquillamente superare la precisione di 50ppm (che e' lo standard dei quarzi economici)
Title: Re: swRTC
Post by: menniti on Oct 24, 2011, 10:53 pm
BENE, FINALMENTE SIAMO RITORNATI SULLA RETTA VIA :)
Non scordatevi che vi tengo costantemente d'occhio 8) Ho sempre seguito un pensiero coerente in merito a questa bella idea di Leo: deve essere qualcosa di autonomo, slegato da hardware esterno, implementabile in firmware più complessi, per sostituire un RTC hardware.
Tutto ciò avrà ovviamente delle limitazioni con le quali bisogna imparare a convivere; se ciò non avviene si comincia ad implementare sempre più hardware fino a ritornare al punto di partenza, cioè un RTC esterno con tanto di quarzo (la famosa morsicatura di chiappe di cui parlavo giorni fa :smiley-mr-green:) oppure, PEGGIO, creare un nuovo RTC a partire da un micro, con la scusa che è più economico.
Le limitazioni di cui parlo devono essere tollerabili ed adeguate a lavori in cui non serve una precisione atomica, quando invece essa serve si ricorre a strumenti specifici di precisione. Questo non significa che non si debba tendere alla perfezione, però se si arriva al limite, gli sforzi non valgono più l'obiettivo.
(da "Pillole filosofiche di saggezza" - Prof. Michele Menniti - Ed. Arduiniche - ott. 2011 - pagg. 1 post)
Title: Re: swRTC
Post by: leo72 on Oct 24, 2011, 10:56 pm
La perfezione è degli dèi, noi comuni mortali possiamo ricercare solo la massima precisione possibile. Domattina rimetto mano alla lib, dai. ;)
Title: Re: swRTC
Post by: menniti on Oct 24, 2011, 11:06 pm

La perfezione è degli dèi, noi comuni mortali possiamo ricercare solo la massima precisione possibile. Domattina rimetto mano alla lib, dai. ;)

ok, in contemporanea io procedo col mio progetto; siccome non so ancora se è il caso di aprire un Topic, ti mando un mp perché mi devi ricordare dei concetti che ho "perso", così ti dico a che punto sono. Poi rispondi con tutta calma, io non scappo. :)
Title: Re: swRTC
Post by: testato on Oct 25, 2011, 06:46 pm
Risultato test:
- Anche senza l'uso del monitor seriale ci sono ritardi dell'RTC. Se ne deduce che la lettura continua dell'rtc provoca ritardi all'RTC stesso.

Messo in test il solo RTC senza letture. a domani i risultati.

Quindi per ora lo scenario giusto sembra essere quello consigliato dal Leo, cioe' usero' l'RTC solo per correggere la swRTC ad ogni mezzanotte, la qual cosa la faro' con un chip termocompensato.
Title: Re: swRTC
Post by: leo72 on Oct 25, 2011, 07:17 pm
Non mi ricordo se te l'avevo già chiesto, ma perché hai bisogno di tutta 'sta precisione?  :smiley-roll-sweat:

PS:
stamattina ho lavorato un po' alla lib, rivedendola. Oggi pom. sono stato fuori tutto il giorno, non ho potuto "produrre".
Domani vedo di rimettermi all'opera. Sto cercando un modo per snellirla più che si può, in modo che l'interrupt esegua il meno quantitativo possibile di operazioni.
Title: Re: swRTC
Post by: testato on Oct 25, 2011, 07:33 pm
per studio, per imparare nuove cose  :)
Voglio avere l'orologio a valvole piu' preciso al mondo senza usare gps  o sincronizzazioni internet.

Se anche scoppia la 3 guerra mondiale, invadono berlino e chiudono il segnale di francoforte, abbattono i satelliti con missili spaziali, io saro' li' con il mio orologio con precisione 2 parti per milione :)

Ho imparato tante cose, ad esempio l'esistenza dei quarzi tarati per oscillatori seriali o paralleli, oppure dei quarzi MEMS, che sono mantenuti su una sospensione microelettromeccanica per non farli soffrire dalle vibrazioni.

Metto tutto a disposizione della community e contribuisco a swRTC.

Il mio obiettivo finale e' essere menzionato nei ringraziamenti della stessa  :)
Title: Re: swRTC
Post by: menniti on Oct 25, 2011, 07:47 pm

per studio, per imparare nuove cose  :)
Voglio avere l'orologio a valvole piu' preciso al mondo senza usare gps  o sincronizzazioni internet.

Se anche scoppia la 3 guerra mondiale, invadono berlino e chiudono il segnale di francoforte, abbattono i satelliti con missili spaziali, io saro' li' con il mio orologio con precisione 2 parti per milione :)

Ho imparato tante cose, ad esempio l'esistenza dei quarzi tarati per oscillatori seriali o paralleli, oppure dei quarzi MEMS, che sono mantenuti su una sospensione microelettromeccanica per non farli soffrire dalle vibrazioni.

Metto tutto a disposizione della community e contribuisco a swRTC.

Il mio obiettivo finale e' essere menzionato nei ringraziamenti della stessa  :)

quando la pazzia diventa spettacolo XD XD XD Sei proprio un personaggio :)
Title: Re: swRTC
Post by: leo72 on Oct 25, 2011, 11:05 pm
allora facciamo così: ti menziono subito così fermo lo sviluppo di questa libreria di cui tu sei al momento l'unico utente  ]:D
Title: Re: swRTC
Post by: testato on Oct 25, 2011, 11:13 pm
bella questa  :)
ma per precisione io ancora non l'ho usata la tua libreria (sto' aspettando il chip dell'rtc per modificare il mio con ds1307)

come unico utente attualmente c'e' la mangiatoia di Reizel  :P
Title: Re: swRTC
Post by: menniti on Oct 25, 2011, 11:15 pm

allora facciamo così: ti menziono subito così fermo lo sviluppo di questa libreria di cui tu sei al momento l'unico utente  ]:D

No Leo, non farlo  =( io non ho occasione di usarla per ora, ma la sto seguendo con molta attenzione, pur avendo in casa almeno una decina di IC per RTC hardware, con altrettanti, o quasi, quarzi.
Title: Re: swRTC
Post by: leo72 on Oct 25, 2011, 11:25 pm

come unico utente attualmente c'e' la mangiatoia di Reizel  :P

'sta cosa della "mangiatoia" mi sa tanto di presepe  XD
Title: Re: swRTC
Post by: testato on Oct 27, 2011, 12:09 am

il solo RTC senza letture. a domani i risultati.

Risultato, persi 4 secondi, che sono in linea con la precisione di un quarzo economico

Un quarzo normale, quindi un rtc reale con ds1307, avendo 50ppm di precisione perde 26minuti all'anno.
Che per un uso come orologio secondo me sono inaccettabili
Quindi non e' che sto' cercando il pelo nell'uovo.

Prossimi test con il chip da 2ppm appena mi arrivano i sample dalla maxim
Title: Re: swRTC
Post by: menniti on Oct 27, 2011, 12:31 am


il solo RTC senza letture. a domani i risultati.

Risultato, persi 4 secondi, che sono in linea con la precisione di un quarzo economico

Un quarzo normale, quindi un rtc reale con ds1307, avendo 50ppm di precisione perde 26minuti all'anno.
Che per un uso come orologio secondo me sono inaccettabili
Quindi non e' che sto' cercando il pelo nell'uovo.

Prossimi test con il chip da 2ppm appena mi arrivano i sample dalla maxim

Una curiosità, ma quale fonte di riferimento usi per calcolare quanta variazione ha l'RTC? Hai l'atomico o che altro?
Title: Re: swRTC
Post by: testato on Oct 27, 2011, 12:33 am
rispetto ad un casio radiocontrollato
Title: Re: swRTC
Post by: gcblack on Oct 27, 2011, 12:55 am
Secondo me, per l'uso che ne fà l'utente medio và più che bene... Chi mi assicura che il mio orologio da polso non perde colpi? Quanti ne perde?
Se poi si sà che l'rtc perde 4 sec al giorno ogni 15 giorni si può mandare avanti 1 minuto da software... :smiley-mr-green:
Title: Re: swRTC
Post by: lestofante on Oct 27, 2011, 12:57 am

Secondo me, per l'uso che ne fà l'utente medio và più che bene... Chi mi assicura che il mio orologio da polso non perde colpi? Quanti ne perde?
Se poi si sà che l'rtc perde 4 sec al giorno ogni 15 giorni si può mandare avanti 1 minuto da software... :smiley-mr-green:


SE l'errore è assoluto, come tu stai dando per scontato, allora è risolvibile dalla libreria swRTC settando il deltaT.

Ma l'errore potrebbe essere relativo: ora a perso 4 secondi, domani 10 dopodomani corre troppo di 2... e qui casca l'asino.

edit: ci servono test di lunga durata con dati grezzi, che così possiamo raggruppare in tanti intervalli di tempo più piccoli per capire quanto influisce l'errore assoluto e quanto quello relativo.altrimenti stiamo solo facendo castelli per aria.
Title: Re: swRTC
Post by: leo72 on Oct 27, 2011, 09:08 am
Il problema dell'errore è che può essere in più come in meno.
Ossia, se vedete i datasheet, dicono ad es. che un quarzo ha un errore di +-20ppm. Vuol dire che i 20 ppm possono essere in più o no. Dipende da tanti fattori, quali la temp., gli sbalzi di tensione (vedi una batt che lentamente si scarica) ecc...

Non a caso esistono gli orologi atomici per questo motivo, per ridurre al minimo le fluttuazioni dovute a cause esterne.

Io dico che come i quarzini da orologio sono dati con tolleranze di +-20ppm, se si ottiene una precisione anche di poco diversa (es. 50 ppm) sarebbe già un GROSSO risultato.

@lesto:
ho abbandonato la gestione del tempo basata sul solo timestamp. Il motivo è che se a livello di interrupt si trattava di una semplice operazione di incremento di una variabile, quindi molto leggera in termini di appesantimento dei calcoli della CPU, per estrapolare poi anno/mese/giorno/ore/minuti/secondi venivano fuori un sacco di calcoli, anche in virgola mobile, per cui la libreria raddoppiava il consumo di memoria. Sono tornato quindi alla versione 0.8.2 che funzionava perfettamente, integrando solo la tua parte di codice che fornisce il timestamp se richiesto.

Ora vedo se in queste 2 orette che ho riesco a sistemare anche la questione dell'ora legale senza appesantire troppo il tutto.
Title: Re: swRTC
Post by: testato on Oct 27, 2011, 09:50 am
In tutti i miei test in tal senso, e parliamo nell'ordine delle decine, se anche e' vero che l'oscillatore ha una tolleranza "+-" in realta' non ho mai visto che corresse in avanti. Sia con la tua lib, sia sull'RTC. Cmq nulla vieta che effettivamente potrebbe andare avanti.

Analizzando il discorso temperatura poi dobbiamo dire che se anche e' reale, in condizioni normali, tipo fra i 20 e i 30 gradi non influisce minimamente, parliamo di nemmeno 1sec/anno.
Questo e' molto importante perche' vuol dire che in condizioni normali di uso una volta definito il tuo personale deltaT sei apposto.

Mentre per le condizioni estreme, dove la temp altera in modo non lineare, serve un termocompensato.

Quindi dico che lato libreria non vi dovete preoccupare delle variazioni non lineari tipo temp e tensione (ci sono anche gli rtc compensati in tensione), ma solo di mettere uno strumento che corregga di X sec al giorno in modo lineare

OT:
per il mio caso particolare mi sovvengono 3 strade:
- vedere come si comporta in lettura diretta il nuovo chip (cioe' se la lettura continua influisce negativamente come sul 1307)
- Usare la swRTC (con o senza deltaT) ed ad ogni mezzanotte correggerla con l'RTC (se anche la swRTC risultasse precisa come un orologio atomico la scelta dell'RTC reale resta per la questione consumi)

Stamattina invece mi e' venuta in mente una 3 strada, visto che le letture continue influiscono sul chip (almeno sul 1307), posso mettere in una variabile orario e data ogni secondo, mentre a video spedisco in continua il dato della variabile, che ne pensate ?
Title: Re: swRTC
Post by: leo72 on Oct 27, 2011, 10:40 am

Quindi dico che lato libreria non vi dovete preoccupare delle variazioni non lineari tipo temp e tensione (ci sono anche gli rtc compensati in tensione), ma solo di mettere uno strumento che corregga di X sec al giorno in modo lineare

Quello già c'è.
Il deltaT della 0.8.2 corregge addirittura con intervalli di ms per spalmare la correzione giornaliera lungo tutto l'arco delle 24 ore.

Quote

Stamattina invece mi e' venuta in mente una 3 strada, visto che le letture continue influiscono sul chip (almeno sul 1307), posso mettere in una variabile orario e data ogni secondo, mentre a video spedisco in continua il dato della variabile, che ne pensate ?

E' la stessa cosa di allineare la swRTC con l'RTC esterno. Cambia l'intervallo, non cambia la sostanza.

PS:
non posso lavorare sulla swRTC, stamani. Ho appena briccato 2 Attiny85 cercando di abilitare l'oscillatore interno a 128 kHz ed ora mi devo costruire un programmatore H/V per cercare di defibrillarli  ]:D
Meno male che ho trovato un alimentatore 12V di un HD esterno che mi si è bruciato mesi fa.... vediamo se riesco a compicciare qualcosa in 1 ora... :smiley-roll-sweat:
Title: Re: swRTC
Post by: astrobeed on Oct 27, 2011, 10:57 am

Il problema dell'errore è che può essere in più come in meno.
Ossia, se vedete i datasheet, dicono ad es. che un quarzo ha un errore di +-20ppm. Vuol dire che i 20 ppm possono essere in più o no. Dipende da tanti fattori, quali la temp., gli sbalzi di tensione (vedi una batt che lentamente si scarica) ecc...


Esatto, infatti la precisione non è un valore assoluto, è un valore medio ottenuto statisticamente da un largo campione di quarzi realizzati con determinato processo.
Oltre alla precisione vera e propria, che normalmente risulta migliore del valore indicato sul data sheet, c'è da fare i conti con la temperatura che influenza notevolmente la frequenza del quarzo, infatti i clock fatti bene sono termostabilizzati.
Non ultimo c'è sempre la possibilità di compensare l'errore del quarzo con un banalissimo trimmer capacitivo, da regolarsi utilizzando un frequenzimetro preciso, in questo modo è possibile ottenere la frequenza nominale del quarzo ad una ben determinata temperatura.
Title: Re: swRTC
Post by: menniti on Oct 27, 2011, 11:35 am

non posso lavorare sulla swRTC, stamani. Ho appena briccato 2 Attiny85 cercando di abilitare l'oscillatore interno a 128 kHz ed ora mi devo costruire un programmatore H/V per cercare di defibrillarli  ]:D
Meno male che ho trovato un alimentatore 12V di un HD esterno che mi si è bruciato mesi fa.... vediamo se riesco a compicciare qualcosa in 1 ora... :smiley-roll-sweat:

Se è solo per i tiny85 devi collegare 3-4 fili dall'Arduino, lo puoi fare su una bread tranquillamente; ti consiglio di seguire il primo schema, 1.0, devi usare il relativo sketch; la versione 2 dello sketch è incompatibile con i collegamenti della 1.
Ti permette solo la programmazione dei fuse, non te li fa leggere, ma a te ora serve risolvere il problema, poi realizzerai lo strumento professionale che sta facendo menniti, al quale stai dando una mano per il firmware della gestione seriale, certamente non mancherà di restituirti il favore ;)
Title: Re: swRTC
Post by: leo72 on Oct 27, 2011, 02:20 pm
Ho provato difatti lo sketch 2.0 ed un mix tra lo schema della versione 1.0 e della 2.0 ma non mi andava!
Si blocca su "Burning fuses...". La cosa curiosa è che sul filo del reset a 12V leggo sui 4,6V e non 12 come dovrebbe, se seguo il collegamento. Devo analizzare bene lo schema, perché non ho capito se ho fatto qualche ca@@ata io o no.
Ho messo un 2N3904 con emettitore a massa, sulla base una R da 1K ed il pin proveniente dall'Arduino, poi sul collettore ho collegato i 12V tramite una R da 1K ed insieme il filo che va al pin di reset dell'Atmega (come riporta lo schema della versione 1), ma non mi pare che lo schema sia logico! Anzi, proprio no. Così i 12V sul pin di reset arrivano sempre.

Ho usato la versione 2 perché mi pareva di capire che lo sketch della versione 1 non fosse compatibile con i Tiny, tu come hai fatto i collegamenti? Come attivi la programmazione?

Se mi parli di incompatibilità con la UNO, se usassi la Luigino?
Title: Re: swRTC
Post by: menniti on Oct 27, 2011, 03:16 pm

Ho provato difatti lo sketch 2.0 ed un mix tra lo schema della versione 1.0 e della 2.0 ma non mi andava!
Si blocca su "Burning fuses...". La cosa curiosa è che sul filo del reset a 12V leggo sui 4,6V e non 12 come dovrebbe, se seguo il collegamento. Devo analizzare bene lo schema, perché non ho capito se ho fatto qualche ca@@ata io o no.
Ho messo un 2N3904 con emettitore a massa, sulla base una R da 1K ed il pin proveniente dall'Arduino, poi sul collettore ho collegato i 12V tramite una R da 1K ed insieme il filo che va al pin di reset dell'Atmega (come riporta lo schema della versione 1), ma non mi pare che lo schema sia logico! Anzi, proprio no. Così i 12V sul pin di reset arrivano sempre.

Ho usato la versione 2 perché mi pareva di capire che lo sketch della versione 1 non fosse compatibile con i Tiny, tu come hai fatto i collegamenti? Come attivi la programmazione?

Se mi parli di incompatibilità con la UNO, se usassi la Luigino?

Io all'epoca feci su millefori l'intero schema, tu elimina l'atmega e collega solo ciò che ti resta; io manco me lo ricordo ora com'era, ma lo schema mi ha funzionato al primo colpo; non credo di aver avuto difficoltà con la UNO, anzi sicuramente no; quel transitor avrebbe una sua logica se il pin che pilota la base sta normalmente HIGH, in tal modo esso conduce e sul collettore ti trovi 0V; una volta sche scrivi nello sketch i valori dei fuse, la programmazione si attiva semplicemente premendo il pulsante previsto sullo schema, basta una semplice pressione, non devi indugiare, poi procede da solo. Se hai difficoltà quando rientro dall?UNI mi riguardo lo schema, ma intanto sarebbe il caso che tu postassi lo schema che hai adottato. Fammi sapere.
Title: Re: swRTC
Post by: alexdb on Oct 27, 2011, 03:20 pm


non posso lavorare sulla swRTC, stamani. Ho appena briccato 2 Attiny85 cercando di abilitare l'oscillatore interno a 128 kHz ed ora mi devo costruire un programmatore H/V per cercare di defibrillarli  ]:D
Meno male che ho trovato un alimentatore 12V di un HD esterno che mi si è bruciato mesi fa.... vediamo se riesco a compicciare qualcosa in 1 ora... :smiley-roll-sweat:

Se è solo per i tiny85 devi collegare 3-4 fili dall'Arduino, lo puoi fare su una bread tranquillamente; ti consiglio di seguire il primo schema, 1.0, devi usare il relativo sketch; la versione 2 dello sketch è incompatibile con i collegamenti della 1.
Ti permette solo la programmazione dei fuse, non te li fa leggere, ma a te ora serve risolvere il problema, poi realizzerai lo strumento professionale che sta facendo menniti, al quale stai dando una mano per il firmware della gestione seriale, certamente non mancherà di restituirti il favore ;)

che strumento professionale stai realizzando?
Title: Re: swRTC
Post by: menniti on Oct 27, 2011, 03:28 pm



non posso lavorare sulla swRTC, stamani. Ho appena briccato 2 Attiny85 cercando di abilitare l'oscillatore interno a 128 kHz ed ora mi devo costruire un programmatore H/V per cercare di defibrillarli  ]:D
Meno male che ho trovato un alimentatore 12V di un HD esterno che mi si è bruciato mesi fa.... vediamo se riesco a compicciare qualcosa in 1 ora... :smiley-roll-sweat:

Se è solo per i tiny85 devi collegare 3-4 fili dall'Arduino, lo puoi fare su una bread tranquillamente; ti consiglio di seguire il primo schema, 1.0, devi usare il relativo sketch; la versione 2 dello sketch è incompatibile con i collegamenti della 1.
Ti permette solo la programmazione dei fuse, non te li fa leggere, ma a te ora serve risolvere il problema, poi realizzerai lo strumento professionale che sta facendo menniti, al quale stai dando una mano per il firmware della gestione seriale, certamente non mancherà di restituirti il favore ;)

che strumento professionale stai realizzando?

Un programmatore di fuse per molte famiglie di micro ATMEL, alla fine sarà uno strumento chiuso in contenitore, completamente stand-alone, alimentato a 220V; ho fatto i test delle varie sezioni singole ed è tutto ok, anche i primi interfacciamenti danno ottimi risultati. Ora sono alle prese con la progettazione fisica: dimensioni dei vari pcb, disposizione nel contenitore, calcolo dell'alimentazione, e cose del genere, quindi devo completare gli schemi elettrici e poi passo al disegno dei PCB, c'è ancora tanto lavoro ma ormai è in "gestazione".
Title: Re: swRTC
Post by: leo72 on Oct 27, 2011, 03:40 pm
Ma quale schema hai usato?
La versione 1.0 non prevede i collegamenti per il Tiny mentre la 2.0 sì ma non mi funziona.
Title: Re: swRTC
Post by: menniti on Oct 27, 2011, 03:44 pm

Ma quale schema hai usato?
La versione 1.0 non prevede i collegamenti per il Tiny mentre la 2.0 sì ma non mi funziona.


:smiley-roll: allora ricordo male, scusami, non ce l'ho sotto mano ma ero convinto che lo schema fosse per atmega e attiny, al rientro controllo e ti dico.
Title: Re: swRTC
Post by: leo72 on Oct 27, 2011, 03:51 pm
Questo è lo schema 1.0 (solo Atmega328):
http://mightyohm.com/blog/2008/09/arduino-based-avr-high-voltage-programmer/

Questo è lo schema 2.0 (Atmega328, Attiny2313, Attiny85):
http://mightyohm.com/blog/products/hv-rescue-shield-2-x/
Gli Attiny85 li programma però con la tecnica HVSP, che usa pin un po' strani rispetto alla tecnica ISP.
Title: Re: swRTC
Post by: menniti on Oct 27, 2011, 03:56 pm

Questo è lo schema 1.0 (solo Atmega328):
http://mightyohm.com/blog/2008/09/arduino-based-avr-high-voltage-programmer/

Questo è lo schema 2.0 (Atmega328, Attiny2313, Attiny85):
http://mightyohm.com/blog/products/hv-rescue-shield-2-x/
Gli Attiny85 li programma però con la tecnica HVSP, che usa pin un po' strani rispetto alla tecnica ISP.

Io ho realizzato questa:
http://mightyohm.com/blog/products/avr-hv-rescue-shield/
ricordavo il secondo zoccolo ma NON la famiglia.
Title: Re: swRTC
Post by: alexdb on Oct 27, 2011, 08:01 pm




non posso lavorare sulla swRTC, stamani. Ho appena briccato 2 Attiny85 cercando di abilitare l'oscillatore interno a 128 kHz ed ora mi devo costruire un programmatore H/V per cercare di defibrillarli  ]:D
Meno male che ho trovato un alimentatore 12V di un HD esterno che mi si è bruciato mesi fa.... vediamo se riesco a compicciare qualcosa in 1 ora... :smiley-roll-sweat:

Se è solo per i tiny85 devi collegare 3-4 fili dall'Arduino, lo puoi fare su una bread tranquillamente; ti consiglio di seguire il primo schema, 1.0, devi usare il relativo sketch; la versione 2 dello sketch è incompatibile con i collegamenti della 1.
Ti permette solo la programmazione dei fuse, non te li fa leggere, ma a te ora serve risolvere il problema, poi realizzerai lo strumento professionale che sta facendo menniti, al quale stai dando una mano per il firmware della gestione seriale, certamente non mancherà di restituirti il favore ;)

che strumento professionale stai realizzando?

Un programmatore di fuse per molte famiglie di micro ATMEL, alla fine sarà uno strumento chiuso in contenitore, completamente stand-alone, alimentato a 220V; ho fatto i test delle varie sezioni singole ed è tutto ok, anche i primi interfacciamenti danno ottimi risultati. Ora sono alle prese con la progettazione fisica: dimensioni dei vari pcb, disposizione nel contenitore, calcolo dell'alimentazione, e cose del genere, quindi devo completare gli schemi elettrici e poi passo al disegno dei PCB, c'è ancora tanto lavoro ma ormai è in "gestazione".

ma è solo programmatore di fuse o anche programmatore normale?
Title: Re: swRTC
Post by: testato on Oct 27, 2011, 09:17 pm

C'è da fare i conti con la temperatura che influenza notevolmente la frequenza del quarzo,

Non e' vero Astro, la temperatura, come ho gia' scritto, influenza poco. Tra i 20 e i 30 gradi influenza di niente, decimi di secondo all'anno. Se invece aumentiamo il range parliamo di secondi
La termostabilizzazione e' secondaria nella creazione di un normale orologio

il 3132 chip termocompensato che usero' dichiara 2 ppm, e per un range di -40 a +85° dichiara solo un aumento a 3,5ppm
Title: Re: swRTC
Post by: menniti on Oct 27, 2011, 09:37 pm


C'è da fare i conti con la temperatura che influenza notevolmente la frequenza del quarzo,

Non e' vero Astro, la temperatura, come ho gia' scritto, influenza poco. Tra i 20 e i 30 gradi influenza di niente, decimi di secondo all'anno. Se invece aumentiamo il range parliamo di secondi
La termostabilizzazione e' secondaria nella creazione di un normale orologio

il 3132 chip termocompensato che usero' dichiara 2 ppm, e per un range di -40 a +85° dichiara solo un aumento a 3,5ppm

ma è proprio perché è "termocompensato", altrimenti la situazione sarebbe decisamente peggiore, la temperatura influenza eccome i sistemi di oscillazione in generale.
Title: Re: swRTC
Post by: testato on Oct 27, 2011, 09:54 pm
scusa l'esempio del termocompensato e' effettivamente inutile.

Facciamo esempi reali con un chip normale come il 1307 quindi non termocompensato

5° 1,45 sec/day
15°0,35 sec/day
25° 0 sec/day
35° 0,35 sec/day
45° 1,45 sec/day

come vedi per un uso da orologio in casa, dove la temperatura e' centrata sulla campana di risposta dei quarzi, il fattore temperatura puo' essere tenuto in secondo piano.
Title: Re: swRTC
Post by: astrobeed on Oct 27, 2011, 09:59 pm

Non e' vero Astro, la temperatura, come ho gia' scritto, influenza poco. Tra i 20 e i 30 gradi influenza di niente, decimi di secondo all'anno. Se invece aumentiamo il range parliamo di secondi


Forse è meglio che ti rifai i conti, un errore di un singolo ppm, cioè un microsecondo ogni secondo, sono 0.0909 periodico secondi al giorno, ovvero 1 secondo ogni 11 giorni, ovvero 99 secondo in un anno.
Come varia l'errore di frequenza nei quarzi in funzione della temperatura è una funzione legato al quadrato della differenza tra la temperatura di turnover, tipicamente 25°, e quella ambiente con una formulazione di questo tipo:

Ktppm * (T - T0)^2   +/-10% dove Ktppm è una costante con valore tipico compreso tra 0.01 e 0.05
Con 10°di differenza rispetto a 25°, non importa se in più o meno, e Ktppm pari a 0.035 (valore medio caratteristico di un buon quarzo) l'errore in ppm diventa circa 0.035 * (25-10) ^ 2 = 0.035 * 15^2 = 0.0035 *225= 7.8 ppm che sono quasi un secondo al giorno.

Ti rammento che stiamo parlando di quarzi e non di chip termocompensati che tengono conto automaticamente dell'errore indotto dalla temperatura, cosa che puoi fare benissimo con un qualunque micro dotandolo di un sensore di temperatura.
Title: Re: swRTC
Post by: testato on Oct 27, 2011, 10:12 pm
non mi ritrovo
0,09 sec al giorno sono 33 sec annui

anche i 7,8ppm non sono un secondo al giorno ma quasi la meta', 0,67 per la precisione

e cmq 10ppm di differenza partendo da 25, cioe' arrivando a 15°, portano ad un errore di soli 0,35sec che sarebbero 4.2 ppm

Note: Temperature dependent crystal frequency error in ppm is determined using the formula:
Error (ppm) = -0.042(25 - OperTemp)²
Title: Re: swRTC
Post by: leo72 on Oct 27, 2011, 10:19 pm
Testato, lo sai che sei un po' "testone"?  :D
Siamo a 31 pagine di thread di cui l'80% a discutere di come realizzare un orologio con uno scarto prossimo a zero.... secondo me fai prima a sincronizzarti col segnale orario di Francoforte, davvero  ;)
Title: Re: swRTC
Post by: testato on Oct 27, 2011, 10:23 pm
lo faccio per te, per tenere il topic alto, se ti dispiace apro un altro topic dal titolo: "Oscilliamo"  :)
Title: Re: swRTC
Post by: menniti on Oct 27, 2011, 10:26 pm
Ma come li fate sti conti :smiley-eek:?
0.0909/giorno*365gg/anno=33.17 secondi/anno (anche bisestile non cambia quasi niente)
Title: Re: swRTC
Post by: leo72 on Oct 27, 2011, 10:29 pm

Ma come li fate sti conti :smiley-eek:?
0.0909/giorno*365gg/anno=33.17 secondi/anno (anche bisestile non cambia quasi niente)

Eh sì... ;) ;)

Sarà mica colpa della calcolatrice di Windows, vero? :P
Title: Re: swRTC
Post by: testato on Oct 27, 2011, 10:47 pm
infatti questo errore di astro mi e' balzato subito agli occhi, ed essendo la seconda volta che colgo un suo errore, la prima legge inizia a vacillare  :smiley-yell:
Title: Re: swRTC
Post by: menniti on Oct 28, 2011, 09:23 am

infatti questo errore di astro mi e' balzato subito agli occhi, ed essendo la seconda volta che colgo un suo errore, la prima legge inizia a vacillare  :smiley-yell:


ma ti è balzato così tanto che hai sbagliato pure tu  :smiley-yell: forse la frenesia.... :smiley-mr-green:
Title: Re: swRTC
Post by: astrobeed on Oct 28, 2011, 09:30 am

Sarà mica colpa della calcolatrice di Windows, vero? :P


No colpa del dannato monitor 1920x1080 su solo 24" dove i caratteri della calcolatrici sono piccini piccini e, complice la stanchezza, ho letto 99 al posto di 33  :smiley-mr-green:
Title: Re: swRTC
Post by: astrobeed on Oct 28, 2011, 09:40 am

infatti questo errore di astro mi e' balzato subito agli occhi, ed essendo la seconda volta che colgo un suo errore, la prima legge inizia a vacillare  :smiley-yell:


Se ti vuoi mettere a fare gara con me hai perso in partenza   :D
Se parliamo di vera precisione per un oscillatore quarzato hai solo due strade percorribili:
Termocompensarlo, ovvero prima lo tari al valore nominale a 25° esatti e poi in base alla temperatura del quarzo, misurata in modo preciso, e il suo Ktppm, che non è uguale per tutti i quarzi, ti calcoli la deviazione e la compensi.
Termostabilizzarlo, ovvero tramite un apposito elemento riscaldante mantieni il quarzo ad una temperatura nota e molto stabile dopo di che tari la frequenza in modo preciso al valore nominale e sei a posto.
Tutta la strumentazione di un certo livello usa come minimo oscillatori termocompensati, oppure quelli termostabilizzati se viene richiesta la massima precisione possibile.
Title: Re: swRTC
Post by: menniti on Oct 28, 2011, 10:40 am


infatti questo errore di astro mi e' balzato subito agli occhi, ed essendo la seconda volta che colgo un suo errore, la prima legge inizia a vacillare  :smiley-yell:


Se ti vuoi mettere a fare gara con me hai perso in partenza   :D
Se parliamo di vera precisione per un oscillatore quarzato hai solo due strade percorribili:
Termocompensarlo, ovvero prima lo tari al valore nominale a 25° esatti e poi in base alla temperatura del quarzo, misurata in modo preciso, e il suo Ktppm, che non è uguale per tutti i quarzi, ti calcoli la deviazione e la compensi.
Termostabilizzarlo, ovvero tramite un apposito elemento riscaldante mantieni il quarzo ad una temperatura nota e molto stabile dopo di che tari la frequenza in modo preciso al valore nominale e sei a posto.
Tutta la strumentazione di un certo livello usa come minimo oscillatori termocompensati, oppure quelli termostabilizzati se viene richiesta la massima precisione possibile.


Abbi pazienza Astro, è un ragazzuolo, e si sa che i ragazzuoli sono sempre un po' ribelli, ci prova..... :smiley-mr-green:
Title: Re: swRTC
Post by: testato on Oct 28, 2011, 11:22 am
Astro, logicamente si scherza, figurati se faccio a gara con te, ma riuscire a dribblare maradona e' bello  XD

x menniti, non scherzare, io ho scritto da subito 33, anche perche' ho semplicemente fatto 0,09x365, piu' facile di cosi', avevo capito che era un banale errore di trascrizione  :)
Title: Re: swRTC
Post by: menniti on Oct 28, 2011, 11:39 am

Astro, logicamente si scherza, figurati se faccio a gara con te, ma riuscire a dribblare maradona e' bello  XD

x menniti, non scherzare, io ho scritto da subito 33, anche perche' ho semplicemente fatto 0,09x365, piu' facile di cosi', avevo capito che era un banale errore di trascrizione  :)


Io scherzo sì, ma tu bari ]:D il "« Last Edit: 27 October 2011, 22:20:51 by Testato »" conferma chiaramente che prima avevi scritto 58, ecco perché sono intervenuto parlando ad entrambi, nessuno dice che anche il tuo non fosse un banale errore di trascrizione :smiley-mr-green:, confermato dal fatto che forse l'hai corretto prima del mio post, come sembrerebbe. Mi suona però strano che anche Leo, dopo di me, abbia letto e confermato; sei forse riuscito a trovare il modo di decidere che orario deve mostrare il "last edit"? :P
Se fai così d'ora in poi ti quoto così la vergogna resterà per sempre :smiley-yell:
Title: Re: swRTC
Post by: testato on Oct 28, 2011, 03:06 pm
Bha, davvero non so, io ho scritto 33 dall' inizio, l'edit e'stato solo per aggiungere la forma sotto, e.come credo non e' nemmeno sovrapposta l'ora, cioè non stavamo scrivendo insieme. Bho sarà impazzito il forum.
Title: Re: swRTC
Post by: testato on Nov 15, 2011, 10:51 pm
Leo al mio valvolare mancano solo un paio di cosine, il contatore 0-9 che grazie a te e' diventato di poche righe ed ora devo solo decidere come e quando farlo avviare (credo di riuscire a farlo da solo), e poi la gestione dell'ora legale.
Ho provato a cercare ma sembra che nessuno ci abbia messo mano su arduino. Tu sai qualcosa in merito ?
E' facile creare da zero la funzione ? c'e' il discorso della settimana da gestire, perche' non avviene in un giorno preciso, ma l'ultima domenica di marzo e ottobre.
Ho chiesto qui perche' sarebbe bello ed utile implementare l'ora legale anche nella libreria. Questo la farebbe distaccare dagli RTC in quanto nessuno gestisce l'ora legale.
Title: Re: swRTC
Post by: leo72 on Nov 15, 2011, 10:57 pm
Ti avevo promesso di dargli un'occhiata, così non è stato per mancanza di tempo (sono dietro a 2/3 progettini contemporaneamente) ed il tempo è quello che è.

Conto di farlo, non è impossibile. Devo solo trovare la voglia di mettermi a fare delle prove.
Title: Re: swRTC
Post by: testato on Nov 15, 2011, 11:07 pm
nemmeno ricordavo che lo avevi promesso :)

nel frattempo continuo a cercare. Ho trovato un tipo che lo ha fatto su PIC, provo a contattarlo, se e' disponibile a fornire il codice credo sia facile riscriverlo per atmega
Title: Re: swRTC
Post by: leo72 on Nov 15, 2011, 11:12 pm
Cmq è una scemenza farlo. Se hai pazienza ad aspettare un paio di gg credo che entro la fine della settimana posso fare la modifica.
Title: Re: swRTC
Post by: testato on Nov 16, 2011, 12:00 am
no problem, fai con calma.
ma io non uso la tua libreria, lo sai sono passato ad rtc, potro' estrapolare poi quello che serve a me ?
Title: Re: swRTC
Post by: leo72 on Nov 16, 2011, 10:30 am
Sicuramente.
Title: Re: swRTC
Post by: pictux on Nov 16, 2011, 01:01 pm
Quote
Ho chiesto qui perche' sarebbe bello ed utile implementare l'ora legale anche nella libreria.

+1

Mi son trovato a dover convertire l'ora GMT, e la gestione dell'ora solare/legale faciliterebbe davvero molto le cose!
Title: Re: swRTC
Post by: leo72 on Nov 16, 2011, 01:06 pm
Se moglie e figli non rompono, oggi ci lavoro  :smiley-sweat:
Title: Re: swRTC
Post by: testato on Nov 18, 2011, 07:21 pm
non per darti fretta, ma solo per contribuire, stavo pensando alla logica di funzionamento, vedi se sei daccordo:

IF => ultima domenica marzo
(primo problema: gli RTC contano anche i giorni della settimana, pero' le domeniche possono essere anche 5 in un mese)
    IF 02.00 di notte
         IF Ora Legale FALSE

Sposta l'orario dell'RTC, e metti a TRUE Ora Legale
------------------------------------------
Stesso discorso ad Ottobre, tornare indietro e settare Ora Legale


In questa analisi ci sono due scelte, la prima e' che il confronto viene fatto tutti i giorni > superiori a marzo, perche' potrei avere l'orologio spento nel giorno della variazione, e quindi se il controllo viene fatto con un == non funzionerebbe
La seconda scelta e' La Variabile ORA LEGALE deve andare nella EEPROM, in modo da non perdersi quando si stacca l'alimentazione, sempre per il discorso di cui sopra, dovendo fare un confronto tutti i giorni, e non solo al giorno esatto, il giorno dopo incrementerebbe dinuovo, ecc ecc.

Che ne pensi ?
Title: Re: swRTC
Post by: leo72 on Nov 18, 2011, 10:40 pm
Tu hai ragione nel mettermi fretta ma ho sempre un sacco di cose da fare...  :smiley-roll-sweat:
Comunque la settimana prox mi cambiano il turno al lavoro per cui avrò la mattina e la sera liberi, senz'altro la termino.

La memorizzazione su EEPROM si può fare ma non so quanto possa essere utile. Senza batteria tampone, se va via l'alimentazione l'orologio si resetta per cui avere l'impostazione corretta dell'ora legale con un orario a caso sa un po' cosa inutile  XD XD
Title: Re: swRTC
Post by: testato on Nov 19, 2011, 09:19 am
nono, nella eeprom ci va solo la.variabile x che dars boolean solo per dire se ora legale e attiva o no.
orario resta gestito fa rtc, nel mio caso, e da swrtc, nel tuo caso.
Tu potresti non usate eeprom, mentre nel caso di rtc serve farlo.
Title: Re: swRTC
Post by: leo72 on Nov 19, 2011, 10:47 am
Ok. Ho capito.
Title: Re: swRTC
Post by: lestofante on Nov 19, 2011, 01:59 pm
secondo me questo controllo non lo metti nell'interrupt ma sono quando l'utente richiede la data: se la data cade nel giono compreso tra X e Y, allora aggiungi un'ora. Quindi l'orologio in se se ne frega dell'ora legale, è un'aggiunta secondaria.
questo è necessario sopratutto nella mia versione, per non incasinare i conti col timestamp
Title: Re: swRTC
Post by: leo72 on Nov 19, 2011, 03:47 pm

secondo me questo controllo non lo metti nell'interrupt ma sono quando l'utente richiede la data: se la data cade nel giono compreso tra X e Y, allora aggiungi un'ora. Quindi l'orologio in se se ne frega dell'ora legale, è un'aggiunta secondaria.

Sì.

Quote

questo è necessario sopratutto nella mia versione, per non incasinare i conti col timestamp

Che anche tu non hai mai messo a posto  XD
Title: Re: swRTC
Post by: lestofante on Nov 19, 2011, 04:34 pm
ehm ehm ehm.. adesso sto lavorando ad altro,però in effetti almeno i test per studiare l'andamento dell'errore dei quarzi potevo farlo :)
Title: Re: swRTC
Post by: leo72 on Nov 19, 2011, 05:26 pm

ehm ehm ehm.. adesso sto lavorando ad altro

Siamo sulla stessa barca...  XD
Pensa che ho ancora da realizzare il PCB per la mia stazione meteo... poi sto finendo di lavorare sul sensore dei gas ed ora ho già un altro paio di idee da "coltivare"... non finisco mai niente  :smiley-sweat:
Title: Re: swRTC
Post by: lestofante on Nov 19, 2011, 06:28 pm
finisce sempre così, i progettini personali non si ha mai tempo i finirli, e quando ce l'hai lo usi per aggiungere sempre qualcosa...
Title: Re: swRTC
Post by: testato on Nov 19, 2011, 10:17 pm
io mi costringo a  finire, o almeno a mettere un punto fermo.
altrimenti si lascia sempre tutto a meta'
ad esempio ho la shield ethernet ed ho il megadisplay elettroluminescente che mi aspettano, ma se non metto questa benedetta ora legale ed accantono definitivamente il valvolare, poi so che resterebbe sempre monco.

potrei iniziare a tentare di scrivere io il codice, ce la posso fare ?
almeno inizio a vedere come si usa la eeprom che non l'ho mai fatto.
Title: Re: swRTC
Post by: leo72 on Nov 19, 2011, 10:21 pm
Usare la EEPROM è facile. Per leggere una locazione dai il suo indirizzo, per scrivere dai l'indirizzo ed il valore.
Delay(5) dopo ogni scrittura (secondo il datasheet ci mette circa 3,3ms a salvare un byte).
Title: Re: swRTC
Post by: lestofante on Nov 20, 2011, 12:39 am
la eeprom è facile se inizia ragionare in byte, che poi ti serve per l'ethernet shield.

per il resto parti dal codice che abbiamo già scritto!
Title: Re: swRTC
Post by: testato on Nov 20, 2011, 09:50 am
Il codice della swrtc a me non serve, uso rtc hardware.
Devo solo gestire ora legale, correggendo rtc.
Quindi ognI 6 mesi correggere in automatico lorario dellrtc hw.

Volendo fare le cose in grande potrebbe diventare una libreria dove scegliere solo la nazione. Esiste infatti un file open.source manutenuto, che include tutti i paesi di tutte le epoche.

Ma per me e troppo, mi basta la mia misera ora da spostare :)
Title: Re: swRTC
Post by: leo72 on Nov 20, 2011, 11:42 am

Volendo fare le cose in grande potrebbe diventare una libreria dove scegliere solo la nazione. Esiste infatti un file open.source manutenuto, che include tutti i paesi di tutte le epoche.

E' un dispendio inutile di risorse.
Alla fine, quanto andrebbe ad occupare questa libreria in termini di Flash? Troppo.
Ora come ora, la swRTC occupa sui 1750 byte, con tutta la gestione degli interrupt e dei timer. Quindi usabilissima anche sui Tiny con 2 kB di memoria.
Title: Re: swRTC
Post by: testato on Nov 20, 2011, 10:18 pm
di preciso non so, pero' visto che mantiene lo storico effettivamente e' una cosa grande, sfizioso il fatto che l'orario tedesco del periodo dell'occupazione a fine guerra, non e' definito in quanto le 4 potenze occupanti, usavano orari diversi :)
Title: Re: swRTC
Post by: leo72 on Nov 20, 2011, 10:32 pm
Ora che lo so, stanotte dormirò più tranquillo  XD XD

A parte gli scherzi, io sono un po' pratico, in queste cose. Se una cosa non serve, la lascio perdere.
Title: Re: swRTC
Post by: aventrax on Nov 27, 2011, 12:54 am
Ragazzi, molto bella la discussione tecnica sulla precisione di sti orogologi ma sul concreto io sto cercando di aggiornare l'ora via seriale, mandando una stringa tipo !D201111260049 . Peccato che arrivo a memorizzare in un array tutti i caratteri e con la funzione String riesco anche a suddividere anno, mese, giorno etc...


Ma quando vado a usare la stringa che ho creato dentro la funzione per l'aggiornamento dell'ora ---> B O O M ! !

sketch_nov26a.cpp: In function 'void loop()':
sketch_nov26a:62: error: no matching function for call to 'swRTC::setTime(String&, String&, int)'
/Users/matteo/Documents/Arduino/libraries/swRTC/swRTC.h:32: note: candidates are: boolean swRTC::setTime(byte, byte, byte)


Ora le stringhe me le compongo così:

     String anno =  String(inData[0]) + String(inData[1]) + String(inData[2]) + String(inData[3]);
     String mese = String(inData[4]) + String(inData[5]);
     String giorno = String(inData[6]) + String(inData[7]);
     String ora = String(inData[8]) + String(inData[9]);
     String minuto = String(inData[10]) + String(inData[11]);

Peccato che lui voglia delle variabili "byte" se ho capito bene. Ma non so come concatenare delle variabili byte!!!
Come avrete inteso sono un niubbo!!

Ciao
M
Title: Re: swRTC
Post by: leo72 on Nov 27, 2011, 01:04 am
Sì, swRTC.setTime richie dati in formato byte.
Devi fare la conversione tra tipi di dato.
Prova convertendo il tuo dato String in un char* usando String.toCharArray e poi con atoi a convertire questo in un numero.

Una soluzione più semplice è spedire direttamente i dati in formato byte: byte mandi, byte arrivano.
Title: Re: swRTC
Post by: aventrax on Nov 27, 2011, 01:16 am

Sì, swRTC.setTime richie dati in formato byte.
Devi fare la conversione tra tipi di dato.
Prova convertendo il tuo dato String in un char* usando String.toCharArray e poi con atoi a convertire questo in un numero.

Una soluzione più semplice è spedire direttamente i dati in formato byte: byte mandi, byte arrivano.


Grazie, ma io non ce l'ho già l'array di byte?? Scusa ti metto il codice che uso... perché non ci capisco niente :P

Code: [Select]

#include <swRTC.h>
swRTC rtc;

int  inChar;             // var that will hold the bytes-in read from the serialBuffer
byte inData[12];  // array that will hold the different bytes  100=100characters;


void setup() {

  delay(2000);
  rtc.stopRTC();
  rtc.setTime(10,43,0); //set the correct time...
  rtc.setDate(25,11,2011); //... and date if you want
  rtc.startRTC();
 
  Serial.begin(9600);
  Serial.println("Arduino Ready");
}

void loop () {

 
 
  while(Serial.available() > 0)
  {


   inChar = Serial.read(); // leggo il primo carattere inviato
   if(inChar == '!') // se inizia per ! allora è un comando e vado a vedere che comando
   {

    Serial.print("Comando: ");
    inChar = Serial.read(); // leggo il secondo carattere inviato
    if(inChar == 'D')  // se inizia per D è il comando settare data e ora
    {
     Serial.println("TimeSync ");
     // leggo le prossime 12 cifre per il formato data YYYYMMDDhhmm
     
     int i = 0;
     for (i=0;i<11;i++)
     {
       inChar = Serial.read();
       inData[i] = inChar;
     }
   
     String anno =  String(inData[0]) + String(inData[1]) + String(inData[2]) + String(inData[3]);
     String mese = String(inData[4]) + String(inData[5]);
     String giorno = String(inData[6]) + String(inData[7]);
     String ora = String(inData[8]) + String(inData[9]);
     String minuto = String(inData[10]) + String(inData[11]);
     
     delay(2000);
     rtc.stopRTC();
     rtc.setTime(ora,minuto,0); //set the correct time...
     rtc.setDate(giorno,mese,anno); //... and date if you want
     rtc.startRTC();
         
    }

   }

  }

}
Title: Re: swRTC
Post by: leo72 on Nov 27, 2011, 01:29 am
Tu hai un array di byte, che non è propriamente una stringa del C classico, ossia un array di char*. atoi funziona con questo tipo di dati,.

L'alternativa, come ti ho detto, per evitare tutte queste conversioni, è spedire direttamente i dati in formato byte. Cioè spedisci byte(23) e ricevi byte(23).
Title: Re: swRTC
Post by: aventrax on Nov 27, 2011, 03:14 am
Ok ce l'ho fatta... posto il codice che magari a qualche principiante come me puo servire..
Setto l'ora con comando da seriale tipo: !D201111261200 e mandando un "G" mi dice l'ora...

Code: [Select]
#include <swRTC.h>
swRTC rtc;

int  inChar;
byte inData[12];  

void setup() {

 delay(2000);
 rtc.stopRTC();
 rtc.setTime(10,43,0);
 rtc.setDate(25,11,2011);
 rtc.startRTC();
 
 Serial.begin(9600);
 Serial.println("Arduino Ready");
}

void loop () {

 
 while(Serial.available() > 0)
 {


  inChar = Serial.read(); // leggo il primo carattere inviato
  if(inChar == '!') // se inizia per ! allora è un comando e vado a vedere che comando
  {

   Serial.print("Set -> ");
   inChar = Serial.read(); // leggo il secondo carattere inviato
   if(inChar == 'D')  // se inizia per D è il comando settare data e ora
   {
    Serial.print(" Time : ");
   
    int i = 0;
    for (i=0;i<12;i++) // leggo le prossime 12 cifre per il formato data YYYYMMDDhhmm
    {
      inChar = Serial.read();
      inData[i] = inChar;
    }
   
    char anno[] = { inData[0], inData[1], inData[2], inData[3], 0 };
    char mese[] = { inData[4], inData[5], 0 };
    char giorno[] = { inData[6], inData[7], 0 };
    char ora[] = { inData[8], inData[9], 0 };
    char minuto[] = { inData[10], inData[11], 0 };
   
    int Anno = atoi(anno);
    int Mese = atoi(mese);
    int Giorno = atoi(giorno);
    int Ora = atoi(ora);
    int Minuto = atoi(minuto);
     
    Serial.print(Anno);
    Serial.print("/");
    Serial.print(Mese);
    Serial.print("/");
    Serial.print(Giorno);
    Serial.print(" ");
    Serial.print(Ora);
    Serial.print(":");
    Serial.println(Minuto);
     
    delay(2000);
    rtc.stopRTC();
    rtc.setTime(Ora,Minuto,0);
    rtc.setDate(Giorno,Mese,Anno);
    rtc.startRTC();

   }
   


  }
 
 
  if (inChar == 'G')
  {
    Serial.print(rtc.getYear(), DEC);
    Serial.print("/");
    Serial.print(rtc.getMonth(), DEC);
    Serial.print("/");
    Serial.print(rtc.getDay(), DEC);
    Serial.print(" ");
    Serial.print(rtc.getHours(), DEC);
    Serial.print(":");
    Serial.println(rtc.getMinutes(), DEC);
   }
 
 
 
 }
 
 

}
Title: Re: swRTC
Post by: aventrax on Nov 27, 2011, 03:28 am
Dimeticavo, grazie per l'hint Leo!
Title: Re: swRTC
Post by: leo72 on Nov 27, 2011, 11:49 am

Dimeticavo, grazie per l'hint Leo!

;)
Title: Re: swRTC
Post by: leo72 on Nov 27, 2011, 12:57 pm
Nuova versione 0.8.3.
Piccole modifiche per introdurre il supporto all'Atmega1284 (da provare) e revisione della documentazione della libreria.

Se ci riesco, oggi lavoro all'ora legale.
Title: Re: swRTC
Post by: aventrax on Nov 27, 2011, 03:39 pm
Non ho avuto la pazienza di leggere tutto il thread sulla precisione dell'orologio, mi limito a fornirti un feekback sul comportamento di un lilpad con il 328.. dopo 8 ore ha scazzato di 4 minuti. Per me non è un problema perché tanto una volta al giorno sincronizzo via seriale (appena mi arrivano i moduli bluetooth aggiorno wireless) e i più lo userò come cronotermostato e quindi non serve sia preciso, mi basta non dovermi costruire un rtc :P

Ciao
M
Title: Re: swRTC
Post by: leo72 on Nov 27, 2011, 04:29 pm
Nelle tante pagine è stato analizzato più volte il problema.
La questione è: se desideri una precisione molto elevata, devi usare un quarzo esterno, gli oscillatori interni così come i risonatori esterni (vedi ad esempio quello dell'Arduino UNO) hanno una tolleranza che può rasentare il +/-10%.
Se la discrepanza è fissa puoi provare con deltaT a riallineare l'RTC al tempo reale.
Title: Re: swRTC
Post by: testato on Nov 27, 2011, 07:41 pm
prova ad usare il deltaT, ancxhe se non ti serve molta precisione cmq togliere quei quattro minuti fa bene a te ed a Leo come test.

x l'ora legale sono qui pronto a testare, per noi in italia dal 1996, insieme con il resto dell'Europa: l'inizio +1 all'ultima domenica di marzo mentre la fine -1 è spostata all'ultima domenica di ottobre.
Title: Re: swRTC
Post by: aventrax on Nov 27, 2011, 10:45 pm
Ne approfitto, come faccio a farmi restituire dalle funzioni l'ora in formato 01:05 e non 1:5 ??
Title: Re: swRTC
Post by: leo72 on Nov 27, 2011, 10:47 pm
La funzione non restituisce i dati come stringa formattata. Devi fare tu la conversione.
Title: Re: swRTC
Post by: aventrax on Nov 27, 2011, 11:41 pm

La funzione non restituisce i dati come stringa formattata. Devi fare tu la conversione.



Mi faccio schifo da solo...

Code: [Select]
if (rtc.getMonth() < 10) { Serial.print((String("0") + String(rtc.getMonth(), DEC))); }
  else { Serial.print(rtc.getMonth(),DEC) ;}
Title: Re: swRTC
Post by: leo72 on Nov 27, 2011, 11:47 pm
E perché? Invece hai fatto una cosina semplice e pratica.
Title: Re: swRTC
Post by: aventrax on Nov 27, 2011, 11:49 pm
Si ma immagino che uno che sa programmare lo faccia in un'elegante mezza riga con caratteri incomprensibili per me :p hehehe
Title: Re: swRTC
Post by: leo72 on Nov 28, 2011, 12:12 am
L'importante è che funzioni. E poi come dico sempre: non c'è mai un solo modo per fare una cosa, in informatica.
Title: Re: swRTC
Post by: lestofante on Nov 28, 2011, 01:43 am
@aventrax: giusto per farti felice (e insegnarti qualcosa di nuovo):
Code: [Select]

if (rtc.getMonth() < 10) { Serial.print((String("0") + String(rtc.getMonth(), DEC))); }
 else { Serial.print(rtc.getMonth(),DEC) ;}


diventa:

Code: [Select]

rtc.getMonth() < 10 ? Serial.print("0");
Serial.print(rtc.getMonth(),DEC) ;


come ci sono arrivato(ovvero il trucco del mestiere)?
passaggio N1: ottimizziamo... String(rtc.getMonth(), DEC) la devi eseguire sia che l'if sia vero che sia falso... quindi va fuori dall'IF così lo scrivi una volta sola... quindi diventa:
(notare che rimanendo String("0") da sola, quindi senza il bisogno di essere concatenata con un altra stringa, si può evitare... In oltre è buona cosa identare il codice.
Code: [Select]

if (rtc.getMonth() < 10) {
   Serial.print("0");
}
Serial.print(rtc.getMonth()) ;


Passaggio N2:
un if che deve eseguire una sola istruzione, e quindi non necessita di {}, per esempio:
Code: [Select]

if (a==b)
 faiC();
else
 faiD();


più essere scritto:
Code: [Select]

a==b?faiC():faiD();


ovviamente non avevamo bisogno dell'else (i due punti) e quindi l'ho omesso nel codice, esattamente come un if normale. CREDO che si possano usare le parentesi graffe lo stesso con questa tipologia di if, ma l'uso lo sconsinglio per una questione di leggibilità: un else è facile da trovare, un : no.
Title: Re: swRTC
Post by: testato on Nov 28, 2011, 12:29 pm
ci inchiniamo ai maestri  :)
Title: Re: swRTC
Post by: aventrax on Nov 28, 2011, 01:05 pm

@aventrax: giusto per farti felice (e insegnarti qualcosa di nuovo):
Code: [Select]

rtc.getMonth() < 10 ? Serial.print("0");
Serial.print(rtc.getMonth(),DEC) ;



Sei un grande lesto, non esitare a darmi dritte in futuro! Sono tutt'orecchi... sta sera provo le modifiche che mi hai suggerito!

Ciao
M
Title: Re: swRTC
Post by: leo72 on Nov 28, 2011, 03:13 pm
Su suggerimento del mio amico Bob "CrossRoads", ho pubblicato la libreria anche sul forum internazionale
http://arduino.cc/forum/index.php/topic,80489.0.html
consiglio a tutti quelli che vogliono suggerire migliorie od altro di seguire anche tale discussione.

Ho inoltre inserito un link anche nel Playground:
http://arduino.cc/playground/Main/LibraryList#Timing
(solo un link, perché le pagine su quel Wiki sono difficili da editare)
Title: Re: swRTC
Post by: aventrax on Nov 29, 2011, 08:29 pm
lesto, quello che mi hai suggerito mi da errore...

calduino_pre0.cpp: In function 'void loop()':
calduino_pre0:135: error: expected `:' before ';' token
calduino_pre0:135: error: expected primary-expression before ';' token

in pratica non mi fa mettere

Code: [Select]

rtc.getMonth() < 10 ? Serial.print("0");


vuole per forza

Code: [Select]

rtc.getMonth() < 10 ? Serial.print("0") : faialtro();


..e anche se metto : faialtro() con certe funzioni va, per ese è ok con rtc.getMonth(), invece da errore con delay(100)...mah?!?!
cmq io ho risolto mettendo

Code: [Select]

if (rtc.getMonth() < 10) Serial.print("0");


però il punto di domanda mi piaceva :P

ps: forse stiamo inquinando il thread, meglio spostarsi altrove?
Title: Re: swRTC
Post by: lestofante on Nov 29, 2011, 10:30 pm
wops, in effetti la clausola else pnon può essere omessa...
a parte questo a me compila anche se uso delay.

@leo: ottima idea la pubblicazione, l'hai messa anche tra le librerie ufficiali sul sito che aveva proposto banzi qualche tempo fa?
Title: Re: swRTC
Post by: leo72 on Nov 29, 2011, 10:47 pm
Per ora no. Mi ero registrato a suo tempo, ma non ho fatto ancora la segnalazione. E poi non mi ricordo più l'indirizzo  :smiley-sweat:
Title: Re: swRTC
Post by: testato on Nov 29, 2011, 11:20 pm
Leo il link alla discussione inglese mettilo nel primo post, in modo da averlo a portata di mano.
Title: Re: swRTC
Post by: testato on Nov 30, 2011, 10:44 pm
Leo ho trovato questa libreria che sembra includere l'ora legale.
Vedi se ti puo' essere utile
http://www.swfltek.com/arduino/timelord.html

Title: Re: swRTC
Post by: leo72 on Nov 30, 2011, 11:14 pm
Ci stavo già lavorando. Ieri ho fatto un bel po' di codice, oggi non ho potuto metterci mano per via del dentista  =(
Cmq non so che praticità avrà, ho paura che vada a farsi friggere una peculiarità della lib, ossia il ridotto consumo di risorse.
Vediamo alla fine dei salmi che impatto ha sulla dimensione del codice.
Title: Re: swRTC
Post by: Maurotec on Dec 01, 2011, 12:09 am
Ho modificato una libreria (MHVlib) in modo da permettere la personalizzazione della frequenza di CPU, cioè quel parametro F_CPU passato a tempo di compilazione lo imposto all'inizio del programma. Questa lib contiente già una libreria RTC, appena arriva il display vedo quanto preciso è un orologio con il 328. Avevo pensato di compensare il valore della frequenza a run-time per compensare la deriva, vediamo se funziona.

Ciao.
Title: Re: swRTC
Post by: testato on Dec 01, 2011, 12:10 am
bella news for me:
The battery backup also applies to 56byte of general purpose RAM.

non avevo pensato che i rtc hanno sempre un po' di spazietto in ram tamponata da poter usare, questo mi permette di non usare la eeprom del micro.
http://dangerousprototypes.com/docs/DS1307_real_time_clock
Title: Re: swRTC
Post by: testato on Dec 01, 2011, 12:56 am
ohoh, il mio rtc non ha Ram disonibile come il 1307.

devo ritornare sull'opzione eeprom.

oppure avrei in mente un trucchetto, apro topic a parte
Title: Re: swRTC
Post by: leo72 on Dec 01, 2011, 09:11 am
@Mauro:
la compensazione è quello che fa infatti la swRTC con il parametro deltaT.
Un 328 con clock esterno è abbastanza preciso, ma se vuoi aumentare la precisione puoi attivare il modulo RTC (Real-Time Counter, non Real-Time Clock) del micro, usare l'oscillatore interno come generatore di frequenza e mettere un cristallo da 32768 Hz sui pin normalmente destinati al quarzo. Attivando il prescaler a 256 hai un segnale di clock esattamente ogni secondo. Provato e funziona, ma non ho sperimentato la precisione.
Title: Re: swRTC
Post by: leo72 on Dec 04, 2011, 07:04 pm
Ho terminato ora una versione "grezza" della lib con supporto all'ora legale.
Calcola in automatico le date corrette per il cambio dell'ora in base all'anno in corso nonché il passaggio da ora solare ad ora legale e viceversa.
Penso fra stasera e domani di poterla mettere online.

Ad una prima occhiata, mi pare raddoppi l'occupazione della memoria...  :smiley-roll:
Title: Re: swRTC
Post by: testato on Dec 04, 2011, 09:15 pm
l'importante e' che sia disattivabile, e quindi la usa solo chi ne ha bisogno.

potro' rubarne solo l'algoritmo che serve a me ? hai intenzione di far uscire una libreria ora legale per gli rtc hardware ?
Title: Re: swRTC
Post by: leo72 on Dec 04, 2011, 09:58 pm
Per disattivare la funzione DST (Daylight Saving Time) bisogna o mettere una direttiva per il compilatore oppure, più semplicemente, rilasciare una versione "2" della lib. Penso che seguirò questa seconda strada, più semplice da gestire per i principianti dato che basta che includono la versione che desiderano per avere le opzioni ricercate. Le direttive devono essere modificate manualmente editando i file della lib, che non è mai una cosa buona da far fare a chi non se ne intende molto  :smiley-sweat:

Il calcolo del giorno della settimana è facilmente estraibile, si tratta di utilizzare 2/3 algoritmi, nulla di trascendentale.
Title: Re: swRTC
Post by: testato on Dec 04, 2011, 10:48 pm
visto che ci ho lavorato molto, e mi sento ferrato, potrei controllarti la parte che mi interessa. magari anche in privato, cosi' la pubblichi gia' "testata"  :)

include il discorso spegnimento ?
Title: Re: swRTC
Post by: leo72 on Dec 04, 2011, 10:49 pm

include il discorso spegnimento ?


Di questo me ne ero scordato  :smiley-sweat:
Title: Re: swRTC
Post by: leo72 on Dec 05, 2011, 12:42 am
In allegato trovate la swRTC2.
Rispetto alla precedente versione, questa supporta l'ora legale (in inglese DST, Daylight Saving Time).
Sono stati aggiunti i seguenti nuovi metodi pubblici:
isDstActive
DST

DST(num) imposta la zona geografica. Attualmente supporta solo 0 o 1 come parametro numerico. 0 serve per disattivare il supporto all'ora legale, 1 attiva il supporto per la nostra zona geografica (CET, Central European Time), con ora legale di 1 ora in più dall'ultima domenica di marzo fino all'ultima domenica di ottobre.
isDstActive serve per verificare se il passaggio all'ora legale è attivo o no.

Il passaggio avviene in automatico ed il calcolo viene eseguito sempre automaticamente. Una volta attivata l'ora legale, sarà cura del software non solo calcolare i giorni di passaggio da ora solare a legale e viceversa ma anche riallineare l'ora a quella solare nel caso si decida di disattivare l'ora legale (se ad esempio siamo ad agosto e si decide di disattivare l'ora legale, l'orologio verrà riportato indietro di 1 ora).
All'avvio dello sketch, se si decide di attivare l'ora legale da subito, la libreria calcola i giorni di passaggio e se si accorge che l'ora preimpostata all'avvio ricade nel periodo dell'ora legale, corregge subito l'orario.

Attendo verifiche  :D

PS:
c'è un terzo esempio, denominato swRTC2dst, per verificare il passaggio in automatico all'ora legale.
Title: Re: swRTC
Post by: pictux on Dec 05, 2011, 10:13 am
Quote
In allegato trovate la swRTC2.
Rispetto alla precedente versione, questa supporta l'ora legale (in inglese DST, Daylight Saving Time).


grazie Leo!

Title: Re: swRTC
Post by: leo72 on Dec 05, 2011, 10:51 am
:smiley-sweat:

Ho bisogno di feedback sul suo funzionamento, provatela a fondo perché di test io ne ho fatti pochi per mancanza di tempo. Intanto preparo la documentazione.
Title: Re: swRTC
Post by: pioneer10 on Dec 05, 2011, 10:23 pm
mi intrometto solo per seguire l'interessante discussione...
Ciao Pitusso
Title: Re: swRTC
Post by: astrobeed on Dec 05, 2011, 10:29 pm

Ho bisogno di feedback sul suo funzionamento, provatela a fondo perché di test io ne ho fatti pochi per mancanza di tempo


Ho provato a compilare gli esempi che hai fornito con la 1.0, previa aggiunta di un file Wprogram.h che dichiara Arduino.h alle librerie del core della 1.0, e pare andare senza problemi.

Title: Re: swRTC
Post by: leo72 on Dec 05, 2011, 10:34 pm

Ho provato a compilare gli esempi che hai fornito con la 1.0, previa aggiunta di un file Wprogram.h che dichiara Arduino.h alle librerie del core della 1.0, e pare andare senza problemi.

Buono a sapersi.
Title: Re: swRTC
Post by: pigatchu on Dec 10, 2011, 10:25 am
Ciao a tutti

Essendo questo il mio primo messaggio volevo inanzitutto complimentarmi con tutta la comunity per l'eccezionale lavoro...

Ho un piccolo problema:
la versione 8.0 funziona benissimo
mentre quando utilizzo la versione 8.3 (scaricata sia dal primo post che dal #501)
il compilatore mi restituisce i seguenti errori:

In file included from swRTCtest.cpp:16:
C:\Users\hp\Arduino\arduino-0022\arduino-0022\libraries\swRTC/swRTC.h:43:126: error: operator '||' has no right operand
C:\Users\hp\Arduino\arduino-0022\arduino-0022\libraries\swRTC/swRTC.h:57:2: error: #error Microcontroller not supported

Ho copiato anche il file core_build_options.h nella cartella arduino-0022/hardware/arduino/cores/arduino/

Qualcuno sa indicarmi come risolvere il problema?

Grazie in anticipo

Ciauz
Title: Re: swRTC
Post by: leo72 on Dec 10, 2011, 10:35 am
Hai ragione, c'era un piccolo errore di battitura (un "ritorno a capo" dove non doveva starci).

Adesso è a posto.
Title: Re: swRTC
Post by: pigatchu on Dec 10, 2011, 11:28 am
Grazie Leo

ora funziona perfettamente

ne aprofitto per chiederti un'altra info:
da quanto ho capito leggendo i post precedenti
c'è uno scarto tra il tempo reale e quello indicato dalla libreria
che varia in funzione anche della temperatura di esercizio,
poichè io dovrei utilizzare il mio sistema all'esterno
quindi con temperature variabili tra giorno e notte
mi consigli, prima di settare il delta t, di effettuare delle prove
in condizioni di operatività (all'esterno) per conoscere il "nuovo" valore dello scarto
visto che dentro casa ha uno scarto di circa 8 secondi al giorno ?

Grazie

Ciao
Title: Re: swRTC
Post by: leo72 on Dec 10, 2011, 01:03 pm
Il problema della temperatura affligge tutti gli RTC che non siano termocompensati.
L'oscillazione del clock è influenzata dalla temperatura, ed il valore standard è riferito sempre a 25°C. Temperature inferiori o superiori danno differenze nell'oscillazione. Il deltaT cerca di ovviare a questo inserendo una correzione fissa.

Se però metti all'esterno il circuito, andrai incontro a sbalzi di temperatura tra un valore minimo ed uno massimo. Probabilmente il deltaT da solo non ti aiuta perché la taratura che fai per una temperatura poi non è efficace per un'altra. La precisione che otterrai non sarà mai assoluta. Ma questo vale anche per un RTC "classico" come un DS1307.

Potresti magari dotare il tuo circuito di un sensore di temperatura e poi, dopo qualche test, verificare quanto e come la temperatura influisce sull'RTC software e modificare deltaT in funzione della temperatura.

Ripeto, se ti serve la massima precisione.
Title: Re: swRTC
Post by: pigatchu on Dec 10, 2011, 05:08 pm
Grazie Mille

comunque non necessito di una precisione "atomica"
per cui lo lascierò qualche giorno alle temperature esterne
e poi mi accontenterò di calcolare un delta T medio...

pensavo inoltre di collegarlo ad un alimentatore esterno
e poi collegare una batteria da 9 v ai pin vin e gnd
che faccia da "batteria tampone" in caso di interruzione di corrente
così da mantenere l'impostazione dell'orario
mi chiedo però se così facendo
1) la batteria interviene solo quando l'alimentatore non eroga corrente
2) durante la "doppia alimentazione" mando tutto in corto e friggo il mio arduino...  =(

Spero di non aver approfittato troppo della tua pazienza

Ciao
Title: Re: swRTC
Post by: leo72 on Dec 10, 2011, 05:29 pm
L'Arduino ha un comparatore interno che seleziona automaticamente fra le 2 tensioni. Mi pare che nel momento in cui è presente la Vin venga esclusa quella sulla porta USB quindi mi sa che non va bene come vuoi impostare tu la cosa.
Title: Re: swRTC
Post by: arduaudio on Dec 25, 2011, 02:28 pm
Code: [Select]
#include <core_build_options.h>
#include <swRTC.h>
volatile byte i;
void setup () {

rtc.setTime('14', '19', '0');
rtc.setDate('25', '12', '2011');
   Serial.begin(9600);
   attachInterrupt(0, count, RISING);
   i = 0;
}

void loop ()
{
delay(1000);
Serial.println(i*2.5,DEC);
Serial.print(" -- ");
Serial.print(rtc.getHours());
Serial.print(":");
Serial.print(rtc.getMinutes());
Serial.print(":");
Serial.print(rtc.getSeconds());
Serial.print(" ");
Serial.print(rtc.getDay());
Serial.print("/");
Serial.print(rtc.getMonth());
Serial.print("/");
Serial.print(rtc.getYear());
i=0;
}

void count()
{
   i++;
}



Dove accidenti è il problema?
Quote

test.cpp: In function 'void setup()':
test.cpp:10:1: error: 'rtc' was not declared in this scope
Title: Re: swRTC
Post by: lestofante on Dec 25, 2011, 02:43 pm
non hai dichiarato l'oggetto RTC...

tra le variabili globali aggiungi

swRTC rtc;
Title: Re: swRTC
Post by: arduaudio on Dec 25, 2011, 03:27 pm
Oops hai ragione! :D
Ora mi dà
Quote
In file included from /usr/lib/gcc/avr/4.5.3/../../../avr/include/util/delay.h:44:0,
                 from /usr/lib/gcc/avr/4.5.3/../../../avr/include/avr/delay.h:37,
                 from /home/netsurfer/Scrivania/arduino-0022/hardware/arduino/cores/arduino/wiring_private.h:30,
                 from /home/netsurfer/Scrivania/arduino-0022/hardware/arduino/cores/arduino/WInterrupts.c:34:
/usr/lib/gcc/avr/4.5.3/../../../avr/include/math.h:426:15: error: expected identifier or '(' before 'double'
/usr/lib/gcc/avr/4.5.3/../../../avr/include/math.h:426:15: error: expected ')' before '>=' token



???????
Title: Re: swRTC
Post by: lestofante on Dec 25, 2011, 03:56 pm
se stai usando l'iDE UNO, torna a usare la 0023
Title: Re: swRTC
Post by: PaoloP on Jan 11, 2012, 08:07 pm
Ciao Leo72,
ho fatto una piccola modifica alla tua libreria e mi sta funzionando anche con l'IDE 1.0.
L'ho provata con un'Arduino UNO R3 con Ethernet Shield R3.
Le modifiche che ho fatto sono:

Eliminato dal file swRTC.cpp e swRTC.h il comando
Code: [Select]
#include "WProgram.h"

Aggiunto al file swRTC.h i comandi:
Code: [Select]
  #if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
  #else
  #include "WProgram.h"
  #endif


Ho testato l'esempio swRTCtest e sulla seriale mi apparivano tutti i dati.

Per il mio progetto vorrei sincronizzare l'RTC con il tempo preso dal server NTP.
I server NTP rilasciano il numero di secondi passati dal 1/1/1900, che sen non sbaglio è anche il tuo contatore.
Però mi sembra che non ci sia un comando per impostare il TimeStamp... giusto?

Paolo.

p.s. Per altri test sono disponibile. Intendo utilizzare per i miei progetti solo l'IDE 1.0, tanto sono del tutto nuovo e non ho vecchi codici da trasferire.  ;)
Title: Re: swRTC
Post by: leo72 on Jan 11, 2012, 10:14 pm
Mi fa piacere vedere che con la classica modifica del check sulla versione la mia lib funzioni senza problemi. La aggiornerò.

Per quanto riguarda la gestione del timestamp, al momento ha solo la funzione per restituire il timestamp estratto dall'orologio interno, ma non la funzione inversa, ossia per regolare l'orologio interno dato un certo timestamp.  Vedrò di implementarla in questi giorni.
Title: Re: swRTC
Post by: lestofante on Jan 11, 2012, 10:48 pm

Mi fa piacere vedere che con la classica modifica del check sulla versione la mia lib funzioni senza problemi. La aggiornerò.

Per quanto riguarda la gestione del timestamp, al momento ha solo la funzione per restituire il timestamp estratto dall'orologio interno, ma non la funzione inversa, ossia per regolare l'orologio interno dato un certo timestamp.  Vedrò di implementarla in questi giorni.


dovrebbe essere già presente nella mia versione della libreria, copiala pure, ma testala un pochettino.
Title: Re: swRTC
Post by: leo72 on Jan 11, 2012, 11:15 pm
Sì, era presente nella tua versione, però non funzionava... difatti ti avevo chiesto di rivedere appunto il codice...  ;)
Se ce la fai a sistemarla, posso integrarla nella nuova release che comprende l'adattamento all'IDE 1.0
Title: Re: swRTC
Post by: PaoloP on Jan 13, 2012, 03:19 pm
Ciao Leo72,
Googolando un pò, ho trovato un'interessantissima funzione che permette di convertire il tempo NTP in data (giorno,mese,anno,ore,minuti,secondi).
Fa parte di un progetto di una scheda Ethernet che monta un AtMega328 che si sincronizza con i server NTP.
Qui la scheda: http://shop.tuxgraphics.org/electronic/index-eth.html
e qui i listati: https://github.com/pklaus/Tuxgraphics-AVR-NTP-clock

I file sono: timeconversions.h
Code: [Select]
/*********************************************
* vim:sw=8:ts=8:si:et
* To use the above modeline in vim you must have "set modeline" in your .vimrc
* Author: Guido Socher
* Copyright: GPL V2
*
*********************************************/
//@{
#ifndef TIMECONVERSIONS_H
#define TIMECONVERSIONS_H

// Number of seconds between 1-Jan-1900 and 1-Jan-1970, unix time starts 1970
// and ntp time starts 1900.
#define GETTIMEOFDAY_TO_NTP_OFFSET 2208988800UL

extern uint8_t gmtime(const uint32_t time,char *day, char *clock);


#endif /* TIMECONVERSIONS_H */
//@}


e timeconversions.c:
Code: [Select]
/*********************************************
* vim:sw=8:ts=8:si:et
* To use the above modeline in vim you must have "set modeline" in your .vimrc
* Author: Guido Socher
* Copyright: GPL V2
* See http://www.gnu.org/licenses/gpl.html
*
* functions to convert ntp timestamps into time and date
*********************************************/
#include <avr/io.h>
#include <stdio.h>
#include <inttypes.h>
#include <avr/pgmspace.h>

// EPOCH = Jan 1 1970 00:00:00
#define EPOCH_YR 1970
//(24L * 60L * 60L)
#define SECS_DAY 86400UL 
#define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400)))
#define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365)


static const char day_abbrev[] PROGMEM = "SunMonTueWedThuFriSat";

// isleapyear = 0-1
// month=0-11
// return: how many days a month has
//
// We could do this if ram was no issue:
//uint8_t monthlen(uint8_t isleapyear,uint8_t month){
//const uint8_t mlen[2][12] = {
// { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
// { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
// };
// return(mlen[isleapyear][month]);
//}
//
uint8_t monthlen(uint8_t isleapyear,uint8_t month){
if(month==1){
return(28+isleapyear);
}
if (month>6){
month--;
}
if (month%2==1){
return(30);
}
return(31);
}

// gmtime -- convert calendar time (sec since 1970) into broken down time
// returns something like Fri 2007-10-19 in day and 01:02:21 in clock
// The return values is the minutes as integer. This way you can update
// the entire display when the minutes have changed and otherwise just
// write current time (clock). That way an LCD display needs complete
// re-write only every minute.
uint8_t gmtime(const uint32_t time,char *day, char *clock)
{
        char dstr[4];
        uint8_t i;
uint32_t dayclock;
        uint16_t dayno;
uint16_t tm_year = EPOCH_YR;
uint8_t tm_sec,tm_min,tm_hour,tm_wday,tm_mon;

dayclock = time % SECS_DAY;
dayno = time / SECS_DAY;

tm_sec = dayclock % 60UL;
tm_min = (dayclock % 3600UL) / 60;
tm_hour = dayclock / 3600UL;
tm_wday = (dayno + 4) % 7; /* day 0 was a thursday */
while (dayno >= YEARSIZE(tm_year)) {
dayno -= YEARSIZE(tm_year);
tm_year++;
}
tm_mon = 0;
while (dayno >= monthlen(LEAPYEAR(tm_year),tm_mon)) {
dayno -= monthlen(LEAPYEAR(tm_year),tm_mon);
tm_mon++;
}
        i=0;
        while (i<3){
                dstr[i]= pgm_read_byte(&(day_abbrev[tm_wday*3 + i]));
                i++;
        }
        dstr[3]='\0';
sprintf_P(day,PSTR("%s %u-%02u-%02u"),dstr,tm_year,tm_mon+1,dayno + 1);
sprintf_P(clock,PSTR("%02u:%02u:%02u"),tm_hour,tm_min,tm_sec);
        return(tm_min);
}


Pensavo che potresti includerli nella tua libreria.

Ciao,
Paolo.

PS: Sul sito http://shop.tuxgraphics.org/ vendono anche una board con sopra il 644A, ma non ho idea se lascino la programmazione all'acquirente o abbiano sviluppato un core.
Title: Re: swRTC
Post by: leo72 on Jan 13, 2012, 03:24 pm
La funzione senz'altro la studio (appena ho terminato le modifiche al core 644/1284), la scheda col 644 dovrebbe essere un web server con firmware fornito da loro. Non so altro, non ho indagato. Però è una scheda col 644 in formato TQFP per cui non mi interessa.
Title: Re: swRTC
Post by: lestofante on Jan 15, 2012, 12:54 am
ho controllato, la funzione che converte le date in timestamp funziona!

eccola:

Quote

#define referenceYear 1900

byte daysPerMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

unsigned long setDate(int year, byte month, byte day, byte hour, byte minute, byte second){
 
 if (year<referenceYear){
   return 0;
 }
 unsigned long time;

 //One revolution of the Earth is not 365 days but accurately 365.2422days.It is leap year that adjusts this decimal fraction.  
 time = (year-referenceYear)*365.2422; //find day from year
 int i;
 for (i=0; i < month-1; i++){
   time = time + daysPerMonth; //find day from month
 }
 time = ( time + day ) * 24; //find hour from day
 time = ( time + hour ) * 60; //find minute from hours
 time = ( time + minute ) * 60; //find seconds from minute
 time += second; // add seconds
 
 //printf("%u\n", time);
 
 //startRTC();
 return time;
}

Lo so, lo so, la daysPerMonth non tiene conto degli anni bisestili, ma perchè in realtà ne tengo conto con "(year-referenceYear)*365.2422;", semplificando molto (la matematica per capire se l'anno è bisestile è un poco complessa, o meglio fa molti più calcoli per niente
Title: Re: swRTC
Post by: menniti on Jan 15, 2012, 01:02 am
Probabilmente le avete affrontate tutte quindi la mia sarà una cazzata inutile, ma non mi pare di averla letta e non si sa mai. Dov'è la difficolta a capire se un anno è bisestile o meno, c'è una formula ben precisa che, a partire dall'anno, ti dice con esattezza se lo è o non lo è. P.es. io non ho ancora controllato ma so con esattezza che il 2012 è un anno bisestile.
Title: Re: swRTC
Post by: lestofante on Jan 15, 2012, 01:13 am
da wikipedia:
Quote
La regola del calendario gregoriano è la seguente:

   Un anno è bisestile se il suo numero è divisibile per 4, con l'eccezione degli anni secolari (quelli divisibili per 100) che sono bisestili solo se divisibili per 400.


come puoi notare sono ben 3 resti di divisioni e 3 if, (senza contare l'if che aggiunge 1, e la chiamata a funzione) contro il mio metodo che usa una sola moltiplicazione float.
comunque la funzione per controllare se l'anno è bisestile va fatta, per completezza, semplicemente eviterei di richiamarla, se non per un motivo di chiarezza del codice.
Title: Re: swRTC
Post by: menniti on Jan 15, 2012, 01:17 am
Ma io lo so perfettamente, non c'era alcun bisogno di scomodare Wikipedia ;) quando facevo programmi in GW e Quick Basic combattevo spesso con date quindi questa cosa di dividere le due cifre meno significative per 4 e verificare se il resto era =0. Volevo quindi capire perché dici che è così complicata la cosa, pura curiosità, tutto qui.
Title: Re: swRTC
Post by: PaoloP on Jan 15, 2012, 11:08 am

da wikipedia:
Quote
La regola del calendario gregoriano è la seguente:

    Un anno è bisestile se il suo numero è divisibile per 4, con l'eccezione degli anni secolari (quelli divisibili per 100) che sono bisestili solo se divisibili per 400.


come puoi notare sono ben 3 resti di divisioni e 3 if, (senza contare l'if che aggiunge 1, e la chiamata a funzione) contro il mio metodo che usa una sola moltiplicazione float.
comunque la funzione per controllare se l'anno è bisestile va fatta, per completezza, semplicemente eviterei di richiamarla, se non per un motivo di chiarezza del codice.


Si può risolvere così:
Quote
int is_leap_year(int year) {
// leap year: is divisable by 4 and not by 100 is divisable by 400
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
  return 1; /* leap */
else
  return 0; /* no leap */
}


Comunque c'è anche il problema dei leap second (http://en.wikipedia.org/wiki/Leap_second)) , ovvero quei secondi che vengono aggiunti agli orologi atomici per riallineare il tempo universale alla reale rotazione terrestre. Ma non vorrei girare i dito nella piaga con rischio che mi rispondiate col titolo di una famosa canzone di Masini.  :smiley-roll-sweat:

Paolo.
p.s. il codice l'ho trovato come al solito... Googolando.
Title: Re: swRTC
Post by: testato on Jan 15, 2012, 11:47 am
interessantissimo, questa non la sapevo, devo rivedere il codice del mio orologio a valvole  :)
Title: Re: swRTC
Post by: leo72 on Jan 15, 2012, 11:54 am
La funzione per il controllo dell'anno bisestile è già integrata nella swRTC:

Code: [Select]
//check if the current year is a leap year
boolean swRTC::isLeapYear(int yearT) {
if (yearT==NULL) { yearT=year; }
if (((yearT % 4) == 0) && ((yearT % 100) != 0) || ((yearT % 400) == 0)) {
return true;
} else {
return false;
}
}

E' una funzione pubblica, quindi funziona anche richiamandola dal proprio sketch.

Ora vedo di integrare la funzione di restituzione del timestamp.
Title: Re: swRTC
Post by: leo72 on Jan 15, 2012, 12:28 pm
@lesto:
ho ragionato solo ora sulla funzione che hai pubblicato tu, ma la funzione per restituire un timestamp dall'orologio interno c'è già.  :P
E' presente nelle 2 ultime versioni della lib, la swRTC e la swRTC2.
Title: Re: swRTC
Post by: lestofante on Jan 15, 2012, 03:24 pm
infatti quella che vedi no è altro che quella contenuta nella mia versione, era già funzionante, l'ho solo copiata e adattata in C per fare qualche test.
Title: Re: swRTC
Post by: leo72 on Jan 15, 2012, 03:50 pm
Ah, ecco...  XD
Title: Re: swRTC
Post by: lestofante on Jan 15, 2012, 03:57 pm
infatti, non capisco, forse la versione non funzionante era quella al contrario, ma sinceramente ricordo che avevo sistemato tutto..
Title: Re: swRTC
Post by: PaoloP on Jan 15, 2012, 04:11 pm
Un attimo...  :smiley-red:
la questione della funzione di conversione tra timestamp e data l'ho tirata fuori perché vorrei sincronizzare il swRTC tramite server NTP.
Il server NTP restituisce solo il timestamp quindi per sincronizzare avrei bisogno di una funzione RTC.SetTime(timestamp). Siccome timestamp è private non posso settarlo.
Allora visto che esistono le funzioni RTC.setTime(hh,mm,ss) e RTCsetDate(yy,mm,dd) ho chiesto se si poteva implementare una funzione che avesse in ingresso il timestamp e in uscita il formato: anno,mese,giorno,ore,minuti,secondi.

Sarebbe molto più semplice poter settare direttamente il timestam semza far fare una doppia conversione per settare l'ora.  :)

Paolo.
Title: Re: swRTC
Post by: leo72 on Jan 15, 2012, 04:24 pm
Sì, ho capito cosa chiedevi. Poi si era inserito lesto.

Stavo guardando un attimo come implementare la cosa (tra le altri 10 che sto facendo in questo momento  :smiley-sweat: )
Title: Re: swRTC
Post by: leo72 on Jan 15, 2012, 05:50 pm
Avrei bisogno di un timestamp preso da un service NTP per controllare che la funzione che ho scritto funzioni. Qualcuno mi può passare un timestamp con ore:minuti:secondi e giorno/mese/anno relativo?
Title: Re: swRTC
Post by: menniti on Jan 15, 2012, 06:05 pm
Mi pare che vi state incasinando,è il problema di quando si inizia qualcosa a ritmi serrati e poi la si abbandona per un po'....
Forse dovreste ognuno tirar fuori la propria ultima versione e confrontarvi un attimo per cercare di arrivare ad un risultato comune, altrimenti Leo continua per la sua strada senza avere l'importante contributo che potrebbe dargli lesto. E' un peccato.  :(
Title: Re: swRTC
Post by: leo72 on Jan 15, 2012, 06:09 pm
Il tributo di lesto c'è già, è già integrato nell'attuale versione della swRTC perché dentro ha il calcolo del timestamp che aveva fatto lui a suo tempo. Mi pareva che non fosse ancora sistemata ma invece è funzionante.  :smiley-sweat:
D'altronde è una cosa a cui ho lavorato 2 mesi fa... se si pensa che non mi ricordo cos'ho fatto 2 GIORNI fa, 2 mesi sono un tempo biblico per la mia mente  :smiley-sweat:

Se qualcuno mi passa un timestamp come richiesto posso controllare se la funzione inversa che ho scritto è giusta.
Title: Re: swRTC
Post by: PaoloP on Jan 16, 2012, 12:56 am
In questo momento, dal 1-1-1900 sono passati: 3'535'577'640 s (tremiliardicinqucentotrentacinquemilionicinquecentosettantasettemilaseicentoquaranta secondi)

---> http://www.aelius.com/njh/unixtime/?y=2012&m=01&d=15&h=0&i=54&s=0

Paolo.

n.b. il timestamp si riferisce alle 00:54:00 del 15-01-2011.

p.s. Domani dopo pranzo carico il codice UdpNTPClient su Arduino e ti do dati precisi.
Title: Re: swRTC
Post by: leo72 on Jan 16, 2012, 09:09 am
Che poi sono un fesso perché avendo Linux posso semplicemente dare date +%s da terminale  :smiley-sweat:
OK.
Title: Re: swRTC
Post by: PaoloP on Jan 16, 2012, 12:33 pm
Ho caricato lo sketch UdpNtpClient è il risultato è questo:

Seconds since Jan 1 1900 = 3535702382
Unix time = 1326713582
The UTC time is 11:33:02

La data è ovviamente quella di oggi: 16-01-2012.

Title: Re: swRTC
Post by: leo72 on Jan 16, 2012, 01:18 pm
Più tardi ci lavoro. L'algoritmo l'ho scritto, ma allo stato attuale mi da degli errori di calcolo, devo aver sbagliato qualcosa.
Title: Re: swRTC
Post by: PaoloP on Jan 16, 2012, 01:53 pm
Se pubblichi il codice posso controllarlo.  :)
Title: Re: swRTC
Post by: leo72 on Jan 17, 2012, 11:22 am
Provate la lib allegata. NON funziona. E' da ieri che ci sbatto la testa ma non ne vengo fuori, sarà che sto facendo nel contempo anche altro, ma non riesco a capire cosa c'è che non va:

1) la funzione getTimeStamp restituisce un valore aumentato di 86.400 che è esattamente 1 giorno
2) la funzione setTimeWithTimestamp regola l'orario alla "hot dog"

Per controllo, ho usato questo timestamp:
1326754800
che corrisponde al 17/01/2012 00:00:00 tempo locale

getTimeStamp con la stessa data ed ora restituisce invece 1326841200 mentre convertendo 1326754800 in orario ottengo 16/01/-..qualcosa.
Questo è lo sketch usato di prova:

Code: [Select]
#include <swRTC.h>
swRTC rtc;

void setup() {
   delay(2000); //delay to let the user opens the serial monitor
   rtc.stopRTC(); //stop the RTC
   rtc.setTime(0,0,0); //set the time here
   rtc.setDate(17,1,2012); //set the date here
   rtc.startRTC(); //start the RTC
   Serial.begin(19200); //choose the serial speed here
   stampa();
   rtc.setTimeWithTimestamp(1326754800, 1970);  
   stampa();
}

void loop() {
}

void stampa() {
   Serial.print(rtc.getHours(), DEC);
   Serial.print(":");
   Serial.print(rtc.getMinutes(), DEC);
   Serial.print(":");
   Serial.print(rtc.getSeconds(), DEC);
   Serial.print("  ");
   Serial.print(rtc.getDay(), DEC);
   Serial.print("/");
   Serial.print(rtc.getMonth(), DEC);
   Serial.print("/");
   Serial.println(rtc.getYear(), DEC);
   Serial.println(rtc.getTimeStamp(), DEC);
}
Title: Re: swRTC
Post by: PaoloP on Jan 17, 2012, 02:09 pm
La libreria dov'è?
Title: Re: swRTC
Post by: leo72 on Jan 17, 2012, 02:10 pm
Uh...  mi ero dimentico di allegarla :smiley-sweat:
Title: Re: swRTC
Post by: lestofante on Jan 17, 2012, 07:30 pm
questo funziona:
comuqnue ad occhio hai solo sbagliato le dimensioni delle costanti
Code: [Select]
int swRTC::updateDate(){
  unsigned long time = getTimestamp();
/* 
  Serial.print( "timestamp: " );
  Serial.println( time );
*/
  unsigned long day = time/(60L*60L*24L);
  float remaining = time-day*(60L*60L*24L);
/* 
  Serial.println( remaining );
 
  Serial.print( "day: " );
  Serial.println( day );
*/ 
  int year = (day / 365.2422);
  float dayRemaining = day-year*365.2422;
  year+=1900;
/* 
  Serial.print( "year: " );
  Serial.println( year );
  Serial.println( dayRemaining );
*/
  if (dayRemaining>=365.2422)
    return 1;//my math is wrong!
 
  if (year<1900)
    return 2;//year not supported!
/* 
  Serial.print( "dayRemaining: " );
  Serial.println( dayRemaining );
*/
  int month=0;
  while (dayRemaining > daysPerMonth[month]){
    dayRemaining -= daysPerMonth[month];
//    Serial.print( "added month: " );
//    Serial.println( dayRemaining );
    month++;
  }
 
  month++;//because month 0 doesn't exist
/* 
  Serial.print( "month: " );
  Serial.println( month );
*/ 
  if (month>12)
    return 3;//my math is wrong!
 
//  Serial.println( dayRemaining );
 
  if (dayRemaining>=(60L*60L*24L))
    return 4;//my math is wrong!
/*
  Serial.print( "dayRemaining: " );
  Serial.println( dayRemaining );
*/
  day=dayRemaining;
  if (dayRemaining-day>0){ //add partial day!
    day++;
  }
 
  int hours = remaining/(60L*60L);
  remaining = remaining-hours*(60L*60L);
/* 
  Serial.println( remaining );
 
  Serial.print( "hours: " );
  Serial.println( hours );
*/
  if (remaining>=(60L*60L))
    return 5;//my math is wrong!
 
  int minutes = remaining/(60L);
  remaining = remaining-minutes*(60L);
/*
  Serial.print( "minutes: " );
  Serial.println( minutes );
 
  Serial.print( "seconds: " );
  Serial.println( remaining );
*/ 
  if (remaining>=60)
    return 6;//my math is wrong!
   
  now.year = year;
  now.month = month;
  now.day = day;
  now.hour = hours;
  now.minute = minutes;
  now.second = remaining; 
  return 0;
}
Title: Re: swRTC
Post by: leo72 on Jan 17, 2012, 10:12 pm
avevo ricopiato l'esempio di Paolo, forse ho sbagliato qualcosa  :smiley-sweat:

Più tardi provo la tua funzione. Ah, hai ricontrollato la funzione per avere il timestamp? Perché va avanti di un giorno? Eppure il codice mi pare corretto!
Title: Re: swRTC
Post by: lestofante on Jan 17, 2012, 10:55 pm

Ah, hai ricontrollato la funzione per avere il timestamp? Perché va avanti di un giorno? Eppure il codice mi pare corretto!


davvero? ma quale, la tua quale delle 2, o la tua?
Title: Re: swRTC
Post by: leo72 on Jan 17, 2012, 11:00 pm
Quella che ho allegato al mio replay 573 qui sopra delle 11:22
Title: Re: swRTC
Post by: lestofante on Jan 17, 2012, 11:19 pm

ad occhio hai solo sbagliato le dimensioni delle costanti


adesso son troppo fuso per controllare, magari domani mattina

edit: macchè domani mattina.. lavoro! magari domani sera (uff!!!) :smiley-mr-green:
Title: Re: swRTC
Post by: leo72 on Jan 17, 2012, 11:31 pm
OK, va bene lo stesso. In allegato trovi la lib con la tua ultima funzione (leggermente modificata per operare nel contesto della swRTC).
Le funzioni per gestire i timestamp si chiamano getTimestamp() e setClockWithTimestamp(timestamp, anno_di_rif).
anno_di_rif può essere 1900 o 1970, a seconda se si vuole il timestamp "classico", calcolato dall'inizio del 1900, oppure quello UNIX, calcolato dall'inizio del 1970. Dando un valore a caso oppure lasciandolo vuoto, l'algoritmo assume 1970 come epoca.

Resta il problema che i timestamp generati, se comparati con quelli calcolati dai tool online, sono avanti di 1 giorno (+86400 secondi). Inoltre ho notato una cosa. L'algoritmo non tiene conto del tempo GMT o CET o altro, nel senso che il fuso influisce (ovviamente) sul timestamp. Sta all'utente tenerne conto se usa server che forniscono l'orario in GMT (il tempo di Greenwich) e se l'orologio del proprio computer è settato su GMT o LocalTime.

Ma qui mi fermo perché la lib sta diventando troppo mastodontica.
Title: Re: swRTC
Post by: lestofante on Jan 17, 2012, 11:55 pm
il problema deriva dal fatto che se leggi attentamente la storia del timestamp, scopriresti che in realtà anche lui ha un errore da calcolare
Title: Re: swRTC
Post by: leo72 on Jan 18, 2012, 12:06 am
Tralascia gli errori "storici" (ho letto del timestamp)  ;)
Il problema è che se generi un timestamp e poi chiedi ad un tool online di generarti il timestamp per la stessa data e la stessa ora, trovi uno scarto in più di 86400. Sapendolo, potrei mettere un "giorno-=1" e sistemare tutto ma non è pulito né mi aiuta a capire questa discrepanza da dove salta fuori. Guarda un po' tu se riesci a capire il motivo dello scarto, io ci ho perso tutta la mattina senza successo.  :smiley-roll-sweat:
Title: Re: swRTC
Post by: lestofante on Jan 18, 2012, 12:22 am
The above scheme means that on a normal UTC day, of duration 86 400 s
Title: Re: swRTC
Post by: leo72 on Jan 18, 2012, 12:29 am
L'ho detto anch'io, che un giorno è 86.400s  :P

Fai una prova: metti 0:0:0 come orario di un qualunque giorno e poi confronta il timestamp generato con quello generato da un tool online: c'è una discrepanza di un giorno. Perché?
Title: Re: swRTC
Post by: lestofante on Jan 18, 2012, 01:02 am
prova a metterlo di un giorno dopo alla data timestamp...

edit: forse di year*365.2422 fa fatto un round sempre al +1, cioè se è > 0  anche di 1/10000000 va fatto +1 invece che troncare come fa il C... se un giorno è già iniziato, non va contato come giorno in più, perchè sarà contato in ore minuti e secondi  :)
Title: Re: swRTC
Post by: leo72 on Jan 18, 2012, 10:19 am
La cosa è logica, farò delle prove.
Title: Re: swRTC
Post by: PaoloP on Jan 18, 2012, 03:05 pm
Ho letto il timestamp dal server NTP:
alle 13:54:29 di oggi 18/01/2011 era: 353583669
il tempo UNIX è pari a: 1326894869

La tua libreria invece rende:
Code: [Select]
13:54:29  18/1/2012
1326981269
13:54:29  17/1/42
3584357909


Con un errore di 1 giorno... e 1970 anni.  :smiley-roll-blue:

Per l'orario ricorda che i server NTP restituiscono sempre l'UTC, quindi sarà cura di chi lo utilizza (io) implementare il fuso orario e il DST.  =(
Title: Re: swRTC
Post by: leo72 on Jan 18, 2012, 03:14 pm

Ho letto il timestamp dal server NTP:
alle 13:54:29 di oggi 18/01/2011 era: 353583669
il tempo UNIX è pari a: 1326894869

La tua libreria invece rende:
Code: [Select]
13:54:29  18/1/2012
1326981269
13:54:29  17/1/42
3584357909


Con un errore di 1 giorno... e 1970 anni.  :smiley-roll-blue:

Non ho capito. Ma i server NTP usano l'epoca 1900 o 1970?
Cmq la lib gestisce entrambe le epoca, basta passargliela come parametro (leggi il mio post).

Quote

Per l'orario ricorda che i server NTP restituiscono sempre l'UTC, quindi sarà cura di chi lo utilizza (io) implementare il fuso orario e il DST.  =(

Qui altrimenti diventa troppo voluminosa, se deve mettersi anche a gestire gli scarti dati dalla longitudine e/o ora legale. Basta fare qualche somma/sottrazione al timestamp prima di passarlo alla lib, sicuramente meno impegnativo che scrivere un algoritmo apposito.
Title: Re: swRTC
Post by: PaoloP on Jan 18, 2012, 03:46 pm
I server NTP restituisce il timestamp dal 1/1/1900.

Quello che non capisco è questo passaggio:
Code: [Select]
if ((yearT==NULL) || (yearT>1970)) {
yearT=1970;
} else if (yearT<1900) {
yearT=1900;
} else if ((yearT!=1900) && (yearT!=1970)) {
yearT=1970;
}


Se non metto niente l'anno è 1970.
Se metto 2012, l'anno è 1970.
Se metto 1835, l'anno è 1900.
Se metto 1945, l'anno è 1970.
Ma se metto 1900, l'anno è 1970??
Title: Re: swRTC
Post by: leo72 on Jan 18, 2012, 03:50 pm
No, se metti 1900 resta 1900 perché non entra in nessuna delle condizioni verificate dall'if.
Il check è:

Code: [Select]
SE ((EPOCA==NULL) O (EPOCA>1970))
    EPOCA=1970
ALTRIMENTI SE (EPOCA<1900)
    EPOCA=1900
ALTRIMENTI SE ((EPOCA!=1900) E (EPOCA!=1970))
    EPOCA=1970
Title: Re: swRTC
Post by: PaoloP on Jan 19, 2012, 03:15 pm

prova a metterlo di un giorno dopo alla data timestamp...

edit: forse di year*365.2422 fa fatto un round sempre al +1, cioè se è > 0  anche di 1/10000000 va fatto +1 invece che troncare come fa il C... se un giorno è già iniziato, non va contato come giorno in più, perchè sarà contato in ore minuti e secondi  :)


Si, controllando la funzione:

Code: [Select]

//returns a timestamp giving the number of seconds since a part year (default=1900)
unsigned long swRTC::getTimeStamp(int yearT){
unsigned long time=0;
 
if ((yearT==NULL) || (yearT>1970)) {
yearT=1970;
} else if (yearT<1900) {
yearT=1900;
} else if ((yearT!=1900) && (yearT!=1970)) {
yearT=1970;
}

//One revolution of the Earth is not 365 days but accurately 365.2422 days.
//It is leap year that adjusts this decimal fraction. But...
time += (getYear()-yearT)*365.2422;
for (int i=0; i < getMonth()-1; i++){
time += daysPerMonth[i]; //find day from month
}
time = ( time + getDay() ) * 24; //find hour from day
time = ( time + getHours() ) * 60; //find minute from hours
time = ( time + getMinutes() ) * 60; //find seconds from minute
time += getSeconds(); // add seconds
return time;
}


per ottenere il dato corretto devi togliere 1 da getDay() perché l'ordinale del giorno non rappresenta il numero dei giorni passati ma avanza di uno (il giorno 0 non esiste, come il cucchiaio d'altronde). Infatti togli uno anche dal mese, ovvero non lo consideri.
Nella REM inoltre indichi che di default l'anno è il 1900 ma per parametro NULL setta 1970.
Adesso do uno sguardo alla funzione inversa.. a dopo.
Title: Re: swRTC
Post by: PaoloP on Jan 19, 2012, 03:48 pm
Trovato!!
La funzione setTimeWithTimestamp accetta in ingresso yearT e per i calcoli usa tm_year, ma come hai spiegato ieri, nel caso l'anno coincida con 1900 o 1970 non entra negli if e quindi non setta tm_year che resta 0 (o peggio un valore casuale nella cella di memoria).
Ecco perché avevo un'errore di 1970 anni sulla data settata.

Code: [Select]
boolean swRTC::setTimeWithTimestamp(unsigned long timeT, int yearT) {
unsigned long dayclock;
   unsigned int dayno, tm_year;
byte tm_sec, tm_min, tm_hour, tm_mon;
tm_year=yearT; // si potrebbe aggiungere questo oppure rivedere gli if
if ((yearT==NULL) || (yearT>1970)) {
tm_year=1970;
} else if (yearT<1900) {
tm_year=1900;
} else if ((yearT!=1900) && (yearT!=1970)) {
tm_year=1970;
}

Title: Re: swRTC
Post by: leo72 on Jan 19, 2012, 05:19 pm

per ottenere il dato corretto devi togliere 1 da getDay() perché l'ordinale del giorno non rappresenta il numero dei giorni passati ma avanza di uno (il giorno 0 non esiste, come il cucchiaio d'altronde). Infatti togli uno anche dal mese, ovvero non lo consideri.

Per i mesi lo faccio per il semplice motivo che nel C gli array iniziano con il numero di indice 0 quindi gennaio, 1° mese dell'anno, deve essere identificato con 0, febbraio con 1 ecc...
Per i giorni la cosa non mi torna lo stesso. Cmq se a tutti torna 1 giorno in più, metterò un day-=1 e risolvo.

Quote

Nella REM inoltre indichi che di default l'anno è il 1900 ma per parametro NULL setta 1970.
Adesso do uno sguardo alla funzione inversa.. a dopo.

Inizialmente la funzione aveva come epoca di default il 1970, poi l'ho cambiato (o viceversa, non ricordo). Il commento è rimasto.


Trovato!!
La funzione setTimeWithTimestamp accetta in ingresso yearT e per i calcoli usa tm_year, ma come hai spiegato ieri, nel caso l'anno coincida con 1900 o 1970 non entra negli if e quindi non setta tm_year che resta 0 (o peggio un valore casuale nella cella di memoria).
Ecco perché avevo un'errore di 1970 anni sulla data settata.

Uh.... OK. Errore trovato. Correggerò a breve.
Title: Re: swRTC
Post by: PaoloP on Jan 19, 2012, 05:20 pm
Eureka!!

Ho sincronizzato il swRTC con un server NTP.
Questo è il risultato del mio sketch

Quote
Serial Start!
Ethernet configured using DHCP.
Local IP: 192.168.40.100
SubnetMask: 255.255.255.0
Gateway: 192.168.40.254
DNS Server: 192.168.40.254
Ethernet started.
Check Server NTP...
NTP Server unavailable.
Wait 10 seconds...
Check Server NTP...
NTP Server unavailable.
Wait 10 seconds...
Check Server NTP...
NTP Server unavailable.
Wait 10 seconds...
Check Server NTP...
NTP Server unavailable.
Wait 10 seconds...
Check Server NTP...
Seconds since Jan 1 1900 = 3535978374
Unix time = 1326989574
The UTC time is 16:12:54
swRTC synchronized.
16:12:54  19/1/2012
1326989574
16:12:55  19/1/2012
1326989575
16:12:56  19/1/2012
1326989576
16:12:57  19/1/2012
1326989577
16:12:58  19/1/2012
1326989578
16:12:59  19/1/2012
1326989579


Mi ha fatto aspettare 40 secondi ma poi tutto è filato liscio.
Bene adesso posso implementare il datalogger per il contatore ENEL. :-)
Grazie per la funzione SetTimestamp.  =(

Lo sketch è questo:
Code: [Select]
#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <swRTC.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

unsigned int localPort = 8888;      // local port to listen for UDP packets

IPAddress timeServer(192, 43, 244, 18); // time.nist.gov NTP server 192, 43, 244, 18

const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
swRTC rtc;

void setup()
{
  unsigned long ts = 0;
  Serial.begin(9600);
  Serial.println("Serial Start!");
 
  AvviaEthernet();
  Serial.println("Ethernet started.");
 
  while (ts==0)
  {
    Serial.println("Check Server NTP...");
    ts=GetNTPtime();
    if (ts==0) {
      Serial.println("Wait 10 seconds...");
      delay(10000);
    }   
  }
 
  rtc.setTimeWithTimestamp(ts, 1970);   
  Serial.println("swRTC synchronized.");
}

void loop()
{
  stampa();
  delay(1000);
}

void AvviaEthernet()
{
  // start Ethernet and UDP
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP.");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  else
  {
    Serial.println("Ethernet configured using DHCP.");
    Serial.print("Local IP: ");
    Serial.println(Ethernet.localIP());
    Serial.print("SubnetMask: ");
    Serial.println(Ethernet.subnetMask());
    Serial.print("Gateway: ");
    Serial.println(Ethernet.gatewayIP());
    Serial.print("DNS Server: ");
    Serial.println(Ethernet.dnsServerIP());
  }
  Udp.begin(localPort);
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:    
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer,NTP_PACKET_SIZE);
  Udp.endPacket();
}

unsigned long GetNTPtime(){
  sendNTPpacket(timeServer); // send an NTP packet to a time server
  // wait to see if a reply is available
  delay(1000); 
  if ( Udp.parsePacket() ) { 
    // We've received a packet, read the data from it
    Udp.read(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer
    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); 
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord; 
    Serial.print("Seconds since Jan 1 1900 = " );
    Serial.println(secsSince1900);               
    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;     
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears; 
    // print Unix time:
    Serial.println(epoch);                               
    // print the hour, minute and second:
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':'); 
    if ( ((epoch % 3600) / 60) < 10 ) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch %60); // print the second
    return epoch;
  }
  else {
    Serial.println("NTP Server unavailable.");
    return 0;
  }
}

void stampa() {
  Serial.print(rtc.getHours(), DEC);
  Serial.print(":");
  Serial.print(rtc.getMinutes(), DEC);
  Serial.print(":");
  Serial.print(rtc.getSeconds(), DEC);
  Serial.print("  ");
  Serial.print(rtc.getDay(), DEC);
  Serial.print("/");
  Serial.print(rtc.getMonth(), DEC);
  Serial.print("/");
  Serial.println(rtc.getYear(), DEC);
  Serial.println(rtc.getTimeStamp(), DEC);
}

Siate clementi... non programmo da molto.  :smiley-roll-sweat:

Paolo.
p.s. per utilizzare la libreria ho fatto le due correzioni suggerite (tolto un giorno e settato tm_year).
Title: Re: swRTC
Post by: PaoloP on Jan 19, 2012, 05:24 pm

Per i giorni la cosa non mi torna lo stesso. Cmq se a tutti torna 1 giorno in più, metterò un day-=1 e risolvo.

Io ho modifica questa:
Code: [Select]
time = ( time + getDay() ) * 24; //find hour from day
così
Code: [Select]
time = ( time + getDay() -1 ) * 24; //find hour from day
e funziona.
Title: Re: swRTC
Post by: leo72 on Jan 19, 2012, 05:36 pm
@Paolo:
un attimo, ci ho fatto caso ora. Tu stai usando la funzione che si chiama setTimeWithTimestamp.
Ma questa NON è l'ultima che avevo pubblicato. Avevo cercato di allegarla al mio post 581 dove avevo rivisto la logica degli if e ridenominato la funzione ma probabilmente non mi ha preso l'allegato. Prova la versione in allegato.

Title: Re: swRTC
Post by: PaoloP on Jan 19, 2012, 05:51 pm
Ok, mutanda mutandis... non funziona!!

Sbaglia di 1 giorno.

Quote
Start!
Set da ora
16:54:14  19/1/2012
1326992054
Set da TimeStamp: 1326992054  Anno : 1970
16:54:14  18/1/2012
1326905654


lo sketch di controllo:
Code: [Select]
#include <swRTC.h>
swRTC rtc;

unsigned long timestamp = 1326992054;
int anno = 1970;

void setup() {
 Serial.begin(9600); //choose the serial speed here
 Serial.println("Start!");
 // delay(2000); //delay to let the user opens the serial monitor
 rtc.stopRTC(); //stop the RTC
 rtc.setTime(16,54,14); //set the time here
 rtc.setDate(19,1,2012); //set the date here
 rtc.startRTC(); //start the RTC
 Serial.println("Set da ora");
 stampa();
 Serial.print("Set da TimeStamp: ");
 Serial.print(timestamp);
 Serial.print("  Anno : ");
 Serial.println(anno);
 rtc.setClockWithTimestamp(timestamp, anno);  
 stampa();
}

void loop() {

}

void stampa() {
 Serial.print(rtc.getHours(), DEC);
 Serial.print(":");
 Serial.print(rtc.getMinutes(), DEC);
 Serial.print(":");
 Serial.print(rtc.getSeconds(), DEC);
 Serial.print("  ");
 Serial.print(rtc.getDay(), DEC);
 Serial.print("/");
 Serial.print(rtc.getMonth(), DEC);
 Serial.print("/");
 Serial.println(rtc.getYear(), DEC);
 Serial.println(rtc.getTimestamp(), DEC);
}


Edit: adesso non funziona neanche il resto della libreria  =(
Quote
Serial Start!
Ethernet configured using DHCP.
Local IP: 192.168.40.100
SubnetMask: 255.255.255.0
Gateway: 192.168.40.254
DNS Server: 192.168.40.254
Ethernet started.
Check Server NTP...
Seconds since Jan 1 1900 = 3535981294
Unix time = 1326992494
The UTC time is 17:01:34
swRTC synchronized.
17:1:34  18/1/2012
1326906094
17:1:34  18/1/2012
1326906094
17:1:34  18/1/2012
1326906094

il tempo rimane fisso  :0
Title: Re: swRTC
Post by: leo72 on Jan 19, 2012, 06:05 pm
Ho semplicemente aggiunto quel getDay()-1 come dicevi tu, però all'ultima mia versione, quella che non ero riuscito a mettere online.
A 'sto punto sto diventando scemo io.... la versione setTimeWithTimestamp funzionava ma NON funzionava la versione getTimestamp allegata.
Ora invece è alla rovescia: funziona la getTimestamp ma NON setClockWithTimestamp
Title: Re: swRTC
Post by: PaoloP on Jan 19, 2012, 06:13 pm
Ok, ho visto che hai tolto dalla funzione StopRTC e StartRTC.
Li aggiungo io nello sketch, schetc, schiecc... nel listato fuori dalla funzione.
Title: Re: swRTC
Post by: leo72 on Jan 19, 2012, 06:19 pm
Qui c'è la versione ibrida, con il getTimestamp con il getDay-1 e con setTimeWithTimestamp precedente....
Title: Re: swRTC
Post by: PaoloP on Jan 19, 2012, 06:28 pm

Qui c'è la versione ibrida, con il getTimestamp con il getDay-1 e con setTimeWithTimestamp precedente....


Non vorrei far confusione.. quindi preferisco testare le ultime: setClockWithTimestamp e getTimestamp del messaggio alla pagina precedente.

Ho modificato il listato per adattarlo ai nuovi nomi delle funzioni:
Code: [Select]
#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <swRTC.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {  
 0x90, 0xA2, 0xDA, 0x00, 0xF7, 0xF0 };

unsigned int localPort = 8888;      // local port to listen for UDP packets

IPAddress timeServer(192, 43, 244, 18); // time.nist.gov NTP server 192, 43, 244, 18

const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
swRTC rtc;

void setup()
{
 unsigned long ts = 0;
 Serial.begin(9600);
 Serial.println("Serial Start!");

 AvviaEthernet();
 Serial.println("Ethernet started.");

 while (ts==0)
 {
   Serial.println("Check Server NTP...");
   ts=GetNTPtime();
   if (ts==0) {
     Serial.println("Wait 5 seconds...");
     delay(5000);
   }  
 }
 rtc.stopRTC();
 rtc.setClockWithTimestamp(ts, 1970);
 rtc.startRTC();  
 Serial.println("swRTC synchronized.");
}

void loop()
{
 stampa();
 delay(1000);
}

void AvviaEthernet()
{
 // start Ethernet and UDP
 if (Ethernet.begin(mac) == 0) {
   Serial.println("Failed to configure Ethernet using DHCP.");
   // no point in carrying on, so do nothing forevermore:
   for(;;)
     ;
 }
 else
 {
   Serial.println("Ethernet configured using DHCP.");
   Serial.print("Local IP: ");
   Serial.println(Ethernet.localIP());
   Serial.print("SubnetMask: ");
   Serial.println(Ethernet.subnetMask());
   Serial.print("Gateway: ");
   Serial.println(Ethernet.gatewayIP());
   Serial.print("DNS Server: ");
   Serial.println(Ethernet.dnsServerIP());
 }
 Udp.begin(localPort);
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
 // set all bytes in the buffer to 0
 memset(packetBuffer, 0, NTP_PACKET_SIZE);
 // Initialize values needed to form NTP request
 // (see URL above for details on the packets)
 packetBuffer[0] = 0b11100011;   // LI, Version, Mode
 packetBuffer[1] = 0;     // Stratum, or type of clock
 packetBuffer[2] = 6;     // Polling Interval
 packetBuffer[3] = 0xEC;  // Peer Clock Precision
 // 8 bytes of zero for Root Delay & Root Dispersion
 packetBuffer[12]  = 49;
 packetBuffer[13]  = 0x4E;
 packetBuffer[14]  = 49;
 packetBuffer[15]  = 52;

 // all NTP fields have been given values, now
 // you can send a packet requesting a timestamp:  
 Udp.beginPacket(address, 123); //NTP requests are to port 123
 Udp.write(packetBuffer,NTP_PACKET_SIZE);
 Udp.endPacket();
}

unsigned long GetNTPtime(){
 sendNTPpacket(timeServer); // send an NTP packet to a time server
 // wait to see if a reply is available
 delay(1000);  
 if ( Udp.parsePacket() ) {  
   // We've received a packet, read the data from it
   Udp.read(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer
   //the timestamp starts at byte 40 of the received packet and is four bytes,
   // or two words, long. First, esxtract the two words:
   unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
   unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);  
   // combine the four bytes (two words) into a long integer
   // this is NTP time (seconds since Jan 1 1900):
   unsigned long secsSince1900 = highWord << 16 | lowWord;  
   Serial.print("Seconds since Jan 1 1900 = " );
   Serial.println(secsSince1900);              
   // now convert NTP time into everyday time:
   Serial.print("Unix time = ");
   // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
   const unsigned long seventyYears = 2208988800UL;    
   // subtract seventy years:
   unsigned long epoch = secsSince1900 - seventyYears;  
   // print Unix time:
   Serial.println(epoch);                              
   // print the hour, minute and second:
   Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
   Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
   Serial.print(':');  
   if ( ((epoch % 3600) / 60) < 10 ) {
     // In the first 10 minutes of each hour, we'll want a leading '0'
     Serial.print('0');
   }
   Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
   Serial.print(':');
   if ( (epoch % 60) < 10 ) {
     // In the first 10 seconds of each minute, we'll want a leading '0'
     Serial.print('0');
   }
   Serial.println(epoch %60); // print the second
   return epoch;
 }
 else {
   Serial.println("NTP Server unavailable.");
   return 0;
 }
}

void stampa() {
 Serial.print(rtc.getHours(), DEC);
 Serial.print(":");
 Serial.print(rtc.getMinutes(), DEC);
 Serial.print(":");
 Serial.print(rtc.getSeconds(), DEC);
 Serial.print("  ");
 Serial.print(rtc.getDay(), DEC);
 Serial.print("/");
 Serial.print(rtc.getMonth(), DEC);
 Serial.print("/");
 Serial.println(rtc.getYear(), DEC);
 Serial.println(rtc.getTimestamp(), DEC);
}

Ho aggiunto stopRTC e startRTC e adesso il tempo scorre.
L'ultimo problema da settare è l'aggiunta di 1 giorno nella funzione che setta il timestamp.

Quote
Check Server NTP...
Seconds since Jan 1 1900 = 3535983356
Unix time = 1326994556
The UTC time is 17:35:56
swRTC synchronized.
17:35:56  18/1/2012
1326908156


Title: Re: swRTC
Post by: lestofante on Jan 19, 2012, 06:38 pm
che bruttura quel -1, e se il giorno è il primo del mese? una bella moltiplicazione per 0? dovete lavorare col risultato di ritorno della divisione, come ho scritto qualche post fa.

p.s. GDI?
Title: Re: swRTC
Post by: leo72 on Jan 19, 2012, 06:41 pm
Quando hai fatto tutte le modifiche, metti il filw swRTC.cpp che poi controllo le diff con il mio e aggiorno la libreria
Title: Re: swRTC
Post by: leo72 on Jan 19, 2012, 06:42 pm

che bruttura quel -1, e se il giorno è il primo del mese? una bella moltiplicazione per 0? dovete lavorare col risultato di ritorno della divisione, come ho scritto qualche post fa.

p.s. GDI?

Infatti. Metterò un return (time-86500L) alla fine della funzione
Title: Re: swRTC
Post by: PaoloP on Jan 19, 2012, 07:01 pm
No No, la funzione GetTimestamp della libreria alla pagina precedenze funziona.
E' SetClockWhitTimestamp che setta un giorno in meno.

Quote
Start!
Orario impostato: 17:35:56  19/1/2012
1326994556
Set da TimeStamp: 1326994556  AnnoT : 1970
17:35:56  18/1/2012
1326908156

L'orario impostato, le 17:35 e 56 di oggi 19 gennaio 2012 restituisce il timestamp corretto: 1326994556.
Se si inserisce il timestamp invece setta la data sbagliata.

Title: Re: swRTC
Post by: leo72 on Jan 19, 2012, 10:17 pm
Tu però avevi detto che per far funzionare swRTC::getTimeStamp avevi messo un getDay()-1.... stiamo facendo confusione... mi potresti postare il file swRTC.cpp che hai usato nel tuo test in cui hai ottenuto risultati corretti in entrambi i casi, per favore?
Title: Re: swRTC
Post by: leo72 on Jan 20, 2012, 10:04 am
Dopo esser diventato matto a ritrovare le funzioni che... funzionavano fra le varie versioni che ho postato e che avevo in locale, ho "partorito" la 0.8.4 che a me funziona sia su getTimestamp sia su setClockWithTimestamp (ricontrollare i nomi perché li ho uniformati).

Confermate per favore se funziona: se è tutto a posto, la inserisco nel 1° post di questo thread.
Title: Re: swRTC
Post by: PaoloP on Jan 20, 2012, 02:15 pm
Funziona perfettamente.
Grazie.  :)

Paolo.
Title: Re: swRTC
Post by: leo72 on Jan 20, 2012, 02:25 pm

Funziona perfettamente.
Grazie.  :)

Paolo.

Ti ringrazio.
Title: Re: swRTC
Post by: menniti on Jan 20, 2012, 04:18 pm


Funziona perfettamente.
Grazie.  :)

Paolo.

Ti ringrazio.

Grande Leo! Ma è completa o devi implementare altre funzioni?
Title: Re: swRTC
Post by: leo72 on Jan 20, 2012, 04:23 pm
Per me è completa, potrei "rivenderla" come versione 1.0.
Non voglio aggiungere altre funzioni, anche perché così com'è già occupa 1,8 kB di Flash. Troppa per i miei gusti.

Difatti sto sviluppando una versione "lite", leggera, della lib, per i piccoli micro, magari qualcuno volesse usarla su un Tiny con un LCD come orologio/sveglia.

Esiste anche la versione 0.9.qualcosa, pubblicata in qualche pagina addietro, che implementa il cambio di ora legale/ora solare in automatico.
Title: Re: swRTC
Post by: menniti on Jan 20, 2012, 04:28 pm

Per me è completa, potrei "rivenderla" come versione 1.0.
Non voglio aggiungere altre funzioni, anche perché così com'è già occupa 1,8 kB di Flash. Troppa per i miei gusti.

Difatti sto sviluppando una versione "lite", leggera, della lib, per i piccoli micro, magari qualcuno volesse usarla su un Tiny con un LCD come orologio/sveglia.

Esiste anche la versione 0.9.qualcosa, pubblicata in qualche pagina addietro, che implementa il cambio di ora legale/ora solare in automatico.

Quindi questa qui NON implementa l'ora legale/solare automatica? :( Ma così hai 3 versioni! Fanne una completa anche con questa funzionalità e poi magari la versione lite senza i "fronzoli"; tanto tra poco lavoriamo col 1284 :smiley-mr-green:
Title: Re: swRTC
Post by: leo72 on Jan 20, 2012, 04:33 pm
La versione con l'ora legale/solare è stata fatta per non mi ricordo chi, forse Testato. Cmq questa funzionalità non l'ho integrata con il ramo principale della lib perché non è completamente testata, ho solo fatto delle prove veloci. Andrebbe provata a fondo, prima di unificare le 2 versioni.

La "lite" non avrà questi "fronzoli", per cui che la faccia ora o tra 2 mesi sarà sempre uguale, cioè "lite"  ;)
Title: Re: swRTC
Post by: menniti on Jan 20, 2012, 04:38 pm

La versione con l'ora legale/solare è stata fatta per non mi ricordo chi, forse Testato. Cmq questa funzionalità non l'ho integrata con il ramo principale della lib perché non è completamente testata, ho solo fatto delle prove veloci. Andrebbe provata a fondo, prima di unificare le 2 versioni.

La "lite" non avrà questi "fronzoli", per cui che la faccia ora o tra 2 mesi sarà sempre uguale, cioè "lite"  ;)

Certo, chiarissimo, infatti ti chiedevo di implementare l'ora legale nella versione "full" :smiley-mr-green: Per i test non ci vuole molto, vediamo se Testato il 1° marzo riapre questo Topic felice o incazzato come una jena unridens maculata
Title: Re: swRTC
Post by: leo72 on Jan 20, 2012, 05:05 pm
Iena unridens ROTFL  XD
Title: Re: swRTC
Post by: testato on Jan 20, 2012, 07:36 pm
probabilmente iniziasti a lavorarci su mia richiesta, ma era prima di approfondire l'impossibilita' di usare una batteria tampone "standard"
Se ricordi feci delle prove di sugli assorbimenti in modalita' risparmio energetico, e purtroppo non e' possibile usare la modalita' piu' spinta che sarebbe stata utile per sostituire un rtc reale.

Purtroppo resta il problema principe, alla swRTC si deve garantire energia eterna senza mai disconnessioni, cosa fattibile in rare occasioni.
Title: Re: swRTC
Post by: leo72 on Jan 20, 2012, 11:08 pm
Affronterò il problema a breve. Finiti alcuni miei progetti, inizierò a lavorare ad un orologio sveglia con display composto da 6 matrici led 8x8. Credo che utilizzerò la swRTC con un 328 alimentato tramite 5V ottenuti dalla presa domestica ed una batteria tampone.

Per ridurre i consumi penso di tarare tutto a 1 MHz/3V3: in queste condizioni il consumo del solo 328 si attesta su pochi mA, per cui in caso di blackout anche 3 stilo AAA ricaricabili (3V6) da 1000 mAh mi garantiscono un'autonomia di decine di ore, più che sufficienti per i ripristino dell'energia. Considera che in caso del genere ovviamente il display è spento ed acceso solo su esplicita richiesta dell'utente mediante pressione di un pulsantino, per cui sono a posto. L'esattezza dell'ora sarà garantita da un quarzo da 32 kHz tramite il modulo RTC del micro.
Title: Re: swRTC
Post by: menniti on Jan 20, 2012, 11:17 pm

Iena unridens ROTFL  XD

sapevo che l'avresti "colta" XD

@Testato: quindi se ho capito bene, alla fine hai optato per la soluzione "classica" hardware col quarzo termocompensato e batteria tampone? Qual è la differenza in termini operativi tra il far mancare la tensione al micro con l'swRTC e farla mancare al PCF (o DS o quello che hai usato)?
Title: Re: swRTC
Post by: leo72 on Jan 20, 2012, 11:31 pm
La diff te la spiego io. Con una batteria tipo bottone da 3V un RTC è garantito per 7/10 anni, a seconda della grandezza della batteria (esistono da 20 o 32 mm, mi par di ricordare). Una durata impensabile per un 328.
Title: Re: swRTC
Post by: menniti on Jan 20, 2012, 11:37 pm

La diff te la spiego io. Con una batteria tipo bottone da 3V un RTC è garantito per 7/10 anni, a seconda della grandezza della batteria (esistono da 20 o 32 mm, mi par di ricordare). Una durata impensabile per un 328.


D'accordo, ma nel caso di un qualcosa come il progetto di Testato o in generale un lavoro alimentato a rete, dove non hai particolari problemi di spazio, una comunissima batteria ricaricabile, messa in modalità backup (interviene appena manca la corrente elettrica), cosa cambierebbe?
Title: Re: swRTC
Post by: leo72 on Jan 21, 2012, 12:18 am
Nulla, difatti io percorro quella strada (leggi mio precedente post). Quando ho 24 ore di autonomia, tanto per aspettare il ritorno dell'elettricità, sono a posto.
Title: Re: swRTC
Post by: testato on Jan 21, 2012, 12:29 am
certo, appunto e' quello che vuole fare leo, restano pero' alcuni punti a sfavore:

- ad ogni cambiamento dello sketch devi ritarare l'orario
- non puoi smanettare con il micro, cambiarlo, spostarlo, spegnerlo. Io posso togliere un 328P e mettere un 8A senza perdere l'orario, oppure posso spegnere tutto per fare una saldatura su un pin
- non hai la termocompensazione
- non hai la meccanicocompensazione (quarzini su microammortizzatori) (utile per progetti in movimento, in auto)
- last but not the least, la precisione. Dalle mie prove la vedo dura, gia' i 50ppm del quarzo che dovrai comprare ti sballano molto, aggiungici che se anche puoi usare il deltaT essa sara' slegata dalla temperatura, quindi ad agosto correra' in un verso a gennaio in un altro.

Sapete che ho dato molto su questa libreria in quanto a test, e' stata dura doverci rinunciare, ma non tornerei indietro. Con 5 euro di rtc hai tutto cio' che ho scritto, e come manutezione hai da mettere una CR2032, non perche' scarica ma perche' scaduta  :)

Questo vale per un aggeggio che principalmente e' orologio, mentre in tutti gli altri porgetti, specialmente se gia' di per se alimentati a batteria, la swRTC avra' successo.
Altro settore dove va benissimo secondo me e' dove l'orologio e' regolato remotamente (GPS-RADIOCONTROLLO-NTP), in quel caso tutte le ottime funzioni della libreria vanno benissimo e sono comode, ed il problema orologio e' risolto a monte, non mi serve piu' la batteria
Title: Re: swRTC
Post by: leo72 on Jan 21, 2012, 12:54 am
Opinione personale: troppa raffinatezza per avere un semplice orologio.  ;)
Title: Re: swRTC
Post by: menniti on Jan 21, 2012, 11:55 am
Tutto sommato mi pare, da "esterno", di poter dare moltissimi punti alla lib di Leo, magari consideando come eccezione i casi in cui si debbano realizzare proprio degli orologi a cui si voglia fornire grande precisione, ovvio che in questi casi si va alla ricerca di tutto ciò che possa garantire la massima precisione.
Un dubbio: gli RTC HW invece sono correttamente programmati per ora legale/solare, bisestili e quant'altro?
Title: Re: swRTC
Post by: testato on Jan 21, 2012, 01:54 pm
no, niente ora legale, mentre per la data tutto ok

se ci pensi nemmeno nessun orologio la implementa, anche carissimi (i radiocontrollati non fanno testo)

principalmente perche' e' una pratica n evoluzione, oni anno un paese si sveglia e cambia le regole, a che ora parte, in che giorno parte, ed altri ne escono. calcola che in italia si risparmiano 90 milioni con questa pratica. nel bilancio dello stato sono bazzecole e molti sono contrari e vogliono eliminarla.

Ricordo quasndo lavoravo nel grande comprensorio olivetti che con i turni era un problema e si mettevano dei cartelli giorni prima per spiegare a chi lavorava di notte di mandare avanti o indietro l'orologio. mi facevano ridere quei cartelli (io ero dipendente di una societa' diversa ma con uffici nella olivetti) sui grandi numeri quei 90milioni si sprecano in ore perse di lavoro per chi si dimentica di gestire l'orario
Title: Re: swRTC
Post by: leo72 on Jan 21, 2012, 02:15 pm

Tutto sommato mi pare, da "esterno", di poter dare moltissimi punti alla lib di Leo, magari consideando come eccezione i casi in cui si debbano realizzare proprio degli orologi a cui si voglia fornire grande precisione, ovvio che in questi casi si va alla ricerca di tutto ciò che possa garantire la massima precisione.

Grazie grazie  :smiley-sweat:

Quote

Un dubbio: gli RTC HW invece sono correttamente programmati per ora legale/solare, bisestili e quant'altro?

Solo bisestili.
Title: Re: swRTC
Post by: PaoloP on Jan 21, 2012, 02:21 pm
Se posso esprimere una mia opinione, nella libreria non dovrebbe essere presente la gestione né dell'ora legale né del fuso orario.
Sono operazioni a carico del programmatore che deciderà se implementarle o meno; al massimo puoi rilasciare dei listati di esempio allegati alla libreria.
Conta inoltre che anche i Server NTP e, come ha detto Testato, gli RTC HW, non implementano tali funzioni: Il tempo NTP è l'UTC quello relativo al meridiano di Greenwich, poi a seconda della località in cui ti trovi aggiungi o sottrai il fuso e l'ora legale.
Per me la libreria va benissimo così com'è.
Giusto un appunto... nella parte di validazione dei dati accetta anche il 30 febbraio!!  :smiley-roll:

Buon Week-end.
Paolo.
Title: Re: swRTC
Post by: leo72 on Jan 21, 2012, 03:16 pm

Giusto un appunto... nella parte di validazione dei dati accetta anche il 30 febbraio!!  :smiley-roll:

Grazie della segnalazione.
Title: Re: swRTC
Post by: pigatchu on Jan 21, 2012, 05:13 pm
Ciao a tutti

sapete dirmi se c'è una funzione che mi permetta di conoscere il giorno della settimana (1-7) ?

io ho provato inserendo un contatore di giorni "d" in questo modo:


    if ((rtc.getHours()==0 && rtc.getMinutes()==0 && rtc.getSeconds()==0))
      {
       d=d+1;                      // set the new day at 00:00:00
       delay(60000);
       }
    if (d>7){d=1;}               // restart the first day of the week
 
però non capisco perchè ogni tanto (tipo ogni 2-3 giorni) sbarella aggiungendo un giorno in più...  :~

Grazie
Ciao

Title: Re: swRTC
Post by: menniti on Jan 21, 2012, 05:40 pm
Ti consiglio di spostare questo intervento in un nuovo Topic, vedrai che otterrai risposta; qui si parla di una libreria specifica, il fatto che si parli di giorni, ore e minuti non significa che vi si debba far confluire ogni domanda che è legata all'argormento generale della data.
Title: Re: swRTC
Post by: pigatchu on Jan 21, 2012, 05:46 pm
Ciao

scusa ma mi sono dimenticato di specificare che
sto usando proprio la libreria in questione

e mi chiedevo se tra le varie funzioni presenti nella libreria
c'è ne sia una che mi permetta di tracciare i giorni della settimana,
oppure se Leo sappia spiegarsi perchè ogni tanto un contatore siffatto sbarelli...

io ho ipotizzato che il deltaT della libreria in qualche modo influisca sul contatore
per questo ho messo un delay di 1 minuto però non riesco a risolvere il problema

Grazie
Ciao
Title: Re: swRTC
Post by: leo72 on Jan 21, 2012, 05:53 pm
Per sapere il giorno della settimana esiste una formula che usa il giorno giuliano, non è facile implementarla con il contatore che hai fatto tu.
Sulla mia stazione meteo ho questa funzione:

Code: [Select]

//funzione per calcolare il giorno della settimana
byte calcolaGiornoSettimana(byte giorno, byte mese, int anno) {
    byte giorno_sett;
    float giornoGiuliano;
   
    giornoGiuliano=calcolaGiornoGiuliano(giorno, mese, anno);
   
    /* restituisce il giorno della settimana riferito al giorno giuliano
    della data selezionata dall'utente
    0=domenica - 6=sabato*/
    giorno_sett=(long(giornoGiuliano+1.5) % 7);
    if (giorno_sett==7) {
        giorno_sett=0;
    }
    return (giorno_sett);
}


//routine per il calcolo del giorno giuliano partendo dalla data
long calcolaGiornoGiuliano(byte giorno, byte mese, int anno) {
    //codice preso da it.wikipedia.org/wiki/Giorno_giuliano
    int a, b, d;
    long c, dataGiuliana;;
    float reset=2415020.50;
   
    //si controlla se siamo nei primi 2 mesi dell'anno
    if ((mese == 1) || (mese == 2)) {
        anno--;
        mese+=12;
    }
    /*quella sottostante marcata con <- è una semplificazione che dà per scontato di essere
    in una data posteriore al 15 ottobre 1582 (entrata in vigore del
    caldendario gregoriano) */
    a = int(anno/100); // <-20
    b = 2-a+int(a/4); // <-b=-13
   
    c = long(365.25*anno); //734517
    d = int(30.6001*(mese+1)); //275

    /* attualmente si riferisce all'inizio della giornata, in più viene sottratto
    un reset che permette di avere una migliore definizione della parte decimale
    (limiti rappresentativi dipendenti dalle strutture dati); il reset indicato
    si riferisce al 1° gennario 1900, ma è una scelta arbitraria. */
    dataGiuliana = long(b+c+d+giorno+1720994.50-reset);
    return (dataGiuliana);
}


Che chiami con
Code: [Select]
giorno_sett=calcolaGiornoSettimana(giorno, mese,anno);
Title: Re: swRTC
Post by: pigatchu on Jan 21, 2012, 06:01 pm
Grazie Leo

Domani proverò ad implementarla nel mio codice...
anche se essendo alle prime armi mi sembra un po complicata

cosa ne pensi invece sul fatto di aggiungere quata funzione alla libreria
e poterla richiamare con un semplice  rtc.getDayweek   ;)

Grazie
Ciao
Title: Re: swRTC
Post by: leo72 on Jan 21, 2012, 06:09 pm

Grazie Leo

Domani proverò ad implementarla nel mio codice...
anche se essendo alle prime armi mi sembra un po complicata

Copi il codice che ti ho postato.
Quando vuoi sapere il giorno, chiami la funzione come ti ho specificato.

Quote

cosa ne pensi invece sul fatto di aggiungere quata funzione alla libreria
e poterla richiamare con un semplice  rtc.getDayweek   ;)

Avevo deciso di non implementare funzioni aggiuntive per non far crescere troppo la lib, integrare questa funzione credo porti ad un discreto aumento della memoria occupata (calcoli in virgola mobile).
Title: Re: swRTC
Post by: lestofante on Jan 21, 2012, 06:33 pm
il codice è incompleto, manca la funzione calcolaGiornoGiuliano()

propongo questa suddivisione:
la swRTCbase che semplicemente conta il timestamp a partire dal 1900 (come i server NTP) attravero l'interrupt

la swRTCtool, che aggiunge le funzioni per giorno, mese, anno, e che può anche essere usata da sola per chi magari ha un RTC e vuole solo le utilità

la swRTC, che al suo interno posside swRTCbase e swRTCtool, per chi non ha problemi di spazio e vuole tutto a portata di mano in un'unica classe



Title: Re: swRTC
Post by: leo72 on Jan 21, 2012, 06:42 pm

il codice è incompleto, manca la funzione calcolaGiornoGiuliano()


C'è, basta scorrere la finestra del codice  :P
Title: Re: swRTC
Post by: PaoloP on Jan 21, 2012, 07:30 pm
Se non sbaglio è possibile ottenere il giorno della settimana dal timestamp.
Adesso cerco e vi faccio sapere.
Title: Re: swRTC
Post by: PaoloP on Jan 21, 2012, 07:43 pm
Ecco...
Nella funzione timeconversions.c, quella postata qualche pagina indietro, è presente il calcolo del giorno della settimana basato sul timestamp.
E' --> tm_wday = (dayno + 4) % 7;   /* day 0 was a thursday */

Includerla nella libreria dovrebbe essere semclisissimo, senza andarsi a cercare date giuliane.
E' in pratica il modulo 7 ai giorni rimasti. (somma quattro perché il 1/1/1900 era giovedì)


Ciao Leo72,
Googolando un pò, ho trovato un'interessantissima funzione che permette di convertire il tempo NTP in data (giorno,mese,anno,ore,minuti,secondi).
Fa parte di un progetto di una scheda Ethernet che monta un AtMega328 che si sincronizza con i server NTP.
Qui la scheda: http://shop.tuxgraphics.org/electronic/index-eth.html
e qui i listati: https://github.com/pklaus/Tuxgraphics-AVR-NTP-clock

I file sono: timeconversions.h
Code: [Select]
/*********************************************
* vim:sw=8:ts=8:si:et
* To use the above modeline in vim you must have "set modeline" in your .vimrc
* Author: Guido Socher
* Copyright: GPL V2
*
*********************************************/
//@{
#ifndef TIMECONVERSIONS_H
#define TIMECONVERSIONS_H

// Number of seconds between 1-Jan-1900 and 1-Jan-1970, unix time starts 1970
// and ntp time starts 1900.
#define GETTIMEOFDAY_TO_NTP_OFFSET 2208988800UL

extern uint8_t gmtime(const uint32_t time,char *day, char *clock);


#endif /* TIMECONVERSIONS_H */
//@}


e timeconversions.c:
Code: [Select]
/*********************************************
* vim:sw=8:ts=8:si:et
* To use the above modeline in vim you must have "set modeline" in your .vimrc
* Author: Guido Socher
* Copyright: GPL V2
* See http://www.gnu.org/licenses/gpl.html
*
* functions to convert ntp timestamps into time and date
*********************************************/
#include <avr/io.h>
#include <stdio.h>
#include <inttypes.h>
#include <avr/pgmspace.h>

// EPOCH = Jan 1 1970 00:00:00
#define EPOCH_YR 1970
//(24L * 60L * 60L)
#define SECS_DAY 86400UL  
#define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400)))
#define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365)


static const char day_abbrev[] PROGMEM = "SunMonTueWedThuFriSat";

// isleapyear = 0-1
// month=0-11
// return: how many days a month has
//
// We could do this if ram was no issue:
//uint8_t monthlen(uint8_t isleapyear,uint8_t month){
//const uint8_t mlen[2][12] = {
// { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
// { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
// };
// return(mlen[isleapyear][month]);
//}
//
uint8_t monthlen(uint8_t isleapyear,uint8_t month){
if(month==1){
return(28+isleapyear);
}
if (month>6){
month--;
}
if (month%2==1){
return(30);
}
return(31);
}

// gmtime -- convert calendar time (sec since 1970) into broken down time
// returns something like Fri 2007-10-19 in day and 01:02:21 in clock
// The return values is the minutes as integer. This way you can update
// the entire display when the minutes have changed and otherwise just
// write current time (clock). That way an LCD display needs complete
// re-write only every minute.
uint8_t gmtime(const uint32_t time,char *day, char *clock)
{
       char dstr[4];
       uint8_t i;
uint32_t dayclock;
       uint16_t dayno;
uint16_t tm_year = EPOCH_YR;
uint8_t tm_sec,tm_min,tm_hour,tm_wday,tm_mon;

dayclock = time % SECS_DAY;
dayno = time / SECS_DAY;

tm_sec = dayclock % 60UL;
tm_min = (dayclock % 3600UL) / 60;
tm_hour = dayclock / 3600UL;
tm_wday = (dayno + 4) % 7; /* day 0 was a thursday */
while (dayno >= YEARSIZE(tm_year)) {
dayno -= YEARSIZE(tm_year);
tm_year++;
}
tm_mon = 0;
while (dayno >= monthlen(LEAPYEAR(tm_year),tm_mon)) {
dayno -= monthlen(LEAPYEAR(tm_year),tm_mon);
tm_mon++;
}
       i=0;
       while (i<3){
               dstr[i]= pgm_read_byte(&(day_abbrev[tm_wday*3 + i]));
               i++;
       }
       dstr[3]='\0';
sprintf_P(day,PSTR("%s %u-%02u-%02u"),dstr,tm_year,tm_mon+1,dayno + 1);
sprintf_P(clock,PSTR("%02u:%02u:%02u"),tm_hour,tm_min,tm_sec);
       return(tm_min);
}


Pensavo che potresti includerli nella tua libreria.

Ciao,
Paolo.

PS: Sul sito http://shop.tuxgraphics.org/ vendono anche una board con sopra il 644A, ma non ho idea se lascino la programmazione all'acquirente o abbiano sviluppato un core.
Title: Re: swRTC
Post by: PaoloP on Jan 21, 2012, 07:52 pm
In definitiva sarebbe una cosa del genere:
Code: [Select]
int wday(unsigned long timestamp)
{
 return ((timestamp / 86400L) + 4 ) % 7;
}


La chiami con:
Code: [Select]

numgiorno = wday(rtc.getTimestamp(1900));

Spero di aver scritto corretto.

Paolo.
p.s. Leo, se la includi nella classe credo si possa richiamare la funzione anche dall'interno, o sbaglio?
Title: Re: swRTC
Post by: pigatchu on Jan 21, 2012, 10:51 pm
Ragazzi

non credevo che la cosa fosse così complicata (almeno per me...)

1) x Leo: il codiche che mi hai riportato lo devo copiare nella parte del loop o fuori??

2) x PaoloP: usando il codice che hai postato mi permette quindi di avere il giorno della settimana
senza dover passare per il giorni gregoriani e/o giuliani?

A questo punto sono curioso di capire perche il "semplice" contatore che avevo scritto io non funziona
a me serviva semplicemente un sistema che tenesse il conto del passare dei giorni
e ritornasse ad 1 ogni 8 gg
tanto nel setup gli dicevo io quale giorno della settimana corrispondeva alla data impostata....

Spero di non aver abbusato troppo della vostra pazienza...

Grazie && Ciao
Carlo
Title: Re: swRTC
Post by: leo72 on Jan 21, 2012, 11:05 pm
@Paolo:
non mi ricordavo della funzione nel codice che mi avevi passato. Ho pubblicato quello del mio meteo perché all'epoca avevo affrontato il problema e lo avevo risolto in quel modo (reminiscenze di astronomia  :smiley-sweat: )

@picachu:
il deltaT entra nel calcolo dell'ora in questo modo. Il deltaT passato alla funzione è una correzione che viene inserita nel calcolo di ogni secondo: ciò significa che un deltaT di, poniamo, -10, significa che ogni giorno l'orologio viene "aggiustato" sottraendo 10 secondi. Ma questa sottrazione non avviene alla mezzanotte o ad una specifica ora del giorno altrimenti, in presenza di grossi valori, sarebbe visibile uno scatto. Ogni secondo dura quindi un certo numero di ms in meno o in più. Nell'esempio qui sopra, siamo a -10s/dì-> -10000ms/dì -> 0,11s/secondo. Ciò significa che un secondo durerà non 1000 ms ma 989 ms. Se tu metti un delay di 60000, il delay è basato sul timer0 dell'Arduino, che non viene influenzato dalla swRTC. Quindi 60000 ms sono "circa" 60 secondi, però in quel frangente, con l'esempio di deltaT=-10, 60s "trascorrono" dopo 59,34s. Forse è per questo che il conto con il tuo metodo salta, perché la swRTC può correre più o meno del timer dell'Arduino.
Title: Re: swRTC
Post by: pigatchu on Jan 21, 2012, 11:36 pm

molto probabilmente è come dici tu perchè il problema è iniziato da quando
ho introdotto il deltaT, per questo i miei sospetti sono caduti su di lui

ma posso utilizzare il codice postato da PaoloP per ottenere il giorno della settimana?
oppure occorre inserirlo all'interno della libreria?
Title: Re: swRTC
Post by: leo72 on Jan 22, 2012, 12:32 am
Lo puoi usare inserendolo nel tuo sketch.
Title: Re: swRTC
Post by: pigatchu on Jan 22, 2012, 10:29 am

Perfetto

funziona benissimo

l'unica cosa che ho cambiato e quel +4 in +1 perchè in quel modo il primo giorno veniva di giovedi...

Grazie Mille

Ciao
Title: Re: swRTC
Post by: leo72 on Jan 22, 2012, 11:40 am
Allegato al 1° post del thread trovate la versione 1.0 della libreria, la prima versione stabile e completa.
Ho aggiunto il calcolo del giorno della settimana secondo la formuletta data da Paolo che,
@picatchu:
a me restituisce correttamente il giorno tenendo il "+4". Ho provato con la data odierna, sia con epoca 1900 che epoca 1970, ed ho ottenuto sempre "0" come risultato. Mi pare giusto. Perché a te torna con "+1"?
Title: Re: swRTC
Post by: pigatchu on Jan 22, 2012, 06:43 pm

Riportando:

Quote

  int wday(unsigned long timestamp)
    {
      return ((timestamp / 86400L) ) % 7;
    }



mi restituisce la domenica=6 e il lunedi=0

mentre aggiungendo il +1 la domenica diventa 0 e il lunedì=1
Title: Re: swRTC
Post by: PaoloP on Jan 22, 2012, 06:51 pm

Riportando:
Quote

 int wday(unsigned long timestamp)
   {
     return ((timestamp / 86400L) ) % 7;
   }


mi restituisce la domenica=6 e il lunedi=0
mentre aggiungendo il +1 la domenica diventa 0 e il lunedì=1


E' infatti così deve essere.
In C, il primo elemento di un array è l'elemento 0.  XD

@Leo
Complimenti per la versione stabile.
Nel primo posto potresti scrivere che la lib funziona anche con la IDE 1.0.
Title: Re: swRTC
Post by: testato on Jan 22, 2012, 09:23 pm
alla fine decidi tu come piu' ti piace gestire i numeri rispetto ai giorni, in italia si usa il lunedi' come primo giorno della settimana, in altri paesi no.
Negli RTC ad esempio decidi tu che numero dare al giorno odierno, lui non fa altro che ripartire ogni 7. in realta' non sa se e' lunedi' o martedi'. io ad esempio uso 1=lunedi' 7=domenica che e' molto italiano come concetto, ma l'rtc non sa che giorno e'
Title: Re: swRTC
Post by: leo72 on Jan 22, 2012, 10:21 pm
In Italia la settimana inizia il lunedì, è vero. Ma siccome (e spero) la lib dev'essere internazionale, uso la nomenclatura anglofila che fa partire la settimana dalla domenica.

@Paolo:
lo faccio
Title: Re: swRTC
Post by: testato on Jan 22, 2012, 10:36 pm
che poi da dove esce sta' modifica straniera ? il capo si riposo' il ettimo giorno, la messa di ringraziamento e' nel settimo giorno, capisco che non hanno buoni rapporti con il messaggero terreno, ma il capo supremo degli inglesi e' il nostro stesso capo  :)
Title: Re: swRTC
Post by: menniti on Jan 22, 2012, 10:41 pm

che poi da dove esce sta' modifica straniera ? il capo si riposo' il ettimo giorno, la messa di ringraziamento e' nel settimo giorno, capisco che non hanno buoni rapporti con il messaggero terreno, ma il capo supremo degli inglesi e' il nostro stesso capo  :)


+1!!! Grande Testato! per non parlare dei mericani... ]:D
Title: Re: swRTC
Post by: leo72 on Jan 22, 2012, 10:46 pm
Perché non istituite una petizione per abolire il meridiano di Greenwich e sostituirlo con quello di Montemario?  :P
Dai, volenti o nolenti ci sono consuetudini che internazionalmente sono regole.
Title: Re: swRTC
Post by: pigatchu on Jan 25, 2012, 12:01 am
Ciao Leo

non capisco perchè ma mi dà dei problemi con la funzione rtc.weekDay(timestamp)

riportando:

Serial.println(rtc.weekDay(1900), DEC);

mi restituisce sempre il valore = 4 per qualsiasi giorno...

sto sbagliando qualcosa?

se invece uso il codice che mi aveva suggerito PaoloP tutto funziona alla perfezione

Grazie
Ciao

Title: Re: swRTC
Post by: leo72 on Jan 25, 2012, 07:40 am
Oggi ricontrollo quanto torno a casa.
Title: Re: swRTC
Post by: reizel on Jan 25, 2012, 12:14 pm
leo, ho installato arduino1.0 e non mi funziona piu' nulla, gli sketch che andavano nella 0022 ora tutti piantati e non capisco che errori s'inventa

mi serve far rifunzionare un codice con il tuo swRTC, mi dai l'ultima versione sicura? (son 44 pagine di reply per cercarla...) cosi' lo metto nelle librerie e vediamo se va...

son stato assente dal forum 3 mesi e ho piantato il pc con reinstallazione, non sarei qui a far ste domande se avessi ancora la 0022 :( non vi dico che stress vedere che nessun scketc non parte...


Ps.: ho rimesso la 0022 e funziona, linkami l'ultima versione del tuo swRTC, visto che ci stai lavorando da moltissimo almeno lo provo e uso quello
(ma che problemi ha la ardu1.0???)
Title: Re: swRTC
Post by: leo72 on Jan 25, 2012, 01:45 pm
L'ultima versione è sempre allegata al 1° post del thread, in prima pagina.

Essa compila anche sotto Arduino 1.0. Cmq consiglio di NON passare ad Arduino 1.0 se si usano librerie di terze parti perché bisogna aspettare che i loro autori le rendano compatibili col nuovo IDE
Title: Re: swRTC
Post by: PaoloP on Jan 25, 2012, 02:23 pm

Ciao Leo
non capisco perchè ma mi dà dei problemi con la funzione rtc.weekDay(timestamp)

riportando:

Serial.println(rtc.weekDay(1900), DEC);
mi restituisce sempre il valore = 4 per qualsiasi giorno...
sto sbagliando qualcosa?
se invece uso il codice che mi aveva suggerito PaoloP tutto funziona alla perfezione

Grazie
Ciao

La funzione weekday accetta in ingresso un timestamp.
Tu gli stai passando 1900 che presumo sia l'anno del timestamp ma non è un time stamp.
Arduino lo interpreta come 1900 secondi del 1.1.1970 che era un giovedì.
Devi passare alla funzione un timestamp che puoi ottenere da gettimestamp(anno).
Scusa il gioco di parole m mi sto intruppando con i timestamp.

Paolo.
Title: Re: swRTC
Post by: reizel on Jan 25, 2012, 02:26 pm
Grazie leo, con la 0022 tutto funziona e il tuo consiglio di non passare alla 1.0 DOVREBBERO METTERLO NELLA PAGINA DEI DOWNLOAD! ho perso ore inutilmente con la 1.0......
Title: Re: swRTC
Post by: pigatchu on Jan 25, 2012, 02:45 pm

@ Paolo:
potresti essere più chiaro, magari con qualche esempio?
perchè questo timestamp mi sta incasinando un bè...  :~

e comunque che senzo avrebbe la funzione rtc.weekDay(timestamp)
se per ottenere il numero della settimana devi passare attraverso un'altra funzione?

Grazie
Ciao
Title: Re: swRTC
Post by: PaoloP on Jan 25, 2012, 03:02 pm


@ Paolo:
potresti essere più chiaro, magari con qualche esempio?
perchè questo timestamp mi sta incasinando un bè...  :~

e comunque che senzo avrebbe la funzione rtc.weekDay(timestamp)
se per ottenere il numero della settimana devi passare attraverso un'altra funzione?

Grazie
Ciao

L'esempio lo trovi nel codice che ho postato precedentemente.
La funzione è stata fatta in quel modo perché era la via più veloce per implementarla.
Poi non è detto che il timestamp lo devi prendere dalla stessa libreria; potrebbe essere un timestamp esterno.
Credo si possa anche creare un funzione del genere --> weekDay(dd,mm,yyyy)
In quel modo non passi dal timestamp.
Mi pare che il C permetta la discriminazione di funzioni omonime in base ai parametri passati.
Title: Re: swRTC
Post by: pigatchu on Jan 25, 2012, 03:40 pm

Ok

ho risolto scrivendo:

Serial.println(rtc.weekDay(rtc.getTimestamp()), DEC);

Grazie per la dritta
Title: Re: swRTC
Post by: PaoloP on Jan 25, 2012, 06:16 pm


Ok, ho risolto scrivendo:
Code: [Select]
Serial.println(rtc.weekDay(rtc.getTimestamp()), DEC);
Grazie per la dritta

8)
Title: Re: swRTC
Post by: duch on Feb 01, 2012, 11:03 pm
ciao a tutti, sto facendo una bozza di software basato su questo swRTC ( sto combattendo con quello hw e vince lui)
avrei l'esigenza di regolare l'ora e i minuti con 2 pulsanti dedicati soltanto che ora mi incrementa ore e minuti a caso senza che la pressione del tasto avvenga, vi posso postare il mio sketch qui o apro una discussione a se stante?

grazie e scusate il disturbo!
Title: Re: swRTC
Post by: leo72 on Feb 01, 2012, 11:27 pm
Credo che il tuo sia un problema di debounce. Cmq apri una discussione a parte, non c'entra direttamente la swRTC.
Title: Re: swRTC
Post by: PaoloP on Feb 03, 2012, 05:35 pm
Ciao Leo,
cosa hai cambiato nella 1.0.1 in confronto alla versione 1.0?
Title: Re: swRTC
Post by: leo72 on Feb 03, 2012, 05:39 pm
La licenza  :smiley-sweat:
Siccome la LGPL era un po' troppo permissiva nei confronti di chi voleva usare la swRTC (permetteva di inglobarla in progetti senza dover fornire, in caso di distribuzione del progetto, il codice del programma che la linkava), ho deciso di adottare la GPLv3 così che chi la usa debba poi ridistribuire il suo codice contribuendo alla diffusione del software libero.
Title: Re: swRTC
Post by: testato on Feb 03, 2012, 05:54 pm
Paolo io pero' ho sul pc la versione con licenza precedente e quindi possiamo fare quello che vogliamo  :)

c'e' stato un lunghissimo post in merito di licenze, non siamo arrivati lontano perche' ci sono disaccordi in merito, se vuoi puoi darci uno sguardo
Title: Re: swRTC
Post by: leo72 on Feb 03, 2012, 06:11 pm

Paolo io pero' ho sul pc la versione con licenza precedente e quindi possiamo fare quello che vogliamo  :)

Senza offesa ma sono comportamenti e commenti come questi che fanno passare la voglia di condividere i propri lavori. Oltretutto sentirli dire proprio da te mi fa un po' stare male. Mi ricordo bene le pagine e pagine di richieste di aggiungere questo o modificare quello, che proprio tu hai fatto in questo thread, basta scorrere le pagine per sincerarsene. Alla fine, con la scusa del "test", ti sei fatto fare una versione della swRTC che ti si cucisse addosso. E poi cosa fai? Te ne appropri e non dai niente in cambio... no no no... così non si fa. :~
Non è lo spirito di Arduino, questo.

Quote

c'e' stato un lunghissimo post in merito di licenze, non siamo arrivati lontano perche' ci sono disaccordi in merito, se vuoi puoi darci uno sguardo

Il disaccordo è questo: prendere la fatica di qualcun altro e poi tenere tutto per sé è una cosa che non condivido. Se tutti i creatori delle librerie avessero fatto così ed avessero solo distribuito l'eseguibile invece del sorgente, nessuno avrebbe potuto trarre beneficio dalle fatiche degli altri ma avrebbe dovuto rifare tutta la strada per proprio conto.
Title: Re: swRTC
Post by: testato on Feb 03, 2012, 06:20 pm
scusa leo, di certo non mi sono spiegato, ma nell'altro topic l'ho spiegato molto bene.
Io non uso la tua libreria, e tutto quello fatto in questo topic e' stato un contributo alla tua libreria.
Sono stto contento di farti tanti test e di averti date tante idee, la DST viene da me come idea, Il concetto del problema alimentazione viene da me.

Io nemmeno ce l'ho la tua libreria credo sul pc, era un voler continuare il discorso licenze.
Credo non si sia capito, sto' solo facendo l'avvocato del diavolo, atto a sottolineare che c'e' gente che ne approfitta e che quindi si devono pensare bene le cose dall'inizio.

Io ad esempio ho paura a rilasciare il mio valvolare perche' per come sono fatto se lo vedo in un negozio cinese va a finire che ammazzo il negoziante.
Quindi in attesa di un mondo migliore mi tengo sul comodino cose che potrei rilasciare. Mica li vendo o ci guadagno, e' pura passione di imparare cose. Ma mi roderebbe vederle copiate da gente che lo fa solo per lucro.

Nell'open source ci sono punti deboli, come le licenze, e mi piace metterlo in evidenza per migliorare. Mi riprometto di non farlo piu' usando come pretesto la tua lib.
Title: Re: swRTC
Post by: leo72 on Feb 03, 2012, 06:27 pm
Io mi ricordavo bene l'altra discussione ma qui avevi fatto un commento un po'... a presa per le mele, con quella frase che tu avevi la versione più "libera" e quindi che ci potevate fare quello che volevate.

Tu sei uno che vuol tenersi tutto per sé, questi si è capito benie non solo in questo thread o nell'altro delle licenze: ad esempio hai fatto lo stesso ragionamento nel thread in cui la Daniela voleva regalare le piastrine a patto che il progetto fosse condiviso e tu hai subito detto che non volevi farlo. A me sinceramente non importa nulla: ognuno è come è, è il bello di essere tutti uguali e di poter dire: "a te piace? A me no."

Io ho condiviso una cosa, mi piacerebbe che anche gli altri facessero lo stesso. Io d'altronde la penso così: se tu "ricevi" è giusto che poi "restituisca" quello che hai ricevuto. Chiamalo "prestito di conoscenza".
Se non vuoi dare, è giusto anche non prendere, non trovi?  :P
Title: Re: swRTC
Post by: testato on Feb 03, 2012, 06:31 pm
peinamente daccordo,
credo di fare inoltre la mia parte perche' nei miei 1762 messaggi ci sono 62 richieste di aiuto e 1700 risposte di aiuto
Title: Re: swRTC
Post by: menniti on Feb 03, 2012, 09:40 pm

peinamente daccordo,
credo di fare inoltre la mia parte perche' nei miei 1762 messaggi ci sono 62 richieste di aiuto e 1700 risposte di aiuto

Beato te, io ho 3900 coglion[OT]te e 78 richieste d'aiuto :smiley-sweat:; mi togli una curiosità? Come l'hai fatta questa statistica? MIca ti sarai riletto tutti i tuoi interventi dividendoli tra dare e avere?
Title: Re: swRTC
Post by: lestofante on Feb 03, 2012, 10:48 pm
e così iniziò la gara a chi l'aveva più lungo  :smiley-mr-green:

c'è poco da fare, chi sa fare sarà sempre in "credito" verso la comunità, ma se si diverte a farle non gliene può fregar di meno  :)
Title: Re: swRTC
Post by: testato on Feb 03, 2012, 11:46 pm
E' un calcolo a cazzo  e di parte  :P
Io so solo che sono fiero di stare in mezzo a gente come leo lesto menny astro uwe. 
E' una bella community
Title: Re: swRTC
Post by: leo72 on Feb 03, 2012, 11:51 pm
Anche a me piace questo forum.  :D
Title: Re: swRTC
Post by: draio on Feb 10, 2012, 02:13 pm
Ciao a tutti!

Premessa: Leo72, la swRTC è un gran bel lavoro! Grazie!
Anni fa mi sono cimentato in un'impresa simile (la creazione di un sistema con più timer indipendenti visualizzati tramite LCD) su un PIC creandomi, in assembler, una cosa molto simile. Il risultato, purtroppo, non mi ha soddisfatto, perdevo un discreto numero di secondi al giorno. Non ho avuto poi tempo di "incaponirmi" e non essendo un guro del PIC ho rinunciato.

Detto questo, ben contento dell'esistenza della swRTC, ho fatto un semplicissimo programma che mostra l'ora su un display (nokia 5110). Non ho usato arduino UNO ma, un Luigino (quindi un compatibile 2009).
L'ho sincronizzato con l'ora di un PC (sempre acceso) e l'ho lasciato andare per 24 ore. 

Purtroppo l'orologio si è perso circa 15 secondi in un giorno.
Avevo letto che c'era la possibilità di imprecisioni, avevo però letto che sulle 2009 avrebbe dovuto funzionare meglio che sulla UNO, forse Luigino ha qualcosa di diverso da una 2009?

In realtà mentre scrivevo questo post ho capito che usando la setDeltaT posso, probabilmente, correggere questo errore.
rtc.setDeltaT(15.0) ? Basta definirla una volta sola all'inizio vero?

Invio comunque il post per darvi un feedback sull'uso con un Luigino.

Se può interessare posso testare (sperando di trovare il tempo) anche:
- Arduino UNO (ok, questo l'avrete testato tutti)
- Arduino Pro Mini 328 - 3.3V/8MHz (sparkfun)
- Arduino Nano V3.0 (chissadichi)
- Lilypad (Lilypad)

Grazie ancora

Title: Re: swRTC
Post by: leo72 on Feb 10, 2012, 05:47 pm
Grazie per il feedback.
La funzione serve appunto a correggere gli scostamenti dell'orologio dall'ora reale. E' uno scostamento di tipo non adattivo quindi se ad esempio la temperatura fluttua molto (ad esempio un dispositivo usato all'esterno) potresti comunque avere degli scarti lo stesso.
Tornando al discorso della precisione, ho citato la 2009 perché l'Arduino 2009 possiede un quarzo, così come la Luigino328. 15 secondi al giorno non sono un grosso errore, se consideri che comunque stai usando un RTC software e che il microcontrollore esegue anche altri compiti nel frattempo, non come un RTC hardware che fa solo la gestione dell'ora.

Quote
rtc.setDeltaT(15.0) ? Basta definirla una volta sola all'inizio vero?

Sì. Anche se puoi ridefinirla nel corso del programma, se ad esempio vuoi rendere la sua modifica interattiva con l'utente.
Title: Re: swRTC
Post by: pablos71 on Feb 10, 2012, 07:21 pm
Si anch'io ho una differenza circa di 14-15 secondi in 24h, solo che il mio ha fretta :) ha superato l'ora del pc di 15 sec.
Arduino Mega ADK + displyay lcd 2x16, lo lascierò ancora un 24h - 48h e facciamo una media

è comunque un ottimo lavoro, ciao
Title: Re: swRTC
Post by: testato on Feb 10, 2012, 07:26 pm
aggiungo un'esperienza utile in tal senso, anche io all'inizio inizia a testare la precisione basandomi sull'orario del mio PC

ma mi sono reso conto che non e' stabile il PC, non chiedetemi il perche' ma mi ritrovavo un giorno avanti e l'0altro indietro, fino a che non ho deciso di monitorare la situazione rispetto ad un orologio digitale normale.

E' molto meglio e sai di preciso se il deltat ti sta correggendo bene o no.

e' vero che l'orologio da polso ha a sua volta un errore, ma nn sara'  a sbalzi, ma regolare, cie' su misure di 24 o 48 ore l'errore dell'orologio da polso e' infinitesimale
Title: Re: swRTC
Post by: pablos71 on Feb 10, 2012, 09:02 pm
Lo sincronizzo col l'orologio atomico che ho sempre a portata di mano sul mio comodino :) e vado a vedere domani sera  :D
Title: Re: swRTC
Post by: leo72 on Feb 10, 2012, 10:33 pm

aggiungo un'esperienza utile in tal senso, anche io all'inizio inizia a testare la precisione basandomi sull'orario del mio PC

ma mi sono reso conto che non e' stabile il PC, non chiedetemi il perche' ma mi ritrovavo un giorno avanti e l'0altro indietro, fino a che non ho deciso di monitorare la situazione rispetto ad un orologio digitale normale.


Non è stabile perché anche l'orologio del PC è un RTC e come tale è soggetto a sbalzi. Inoltre il servizio di sincronizzazione dell'ora tramite un server NTP non agisce ogni secondo ma ad intervalli temporali per cui la precisione dell'ora dipende dalla precisione dell'RTC e dalla frequenza di aggiornamento dell'ora.
Title: Re: swRTC
Post by: testato on Feb 10, 2012, 11:12 pm
infatti avevo pensato subito all'NTP ma non al fatto che l'rtc del pc fosse talmente schifoso.
probabilmente sul mio posso dire che nella notte, a pc spento l'rtc sballa alla grande, tipo 30 secondi, poi lo vai ad accendere e lui si aggiusta all'NTP (credo che almeno al boot lo faccia il controllo ? non so come e' settatto di base l'ntp di win7) poi magari nella giornata risballa di 15sec
in pratica e' inutlizzabile per una cosa del genere, l'orologio cinese digitale da 5 euro va piu' che bene :)

ho avuto brutte esperienze anche con i siti che riportano l'orario, ne ho rpovati un paio italiani che dicono di avere l'orario atomico, ma sballano anche loro alla grande

ma ormai in casa mia la precisione la faccio io  :)
a 20 giorni dalla definitiva chiusura del progetto valvolare, sto' in avanti di 2 secondi, il che significa la meta' di quanto dichiarato dal produttore dell'rtc (sarebbero 1 ppm mentre il datasheet riporta 2ppm )  :)
Title: Re: swRTC
Post by: leo72 on Feb 11, 2012, 12:11 am

infatti avevo pensato subito all'NTP ma non al fatto che l'rtc del pc fosse talmente schifoso.

Probabilmente, essendo chiuso in un case soggetto a sbalzi termici, subisce delle variazioni significative.

Quote

probabilmente sul mio posso dire che nella notte, a pc spento l'rtc sballa alla grande, tipo 30 secondi, poi lo vai ad accendere e lui si aggiusta all'NTP (credo che almeno al boot lo faccia il controllo ? non so come e' settatto di base l'ntp di win7)

In teoria dovrebbe sincronizzarsi all'avvio, almeno sul mio Linux il demone NTP fa così. Poi si sincronizza ogni tanto, ma non so esattamente con che frequenza.
Title: Re: swRTC
Post by: PaoloP on Feb 11, 2012, 11:43 pm
Win7 per impostazione si sincronizza ogni 7 giorni.
Poi è possibile forzare la sincronizzazione in ogni momento.
Title: Re: swRTC
Post by: draio on Feb 13, 2012, 11:17 am

Ciao a tutti, grazie per le risposte.
Nel weekend l'ho abbandonato acceso in ufficio con delta +13 (erano 13 i secondi, non 15) e oggi al posto di essere a -13(*e giorni e mezzo) è a +24.


E' uno scostamento di tipo non adattivo quindi se ad esempio la temperatura fluttua molto (ad esempio un dispositivo usato all'esterno) potresti comunque avere degli scarti lo stesso.


Sicuramente la temperatura, in ufficio, nel weekend si è abbassata di alcuni grandi (5..7..10?).

[quote ]15 secondi al giorno non sono un grosso errore, se consideri che comunque stai usando un RTC software e che il microcontrollore esegue anche altri compiti nel frattempo, non come un RTC hardware che fa solo la gestione dell'ora.
[/quote]

Come detto ci son passato anche io e capisco benissimo il problema. Onestamente speravo fosse più che altro colpa della mia incopetenza :-)

Per quanto riguarda invece l'affidabilità dell'orologio del mio pc, in realtà è l'ora del NTP Pool Project (http://www.pool.ntp.org) con cui il mio PC si sincronizzato costantemente.

Mi piacerebbe, grazie al collegamento seriale, lasciare il sistema in funzione in modo che, di tanto in tanto, compari l'ora con il PC e generi un deltaT automaticamente. Una sorta di sistema automatico che in un tot di tempo trovi il miglior deltaT per la scheda su cui sta girando. Inutile dire che, probabilmente, si deve rifare il tuning ogni volta che cambia la stagione :-D

Title: Re: swRTC
Post by: leo72 on Feb 13, 2012, 11:23 am


Ciao a tutti, grazie per le risposte.
Nel weekend l'ho abbandonato acceso in ufficio con delta +13 (erano 13 i secondi, non 15) e oggi al posto di essere a -13(*e giorni e mezzo) è a +24.

:smiley-yell:

Quote

Mi piacerebbe, grazie al collegamento seriale, lasciare il sistema in funzione in modo che, di tanto in tanto, compari l'ora con il PC e generi un deltaT automaticamente. Una sorta di sistema automatico che in un tot di tempo trovi il miglior deltaT per la scheda su cui sta girando. Inutile dire che, probabilmente, si deve rifare il tuning ogni volta che cambia la stagione :-D

E' fattibile, l'impostazione del delta la puoi cambiare anche in "corsa".
Title: Re: swRTC
Post by: testato on Feb 13, 2012, 11:25 am
scusa pero' non ricordo che il deltat sia legato ai secondi.
non significa niente avere 13secondi di errore e quindi mettere 13 deltat
leo correggimi se sbaglio, con +13 hai detto ad arduino di avanzare di 13millisecondi al secondo

inoltre aggiungo dati sul concetto di temperatura, l'influenza della stessa e' molto piccola perche' parliamo di un oggetto che e' in ufficio non a -40
nei post avevo scriitto il valore. parliamo di secondi/anno
quindi non farti problemi

A questo risincronizza l'orario e piazza un bel -10DT
Title: Re: swRTC
Post by: lestofante on Feb 13, 2012, 11:34 am

Mi piacerebbe, grazie al collegamento seriale, lasciare il sistema in funzione in modo che, di tanto in tanto, compari l'ora con il PC e generi un deltaT automaticamente. Una sorta di sistema automatico che in un tot di tempo trovi il miglior deltaT per la scheda su cui sta girando. Inutile dire che, probabilmente, si deve rifare il tuning ogni volta che cambia la stagione :-D


con l'aggiunta di un sensore di temperatura forse in un anno avresti la curva di correzione in base alla temperatura
Title: Re: swRTC
Post by: leo72 on Feb 13, 2012, 11:37 am
Il deltaT indica di quanti secondi al giorno si vuole correggere l'orologio è può variare da -600.0 a +600.0 secondi.
E' però strutturato in modo che la correzione non avvenga in maniera "brutale" in un unico momento, bensì sia spalmato su ogni secondo allungandolo o accorciandolo in maniera proporzionale affinché la correzione non sia percettibile.

Title: Re: swRTC
Post by: pablos71 on Feb 13, 2012, 11:37 am
Scusa Leo, dove hai scitto volatile int delta=0; se metto un valore ad esempio 13000 (13 sec), il programma andrebbe a sottrarli ogni mezzanotte? come funziona il delta, li toglie all'inizio e basta?

ciao grazie
Title: Re: swRTC
Post by: pablos71 on Feb 13, 2012, 11:38 am
Abbiamo scritto nello stesso momento  :D ok visto, la variabile l'hai intesa come secondi non come millisecondi,  esiste una linea di comando da sketch per impostarlo?


ciao
Title: Re: swRTC
Post by: pablos71 on Feb 13, 2012, 11:56 am
trovato rtc.setDeltaT(-***.*);

dovrei mettere rtc.setDeltaT(-13.0); per rallentarlo di 13 sec al giorno?
Title: Re: swRTC
Post by: draio on Feb 13, 2012, 12:06 pm
Title: Re: swRTC
Post by: testato on Feb 13, 2012, 08:14 pm

Il deltaT indica di quanti secondi al giorno si vuole correggere l'orologio

e' sempre stato cosi' ?
Title: Re: swRTC
Post by: pablos71 on Feb 13, 2012, 09:35 pm
Bho non capisco, scrivo solo per Vs. conoscenza dei test

ho collegato un display 16x2 con solo il programma per visualizzare data e ora senza seriale per 3 giorni senza toccarlo impostato e confrontato con http://www.inrim.it/ntp/webclock_i.shtml

in questi 3 giorni arduino va avanti di 50 secondi circa ( 16.6 a gg)

questa mattina alle 9 reimposto deltaT a -13.0 sec salvo lo sketch 4 secondi prima per avere una sincronizzazione +/- precisa col server ntp.
in 12H è indietro di 5 secondi , quindi in 3 giorni resterò indietro di 30 sec, qui deduco che se lo avessi messo a -16.6 sarei arrivato a indietro di 50 sec

Come funziona questo delta???

ciao
Title: Re: swRTC
Post by: lestofante on Feb 13, 2012, 10:02 pm
tu dai per scontato che l'errore del timer sia sempre costante, cosa che non è assolutamente vera, l'errore varia in base alla temperatura, e qualche altro fattore.

poi se hai un'arduino uno che al posto del quarzo ha l'oscillatore....
Title: Re: swRTC
Post by: leo72 on Feb 13, 2012, 10:13 pm
@lesto:
quoto

@testato:
forse una vecchia versione era leggermente differente, dovrei riguardare meglio negli archivi.
Title: Re: swRTC
Post by: pablos71 on Feb 13, 2012, 10:54 pm
Quote
dai per scontato che l'errore del timer sia sempre costante, cosa che non è assolutamente vera, l'errore varia in base alla temperatura, e qualche altro fattore.


Non metto in dubbio che la temperatura possa influenzare il clock, ma arduino non si trova ne in Antartide ne all'equatore :) il processo è costante, alimentazione costante, temperatura ambiente costante, sul chip ho 54° costanti, c'e' solo un programma che fa solo questo n volte al secondo. Secondo questa teoria allora domani può essere che acceleri di 5 secondi..... vediamo :)

ciao
Title: Re: swRTC
Post by: lestofante on Feb 13, 2012, 11:30 pm

il processo è costante, alimentazione costante, temperatura ambiente costante, sul chip ho 54° costanti, c'e' solo un programma che fa solo questo n volte al secondo.


secondo i rozzi sensi di un flebile umano hai ragione  :smiley-mr-green:

Quote
Secondo questa teoria allora domani può essere che acceleri di 5 secondi..... vediamo :)


come potrebbe essere che per una settimana non perda neanche un secondo... credo che a questi livelli si scenda nella quantistica  :D
Title: Re: swRTC
Post by: pablos71 on Feb 14, 2012, 10:40 am
A chi interessasse e possiede una etherne shield ho prelevato e modificato lo sketch UDP client, cercato un server NTP e usando la libreria di Leo72 l'orologio si sincronizza in pochi secondi al server http://www.inrim.it/ntp/webclock_i.shtml
Al momento non aggiorna la data, ci studierò, ma non credo mi sarà tanto facile
IDE 0022-0023

Code: [Select]

#include <SPI.h>        
#include <Ethernet.h>
#include <Udp.h>
#include <LiquidCrystal.h> // 16x2
#include <swRTC.h>
swRTC rtc;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

unsigned long previousMillis_a = 0;    //contatore millisecondi per display
unsigned long previousMillis_b = 0;    //contatore millisecondi per led (facoltativo)
long interval_a = 1000;
long interval_b = 500;
int led = 40; // pin led secondi
int ledState = LOW;

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192,168,2,177 };

UdpClass Udp;

unsigned int localPort = 8888;      // local port to listen for UDP packets
byte timeServer[] = {193,204,114,232}; // time NTP server
const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

int hh=0; int mm=0; int ss=0;

void setup()
{
   pinMode(led, OUTPUT);  
 Ethernet.begin(mac,ip);
 Udp.begin(localPort);
// Serial.begin(9600);

 sendNTPpacket(timeServer); // send an NTP packet to a time server

   // wait to see if a reply is available
 delay(500);  //se fallisce provare con 1000 - 2000
 if ( Udp.available() )
 {  
   Udp.readPacket(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer

   unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
   unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);  
   unsigned long secsSince1900 = highWord << 16 | lowWord;  
   const unsigned long seventyYears = 2208988800UL;    
   unsigned long epoch = secsSince1900 - seventyYears;  
                               
   hh=((epoch  % 86400L) / 3600)+1;
   mm=(epoch  % 3600) / 60;
   ss=epoch %60;
 }
 else
 {
   lcd.begin(0, 2);
   lcd.print("Connect FAILED!");
   delay (10000); //in caso di fallimento l'orologio parte da 00:00:00
   }
   
   rtc.stopRTC(); //stop the RTC
   rtc.setTime(hh,mm,ss);
   rtc.setDate(1,1,2000); //set the date here
   rtc.startRTC(); //start the RTC
   rtc.setDeltaT(-6.0); //correzione del ritardo o anticipo dell'ora (facoltativo)
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(byte *address)
{
 memset(packetBuffer, 0, NTP_PACKET_SIZE);
 packetBuffer[0] = 0b11100011;   // LI, Version, Mode
 packetBuffer[1] = 0;     // Stratum, or type of clock
 packetBuffer[2] = 6;     // Polling Interval
 packetBuffer[3] = 0xEC;  // Peer Clock Precision
 // 8 bytes of zero for Root Delay & Root Dispersion
 packetBuffer[12]  = 49;
 packetBuffer[13]  = 0x4E;
 packetBuffer[14]  = 49;
 packetBuffer[15]  = 52;
 
 Udp.sendPacket( packetBuffer,NTP_PACKET_SIZE,  address, 123); //NTP requests are to port 123
}

void loop()
{  
 unsigned long currentMillis_a = millis();
 if(currentMillis_a - previousMillis_a > interval_a)
 {
      previousMillis_a = currentMillis_a;  
     
       lcd.begin(16, 2);
       lcd.print("Data: ");
       lcd.print(rtc.getDay(), DEC);
       lcd.print("/");
       lcd.print(rtc.getMonth(), DEC);
       lcd.print("/");
       lcd.print(rtc.getYear(), DEC);
     
       lcd.setCursor(0, 1);
       lcd.print("Ora: ");
       lcd.print(rtc.getHours(), DEC);
       lcd.print(":");
       lcd.print(rtc.getMinutes(), DEC);
       lcd.print(":");
       lcd.print(rtc.getSeconds(), DEC);
 }
 
      unsigned long currentMillis_b = millis();
      if(currentMillis_b - previousMillis_b > interval_b)
    {  
      previousMillis_b = currentMillis_b;    
       if (ledState == LOW)
       ledState = HIGH;
       else
       ledState = LOW;
       digitalWrite(led, ledState);
    }  
}

Title: Re: swRTC
Post by: leo72 on Feb 14, 2012, 10:47 am

Al momento non aggiorna la data, ci studierò, ma non credo mi sarà tanto facile

Perché non aggiorna la data?
Non conosci il protocollo di invio delle informazioni?
Title: Re: swRTC
Post by: pablos71 on Feb 14, 2012, 10:50 am
perchè devo ricavare la data da epoch tenendo conto dei bisestili e altri parametri un po' incasinato, quello che poi effettivamente conta è avere un orario aggiornato e preciso la data mettendola a mano poi ci pensa la tua libreria :)

ciao
Title: Re: swRTC
Post by: leo72 on Feb 14, 2012, 10:52 am
Ma quel server fornisce l'ora/data con un timestamp oppure quell'epoch MJD che c'è in homepage?
Title: Re: swRTC
Post by: pablos71 on Feb 14, 2012, 10:56 am
'epoch MJD che c'è in homepage, mi fornisce quei 2 valori
Title: Re: swRTC
Post by: pablos71 on Feb 14, 2012, 10:57 am
nello sketch sarebbero highWord  e lowWord

   unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
   unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);  
   unsigned long secsSince1900 = highWord << 16 | lowWord;  
   const unsigned long seventyYears = 2208988800UL;    
   unsigned long epoch = secsSince1900 - seventyYears;  
Title: Re: swRTC
Post by: PaoloP on Feb 14, 2012, 11:10 am
@Pablos,
setClockWithTimestamp e sincronizzi la libreria con i server NTP.  :smiley-mr-green:

Ho scassato le @@ per settimane per implementarla!  XD

Paolo.

p.s. per i server NTP si può usare anche: it.pool.ntp.org (però bisogna abilitare il DNS su Arduino)

p.s.s. questo è il mio sketch compilato con la IDE 1.0:
Code: [Select]
#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <swRTC.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {  
 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };

unsigned int localPort = 8888;      // local port to listen for UDP packets

IPAddress timeServer(192, 43, 244, 18); // time.nist.gov NTP server 192, 43, 244, 18

const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

long interval = 3600000;    // interval to control NTP Server
unsigned long previousMillis = 0;        // will store last time LED was updated

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
swRTC rtc;

void setup()
{
 delay(2000);
 unsigned long ts = 0;
 Serial.begin(9600);
 Serial.print("Serial Start! at ");
 Serial.print(millis());
 Serial.println(" microsecond.");
 AvviaEthernet();
 Serial.println("Ethernet started.");

 while (ts==0)
 {
   Serial.println("Check Server NTP...");
   ts=GetNTPtime();
   if (ts==0) {
     Serial.println("Wait 5 seconds...");
     delay(5000);
   }  
 }
 rtc.stopRTC();
 rtc.setClockWithTimestamp(ts, 1970);
 rtc.startRTC();  
 Serial.println("swRTC synchronized.");
}

void loop()
{
 int deltaT = 0;
 unsigned long currentMillis = millis();
//  stampa();
//  delay(1000);
 if(currentMillis - previousMillis > interval) {
   // save the last time you blinked the LED
   previousMillis = currentMillis;  
   // Controlla il server NTP
   deltaT = GetNTPtime() - rtc.getTimestamp();
   Serial.print("DeltaT : ");
   Serial.println(deltaT);
 }
 // else{
 //   Serial.println("Millis: ");
 //   Serial.println(currentMillis);
 //   Serial.println(previousMillis);
 //   Serial.println(interval);
 //   Serial.println(" ");  
 // }

}

void AvviaEthernet()
{
 // start Ethernet and UDP
 if (Ethernet.begin(mac) == 0) {
   Serial.println("Failed to configure Ethernet using DHCP.");
   // no point in carrying on, so do nothing forevermore:
   for(;;)
     ;
 }
 else
 {
   Serial.println("Ethernet configured using DHCP.");
   Serial.print("Local IP: ");
   Serial.println(Ethernet.localIP());
   Serial.print("SubnetMask: ");
   Serial.println(Ethernet.subnetMask());
   Serial.print("Gateway: ");
   Serial.println(Ethernet.gatewayIP());
   Serial.print("DNS Server: ");
   Serial.println(Ethernet.dnsServerIP());
 }
 Udp.begin(localPort);
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
 // set all bytes in the buffer to 0
 memset(packetBuffer, 0, NTP_PACKET_SIZE);
 // Initialize values needed to form NTP request
 // (see URL above for details on the packets)
 packetBuffer[0] = 0b11100011;   // LI, Version, Mode
 packetBuffer[1] = 0;     // Stratum, or type of clock
 packetBuffer[2] = 6;     // Polling Interval
 packetBuffer[3] = 0xEC;  // Peer Clock Precision
 // 8 bytes of zero for Root Delay & Root Dispersion
 packetBuffer[12]  = 49;
 packetBuffer[13]  = 0x4E;
 packetBuffer[14]  = 49;
 packetBuffer[15]  = 52;

 // all NTP fields have been given values, now
 // you can send a packet requesting a timestamp:  
 Udp.beginPacket(address, 123); //NTP requests are to port 123
 Udp.write(packetBuffer,NTP_PACKET_SIZE);
 Udp.endPacket();
}

unsigned long GetNTPtime(){
 sendNTPpacket(timeServer); // send an NTP packet to a time server
 // wait to see if a reply is available
 delay(1000);  
 if ( Udp.parsePacket() ) {  
   // We've received a packet, read the data from it
   Udp.read(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer
   //the timestamp starts at byte 40 of the received packet and is four bytes,
   // or two words, long. First, esxtract the two words:
   unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
   unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);  
   // combine the four bytes (two words) into a long integer
   // this is NTP time (seconds since Jan 1 1900):
   unsigned long secsSince1900 = highWord << 16 | lowWord;  
   Serial.print("Seconds since Jan 1 1900 = " );
   Serial.println(secsSince1900);              
   // now convert NTP time into everyday time:
   Serial.print("Unix time = ");
   // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
   const unsigned long seventyYears = 2208988800UL;    
   // subtract seventy years:
   unsigned long epoch = secsSince1900 - seventyYears;  
   // print Unix time:
   Serial.println(epoch);                              
   // print the hour, minute and second:
   Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
   Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
   Serial.print(':');  
   if ( ((epoch % 3600) / 60) < 10 ) {
     // In the first 10 minutes of each hour, we'll want a leading '0'
     Serial.print('0');
   }
   Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
   Serial.print(':');
   if ( (epoch % 60) < 10 ) {
     // In the first 10 seconds of each minute, we'll want a leading '0'
     Serial.print('0');
   }
   Serial.println(epoch %60); // print the second
   return epoch;
 }
 else {
   Serial.println("NTP Server unavailable.");
   return 0;
 }
}

void stampa() {
 Serial.print(rtc.getHours(), DEC);
 Serial.print(":");
 Serial.print(rtc.getMinutes(), DEC);
 Serial.print(":");
 Serial.print(rtc.getSeconds(), DEC);
 Serial.print("  ");
 Serial.print(rtc.getDay(), DEC);
 Serial.print("/");
 Serial.print(rtc.getMonth(), DEC);
 Serial.print("/");
 Serial.println(rtc.getYear(), DEC);
 Serial.println(rtc.getTimestamp(), DEC);
}

Title: Re: swRTC
Post by: leo72 on Feb 14, 2012, 11:18 am
Credo che il server che sta usando restituisca un epoch in giorni giuliani a partire dal 1870, non è un timestamp, che sono il numeri di secondo da una certa data.
Title: Re: swRTC
Post by: PaoloP on Feb 14, 2012, 11:24 am

Credo che il server che sta usando restituisca un epoch in giorni giuliani a partire dal 1870, non è un timestamp, che sono il numeri di secondo da una certa data.


Ok...
a quando la funzione SetClockFromJulianDate(uint epoch) ?  ]:D
Title: Re: swRTC
Post by: pablos71 on Feb 14, 2012, 11:25 am
Grazie :) lo provo subito
ciao
Title: Re: swRTC
Post by: pablos71 on Feb 14, 2012, 12:00 pm
@ Paolo P
scusa ma anche tu hai il mio stesso identico risultato, nemmeno tu aggiorni la data dal pacchetto che ricevi :)

Serial Start! at 1999 microsecond.
Ethernet configured using DHCP.
Local IP: 192.168.2.100
SubnetMask: 255.255.255.0
Gateway: 192.168.2.1
DNS Server: 192.168.2.1
Ethernet started.
Check Server NTP...
Seconds since Jan 1 1900 = 3538205921
Unix time = 1329217121
The UTC time is 10:58:41
swRTC synchronized.
Title: Re: swRTC
Post by: PaoloP on Feb 14, 2012, 12:06 pm
Si che si aggiorna e che non te lo dice ;-)
togli il // dalla funzione stampa(); all'inizio del loop()
Title: Re: swRTC
Post by: pablos71 on Feb 14, 2012, 12:17 pm
ahhhhhhhh ora ho capito cosa volevi dire prima con
Quote
setClockWithTimestamp e sincronizzi la libreria con i server NTP.  smiley-mr-green


con questa riga
  rtc.setClockWithTimestamp(ts, 1970);
sincronizzi la libreria  swRTC.h, ora mi è tutto chiaro

grazie mille
Title: Re: swRTC
Post by: pablos71 on Feb 14, 2012, 11:20 pm
Fatto !!! va che è un orologio svizzero :) data e ora

Sketch semplificato e ripulito. Si aggiorna allo start di arduino la prima volta, poi ogni 24h
per il mio arduino ho notato che un delta di -6.0 mi sballa di 1 sec circa in un giorno più che accettabile, poi il parametro sarà personalizzato.
In caso di connessione fallita continua a lavorare sull'orario precedente e ritenterà dopo altre 24h.
Si possono aggiungere altre opzioni come ad esempio in caso di fallimento tentare altri server ntp magari con una lista, creare un numero di tentativi prima di rinunciare ecc, ma così per me è soddisfacente.
Grazie a Leo e Paolo P. per i suggerimenti, anche a Lesto per la possibilità di applicare la quantistica :)

ps ide 0023 e solo display 16x2 retroilluminato
Code: [Select]
#include <SPI.h>        
#include <Ethernet.h>
#include <Udp.h>
#include <LiquidCrystal.h> // display 16x2
#include <swRTC.h>
swRTC rtc;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // pin display
unsigned long previousMillis_a = 0;    //contatore millisecondi display
unsigned long previousMillis_b = 0;    //contatore millisecondi led
unsigned long previousMillis_c = 0;    //contatore millisecondi aggiornamento a NTP
long interval_a = 1000; // aggiornamento LCD
long interval_b = 500; // led dei secondi
long interval_c = 86400000; // aggiorna ogni ogni 24h
//long interval_c = 10000; // test ogni 10 sec
int led = 40; // pin led secondi
int ledState = LOW;
unsigned long epoch;
unsigned long highWord;
unsigned long lowWord;
unsigned long secsSince1900;
const unsigned long seventyYears = 2208988800UL;
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192,168,2,177 };

UdpClass Udp;
unsigned int localPort = 8888;      // local port to listen for UDP packets
byte timeServer[] = {193,204,114,232}; // time NTP server
//byte timeServer[] = {192,43,244,18}; // time.nist.gov NTP (altro server)
const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

void setup()
{
 pinMode(led, OUTPUT);
 Ethernet.begin(mac,ip);
 Udp.begin(localPort);
 rtc.setClockWithTimestamp(0, 1970);
 aggiorna();  
}

void loop()
{  
 unsigned long currentMillis_a = millis();
 if(currentMillis_a - previousMillis_a > interval_a)
 {
       previousMillis_a = currentMillis_a;  
       lcd.begin(16, 2);
       lcd.print("Data: ");
       lcd.print(rtc.getDay(), DEC);
       lcd.print("/");
       lcd.print(rtc.getMonth(), DEC);
       lcd.print("/");
       lcd.print(rtc.getYear(), DEC);
     
       lcd.setCursor(0, 1);
       lcd.print("Ora: ");
       lcd.print(rtc.getHours(), DEC);
       lcd.print(":");
       lcd.print(rtc.getMinutes(), DEC);
       lcd.print(":");
       lcd.print(rtc.getSeconds(), DEC);
 }
 
      unsigned long currentMillis_b = millis();
      if(currentMillis_b - previousMillis_b > interval_b)
     {  
       previousMillis_b = currentMillis_b;    
       if (ledState == LOW)
       ledState = HIGH;
       else
       ledState = LOW;
       digitalWrite(led, ledState);
     }  
 
     unsigned long currentMillis_c = millis();
     if(currentMillis_c - previousMillis_c > interval_c)
     {  
       previousMillis_c = currentMillis_c;    
       aggiorna();
     }          
}

void aggiorna()
{    
 sendNTPpacket(timeServer); // send an NTP packet to a time server
 // wait to see if a reply is available
   lcd.begin(0, 2);
   lcd.print("Aggiornamento....");
   delay(500);   //se fallisce provare con 1000 - 2000
 if ( Udp.available() )
 {  
   Udp.readPacket(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer
   highWord = word(packetBuffer[40], packetBuffer[41]);
   lowWord =  word(packetBuffer[42], packetBuffer[43]);  
   secsSince1900 = highWord << 16 | lowWord;  
   epoch = secsSince1900 - seventyYears;    
 }
 else
 {
   lcd.begin(0, 2);
   lcd.print("Connect FAILED!");
   rtc.setClockWithTimestamp(epoch+3601, 1970);
   delay (6000);
 }
   rtc.startRTC(); //start the RTC
   rtc.setClockWithTimestamp(epoch+3601, 1970); // +3600 aggiungo 1 ora , +1 aggiungo 1 secondo di ritardo connessione aggiornamento
   rtc.setDeltaT(-6.0); //ritardo o anticipo .... facoltativo
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(byte *address)
{
 memset(packetBuffer, 0, NTP_PACKET_SIZE);
 packetBuffer[0] = 0b11100011;   // LI, Version, Mode
 packetBuffer[1] = 0;     // Stratum, or type of clock
 packetBuffer[2] = 6;     // Polling Interval
 packetBuffer[3] = 0xEC;  // Peer Clock Precision
 packetBuffer[12]  = 49;
 packetBuffer[13]  = 0x4E;
 packetBuffer[14]  = 49;
 packetBuffer[15]  = 52;  
 Udp.sendPacket( packetBuffer,NTP_PACKET_SIZE, address, 123); //NTP requests are to port 123  
}


Title: Re: swRTC
Post by: pigatchu on Feb 18, 2012, 01:51 pm
Considerazione:

Se ad un certo punto viene a mancare l'alimentazione (anche solo per qualce secondo)
tutto il lavoro andra perso perchè al suo ritorno arduino riparte dall'orario
impostato originariamente nel setup... (che magari risale a qualche settimana prima)

Domanda 1: è possibile durante l'esecuzione dello sketch modificare (tipo ogni secondo o minuto)
data e ora impostati nel void setup così da far ripartire arduino dall'ultima "memorizzazione"
"perdendo" così solo il tempo trascorso senza alimentazione ??

Domanda 2: è possibile prevenire questo utilizzando una seconda alimentazione (magari a batteria)
che intervenga solo quando viene a mancare l'alimentazione dal jack ??
io ho provato a farlo utilizzando il pin vin ma credo che non sia corretto
perchè quando arduino e collegato tramite jack manda al vin la stessa tensione
fornita dal jack creando così un cortocircuito sulla batteria...


Ciao & Grazie...

Title: Re: swRTC
Post by: leo72 on Feb 18, 2012, 04:58 pm

Considerazione:

Se ad un certo punto viene a mancare l'alimentazione (anche solo per qualce secondo)
tutto il lavoro andra perso perchè al suo ritorno arduino riparte dall'orario
impostato originariamente nel setup... (che magari risale a qualche settimana prima)

Si presuppone che, essendo un orologio, tu abbia previsto una qualche forma di alimentazione di backup. D'altronde, anche un RTC classico come i DS1307 o i PCF8563 necessitano di una batteria esterna se vuoi che mantengano l'orario anche in assenza di alimentazione principale.

Quote

Domanda 1: è possibile durante l'esecuzione dello sketch modificare (tipo ogni secondo o minuto)
data e ora impostati nel void setup così da far ripartire arduino dall'ultima "memorizzazione"
"perdendo" così solo il tempo trascorso senza alimentazione ??

Potresti in teoria tenere traccia dell'ora nella EEPROM interna ma ricordati che la EEPROM si deteriora dopo 100.000 scritture.
Il modo più semplice è quello spiegato all'inizio.

Quote

Domanda 2: è possibile prevenire questo utilizzando una seconda alimentazione (magari a batteria)
che intervenga solo quando viene a mancare l'alimentazione dal jack ??
io ho provato a farlo utilizzando il pin vin ma credo che non sia corretto
perchè quando arduino e collegato tramite jack manda al vin la stessa tensione
fornita dal jack creando così un cortocircuito sulla batteria...

Il Vin è un pin particolare perché è bidirezionale: porta fuori l'alimentazione proveniente dal jack oppure può servire per alimentare l'Arduino se non c'è alimentazione sul jack. Dovresti prevedere un piccolo circuitino per poter attivare l'alimentazione da Vin in caso manchi quella sul jack. Oppure, meglio ancora e più pulito, il circuito lo fai direttamente a monte del jack.
Title: Re: swRTC
Post by: testato on Feb 18, 2012, 10:16 pm
se e' un progetto connesso alla rete non serve prevedere nessun backup, basta che ad ogni accensione si aggiorni l'orario via rete
su un progetto senza la rete devi pensare a qualcosa di ricaricabile, perche' arduino consuma molto,
e cmq se lamancanza della tensione e' lunga, portando allo scaricamento la batteria, si dovra' per forza risettare a mano.
Come ha detto Leo queste sono problematiche comuni anche sugli RTC hardware, l'unica differenza e' che un rtc hd consuma pochissimo e quindi un backup lo si fa con la classica pila bottone, mentre arduino consuma molto e quindi si deve prevedere una batteria di grandi dimensioni
Title: Re: swRTC
Post by: leo72 on Feb 18, 2012, 10:38 pm
2 pensieri in libertà:

1) grazie al cielo, i blackout come quello del 2003 sono eventi eccezionali, equiparabili alla caduta dal balcone del proprio circuitino  :smiley-yell:, quindi quando si è prevista un'alimentazione di qualche ora, siamo più che al riparo da questo genere di eventi
2) se si usa un Atmega su un circuito, la questione dell'alimentazione si riduce, perché il solo chip consuma molto meno di tutta la scheda Arduino o del proprio circuito: basta infatti provvedere l'alimentazione per il micro, non per tutta la scheda.
Title: Re: swRTC
Post by: testato on Feb 18, 2012, 10:42 pm
yes
certo che se si trovasse un modo alchemico per poter mettere in modalita' risparmio il micro senza intaccare la swRTC, si sostituirebbero veramente del tutt gli RTC, e Leo diventerebbe famoso :)
Title: Re: swRTC
Post by: leo72 on Feb 18, 2012, 10:57 pm
Ho provato e fatto dei test, tempo addietro, perché sulla carta l'uso del timer 2 permette di mettere in sleep il micro. Quindi avevo combinato lo sleep alla gestione temporale:

1) messa in sleep del micro
2) uscita dallo sleep per overflow del timer 2
3) aggiornamento temporale dell'RTC
4) rimessa in sleep del micro

Il problema però è che la procedura per uscire dallo sleep richiede del tempo: questo tempo di per sé non è molto, ma il problema è che si somma ed alla fine arriva ad incidere in maniera molto significativa sulla libreria.
Considera che abbiamo 1000 overflow al secondo, ed ogni volta devi rifare tutta la trafila su indicata.

A suo tempo non misurai fisicamente il ritardo ma ti posso garantire che era ben visibile anche ad occhio nudo con il semplice test del blink del led dell'esempio allegato alla libreria.
Title: Re: swRTC
Post by: testato on Feb 27, 2012, 09:19 pm
Leo
sul numero di questo mese di Firmware hanno pubblicato un swRTC con un pic
e' visibile anche online qui, chissa' se l'autore conosce il tuo lavoro  :)
http://www.nxtbook.fr/newpress/inwaredizioni/Firmware-2012-02_73/index.php?ap=1#/44/OnePage
Title: Re: swRTC
Post by: leo72 on Feb 28, 2012, 06:08 pm
Io non riesco a leggerlo...  :smiley-roll-sweat:
Title: Re: swRTC
Post by: testato on Feb 28, 2012, 06:47 pm
oggi nemmeno a me, avranno problemi sul server.
cmq se ci fai caso c'e' un menu' nascosto, appare quando metti il mouse in alto, proprio ad inizio pagina. si apre un bottone SOLO TESTO.
A me in questo modo fa leggere l'articolo, tanto di immagini non c'era niente di importante
Title: Re: swRTC
Post by: menniti on Feb 28, 2012, 09:32 pm

oggi nemmeno a me, avranno problemi sul server.
cmq se ci fai caso c'e' un menu' nascosto, appare quando metti il mouse in alto, proprio ad inizio pagina. si apre un bottone SOLO TESTO.
A me in questo modo fa leggere l'articolo, tanto di immagini non c'era niente di importante

Fino a pagina 31-32 fa vedere tutto, testo, immagini e perfino la pubblicità  :smiley-yell:
Title: Re: swRTC
Post by: testato on Feb 28, 2012, 09:58 pm
ho riprovato, ed a me non fa vedere nessuna pagina,
cmq questo link e' solo a scopo promozionale, probabilmente memorizzano l'indirizzo ip e poi non fanno piu' vedere dopo tot pagine.
pero' leo non essendoci mai entrato dovrebbe riuscirci.
Riconfermo cmq che a livello testuale e' ancora tutto accessibile per me
Title: Re: swRTC
Post by: leo72 on Feb 28, 2012, 10:07 pm
Io non ho visto nulla neanche la prima volta.
Title: Re: swRTC
Post by: leo72 on Feb 28, 2012, 10:18 pm

ma sopratutto quella rivista non era fallita ? da me' da 1 anno che non si vede piu' nelle edicole nel raggio di 50Km da dove abito

E' solo digitale, ormai.
Title: Re: swRTC
Post by: DanielaES on Mar 02, 2012, 02:21 pm
Leo, tu che sei esperto di orologi software, hai mica una formula pronta e testata per il passaggio dall'ora legale a quella solare e viceversa?
Valore di partenza ricevuto da un server NTP: unix time.
Al quale aggiungo un 3600 s per UTC(IT).
Adesso cercavo qualcosa del tipo:
If ( Blabla ) { aggiungi altri 3600s }.
Suggerimenti?
Title: Re: swRTC
Post by: PaoloP on Mar 02, 2012, 02:33 pm
Nella libreria indicata nel mio post: http://arduino.cc/forum/index.php/topic,94104.msg710718.html#msg710718
C'è già la funzione ora legale.
Si tratta di estrarla e implementarla nella libreria standard o come funzione a se.

Code: [Select]
// check if current time is european summer time
uint8_t DS1307new::isMEZSummerTime(void)
{
  uint32_t current_time, summer_start, winter_start;
  current_time = time2000;
 
  // calculate start of summer time
  fillByYMD(year, 3, 30);
  fillByHMS(2,0,0);
  fillByCDN(RTC.cdn - RTC.dow); // sunday before
  summer_start = time2000;
 
  // calculate start of winter
  fillByYMD(year, 10, 31);
  fillByHMS(3,0,0);
  fillByCDN(RTC.cdn - RTC.dow); // sunday before
  winter_start = time2000;
 
  // restore time
  fillByTime2000(current_time);
 
  // return result
  if ( summer_start <= current_time && current_time < winter_start )
    return 1;
  return 0; 
}


Praticamente è tutto nell'ultimo if.
Se la data corrente e dopo l'ultima domenica di marzo alle 2.00 e prima dell'ultima domenica di ottobre alle 3.00 allora c'è l'ora legale.
Title: Re: swRTC
Post by: leo72 on Mar 02, 2012, 02:48 pm
Avevo fatto una versione con l'ora legale per Testato, mi pareva di averla pubblicata qualche pagina addietro.
Era beta ma doveva funzionare, per lo meno per le prove che avevo fatto io.
Title: Re: swRTC
Post by: leo72 on Mar 02, 2012, 02:51 pm
Ecco, ho ritrovato il post dove la trovate allegata:
http://arduino.cc/forum/index.php/topic,73496.msg614955.html#msg614955
Title: Re: swRTC
Post by: DanielaES on Mar 02, 2012, 03:52 pm
Sono in giro quindi non ho ancora avuto modo di vedere il codice di Leo.
Mentre il codice postato da Paolo è quantomeno criptico...
Come calcola la domenica del mese lo sa solo lui :p
Stasera mi guardo bene i listati di entrambe le librerie ma possibile che non esista una formula standar gia fatta, senza doverla estrarre da qualche parte o scriversela da soli?
Non è tanto questione di complessità quanto di testing.
Se qualcosa non va me ne accorgo solo tra mesi quando è gia tutto inscatolato :)
Title: Re: swRTC
Post by: testato on Mar 03, 2012, 10:49 am
Ma non esistono server NTP che forniscono l'ora legale ?
sarebbe un bel servizio da dare, si potrebbe creare un server dove l'utente si sceglie il suo paese, tipo Italia, e fornisse una stringa da usare nel micro che includesse gia' la correzione per l'ora legale italia
Title: Re: swRTC
Post by: astrobeed on Mar 03, 2012, 11:06 am

Ma non esistono server NTP che forniscono l'ora legale ?


Per quanto ne so io i server NTP forniscono esclusivamente l'orario UTC, per ovvi motivi di internazionalità, poi è a cura dell'utilizzatore finale aggiungere l'offset per la sua zona temporale e l'eventuale daylight.
Title: Re: swRTC
Post by: leo72 on Mar 03, 2012, 11:07 am
Boh, io ho trovato questo:
http://www.inrim.it/ntp/howtosync_i.shtml

Pare che fornisca l'orario in formato legale italiano, danno un software di sincronizzazione: magari osservando il sorgente si può vedere il protocollo usato e provare ad implementarlo.
Title: Re: swRTC
Post by: DanielaES on Mar 03, 2012, 11:24 am
Io uso il server del inrim, configurando il pacchetto npt come nell'esempio dell'ide ricevo ovviamente il tempo ntp.
Non vedo altri parametri da settare per richiedere l'ora legale od il fuso italiano :\
Cmq ho risolto cambiando libreria ed usando quella suggerita da paolo, il cambio è stato abbastanza indolore.

Code: [Select]
  Serial.print("Seconds since Jan 1 1900 NTP = " );
    Serial.println(mydata.secsSince1900ES); // seconds since 1900
    // now convert NTP time into everyday time:
    Serial.print("Unix time NTP = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;     
    // subtract seventy years:
    unsigned long epochUnix = mydata.secsSince1900ES - seventyYears; 
    // print Unix time:
    Serial.println(epochUnix); 
    // Trasformo il tempo unix in secondi dal 2000.
    epochUnix -= SECONDS_FROM_1970_TO_2000;
    // Aggiungo il fusorario (Italy +1h - 3600s) per passare dal tempo UTC al tempo TMEC
    epochUnix += fusoorario;
    // Compenso eventuali lag nella sincronizzazione
    epochUnix += erroreSyncNTP;
    // Adjust daylight saving time ( ora legale europea )
    RTC.getTime();
    if ( RTC.isMEZSummerTime() != 0 ) { // se siamo nel periodo dell'ora legale europea
      // tra l'ultima domenica di marzo e l'ultima domenica di ottobre
      epochUnix += 3600; // aggiungo un ora
      Serial.println(F("Ora Legale in vigore. Aggiunta un ora."));
    }
    else {
      Serial.println(F("Ora Legale non in vigore."));
    }

    if (millis() > contatoreSyncNTP) { // se è avvenuto un reset o se sono passate 24 ore
      contatoreSyncNTP = millis() + (intervalloSyncNTP*3600000); // aggiorno il contatore aggiungendo 24 ore
      // (moltiplico intervalloSyncNTP * il numero di millisecondi in un ora 3600000)     
      // avvio la sincronizzazione NTP
      srlcd.clear();
      srlcd.setCursor(0, 0);
      srlcd.print(F("Sincronizzazione NTP"));
      srlcd.setCursor(0, 1);
      ShowTimeLCD();
      ShowTimeSERIAL();
      // sincronizza RTC con NTP
      RTC.fillByTime2000(epochUnix);
      RTC.setTime();
      RTC.startClock();
      flagSyncNTP = 1; // flag di avvenuta sincronizzazione NTP
      Serial.println(F("RTC adjusted"));
      Serial.print(F("FlagSyncNTP:"));
      Serial.println(flagSyncNTP);
      srlcd.setCursor(0, 2);
      srlcd.print(F("----RTC adjusted----"));
      srlcd.setCursor(0, 3);
      ShowTimeLCD();
      ShowTimeSERIAL();
      delay (4000);
    }


Per ora sembra andare :) Anche se ci sono cose in quella libreria che francamente non capisco...
Title: Re: swRTC
Post by: astrobeed on Mar 03, 2012, 11:30 am

Io uso il server del inrim, configurando il pacchetto npt come nell'esempio dell'ide ricevo ovviamente il tempo ntp.
Non vedo altri parametri da settare per richiedere l'ora legale od il fuso italiano :\
Cmq ho risolto cambiando libreria ed usando quella suggerita da paolo, il cambio è stato abbastanza indolore.


Infatti il server ti fornisce l'ora UTC, non esistono parametri di configurazione per il server, poi è il tuo sistema che deve adattarla per la località reale.
Comunque non capisco quale problema trovi per l'ora legale, devi solo controllare la data ogni volta che cambia (alle 02:00 per l'entrata in vigore e alle 03:00 per la rimozione) e se è all'interno dell'intervallo dell'ora legale sommi 3600 secondi all'orario in caso contrario mantieni l'orario normale (UTC+3600).
Title: Re: swRTC
Post by: DanielaES on Mar 03, 2012, 11:50 am

Comunque non capisco quale problema trovi per l'ora legale, devi solo controllare la data ogni volta che cambia (alle 02:00 per l'entrata in vigore e alle 03:00 per la rimozione)


Il problema è che:
la nuova regola stabilisce infatti che tale ora abbia inizio l'ultima domenica di marzo e termini l'ultima domenica di ottobre per allinearsi a quanto veniva già fatto in Gran Bretagna.
La libreria precedente non implementava i giorni della settimana, e fare una formula che calcoli l'ultima domenica di marzo / l'ultima domenica di ottobre non è semplice. Almeno per me!
Se hai la formula condividila :D

Quote

e se è all'interno dell'intervallo dell'ora legale sommi 3600 secondi all'orario in caso contrario mantieni l'orario normale (UTC+3600).


Questo è esattamente quello che faccio ora:
Code: [Select]
if ( RTC.isMEZSummerTime() != 0 ) { // se siamo nel periodo dell'ora legale europea
      // tra l'ultima domenica di marzo e l'ultima domenica di ottobre
      epochUnix += 3600; // aggiungo un ora
      Serial.println(F("Ora Legale in vigore. Aggiunta un ora."));
    }


Ovviamente sfrutto la funzione integrata della lib:

Quote
isMEZSummerTime
    Description:
        Check for european daylight saving time (summer time): This procedure will return 1 if the date and time, stored in the object, is between 2:00 of the last Sunday of March and 3:00 of the last Sunday of October. Otherwise this procedure will return 0. Execution time is about 0.9ms on a 16 MHz ATMEGA.




Title: Re: swRTC
Post by: astrobeed on Mar 03, 2012, 12:12 pm

La libreria precedente non implementava i giorni della settimana, e fare una formula che calcoli l'ultima domenica di marzo / l'ultima domenica di ottobre non è semplice. Almeno per me!
Se hai la formula condividila :D


Come fare dipende da che dati possiedi che a loro volta dipendono dalla libreria che usi, comunque puoi risolvere facilmente il problema tabellando in memoria (flash) le date esatte per l'ora legale dei prossimi anni, una decina dovrebbero bastarti, in questo modo non devi fare nessun calcolo "strano".

Title: Re: swRTC
Post by: testato on Mar 03, 2012, 12:21 pm

Boh, io ho trovato questo:
http://www.inrim.it/ntp/howtosync_i.shtml
Pare che fornisca l'orario in formato legale italiano, danno un software di sincronizzazione: magari osservando il sorgente si può vedere il protocollo usato e provare ad implementarlo.

ho seguito la procedura, per win7, si tratta solo di usare  ntp.inrim.it come server

e' quindi gia' inclusa l'ora legale ?
Title: Re: swRTC
Post by: astrobeed on Mar 03, 2012, 12:25 pm

e' quindi gia' inclusa l'ora legale ?


No, semplicemente ti configura il relativo servizio per usare quel server con tutte le relative configurazioni, del servizio, per convertire l'orario UTC in quello Italiano con relativo cambio automatico, che fa il servizio, per l'ora legale.
Lo standard NTP è perfettamente descritto e si basa sull'uso dell'orario UTC in modo che sia svincolato dalle varie zone temporali e/o l'uso dell'ora legale, solo in questo modo è possibile utilizzare in tutto il mondo un qualunque server NTP.

Title: Re: swRTC
Post by: leo72 on Mar 03, 2012, 12:42 pm
@Daniela:
la funzione già c'è. La swRTC2 che ho rilinkato qualche post su fa questo per te. Ogni anno, calcola l'ultima domenica del mese di marzo e quella del mese di ottobre, poi si preoccupa di mandare avanti o indietro l'orologio se si è nella condizione temporale di doverlo fare (alle ore 2:00 nel primo caso ed alle ore 3:00 nel secondo). Addirittura tiene anche conto del fuso orario così che non si debba neanche stare a regolare l'orario dato da un server NTP per adeguarlo all'ora in vigore in Italia, ossia UTC+1.

Poi non so, volete codici, formule ecc... Ce l'avete! Sono nella swRTC2.  :smiley-sweat:
Title: Re: swRTC
Post by: testato on Mar 03, 2012, 12:44 pm
anche io ho sempre visto cosi' la cosa, quello che mi ha fatto pensare, credo anche a leo, e' che il servizio viene cosi' illustrato
Quote
I server NTP dell'I.N.RI.M. permettono di sincronizzare l'orologio interno di un calcolatore alla scala di tempo nazionale italiana UTC(IT)


cosa e' incluso in UTC(IT) ?
Title: Re: swRTC
Post by: DanielaES on Mar 03, 2012, 01:22 pm

@Daniela:
la funzione già c'è. La swRTC2 che ho rilinkato qualche post su fa questo per te.
Poi non so, volete codici, formule ecc... Ce l'avete! Sono nella swRTC2.  :smiley-sweat:


Leo ho guardato la tua libreria ieri :D
Ho visto la funzione ma mi sembrava richiamasse almeno un altra sottofunzione... alla fine mi risultava difficile estrarre solo il calcolo per il passaggio all'ora legale.
Avrei dovuto estrapolare troppo codice ed ho preferito abbandonare l'attuale mia libreria RTC e testare una con più funzioni.

@Test
Quote
I server NTP dell'I.N.RI.M. permettono di sincronizzare l'orologio interno di un calcolatore alla scala di tempo nazionale italiana UTC(IT)


Aveva ingannato anche me la prima volta.
Ma quando ho fatto la prima sincronizzazione ero indietro di 1 ora :)
Title: Re: swRTC
Post by: astrobeed on Mar 03, 2012, 01:37 pm

cosa e' incluso in UTC(IT) ?


E' solo una notazione per dire che l'ora UTC è da considerarsi corretta per quella Italiana, il punto chiave della questione è che il protocollo NTP è basato sull'ora UTC e non può essere diversamente, è uno standard mondiale perfettamente definito.
Se cerchi su Wikipedia Italia trovi una descrizione abbastanza corretta di cosa è NTP e vari link di approfondimento.
Non ti scordare che sul pc hai un servizio, parlando di Windows, che fa da client NTP che tu configuri per la località in quale ti trovi, poi che usi un server NTP in America, in Giappone, in Russia, in Italia non cambia nulla perché il dato che ricevi è identico per tutti.
Title: Re: swRTC
Post by: testato on Mar 03, 2012, 01:58 pm
thanks,
quindi scusa pero' a questo punto non capisco se la correzione +1 rispetto a utc e' presente o no ?
se la correzione e' presente direttamente su questo server, un americano che lo usa su un sup so americano avra' un'orario sbagliato.

oppure non e' vero quello che loro dichiarano (utc)it ma e' un utc e basta, e poi il servizio "OraWindows" aggiunge sia l'ora in piu' per italia, sia l'ora in piu' per ora legale.

Daniela dice che ha ricevuto un'ora indietro, visto che siamo ancora nell'ora solare, vuol dire che non include proprio nulla.
Perche' scrivono utc(it) ?
Title: Re: swRTC
Post by: astrobeed on Mar 03, 2012, 02:31 pm

thanks,
quindi scusa pero' a questo punto non capisco se la correzione +1 rispetto a utc e' presente o no ?


Non c'è nessuna correzione, e non ci può essere se è un server NTP, quella è solo una notazione per indicare che l'ora UTC è da considerarsi localizzata sul ricevente, ma non perché loro trasmettono l'orario Italiano, ma perché viene corretta da un qualche sistema locala sull'hardware che riceve l'informazione.
Infatti se leggi la loro procedura per settare il server sul pc semplicemente ti dicono di inserirlo nella apposita finestra di configurazione del client NTP di Windows, poi è il client a modificare l'orario UTC in orario locale in base alla timezone che scegli e l'eventuale attivazione per il cambio ora legale in automatico.
Title: Re: swRTC
Post by: leo72 on Mar 03, 2012, 03:03 pm
@Daniela:
sì, ma sono tutte funzioni contenute nella libreria stessa...

Cmq continuo a non vedere realmente il problema. Prendete l'ora dal server, aggiungeteci 1 ora per avere l'orario italiano e poi l'eventuale ora se siamo nel periodo compreso fra l'ultima di marzo e l'ultima di ottobre. Dove sta il problema?
Title: Re: swRTC
Post by: astrobeed on Mar 03, 2012, 03:12 pm

Cmq continuo a non vedere realmente il problema. Prendete l'ora dal server, aggiungeteci 1 ora per avere l'orario italiano e poi l'eventuale ora se siamo nel periodo compreso fra l'ultima di marzo e l'ultima di ottobre. Dove sta il problema?


Quello che dico pure io, però mi pare di capire che Daniela non sa come determinare il giorno della settimana ecco perché gli ho consigliato di mettere in una tabelle le varie coppie di date esatte per i prossimi 10 anni, così non deve determinare nulla, basta che confronta la data corrente con quelle contenute nella tabella.
Title: Re: swRTC
Post by: leo72 on Mar 03, 2012, 03:19 pm
Basta che calcoli il giorno della settimana a partire da uno noto che valga poi per i secoli a venire  XD
Ad esempio, assuma come epoca il 1° gennaio 2012, che era domenica. Da quel dì, basta che trovi il giorno rispetto all'anno e da lì calcolare poi il giorno della settimana.

Esempio:
voglio sapere che giorno è il 20 ottobre 2012.

Risoluzione:
calcolo i giorni trascorsi dallo 01/01/2012. Sono 293.
293 mod 7=6
Adesso so che 0=lun, 1=mar ecc... 6=sab per cui so che il 20 ottobre 2012 sarà sabato.
Title: Re: swRTC
Post by: DanielaES on Mar 03, 2012, 07:56 pm

Basta che calcoli il giorno della settimana a partire da uno noto che valga poi per i secoli a venire  XD


Era lo stesso pensiero che avevo avuto io... ma poi la pigrizia affiancata ad una libreria aggiornata :)
Title: Re: swRTC
Post by: leo72 on Mar 05, 2012, 10:33 am
Teoricamente la libreria è indipendente dalla versione dell'IDE usata visto che modifica i timer del micro a basso livello, quindi agendo direttamente sui registri e non passando da librerie del core.

Servirebbe un debug fatto sulla seriale: stampando continuamente l'ora ottieni cose strane?
Il log che fai riporta data ed ora: queste sono prese direttamente con le funzioni della libreria oppure converti il timestamp che ricevi dal server?
Title: Re: swRTC
Post by: leo72 on Mar 05, 2012, 11:27 am
Questa è la funzione che invochi:

Code: [Select]

// set the internal clock using a timestamp using the epoch passed as argument
byte swRTC::setClockWithTimestamp(unsigned long timeT, int yearRef) {
unsigned long dayT;

timeT+=86400; //days in the calendar start from Jan., 1 not from Jan., 0
dayT = timeT/(60L*60L*24L);
float remaining = timeT-dayT*(60L*60L*24L);
int yearT = (dayT / 365.2422);
float dayRemaining = dayT-yearT*365.2422;

if (yearRef==NULL) {
yearRef=1970;
} else if (yearRef<1900) {
yearRef=1900;
} else if (yearRef>1970) {
yearRef=1970;
} else if ((yearRef!=1900) && (yearRef!=1970)) {
yearRef=1970;
}

yearT+=yearRef;
if (dayRemaining>=365.2422)
return 1;//my math is wrong!
if (yearT<yearRef)
return 2;//year not supported!
int monthT=0;
while (dayRemaining > daysPerMonth[monthT]){
dayRemaining -= daysPerMonth[monthT];
monthT++;
}

monthT++;//because month 0 doesn't exist
if (monthT>12)
return 3;//my math is wrong!
if (dayRemaining>=(60L*60L*24L))
return 4;//my math is wrong!
dayT=dayRemaining;
if (dayRemaining-dayT>0){ //add partial day!
dayT++;
}
int hoursT = remaining/(60L*60L);
remaining = remaining-hoursT*(60L*60L);
if (remaining>=(60L*60L))
return 5;//my math is wrong!
int minutesT = remaining/(60L);
remaining = remaining-minutesT*(60L);
if (remaining>=60)
return 6;//my math is wrong!

year=yearT;
month = monthT;
day = dayT;
hours = hoursT;
minutes = minutesT;
seconds = remaining;
return 0;
}

Come vedi si tratta solo di poche formule matematiche. Non vorrei che con la 1.0 fosse cambiato qualcosa nelle regole di casting dei dati.
Mi confermi che con la 0022 funziona tutto perfettamente?
Title: Re: swRTC
Post by: pablos71 on Mar 05, 2012, 11:28 am
sisi è lo sketch che ho postato più su ... spe ti metto la pag

PAG 48 http://arduino.cc/forum/index.php/topic,73496.705.html
   
Re: swRTC
« Reply #714 on: February 14, 2012, 11:20:56 PM »
quello andava bene
Title: Re: swRTC
Post by: leo72 on Mar 05, 2012, 11:36 am
Allora è proprio l'IDE 1.0 che ha cambiato qualcosa. Ora non sono a casa, stasera farò dei test per capire cos'è che sballa.
Title: Re: swRTC
Post by: pablos71 on Mar 05, 2012, 11:40 am
potrebbe essere che la nuova libreria UDP cambia il qualche modo il formato della risposta? Magari la gestione dei packet è cambiata ... non so dico io, magari è una boiata :)
Title: Re: swRTC
Post by: leo72 on Mar 05, 2012, 12:16 pm
Ci sta tutto, mai usato l'ethernet per cui non so come lavorano le lib a corredo.
Bisognerebbe mettersi lì a controllare tutte le righe di codice delle funzioni interessate.
Title: Re: swRTC
Post by: leo72 on Mar 05, 2012, 12:35 pm
Forse è il server che ha dei problemi. Hai provato a cambiarlo?
Title: Re: swRTC
Post by: pablos71 on Mar 05, 2012, 01:08 pm
un istruzione UDP è cambiata e non l'avevo notata, ora è giusto, ma quando passo epoch alla lib, mi calcola che oggi è il giorno
6/3/2012 13:7:12 non dovrebbe essere 5? :) centra qualcosa col 29 febbraio passato?

elimino i post precedenti giusto per non inzozzare di infirmazioni sbagliate il tuo treadh grazie
Title: Re: swRTC
Post by: leo72 on Mar 05, 2012, 01:11 pm

un istruzione UDP è cambiata e non l'avevo notata, ora è giusto, ma quando passo epoch alla lib, mi calcola che oggi è il giorno
6/3/2012 13:7:12 non dovrebbe essere 5? :) centra qualcosa col 29 febbraio passato?

Coincidenza strana.....
Title: Re: swRTC
Post by: pablos71 on Mar 05, 2012, 01:21 pm
questo è quello che mi restituisce la richiesta al server
Unix time = 1330949734 << epoch
The UTC time is 12:15:34

se lo inserisci nella tua libreria anche senza ethernet puoi verificarlo
rtc.setClockWithTimestamp(epoch+3600, 1970); //+ 1 ora

Title: Re: swRTC
Post by: leo72 on Mar 05, 2012, 07:40 pm
Sì, è vero. Il computo degli anni trascorsi non teneva conto di febbraio con 29 gg.
Sostituisci la versione allegata del file swrtc.cpp a quello che hai tu, se anche tu mi dici che va bene stasera aggiorno il pacchetto della libreria nel 1° post di questo thread.

Title: Re: swRTC
Post by: essere_digitale on Mar 07, 2012, 07:44 pm
Salve,
voglio fare i complimenti per il lavoro finora svolto da tutti quelli che vi hanno partecipato.
Ho letto quasi tutto il topic, ma mi sono perso per strada e vorrei porre un paio di domande:
1. la libreria è pronta? (ma mi pare di avere capito di si)
2. Da dove la scarico?
3. il cristallo esterno è "obbligatorio" per avere una precisione accettabile?
4. Se si alla domanda precedente, http://it.rs-online.com/web/p/products/5476070/ indicato da Lesto, va bene?
5. L'aggiornamento via internet è "obbligatorio"?
Grazie
Title: Re: swRTC
Post by: PaoloP on Mar 07, 2012, 08:59 pm

Salve,
voglio fare i complimenti per il lavoro finora svolto da tutti quelli che vi hanno partecipato.
Ho letto quasi tutto il topic, ma mi sono perso per strada e vorrei porre un paio di domande:
1. la libreria è pronta? (ma mi pare di avere capito di si)

Si, la libreria è pronta anche se in continuo miglioramento.

Quote
2. Da dove la scarico?

La trovi allegata al primo post oppure nel playground.

Quote
3. il cristallo esterno è "obbligatorio" per avere una precisione accettabile?

Si e No, questa libreria serve per simulare un orologio via software. La precisione dell'oscillatore interno è bassa ma alla fine dipende dall'uso che uno deve farne.

Quote
4. Se si alla domanda precedente, http://it.rs-online.com/web/p/products/5476070/ indicato da Lesto, va bene?

-> Questa la lascio a Lesto.

Quote
5. L'aggiornamento via internet è "obbligatorio"?

No, non è obbligatorio sincronizzare la libreria, ma consigliato.
Infatti in caso di reboot di Arduino, senza sincronizzazione, l'orario ripartirebbe da quello indicato nel setup. Puoi effettuare la sincronizzazione in vari modi: con un input via seriale, con un server NTP, con il segnale GPS o DCF77 o tramite un tastierino ed un display; insomma... le possibilità sono tantissime.
Comunque ricorda che "anche un orologio fermo segna l'ora esatta due volte al giorno"  :D

Quote
Grazie

Prego
Title: Re: swRTC
Post by: leo72 on Mar 07, 2012, 09:59 pm

Comunque ricorda che "anche un orologio fermo segna l'ora esatta due volte al giorno"  :D

E' il famoso paradosso temporale: è più preciso un orologio fermo che almeno 2 volte al giorno segna l'ora esatta oppure un orologio marciante ma che va avanti sempre di 1 secondo all'ora, non segnando mai l'ora precisa?  :smiley-yell:
Title: Re: swRTC
Post by: pablos71 on Mar 07, 2012, 10:37 pm
scusa ho visto adesso che avevi risposto al post del giorno sbagliato, ho sostituito il cpp

Aggiornamento a server NTP Riuscito  Epoch = 1331156101
10/3/2012 22:35:1

non capisco cosa non vada
Title: Re: swRTC
Post by: leo72 on Mar 07, 2012, 10:41 pm
Domani gli rido un'occhiata, adesso non ho voglia: è tardi  :smiley-sweat:
Title: Re: swRTC
Post by: pablos71 on Mar 07, 2012, 10:42 pm
figurati, quando vuoi, grazie

ciao
Title: Re: swRTC
Post by: pablos71 on Mar 07, 2012, 10:50 pm
Magari lo sai già, se dovesse tornarti utile inserendo qui http://www.mario-online.com/timestamp.php il timestamp controlli se il numero è corretto, il server mi restituisce

timestamp 1331156841 >> corrisponde a "il 07 di Marzo del 2012 alle 22:47 e 21 sec. "

lo sketch converte in 10/3/2012   22:47:21

ciao

Title: Re: swRTC
Post by: PaoloP on Mar 07, 2012, 10:51 pm
Con la vecchia libreria mi da:
Quote
Ethernet started.
Check Server NTP...
Seconds since Jan 1 1900 = 3540145562
Unix time = 1331156762
The UTC time is 21:46:02
swRTC synchronized.


sostituendo il cpp:
Quote
Ethernet started.
Check Server NTP...
Seconds since Jan 1 1900 = 3540145844
Unix time = 1331157044
The UTC time is 21:50:44
swRTC synchronized.
21:50:44  7/3/2012
1331070644


è giusto!  :D
A me converte bene.
Title: Re: swRTC
Post by: leo72 on Mar 07, 2012, 10:52 pm
Io uso questo:
http://www.onlineconversion.com/unix_time.htm
L'altro giorno funzionava, boh... vediamo un po'. Farò un po' di debug più approfondito.
Title: Re: swRTC
Post by: leo72 on Mar 07, 2012, 10:53 pm

è giusto!  :D
A me converte bene.

Ma allora... va o non va?  :smiley-yell:
Title: Re: swRTC
Post by: PaoloP on Mar 07, 2012, 10:55 pm
Questo è il mio sketch
Code: [Select]
#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <swRTC.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x00, 0xF7, 0xF0 };

unsigned int localPort = 8888;      // local port to listen for UDP packets

IPAddress timeServer(192, 43, 244, 18); // time.nist.gov NTP server 192, 43, 244, 18

const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

long interval = 3600000;    // interval to control NTP Server
unsigned long previousMillis = 0;        // will store last time LED was updated

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
swRTC rtc;

void setup()
{
  delay(2000);
  unsigned long ts = 0;
  Serial.begin(9600);
  Serial.print("Serial Start! at ");
  Serial.print(millis());
  Serial.println(" microsecond.");
  AvviaEthernet();
  Serial.println("Ethernet started.");

  while (ts==0)
  {
    Serial.println("Check Server NTP...");
    ts=GetNTPtime();
    if (ts==0) {
      Serial.println("Wait 5 seconds...");
      delay(5000);
    }   
  }
  rtc.stopRTC();
  rtc.setClockWithTimestamp(ts, 1970);
  rtc.startRTC(); 
  Serial.println("swRTC synchronized.");
}

void loop()
{
  int deltaT = 0;
  unsigned long currentMillis = millis();
  stampa();
  delay(10000);
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;   
    // Controlla il server NTP
    deltaT = GetNTPtime() - rtc.getTimestamp();
    Serial.print("DeltaT : ");
    Serial.println(deltaT);
  }
  // else{
  //   Serial.println("Millis: ");
  //   Serial.println(currentMillis);
  //   Serial.println(previousMillis);
  //   Serial.println(interval);
  //   Serial.println(" "); 
  // }

}

void AvviaEthernet()
{
  // start Ethernet and UDP
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP.");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  else
  {
    Serial.println("Ethernet configured using DHCP.");
    Serial.print("Local IP: ");
    Serial.println(Ethernet.localIP());
    Serial.print("SubnetMask: ");
    Serial.println(Ethernet.subnetMask());
    Serial.print("Gateway: ");
    Serial.println(Ethernet.gatewayIP());
    Serial.print("DNS Server: ");
    Serial.println(Ethernet.dnsServerIP());
  }
  Udp.begin(localPort);
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:    
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer,NTP_PACKET_SIZE);
  Udp.endPacket();
}

unsigned long GetNTPtime(){
  sendNTPpacket(timeServer); // send an NTP packet to a time server
  // wait to see if a reply is available
  delay(1000); 
  if ( Udp.parsePacket() ) { 
    // We've received a packet, read the data from it
    Udp.read(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer
    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); 
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord; 
    Serial.print("Seconds since Jan 1 1900 = " );
    Serial.println(secsSince1900);               
    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;     
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears; 
    // print Unix time:
    Serial.println(epoch);                               
    // print the hour, minute and second:
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':'); 
    if ( ((epoch % 3600) / 60) < 10 ) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch %60); // print the second
    return epoch;
  }
  else {
    Serial.println("NTP Server unavailable.");
    return 0;
  }
}

void stampa() {
  Serial.print(rtc.getHours(), DEC);
  Serial.print(":");
  Serial.print(rtc.getMinutes(), DEC);
  Serial.print(":");
  Serial.print(rtc.getSeconds(), DEC);
  Serial.print("  ");
  Serial.print(rtc.getDay(), DEC);
  Serial.print("/");
  Serial.print(rtc.getMonth(), DEC);
  Serial.print("/");
  Serial.println(rtc.getYear(), DEC);
  Serial.println(rtc.getTimestamp(), DEC);
}


La libreria è quella del primo post + il cpp della pagina precedente.
Title: Re: swRTC
Post by: pablos71 on Mar 07, 2012, 11:10 pm
si è lo stesso che c'e' negli esempi dell'ide 1.0 io quello uso, poi passo il timestamp alla lib, ci do di nuovo un occhio, grazie
Title: Re: swRTC
Post by: PaoloP on Mar 07, 2012, 11:56 pm

si è lo stesso che c'e' negli esempi dell'ide 1.0

Si lo so.
E' sempre il mio codice che riposto ogni tot pagine, per non dimenticarlo  :D
Title: Re: swRTC
Post by: pablos71 on Mar 08, 2012, 12:58 am
Maledetto errore!!! eccolo

servendomi un stringa per scrivere su sd convertivo i valori DEC in stringa

ore = rtc.getHours(), DEC;
minuti = rtc.getMinutes(), DEC;
secondi = rtc.getSeconds(), DEC;
giorno = (rtc.getDay(), DEC); .......LE PARENTESI!!!!! messe nel tentivo di correggere con un -1 poi dimenticate smiley
mese = rtc.getMonth(), DEC;
anno = rtc.getYear(), DEC;

String time= String(giorno) + "/" + String(mese) + "/" + String(anno)+ " " + String(ore) + ":" + String(minuti) + ":" + String(secondi);
file.println(time+ " >> " + log_msg);

grazie e scusate mea culpa

ciao
Title: Re: swRTC
Post by: astrobeed on Mar 08, 2012, 07:21 am

E' il famoso paradosso temporale: è più preciso un orologio fermo che almeno 2 volte al giorno segna l'ora esatta oppure un orologio marciante ma che va avanti sempre di 1 secondo all'ora, non segnando mai l'ora precisa?  :smiley-yell:


In pratica la versione moderna del secondo paradosso di Zenone "Achille e la tartaruga"  :D
Title: Re: swRTC
Post by: leo72 on Mar 08, 2012, 09:17 am

Maledetto errore!!! eccolo

servendomi un stringa per scrivere su sd convertivo i valori DEC in stringa

ore = rtc.getHours(), DEC;
minuti = rtc.getMinutes(), DEC;
secondi = rtc.getSeconds(), DEC;
giorno = (rtc.getDay(), DEC); .......LE PARENTESI!!!!! messe nel tentivo di correggere con un -1 poi dimenticate smiley
mese = rtc.getMonth(), DEC;
anno = rtc.getYear(), DEC;

String time= String(giorno) + "/" + String(mese) + "/" + String(anno)+ " " + String(ore) + ":" + String(minuti) + ":" + String(secondi);
file.println(time+ " >> " + log_msg);

grazie e scusate mea culpa

ciao


Frust... frust.... (il rumore delle frustate che ti sto dando mentalmente  :P)
Title: Re: swRTC
Post by: testato on Mar 22, 2012, 04:07 pm
ciao leo,

sto' pensado di usare la tua lbreria nel mio nuovo giochetto inutile, pero' non ricordo piu' niente  :)

la mia idea sarebbe di far aggiornare l'orario automaticamente quando attacco arduino alla usb. secondo te si puo' fare ?
quindi per capirci senza la ethernet, ma via usb andare su internet attraverso il pc (penso a voce alta, mi sa di cazzata ma non ho voglia di pensare  :smiley-roll-sweat:)

oppure seconda strada scrivere un programma in processing che mi faccia da interfaccia, quindi attacco arduino lancio sto' programma, e cliccando un bottone aggiorno l'orario preso da internet

logicamente ad arduino deve essere connessa una batteria perche' quando lo staccherei dalla usb perderei l'orario, e non devo nemmeno resettarlo mai, altrimenti riparte dall'ultimo orario sincronizzato
Title: Re: swRTC
Post by: astrobeed on Mar 22, 2012, 04:29 pm

la mia idea sarebbe di far aggiornare l'orario automaticamente quando attacco arduino alla usb. secondo te si puo' fare ?


Non senza usare un servizio che rileva la connessione e invia l'orario.

Quote

oppure seconda strada scrivere un programma in processing che mi faccia da interfaccia, quindi attacco arduino lancio sto' programma, e cliccando un bottone aggiorno l'orario preso da internet


Questo è fattibile facilmente, non necessariamente con processing.
Title: Re: swRTC
Post by: testato on Mar 22, 2012, 04:44 pm
buona la seconda  :)

ho detto processing perche' non avendo mai rpogrammato credo sia una buona scelta partire dall'accoppiata arduino+processing. non diventero' mai u rpogrammatore, sono troppo vecchio, mi basta diventare un assemblatore  :)
sper quindi in sketch di esempi da modificare.

fammi capire, se ne hai voglia.
per aggiornare l'orario della swRTC dovro' scrivere in ram l'orario aggiornato giusto ? la swRTC scrive l'orario durante l'upload dello sketch stesso. secondo te quindi via seriale faro' l'upload dello sketch ? non credo, anche perche' mi brucerei la quantita' di scrittura della flash.
Dovro' caricare il nuovo orario direttamente in ram via processing ?
Title: Re: swRTC
Post by: astrobeed on Mar 22, 2012, 04:53 pm

sono troppo vecchio


Finché ci rimane almeno un neurone funzionante non si è mai troppo vecchi  :D

Quote

Dovro' caricare il nuovo orario direttamente in ram via processing ?


Serve semplicemente un programma su PC che se riceve dalla seriale una certa sequenza di caratteri legge l'orario/data corrente del pc e lo invia tramite seriale ad Arduino codificato in qualche modo.
Lo sketch su Arduino dovrebbe inviare in automatico la richiesta al pc dopo qualche secondo l'accensione/reset, giusto per dare il tempo di rilevare la porta USB e avviare il programma su pc, non appena riceve la risposta aggiorna l'orario della swRTC.
Se hai problemi per il programma sul PC ci metto meno di 10 minuti a fartelo io in C++, anzi potrebbe diventare un utile complemento alla swRTC.

Title: Re: swRTC
Post by: leo72 on Mar 22, 2012, 05:32 pm

per aggiornare l'orario della swRTC dovro' scrivere in ram l'orario aggiornato giusto ? la swRTC scrive l'orario durante l'upload dello sketch stesso. secondo te quindi via seriale faro' l'upload dello sketch ? non credo, anche perche' mi brucerei la quantita' di scrittura della flash.
Dovro' caricare il nuovo orario direttamente in ram via processing ?

Aggiungo, per completezza d'informazione, che se preimposti un orario all'interno dello sketch fissi un "punto zero", ossia memorizzi in Flash (non in Ram! :P) una coppia di valori data/ora da cui tutte le volte che il micro viene resettato riparte il tuo orario. Però i registri interni dell'orologio swRTC sono mantenuti in Ram per cui non vi è nessun limite al loro aggiornamento. Considera, anzi, che sono anch'essi aggiornati costantemente durante il funzionamento del micro.

Detto questo, la lib ha delle funzioni per modificare data e ora, basta passargli i valori in qualche maniera. O con un programma come suggerisce astro o, al limite, basterebbe addirittura un semplice terminale seriale (per assurdo).
Title: Re: swRTC
Post by: testato on Mar 22, 2012, 05:59 pm
x astro: avere un listato da cui partire sarebbe ottimo, questo codice c++ che dici sarebbe poi adattabile a processing ? non vorrei un semplice exe funzionante ma che non mi permette modifiche, alla fine lo fo per imparare  :)

x leo, avevo pensato a passare l'ora via arduino serial monitor, ma servono delle modfiche alla tua libreria gusto ? o sono gia' implementate queste funzioni ?
Title: Re: swRTC
Post by: leo72 on Mar 22, 2012, 06:12 pm
La libreria non la devi toccare. Devi semplicemente implementare nel codice la comunicazione seriale verso l'Arduino o, comunque, il micro che ospita la libreria. All'arrivo di qualcosa sulla seriale, controlli che sia il comando di modifica dell'ora/data e, se sì, rispondi con la richiesta di invio dei dati e della successiva modifica dell'rtc interno.
Title: Re: swRTC
Post by: astrobeed on Mar 22, 2012, 06:50 pm

x astro: avere un listato da cui partire sarebbe ottimo, questo codice c++ che dici sarebbe poi adattabile a processing ? non vorrei un semplice exe funzionante ma che non mi permette modifiche, alla fine lo fo per imparare  :)


Il sorgente non è un problema rilasciarlo open source, però processing è java e ha ben poco a che vedere con il C++ salvo una similitudine con la sintassi.
Title: Re: swRTC
Post by: lestofante on Mar 22, 2012, 07:40 pm
il c++ è un'idea perchè conosci già il linguaggio, ma vai a scontrarti col sistema operativo che non è così user-friendly come un'arduino.

Processing possiede al suo interno già tutto quello che ti serve (classe Serial), e ha un'ottima documentazione sul suo sito
Title: Re: swRTC
Post by: astrobeed on Mar 22, 2012, 07:55 pm

il c++ è un'idea perchè conosci già il linguaggio, ma vai a scontrarti col sistema operativo che non è così user-friendly come un'arduino.


Il sistema operativo non c'entra nulla con il linguaggio di programmazione che scegli per realizzare un applicativo, un buon compilatore C++ offre tutto quello che serve per gestire le varie interfacce del pc, seriale inclusa.


Title: Re: swRTC
Post by: PaoloP on Mar 22, 2012, 07:58 pm
Qui trovi un abbozzo di terminale --> http://arduino.cc/forum/index.php/topic,95684.0.html
Lo so è proprio spartano.  :smiley-roll-blue:
Title: Re: swRTC
Post by: lestofante on Mar 22, 2012, 09:34 pm


il c++ è un'idea perchè conosci già il linguaggio, ma vai a scontrarti col sistema operativo che non è così user-friendly come un'arduino.


Il sistema operativo non c'entra nulla con il linguaggio di programmazione che scegli per realizzare un applicativo, un buon compilatore C++ offre tutto quello che serve per gestire le varie interfacce del pc, seriale inclusa.



si che centra, diversi linguaggi forniscono (se forniscono) diversi livelli di astrazione delle interfacce. C'è chi fornisce quasi nulla di base e tutto va scaricato a parte, e c'è chi fornisce quasi tutto in modo semplice e intuitivo.
Si tratta solo di scegliere il livello di "sbatterci la testa" che vuoi raggiungere.
Title: Re: swRTC
Post by: astrobeed on Mar 22, 2012, 09:46 pm

si che centra, diversi linguaggi forniscono (se forniscono) diversi livelli di astrazione delle interfacce.


Lesto, questa è una discussione che non ha alcun senso, i casi sono solo due, o sei capace di scrivere software di sistema oppure non sei capace di farlo, tutto il resto è solo discussioni sul sesso degli angeli  :)

Title: Re: swRTC
Post by: lestofante on Mar 22, 2012, 10:05 pm
cosa vuol dire "software di sistema"?
per Quale sistema?
Sicuro di quello che dici?
Prova a fare un programma che mostra un cubo 3d con processing, e poi prova a rifarlo in C. Certo che ci riesci, ma quanti ci hai sbattuto la testa nei 2 casi? e quanto tempo ci hai messo?
certo, il cubo in C ti fa 100 FPS in più, ma ne è valsa la pena?
questo vuol dire fornire diversi sistemi di astrazione.
Certo, sicuramente anche il C avrà qualche libreria da scaricare semplice come il processing, ma appunto è da scaricare e probabilmente se già non ne mastichi, difficilmente riuscirai ad includerla ed usarla.
Vogliamo parlare di avviare un processo o un thread?
vogliamo parlare della portabilità del codice? (anche a livello sorgenti?)

La stessa cosa vale per la seriale, certo l'interfaccia seriale è meno complessa e quindi si mostra molto meno questo problema, ma c'è comunque.

prendiamo l'esempio linkato da PaoloP: 300 e passa righe, platform dependet. (c++)
processing: http://tigoe.net/pcomp/serial-processing.shtml in meno di 50 righe hai un programma completo, e senza nemmeno preoccuparti del sistema su cui girerà il programma
Title: Re: swRTC
Post by: astrobeed on Mar 23, 2012, 06:55 am

Sicuro di quello che dici?


Io sono più che sicuro di quello che dico, e comunque sto parlando in senso generale.
In tutti i casi questo sta diventando un flame e non ho alcuna intenzione di portarlo avanti, tu sei libero di pensarla come ti pare e lo stesso vale per me.

Title: Re: swRTC
Post by: essere_digitale on Mar 23, 2012, 01:06 pm
Ciao,
per un ignorante come me: se volessi usare la libreria e un cristallo, come devo procedere all'installazione e all'eventuale modifica del codice?
Grazie
--
Alfredo Silvano
Title: Re: swRTC
Post by: astrobeed on Mar 23, 2012, 02:21 pm
Dato che io preferisco fare piuttosto che chiaccherare ho realizzato sia il software per pc che la funzione aggiuntiva per lo sketch necessari per sincronizzare la swRTC con l'orario del pc tramite USB.
Per il momento il programma per pc è solo versione windows, non appena ho un attimo di tempo lo rilascio anche per Linux.
Ho aperto un topic (http://arduino.cc/forum/index.php/topic,98049.msg735387.html#msg735387) dedicato all'argomento.
Title: Re: swRTC
Post by: lestofante on Mar 23, 2012, 02:56 pm

Ciao,
per un ignorante come me: se volessi usare la libreria e un cristallo, come devo procedere all'installazione e all'eventuale modifica del codice?
Grazie
--
Alfredo Silvano


è da un pò che non guardo i sorgenti dalla swRTC, ma non ricordo che fosse in grado di usare il cristallo per rendere l'atmega un vero RTC (quello da 32k).
se ti riferisci ad un normale cristallo, invece, non devi fare nessuna modifica se non fashare il boot-loader con la giusta frequnza
Title: Re: swRTC
Post by: essere_digitale on Mar 23, 2012, 03:14 pm
Ciao,


Ciao,
per un ignorante come me: se volessi usare la libreria e un cristallo, come devo procedere all'installazione e all'eventuale modifica del codice?
Grazie
--
Alfredo Silvano


è da un pò che non guardo i sorgenti dalla swRTC, ma non ricordo che fosse in grado di usare il cristallo per rendere l'atmega un vero RTC (quello da 32k).
se ti riferisci ad un normale cristallo, invece, non devi fare nessuna modifica se non fashare il boot-loader con la giusta frequnza

mi riferisco al cristallo da 16Mhz di cui si parla in questo post dello stesso thread http://arduino.cc/forum/index.php/topic,73496.msg554350.html#msg554350 .
Invece "fashare il boot-loader con la giusta frequnza" non so cosa voglia dire .. abbi pazienza!
Title: Re: swRTC
Post by: lestofante on Mar 23, 2012, 03:48 pm
se tu hai un atmega, per usarlo devi caricare il boot-loader. I boot-loader esistono per 8Mhz e 16 Mhz.
se da oscillatore o cristallo a 16MHz passi ad un cristallo a 16MHz nessun problema.
se da oscillatore o cristallo a 8MHz passi ad un cristallo o oscillatore a 16MHz devi caricare il giusto boot-loader.
Per maggiorni informazioni sull'operazione cerca sul forum, ci sono un sacco di metodi e di guide
Title: Re: swRTC
Post by: essere_digitale on Mar 23, 2012, 03:57 pm

se tu hai un atmega, per usarlo devi caricare il boot-loader. I boot-loader esistono per 8Mhz e 16 Mhz.
se da oscillatore o cristallo a 16MHz passi ad un cristallo a 16MHz nessun problema.
se da oscillatore o cristallo a 8MHz passi ad un cristallo o oscillatore a 16MHz devi caricare il giusto boot-loader.
Per maggiorni informazioni sull'operazione cerca sul forum, ci sono un sacco di metodi e di guide


io devo usarlo su un Arduino Mega che credo sia a 16MHz, quindi per usarlo gli do 5v in un pin e l'altro lo collego ad un pin dell'arduino? Se si quale?
Grazie
Title: Re: swRTC
Post by: testato on Mar 23, 2012, 04:09 pm
scusa essere digitale ma ho capito che non hai capito  :)

questa libreria serve per usare arduino come orologio sw. Quindi non devi aggiungere nulla al tuo arduino, il quarzo e' quello gia' presente su arduino
Title: Re: swRTC
Post by: lestofante on Mar 23, 2012, 04:11 pm
no, non ci stiamo capendo. il cristallo, va messo su 2 pin particolari dell'atmega, ovvero del microchip, che poi ci pensa da solo ad alimentare e utilizzare il cristallo (settaggio dei giusti fuse, e adattamento delle funzioni basate sul tempo sono il motivo per cui devi usare il boot-loader per la giusta frequenza)
L'arduino mega è una board che possiede già un oscillatore o cristallo a 16MHz sulla sceda (credo siano tutte a 16MHz), il massimo che puoi fare è dissaldare il cristallo/oscillatore già presente sulla scheda e sostituirlo con uno più preciso.

ps. ma questa libreria funziona sull'arduino mega?

edit: preceduto da brain :)
Title: Re: swRTC
Post by: essere_digitale on Mar 23, 2012, 04:21 pm

scusa essere digitale ma ho capito che non hai capito  :)


troppo buono :(


questa libreria serve per usare arduino come orologio sw. Quindi non devi aggiungere nulla al tuo arduino, il quarzo e' quello gia' presente su arduino

ok, ma leggendo il thread mi era parso di capire che si poteva migliorare la precisione, utilizzando un cristallo.
Giusto?
Title: Re: swRTC
Post by: essere_digitale on Mar 23, 2012, 04:23 pm

no, non ci stiamo capendo. il cristallo, va messo su 2 pin particolari dell'atmega, ovvero del microchip, che poi ci pensa da solo ad alimentare e utilizzare il cristallo (settaggio dei giusti fuse, e adattamento delle funzioni basate sul tempo sono il motivo per cui devi usare il boot-loader per la giusta frequenza)
L'arduino mega è una board che possiede già un oscillatore o cristallo a 16MHz sulla sceda (credo siano tutte a 16MHz), il massimo che puoi fare è dissaldare il cristallo/oscillatore già presente sulla scheda e sostituirlo con uno più preciso.


neanche per sogno!


ps. ma questa libreria funziona sull'arduino mega?
edit: preceduto da brain :)


mi pare di aver letto in questo thread, di un test sul 2560 ...
Title: Re: swRTC
Post by: leo72 on Mar 23, 2012, 04:39 pm
Bòni  ;)

Allora, credo che essere_digitale abbia una scheda Arduino MEGA. Su questo non ci sono dubbi. E' ovvio che non si possa dissaldare il microcontrollore, perché poi si butterebbe via micro e scheda  $) Anche su questo non ci sono dubbi.

Quando leggi che per aumentare la precisione della libreria va usato un cristallo esterno è ovvio che ci riferisce a situazioni in cui si implementa un circuito con un Atmega in standalone (parola per indicare il micro ed i componenti minimi necessari al suo funzionamento). Se si parla di Atmega328, il micro dell'Arduino UNO/2009, la cosa è facile perché il micro è in formato DIP quindi facilmente gestibile Un chip come l'Atmega2560 non puoi piazzarlo su una millefori né la sua saldatura è alla portata di tutti. Credo che a meno che tu non riesca a procurarti una breakout board, ossia una schedina con il solo Atmega2560 montato sopra, come questa:
http://jkdevices.com/index.php?route=product/product&product_id=49
non puoi aggiungere ad una scheda Arduino MEGA un cristallo.

Ah, per la cronaca, la swRTC supporta i seguenti micro:
-Attiny25/45/85
-Attiny24/44/84
-Atmega8
-Atmega48/88/168/328
-Atmega644/1284
-Atmega640/1280/1281/2560/2561
Title: Re: swRTC
Post by: essere_digitale on Mar 23, 2012, 04:52 pm

Bòni  ;)

Allora, credo che essere_digitale abbia una scheda Arduino MEGA. Su questo non ci sono dubbi. E' ovvio che non si possa dissaldare il microcontrollore, perché poi si butterebbe via micro e scheda  $) Anche su questo non ci sono dubbi.

Quando leggi che per aumentare la precisione della libreria va usato un cristallo esterno è ovvio che ci riferisce a situazioni in cui si implementa un circuito con un Atmega in standalone (parola per indicare il micro ed i componenti minimi necessari al suo funzionamento). Se si parla di Atmega328, il micro dell'Arduino UNO/2009, la cosa è facile perché il micro è in formato DIP quindi facilmente gestibile Un chip come l'Atmega2560 non puoi piazzarlo su una millefori né la sua saldatura è alla portata di tutti. Credo che a meno che tu non riesca a procurarti una breakout board, ossia una schedina con il solo Atmega2560 montato sopra, come questa:
http://jkdevices.com/index.php?route=product/product&product_id=49
non puoi aggiungere ad una scheda Arduino MEGA un cristallo.


finalmente è tutto chiaro  :. :. :.


Ah, per la cronaca, la swRTC supporta i seguenti micro:
-Attiny25/45/85
-Attiny24/44/84
-Atmega8
-Atmega48/88/168/328
-Atmega644/1284
-Atmega640/1280/1281/2560/2561


la provo. grazie ancora.
Title: Re: swRTC
Post by: lestofante on Mar 23, 2012, 05:33 pm

Allora, credo che essere_digitale abbia una scheda Arduino MEGA. Su questo non ci sono dubbi. E' ovvio che non si possa dissaldare il microcontrollore, perché poi si butterebbe via micro e scheda  $) Anche su questo non ci sono dubbi.


non dissaldare il micro, ma il cristallo/oscillatore.
Ma dubito comunque che abbia una reale utilità, salvo mettere un cristallo 16MHz con la stessa precisione di uno a 32kHz
Title: Re: swRTC
Post by: leo72 on Mar 23, 2012, 06:28 pm

non dissaldare il micro, ma il cristallo/oscillatore.
Ma dubito comunque che abbia una reale utilità, salvo mettere un cristallo 16MHz con la stessa precisione di uno a 32kHz

Con questa opzione poi si è costretti ad usare l'oscillatore interno a 8 MHz, ed il software Arduino non è progettato per tale frequenza per cui poi bisognerebbe iniziare a modificare un sacco di cose per far funzionare tutta la baracca. Ergo: non conviene assolutamente.
Title: Re: swRTC
Post by: leo72 on Mar 23, 2012, 06:28 pm


Ah, per la cronaca, la swRTC supporta i seguenti micro:
-Attiny25/45/85
-Attiny24/44/84
-Atmega8
-Atmega48/88/168/328
-Atmega644/1284
-Atmega640/1280/1281/2560/2561


la provo. grazie ancora.

Mi ero dimenticato: Attiny2313
Title: Re: swRTC
Post by: lestofante on Mar 23, 2012, 06:34 pm


non dissaldare il micro, ma il cristallo/oscillatore.
Ma dubito comunque che abbia una reale utilità, salvo mettere un cristallo 16MHz con la stessa precisione di uno a 32kHz

Con questa opzione poi si è costretti ad usare l'oscillatore interno a 8 MHz, ed il software Arduino non è progettato per tale frequenza per cui poi bisognerebbe iniziare a modificare un sacco di cose per far funzionare tutta la baracca. Ergo: non conviene assolutamente.


scusa ma con un cristallo 16MHz ad altissima precisione cosa cambia tanto da dover usare quello interno a 8MHz? mi sa che non hai letto bene l'intervento :-)
Title: Re: swRTC
Post by: leo72 on Mar 23, 2012, 06:37 pm
Sì, scusa. Ho sbagliato ad intendere l'ultimo tuo punto. Avevo letto di mettere il 32 kHz al posto del 16 MHz.
Title: Re: swRTC
Post by: tiusalessio on Mar 28, 2012, 04:55 pm
So che vado fuori argomento, ho provato ad usare swrtc
ma vorei utilizzare un DS1307 come RTC in modo di tenere l'ora anche in caso di black out.
nel caso perdessi la precisione e quindi il reale valore della variabile tempo c'è la possibilità di aggiornarla mediante pc senza ricaricare lo sketch.
Title: Re: swRTC
Post by: leo72 on Mar 28, 2012, 05:06 pm
Segui l'altra discussione in cui si parla di aggiornare la swRTC da PC. Il problema è identico.
Oppure metti un piccolo display tipo un 16x2 e permetti all'utente di modificare l'orario, la vedo più semplice e meno impedente: con la soluzione del PC sei costretto a collegare il tuo dispositivo al computer.
Title: Re: swRTC
Post by: tiusalessio on Mar 28, 2012, 08:24 pm
Ciao Leo
Ho già inserito un display con cui visualizzo l'ora.
tu intendi di inserine nello sketch un menù tramite il quale andare a impostare l'ora e magari altri parametri ?
Title: Re: swRTC
Post by: leo72 on Mar 28, 2012, 08:26 pm

tu intendi di inserine nello sketch un menù tramite il quale andare a impostare l'ora e magari altri parametri ?

Esatto  ;)
Title: Re: swRTC
Post by: tiusalessio on Mar 28, 2012, 08:39 pm

Penso che dovro studiare un'pò per fare un menù perchè ancora non ho mai provato a farne uno.
c'è qualche consiglio per un metodo semplice da seguire per fare un menù
Title: Re: swRTC
Post by: leo72 on Mar 28, 2012, 09:21 pm
Parti per gradi.
Creati un menu con 2 sole opzioni, una di tua scelta, esempio "Visualizza ora" e l'altra "Uscita".
Gestisci 2 pulsantini. Con il primo richiami il menu e fai le scelte, con l'altro scorri le voci. Allenati a far apparire il menu ed a scorrere fra le 2 opzioni, facendo visualizzare l'ora oppure uscendo dal menu a seconda dell'opzione scelta. Poi pian piano aggiungi le voci. Comunque se la cosa diventa difficile, apri un thread apposito, qui si va OT.
Title: Re: swRTC
Post by: tiusalessio on Mar 29, 2012, 09:45 am
Grazie Leo.
questa sera ci provo.
Un consiglio e poi chiudo, secondo te una tastiera a 4 pulanti se è sufficente per comandare qualsiasi menù la cerco su internet e la prendo.
Title: Re: swRTC
Post by: leo72 on Mar 29, 2012, 12:23 pm
In teoria ne bastano 2: uno per aprire il menu e selezionare le scelte, l'altro per scorrere fra le opzioni. In caso di richieste all'utente, uno assume il valore di "Sì", l'altro "No". Poi se ti va di prendere la tastierina, fai pure.
Title: Re: swRTC
Post by: unoracing on Apr 12, 2012, 12:57 am
Salve a tutti, mi chiamo Fabio e mi sono avvicinato da poco ad Arduino.
Il mio progetto è un cronometro e sino a qui non c'è nulla di nuovo vedendo che ce ne sono di tutti i colori con Arduino.
Io stò provando con Arduino Uno a fare un cronometro con i centesimi di secondo utilizzando la SwRtc.
Ho modificato leggermente la libreria (con soli due if in piu' e due variabili una per centesimi e una per i decimi) e quindi da programma ho aggiunto un if nel loop che controlli quando i centesimi sono = a 0 per farmi suonare un buzzer una volta al secondo.
Il problema è che una volta che metto il suono una volta al secondo il timer sembra che contiuni a funzionare bene ma sulla seriale si notano dei problemi che si verificano anche ascoltando il buzzer, o meglio:
per alcuni instanti funziona tutto e una volta al secondo il buzzer suona, poi succede che per alcuni secondi non suona piu' e altre volte che faccia anche due o tre "suonate" consecutive.
Lo so benissimo che con un software rtc non potrò mai esser preciso ma al momento per imparare volevo fare il primo programma così per poi implementarlo con diverse altre cose.
Il progetto in realtà è abbastanza complesso e sinceramente non so nemmeno se Arduino sia in grado di sopportarlo per questioni di memoria e forse potenza.
Sono un neofita di questo mondo e potrei anche sbagliarmi, anzi se qualcuno vuole contribuire a farmi capire un pochino il motivo di questo strano comportamento gliene sarei grato.
Vorrei approfittarne per ringraziare colui che ha fatto la SWRTC, davvero un bel lavoro.
Lasciandola standar e con il swrtctest il mio arduino uno sbaglia di 391 sec al giorno........ Per fortuna che c'è il setDeltaT :-)
Di seguito il codice che ho messo nel loop:
Code: [Select]

void loop() {
    Serial.print(rtc.getHours(), DEC);
    Serial.print(":");
    Serial.print(rtc.getMinutes(), DEC);
    Serial.print(":");
    Serial.print(rtc.getSeconds(), DEC);
    Serial.print(".");
    Serial.println(rtc.getCentesimi(), DEC);
    second_lap();
       
}

void second_lap(){
     cent = rtc.getCentesimi();
     if (cent == 1){
         flag1 = 0;
         }
     if ((cent == 0) && (flag1 == 0)){
       buzz(buzPin, 4000, 90);
       flag1 = 1;
    }
}
Title: Re: swRTC
Post by: leo72 on Apr 12, 2012, 07:33 am
La swRTC, come descritto nel readme allegato, utilizza un timer interno al microcontrollore. Tale timer dipende dal tipo di micro su cui gira. Nel caso dell'Atmega328 usa il timer 2.
Ora, analizzando la libreria Tone, mi pare di capire che usi anch'essa il timer 2. Se è così, è scontato che vadano in conflitto. Prova ad aprire la Tone ed a cambiare il timer predefinito, dovrebbe essere il blocco di codice tra le righe 88-111 nel file Tone.c contenuto in /hardware/arduino/cores/arduino. Metti ad esempio il timer 1.
Title: Re: swRTC
Post by: unoracing on Apr 12, 2012, 08:27 am
Grazie Leo72, oltre a quello che dici te avevo commesso un errore grossolano nelle if modificando il file swRTC.cpp... Ora ho appena sistemato tutto e ho cambiato anche il timer nel file da te indicato. Ho fatto partire ora in lo skect, vedremo tra un'oretta a che punto sarà...
Grazie ancora.
Posso approfittarne per chiederti una cosa? Si sà piu' o meno di quanto può variare il conteggio al variare di 1 grado della temperatura?
Title: Re: swRTC
Post by: leo72 on Apr 12, 2012, 08:32 am
No, troppe incognite. Considera che poi il risonatore ceramico adottato sull'Arduino UNO già di suo sbaglia molto (lo dimostrano i tuoi 300 e passa secondi/giorno di differenza).
Title: Re: swRTC
Post by: unoracing on Apr 12, 2012, 08:43 am
Eh già ma era dovuto molto anche al fatto del timer come dicevi te. Ora dopo aver riazzerato anche il setDeltaT sembra sia fuori di circa 143 secondi al giorno e quindi riprovo risettandolo e vediamo come va.
Alla fine io vorrei creare un "orologio" che viene sincronizzato dall'orario ottenuto dal GPS e che poi mi mantenga l'orario in quanto il cronometro per lo scopo per il quale serve a me deve avere l'orario preciso e non deve essere solo un contavanti.
In pratica alla fine il cronometro dovrebbe permettermi di inserire diversi orari in cascata e una volta fatto partire il primo con un pulsante esterno deve effettuare il countdown sino all'orario specificato, ripremendo il pulsante deve passare al secondo countdown e via di seguito sino a quanti orari sono stati specificati dall'utente via tastierina.
Secondo il tuo parere è meglio appoggiarsi ad un rtc tipo DS3234?
Title: Re: swRTC
Post by: leo72 on Apr 12, 2012, 08:49 am
La swRTC è un succedaneo di un RTC vero. Se vuoi la max precisione un RTC esterno è sempre meglio. Se poi devi realizzare un circuito con un Atmega in standalone ed usi un quarzo vero (molto più preciso del risonatore) allora puoi continuare ad usare la swRTC, che acquista precisione. Hai più soluzioni.
Title: Re: swRTC
Post by: unoracing on Apr 12, 2012, 08:58 am
L'obbiettivo era in effetti quello di far la prova con Arduino e poi, una volta che tutti i pezzi del puzzle funzionavano, creare una scheda con tutto incorporato.
Non ho sinceramente capito come faccio però ad aggiungerci un quazo esterno e dire ad arduino di usare quello per il timer.
Altra cosa la variabile setDeltaTsetDeltaT se non sbaglio, tiene conto solo di una cifra dopo il punto nel caso di decimali giusto?
Title: Re: swRTC
Post by: leo72 on Apr 12, 2012, 09:12 am

L'obbiettivo era in effetti quello di far la prova con Arduino e poi, una volta che tutti i pezzi del puzzle funzionavano, creare una scheda con tutto incorporato.
Non ho sinceramente capito come faccio però ad aggiungerci un quazo esterno e dire ad arduino di usare quello per il timer.

Non devi "dirgli nulla". Se usi un Atmega con il bootloader precaricato, il chip è già impostato per lavorare con un generatore di clock esterno, quarzo o risonatore che sia.

Quote

Altra cosa la variabile setDeltaTsetDeltaT se non sbaglio, tiene conto solo di una cifra dopo il punto nel caso di decimali giusto?

Sì solo 1 decimale. setDeltaT accetta un float che spazi tra -600.0 e + 600.0 ma poi converte il float in int con una semplice moltiplicazione per 10. E' inutile usare molti decimali (es 12.4535365262) vista l'approssimazione dei float.
Title: Re: swRTC
Post by: unoracing on Apr 12, 2012, 09:15 am
Perfetto ti ringrazio ancora, davvero molto gentile...
Per il fatto del quarzo, tu intendi crearsi un arduino su piastra mille fori e al posto del risonatore mettere un quarzo da 16Mhz?
Title: Re: swRTC
Post by: leo72 on Apr 12, 2012, 09:36 am

Per il fatto del quarzo, tu intendi crearsi un arduino su piastra mille fori e al posto del risonatore mettere un quarzo da 16Mhz?

Sì, il classico circuito che viene definito "Arduino in standalone". In pratica si tratta di replicare la componentistica minima per far funzionare il microcontrollore.
Title: Re: swRTC
Post by: unoracing on Apr 12, 2012, 09:53 am
Perfetto, grazie ancora.... Andrò avanti con i pezzi del puzzle e appena avrò tutto disponibile (gps, sd, eeprom supplementare, lcd grafico e pulsanti vari) assemblerò e proverò di conseguenza se ho necessità di un rtc esterno o meno. Mi hai schiarito molto le idee.
PS: ho modificato il timer da 2 a 1 nella libreria che hai indicato ma sembra non abbia sortito l'effetto, nel senso che anche se aumento il setDeltaT di un tot per pareggiare la differenza da un crono reale, alla ripartenza dello sketch rimane a sua volta sempre indietro di un secondo ogni 8 minuti circa. Studio un pò la situazione perchè probabilmente a questo punto ho sbagliato qualche cosa io
Title: Re: swRTC
Post by: testato on Apr 12, 2012, 08:49 pm
aggiungo due riflessioni se possono essere utili.
1- arduinoUNO e' predisposto per usare quarzo+Condensatori, quindi puoi dissaldare il risuonatore e modificare arduino
2- la temperatura influisce in minima parte, nelle pagine passate ho inserito dati di miei test in merito, quindi non preoccupartene.
3-vado a memoria, ma l'rtc da te proposto mi sembra non sia i2c, per comodita' conviene prendere i2c, ma visto che tu vuoi gestire l'orologio gia GPS (o altri metodi di correzione), un RTC vero e' inutile, il superiperlavoro di Leo e' piu' che ottimo  :)
Title: Re: swRTC
Post by: leo72 on Apr 12, 2012, 10:01 pm

aggiungo due riflessioni se possono essere utili.
1- arduinoUNO e' predisposto per usare quarzo+Condensatori, quindi puoi dissaldare il risuonatore e modificare arduino

Per dovere di cronaca, precisiamo:
1) l'Arduino 2009 ha un cristallo, per cui questa scheda soffre meno dell'imprecisione sul conteggio della swRTC
2) solo l'Arduino UNO R1, la prima versione quindi, aveva ancora i fori passanti per l'innesto del quarzo e dei relativi condensatori. Dalla R2 in poi questi fori sono stati tolti per cui tale modifica non è più possibile.

Title: Re: swRTC
Post by: unoracing on Apr 13, 2012, 12:53 am

aggiungo due riflessioni se possono essere utili.
1- arduinoUNO e' predisposto per usare quarzo+Condensatori, quindi puoi dissaldare il risuonatore e modificare arduino
2- la temperatura influisce in minima parte, nelle pagine passate ho inserito dati di miei test in merito, quindi non preoccupartene.
3-vado a memoria, ma l'rtc da te proposto mi sembra non sia i2c, per comodita' conviene prendere i2c, ma visto che tu vuoi gestire l'orologio gia GPS (o altri metodi di correzione), un RTC vero e' inutile, il superiperlavoro di Leo e' piu' che ottimo  :)

Grazie per la risposta, avevo pensato di far così:
con il gps prendo l'orario iniziale e sincronizzo l'rtc arduino (software o hardware) per non consumare troppe batterie (per l'impiego che avrà le batterie devo durare almeno 24 ore) dopo il gps sarà spento;
avevo optato per il DS3234 in quanto sembra sia il piu' preciso tra gli economici o sbaglio? In verità il cronometro dovrà avere una tolleranza di circa 1 centesimo di secondo nell'arco delle 24 ore.....
per il fatto che sia i2c o meno sinceramente non so ancora se sia di rilievo;
Purtroppo la precisione, per quello a cui serve a me, è di fondamentale importanza, se qualcuno ha delle idee su come raggiungerla sono pronto ad avventurarmi :-)
Grazie a Leo cmq per il lavoro stupendo sulla libreria, oggi mi son divertito un pochino ma non riesco a scendere sotto al secondo nell'arco delle 24 ore, probabilmente è dovuto alle modifiche che ho fatto io
Title: Re: swRTC
Post by: astrobeed on Apr 13, 2012, 07:59 am

In verità il cronometro dovrà avere una tolleranza di circa 1 centesimo di secondo nell'arco delle 24 ore.....


Scordatela di ottenerla da un device economico, non esiste nulla di così preciso a basso costo e basso consumo, il DS3234 è preciso +/-2 minuti per anno il che significa circa 120s/365 = 0.33 secondi al giorno.
Per ottenere una precisione di 0.01 secondi al giorno serve un clock con una stabilità e un errore minore di 0.12 ppm.


Title: Re: swRTC
Post by: unoracing on Apr 13, 2012, 08:57 am
Grazie Astrobeed, quindi secondo te come potrei arrivare ad una tale precisione?
Title: Re: swRTC
Post by: astrobeed on Apr 13, 2012, 09:28 am

Grazie Astrobeed, quindi secondo te come potrei arrivare ad una tale precisione?


In nessun modo economico e semplice  :)
Devi usare un oscillatore termostabilizzato (http://it.rs-online.com/web/p/oscillatori-controllati/7293329/) (oven controlled), un "giocattolo" che costa come minimo un centone e si mangia almeno 80 mA.
Title: Re: swRTC
Post by: unoracing on Apr 13, 2012, 09:56 am
Beh forse ora capisco perchè i cronometri di precisione costano anche 1000€.... Grazie delle info e scusami per l'ignoranza
Title: Re: swRTC
Post by: astrobeed on Apr 13, 2012, 10:19 am

Beh forse ora capisco perchè i cronometri di precisione costano anche 1000€.... Grazie delle info e scusami per l'ignoranza


Un GPS consuma di meno, e costa meno, di un oscillatore termostabilizzato e ti fornisce un clock con una risoluzione al superiore al millesimo di secondo e una precisione migliore di un miliardesimo di secondo al giorno (orolologio atomico), basta che utilizzi l'apposita uscita a 1Hz, meglio ancora  se usi un modello a 10 Hz, come clock di un counter, previa moltiplicazione x100, e sei a posto.
Ultimamente sono usciti dei cronometri per uso sportivo che utilizzano il GPS come clock di altissima precisione, esistono anche moduli GPS specifici per fornire solo ora, data e clock da utilizzarsi come orologi/cronometri di altissima precisione.



Title: Re: swRTC
Post by: unoracing on Apr 13, 2012, 11:05 am
si si hai ragione il mio dubbio è: se io faccio fare da clock al gps e per caso durante la gara questo per una o due ore non ha segnale, il suo contatore interno è preciso o sbaglia alla grande? io ho già collegato un gps all'arduino e già sono riuscito a sincronizzare la swRtc con i dati del GPS, ma già usandolo qui in ufficio faccio fatica a prendere il segnale.... Anche se devo dire che come GPS utlizzo un holux 236 (modulo con antenna integrata, bluetooth e un pò datato... ), lo ho smontato e collegato in seriale e ha funzionato subito con la tinyGPS. Ora ho smontato un cronometro di precisione e stranamente dentro ho trovato questo rtc: V3025A 28SI.
Non intendendomi sono andato alla ricerca con SanGoogle e ho trovato il datasheet.... dice + o - 5 ppm.... eppure il cronometro in questione perde al massimo 2 centesimi in 3 giorni, provato sincronizzandolo con un'apposito sincronizzato gps. Probabilmente hanno lavorato molto sul software e sui controlli di temperatura (attaccato a lui c'è un sensore di temperatura).
Title: Re: swRTC
Post by: astrobeed on Apr 13, 2012, 11:27 am

dice + o - 5 ppm.... eppure il cronometro in questione perde al massimo 2 centesimi in 3 giorni, provato sincronizzandolo con un'apposito sincronizzato gps. Probabilmente hanno lavorato molto sul software e sui controlli di temperatura (attaccato a lui c'è un sensore di temperatura).


Se conosci perfettamente la curva di deriva termica del quarzo, il che vuol dire provarlo in laboratorio in condizioni controllate e con strumentazione di precisione, puoi compensare l'errore da software, previa taratura iniziale di precisione, se conosci in modo preciso la temperatura del quarzo.

Title: Re: swRTC
Post by: gcblack on Apr 13, 2012, 11:58 am
Scusate se interrompo questa discussione di alto livello per una sciocchezza..
come mai quando carico l'esempio di questa libreria sul serial monitor mi vengono fuori caratteri strani? Dove sbaglio? grazie
Title: Re: swRTC
Post by: astrobeed on Apr 13, 2012, 12:00 pm

come mai quando carico l'esempio di questa libreria sul serial monitor mi vengono fuori caratteri strani? Dove sbaglio? grazie


Hai verificato che il baud rate del serial monitor sia lo stesso previsto nello sketch ?
Title: Re: swRTC
Post by: gcblack on Apr 13, 2012, 12:03 pm
=( Non avevo verificato.. Infatti Funziona!!!  :smiley-mr-green: Grazie Astro e scusa l'ignoranza.. :smiley-red: :smiley-sweat:
Title: Re: swRTC
Post by: testato on Apr 14, 2012, 12:30 am

si si hai ragione il mio dubbio è: se io faccio fare da clock al gps e per caso durante la gara questo per una o due ore non ha segnale, il suo contatore interno è preciso o sbaglia alla grande?

Potresti fare cosi', usi il "mio" DS3231, in questo modo gia' recuperi il 50% di precisione rispetto a quello detto da te, ed e' anche i2c.
Dopodiche' lo tieni sempre fisso con il gps, se, come nell'esempio fatto da te, per solo 1 o 2 ore perde il segnale (cosa difficile, che cavolo si fanno all'aperto ? che c'e' un oscuramento dei satelliti ?) cmq sono solo 2 ore, cioe' l'errore sara' proporzionale a quelle due ore, poi dopo si riaggancera' e sara' dinuovo ultrapreciso.

Altro esempio, se il segnale e' scarso, ed il fix va e viene, comunque durante il VIENE sei dinuovo ultrapreciso, e quindi riperderai quel miliardesimo durante il VA.
Title: Re: swRTC
Post by: unoracing on Apr 14, 2012, 12:37 am
Beh in effetti hai ragione anche se mi sfugge il modo di come si può far una cosa del genere.
Io ad esempio lo sincronizzo una volta sola, tu da come parli metteresti la sincronizzazione nel loop?
Title: Re: swRTC
Post by: unoracing on Apr 14, 2012, 12:46 am
altra cosa:


Potresti fare cosi', usi il "mio" DS3231, in questo modo gia' recuperi il 50% di precisione rispetto a quello detto da te, ed e' anche i2c.[/quote]
Intendi dire che tu ha già usato un DS3231? Se si per cosa? Come si comporta?
Title: Re: swRTC
Post by: testato on Apr 14, 2012, 11:18 am
si, vedi mio avatar, e' un orologio a valvole.

dopo 3 mesi di monitoraggio sta' portando 11 centesimi di secondo di errore al giorno, piu' precisamente in avanti.
Di questo passo supero la precisione dichiarata dal costruttore, aspetto fine anno per un consuntivo.

tornando quindi alla mia idea di tenerlo sincronizzato sempre via GPS (si, nel loop), due ore di buio satellitare ti porterebbero a 1 centesimo di errore, che e' la tua richiesta iniziale, visto che non esiste che hai 2 ore di mancato fix satellitare, sei a cavallo  :)
e cmq sai che se lo usi al coperto, per una gara di 4 ore, stai sbagliando di 2 centesimi

ot: la gestione dell'ora legale ha funzionato, mettendo in evidenza anche un piccolo bug sw  :)
Title: Re: swRTC
Post by: leo72 on Apr 14, 2012, 11:26 am

ot: la gestione dell'ora legale ha funzionato, mettendo in evidenza anche un piccolo bug sw  :)

Di cosa? Della swRTC modificata che ti ho passato?
Title: Re: swRTC
Post by: testato on Apr 14, 2012, 11:33 am
nono, del mio sistema di risparmio energetico, tengo accese le valvole solo 8 ore al giorno, ed in quel giorno si sono accese con un'ora di errore.
cosa da niente.
p.s. per precisione e' il "mio" controllo ora legale, non mi andava di aspettare, finii ad implementarla prima che tu finissi la tua.

In definitiva nel mio orologio non c'e' una virgola della swRTC, ma la swRTC e' pur sempre il primo amore perche' iniziai con essa.  :)
Title: Re: swRTC
Post by: leo72 on Apr 14, 2012, 11:40 am

p.s. per precisione e' il "mio" controllo ora legale, non mi andava di aspettare, finii ad implementarla prima che tu finissi la tua.

La swRTC con il controllo dell'ora legale (swRTC2) è funzionante, gli manca solo l'ultima funzione di impostazione dell'ora con un timestamp.
Title: Re: swRTC
Post by: unoracing on Apr 14, 2012, 02:48 pm
Grazie Testato, ma del tuo orologio hai documentazione da qualche parte? Cmq grazie per i consigli, il cronometro in questione purtroppo non viene usato su circuito o su kart e quindi in un luogo dove sai a priori se prende o meno, bensì lo userò per delle manifestazioni di regolarità e quindi può capitare che non sincronizzi spesso, in quanto in una manifestazione di regolarità capita che sei in montagna in posti inimmaginabili e se il ricevitore non è abbastanza potente molte volte non prende per un pò. La tua soluzione cmq mi piace e penso sarà quella che adotterò.
Esiste una swRTC versione 2?? scusatemi ma non ne sapevo nulla....
Title: Re: swRTC
Post by: leo72 on Apr 14, 2012, 03:01 pm

Esiste una swRTC versione 2?? scusatemi ma non ne sapevo nulla....

Era una 1.9b per l'esattezza. Comunque non ne ho portato avanti lo sviluppo perché la questione dell'ora legale era un "pallino" di Testato, che alla fine non riguardava direttamente la libreria dato che uno può benissimo farlo da codice con 2 righe in più, quindi ho lasciato perdere. Se proprio la vuoi, basta che cerchi nei vecchi post di questo thread: dovresti trovare il link.
Title: Re: swRTC
Post by: unoracing on Apr 14, 2012, 03:04 pm
Ok grazie ancora Leo
Title: Re: swRTC
Post by: testato on Apr 14, 2012, 03:50 pm
x leo: si, so che e' funzionante, ma io la implementai via codice prima che tu finissi. A proposito visto che nel mio attuale progetto sto' usando la swRTC non ricordo piu' se e' implementato o meno il giorno della settimana

x unoracing: il mio orologio a valvole per ora e' un progetto segreto, niente documentazione, ma a parole posso sempre aiutarti  :)
Ti basta sapere che l'RTC da me indicato e' compatibile con le librerie DS1307 e lo colleghi in i2c, quindi solo due pin occupati su arduino
Title: Re: swRTC
Post by: unoracing on Apr 14, 2012, 03:59 pm
perfetto Testato, ti ringrazio della disponibilità. Anch'io mi indirizzerò su quel rtc penso ma sino a quando non mi arriva il materiale vado avanti con questa bellissima swRTC. Altra cosa anche se un pò suori swrtc, secondo voi tra una arduino standalone, display 128x64 glcd, rtc e gps, che batteria dovrei mettere perchè mi duri almeno una giornata?
Title: Re: swRTC
Post by: testato on Apr 14, 2012, 04:08 pm
il grosso te lo consuma la retroilluminazione, di che tipo e' ?
controlla quanto ti consuma e poi ci aggiungi 300mA, ed avrai un valore approssimativo che ti da' l'idea giusta
Title: Re: swRTC
Post by: unoracing on Apr 14, 2012, 04:18 pm
pensavo al ks0108 piu' controller per renderlo 12c, però sono indeciso se è meglio blue o il classico con retrilluminazione verde
Title: Re: swRTC
Post by: testato on Apr 14, 2012, 04:25 pm
il blu e' piu' tamarro.... parliamo di corse ?
VA BENE IL TAMARROOOO  :)
Title: Re: swRTC
Post by: leo72 on Apr 14, 2012, 04:52 pm

A proposito visto che nel mio attuale progetto sto' usando la swRTC non ricordo piu' se e' implementato o meno il giorno della settimana

Certo. Metodo .weekDay  ;)
Title: Re: swRTC
Post by: menniti on Apr 14, 2012, 08:05 pm

il grosso te lo consuma la retroilluminazione, di che tipo e' ?
controlla quanto ti consuma e poi ci aggiungi 300mA, ed avrai un valore approssimativo che ti da' l'idea giusta

Per la verità molti LCD di generazione più recente spesso hanno a bordo una R da 500 ohm in serie all'anodo del led della retro, il che significa che gli bastano 10mA ber essere illuminati e ti assicuro che danno ottimi risultati; ne parlammo con leo ai tempi della sua stazione meteo (da allora ne è venuta giù acqua :smiley-mr-green:)
Title: Re: swRTC
Post by: astrobeed on Apr 14, 2012, 09:20 pm

Per la verità molti LCD di generazione più recente spesso hanno a bordo una R da 500 ohm in serie all'anodo del led della retro, il che significa che gli bastano 10mA ber essere illuminati


Su gli LCD di ultima generazione bastano 50 mA per ottenere una buona luminosità, di meno è impossibile perché in realtà è un array di led composto da almeno due file in parallelo, se non quattro, quindi 50 mA a 5V (= 0.25 Watt) è veramente il minimo sindacale per ottenere una retroilluminazione ben fatta, la resistenza in serie è di poche decine di ohm.
Su i display più vecchi, sopratutto quelli verdi low cost, correnti di oltre 150 mA sono la norma per la retro.
Title: Re: swRTC
Post by: menniti on Apr 14, 2012, 09:24 pm
io non ho sottomano uno schema elettrico, quindi può essere che quella 500 ohm serva per pilotare un transistor interno, non so dirti, di sicuro è in serie al pin su cui si collegano direttamente i +5V per la retro. La storia del transistor si spiegherebbe col fatto che così si evita di dover mettere una R esterna (ricordi quelli che ogni tanto sbampavano la retro perché schiaffavano i 5V direttamente sul led?)Sinceramente non ho fatto misurazioni, mi riservo per la prima occasione.
Title: Re: swRTC
Post by: astrobeed on Apr 14, 2012, 09:40 pm

io non ho sottomano uno schema elettrico, quindi può essere che quella 500 ohm serva per pilotare un transistor interno, non so dirti, di sicuro è in serie al pin su cui si collegano direttamente i +5V per la retro.


500 ohm è impossibile perché la caduta di tensione su i led è molto prossima ai 5V, solitamente circa 4.5V e facendo un semplice conto per far scorrere 50 mA bastano(5-4.5)V /0.05 mA = 10 ohm.
Title: Re: swRTC
Post by: unoracing on Apr 14, 2012, 09:46 pm
Grazie mi state schiarendo parecchio le idee, meglio se apro una discussione apposita sul mio progetto?
Title: Re: swRTC
Post by: testato on Apr 14, 2012, 10:31 pm
scusa leo, non trovo esempi che mi aiutano.

il .weekDay funziona solo se gli viene passato il timestamp ?
Se io regolo semplicemente l'orario manualmente nello sketch, da esso non posso tirar fuori il giorno della settimana ?

ho provato ad inserire
Code: [Select]
lcd.print(rtc.getTimeStamp(), DEC);
ma non compila  :(

ed anche
Code: [Select]
lcd.print(rtc.weekDay(), DEC);

non va


Gli RTC forniscono direttamente il gorno della settimana, come fanno ?
Title: Re: swRTC
Post by: leo72 on Apr 14, 2012, 11:34 pm

scusa leo, non trovo esempi che mi aiutano.

il .weekDay funziona solo se gli viene passato il timestamp ?
Se io regolo semplicemente l'orario manualmente nello sketch, da esso non posso tirar fuori il giorno della settimana ?

ho provato ad inserire
Code: [Select]
lcd.print(rtc.getTimeStamp(), DEC);
ma non compila  :(

ed anche
Code: [Select]
lcd.print(rtc.weekDay(), DEC);

non va

Non mi ricordavo. weekDay lavora effettivamente su un timestamp.
Hai 2 alternative. La prima è un po' ridondante ma dovrebbe funzionare:
lcd.print(rtc.weekDay(rtc.getTimeStamp()));
In pratica stampi il giorno dato dal timestamp dell'orario attuale.
La seconda è usare la funzione weekDay cheil giorno seguente è venerdì c'era nella swRTC2. Quella funzione calcola il giorno della settimana in base al giorno giuliano, quest'ultimo lo calcola con la data che gli viene passata.

Quote

Gli RTC forniscono direttamente il gorno della settimana, come fanno ?

Hanno un registro che incrementano ad ogni incremento del giorno. Però  un registro "passivo" nel senso che lo devi impostare tu insieme alla data ed ora, non è calcolato dall'RTC. Quindi se tu ad un giovedì metti che è invece lunedì, all'RTC va bene.
Title: Re: swRTC
Post by: testato on Apr 14, 2012, 11:50 pm
1-     lcd.print(rtc.weekDay(rtc.getTimeStamp())); mi da errore
Code: [Select]
test.cpp: In function 'void loop()':
test:201: error: 'class swRTC' has no member named 'getTimeStamp'


2- il comando rtc.getTimeStamp() che fa ? prende ora e data (settati da me manualmente nel void setup) e li trasforma in timestamp ?

3- fare: lcd.print(rtc.getTimeStamp(), DEC); dovrebbe stamparmi i timestamp ? a me da errore, come sopra

thanks

o.t. sono stato in giro nel tuo blog, ho letto le radici del dos, interessantissimo articolo  :)

Title: Re: swRTC
Post by: pablos71 on Apr 14, 2012, 11:52 pm
Sera a tutti
questo server NTP che sarebbe INRIM Italia non mi risponde più da ieri pomeriggio, qualcuno ha occasione di verificare se funziona?

IPAddress timeServer(192, 43, 244, 18)

ne ho messo uno di New York City, e funziona, siccome ho lasciato 2 mesi in test arduino mi sa tanto che mi hanno bannato l'ip  (aggiornava ogno 30 secondi) mi sa che ho esagerato :) o sarà solo un disservizio

ciao
Title: Re: swRTC
Post by: leo72 on Apr 14, 2012, 11:58 pm

1-     lcd.print(rtc.weekDay(rtc.getTimeStamp())); mi da errore
Code: [Select]
test.cpp: In function 'void loop()':
test:201: error: 'class swRTC' has no member named 'getTimeStamp'


Scusa, è scritto male. E' getTimestamp. L'ho cambiato da getTimeStamp a getTimestamp nelle ultime versioni.

Quote

2- il comando rtc.getTimeStamp() che fa ? prende ora e data (settati da me manualmente nel void setup) e li trasforma in timestamp ?

Restituisce un timestamp, ossia il numero di secondi dall'epoca di riferimento (l'anno passato come parametro, che può essere 1900 o  1970. Di defualt è 1970..

Quote

3- fare: lcd.print(rtc.getTimeStamp(), DEC); dovrebbe stamparmi i timestamp ? a me da errore, come sopra

thanks

Come sopra, getTimestamp.
o.t. sono stato in giro nel tuo blog, ho letto le radici del dos, interessantissimo articolo  :)
Title: Re: swRTC
Post by: menniti on Apr 15, 2012, 11:47 am


io non ho sottomano uno schema elettrico, quindi può essere che quella 500 ohm serva per pilotare un transistor interno, non so dirti, di sicuro è in serie al pin su cui si collegano direttamente i +5V per la retro.


500 ohm è impossibile perché la caduta di tensione su i led è molto prossima ai 5V, solitamente circa 4.5V e facendo un semplice conto per far scorrere 50 mA bastano(5-4.5)V /0.05 mA = 10 ohm.

Mi scuso con Leo, ma almeno dimostro che non dico strnzt (http://arduino.cc/forum/index.php/topic,86632.msg649708.html#msg649708); in questo Topic hai proprio conferma di quello che sto dicendo, quindi dando per scontato che tu abbia ragione (e non mi azzarderei a fare diversamente :smiley-mr-green:) resta solo l'ipotesi del pilotaggio di un transistor, la R smd da 501 in serie all'anodo del led c'è; qui leggi la conferma ma io ho anche verificato il collegamento fisico verso il pin esterno; non posso dire però a valle se va sul led o su un transistor.
Title: Re: swRTC
Post by: astrobeed on Apr 15, 2012, 12:21 pm

in questo Topic hai proprio conferma di quello che sto dicendo, quindi dando per scontato che tu abbia ragione (e non mi azzarderei a fare diversamente :smiley-mr-green:) resta solo l'ipotesi del pilotaggio di un transistor, la R smd da 501 in serie all'anodo del led c'è;


Facciamo un banalissimo conto, I = V/R = 5/500 = 10 mA se sono tutti i 5V ai capi della R, se poi ci mettiamo di mezzo la caduta di tensione su i led la corrente diventa ridicola anche considerando solo 3V di caduta, 2/500 = 4 mA.
Non metto in dubbio che sul display di cui parli hai visto una R da 500 ohm collegata sul contatto dell'Anodo della retro, ma non va verso l'anodo, sicuramente va da qualche altra parte, nessun display LCD di quel tipo possiede un driver dedicato per la corrente della retro, solo alcuni modelli di fascia alta, e abbastanza costosi, hanno generatori a corrente costante integrati sulla board.

Title: Re: swRTC
Post by: testato on Apr 15, 2012, 12:21 pm
Non pensavo di scalarti test su questa questione.
Mi devo ricredere, oltre a scalarti 3 test devo mandarti anche fattura perche'
i test sono gratuiti, ma la documentazione dei bug e' a pagamento  :)

Bug TIMESTAMP:

Comandi usati:
Code: [Select]
Serial.println(rtc.getTimestamp(), DEC);
Serial.println(rtc.weekDay(rtc.getTimestamp()), DEC);


Risultato su un Venerdi' del 1999
Quote
Data settata manualmente: 16,04,1999 (venerdi)
924267591 timestamp
5 weekday


Risultato su un Venerdi' del 2012
Quote
Data settata manualmente: 13,04,2012 (venerdi)
1334235591 timestamp
4 weekday


Come vedi nel 1999 il venerdi' risulta il numero 5, nel 2012 il venerdi' risulta il numero 4
Sembrava a prima vista un bug in weekday, invece e' un bug del timestamp perche' ho controverificato i dati:
- 924267591 corrisponde al 16 di Aprile del 1999, quindi Venerdi', quindi 5
- 1334235591 invece corrispode al 12 di Aprile del 2012, quindi essendo Giovedi', weekday mette 4

Proposta:
Visto che devi fare le correzioni alla documentazione, per il discorso TimeStamp-->Timestamp
Visto che devi correggere il bug timestamp
Perche' non approfitti per eliminare il comando rtc.weekDay e crearne uno piu' comodo per gli utenti rtc.getWeekday. In questo modo sarebbe tutto piu' lineare, e chi vuole il giorno della settimana lo stampa in modo diretto senza dover prima capire cosa e', e come usare il timestamp.

Tanto era dovuto, porgo distinti saluti  :)
Title: Re: swRTC
Post by: menniti on Apr 15, 2012, 12:27 pm


in questo Topic hai proprio conferma di quello che sto dicendo, quindi dando per scontato che tu abbia ragione (e non mi azzarderei a fare diversamente :smiley-mr-green:) resta solo l'ipotesi del pilotaggio di un transistor, la R smd da 501 in serie all'anodo del led c'è;


Facciamo un banalissimo conto, I = V/R = 5/500 = 10 mA se sono tutti i 5V ai capi della R, se poi ci mettiamo di mezzo la caduta di tensione su i led la corrente diventa ridicola anche considerando solo 3V di caduta, 2/500 = 4 mA.
Non metto in dubbio che sul display di cui parli hai visto una R da 500 ohm collegata sul contatto dell'Anodo della retro, ma non va verso l'anodo, sicuramente va da qualche altra parte, nessun display LCD di quel tipo possiede un driver dedicato per la corrente della retro, solo alcuni modelli di fascia alta, e abbastanza costosi, hanno generatori a corrente costante integrati sulla board.

ok, la cosa strana è che questi display li puoi alimentare direttamente con 5V, senza limitazione di corrente, e assorbono poco. Appena posso faccio due prove: voglio misurare l'assorbimento della sola retro, poi mi collego a valle della R da 501, con una R esterna, per vedere che succede; tanto ho un display che ha il controller sballato e non rischio nulla ;)
Title: Re: swRTC
Post by: astrobeed on Apr 15, 2012, 12:37 pm

ok, la cosa strana è che questi display li puoi alimentare direttamente con 5V, senza limitazione di corrente, e assorbono poco.


Mica c'è niente di strano, a seconda del modello i display LCD possono essere sia con che senza resistenze di limitazione per la retro e l'alimentazione per questa può essere sia separata da quella della logica che essere in comune.
Mi spiego meglio, su alcuni LCD basta che dai il 5V sui i relativi contatti e si accende anche la retro, su altri modelli è necessario portare i 5V ai contatti dedicati per la retro perché sono isolati da quella principale, solitamente arrivano questi perché in questo modo è possibile controllare l'accensione e/o la luminosità della retro.
In alcuni modelli sono già presenti le resistenze di limitazione della corrente in altri non ci sono e vanno messe esternamente, su molti modelli di display è presente una matrice di alimentazione per la retro tramite la quale è possibile scegliere dove collegarla ed eventualmente montare direttamente sul pcb le resistenze di limitazione.
Quanta corrente richiede la retro dipende dal modello del display, dalle sue dimensioni e pure dal colore, io ho dei vecchi LCD 4x20 con retro verde che se non gli dai almeno 200 mA la retro è fioca, però ho pure dei moderni LCD blu con scritta bianca che con 50 mA ti ci abbronzi  :)
Insomma è un gran casino  :smiley-mr-green:
Title: Re: swRTC
Post by: leo72 on Apr 15, 2012, 02:06 pm

Non pensavo di scalarti test su questa questione.
Mi devo ricredere, oltre a scalarti 3 test devo mandarti anche fattura perche'
i test sono gratuiti, ma la documentazione dei bug e' a pagamento  :)

OK. Fattura a
Menniti Prof. Michele
Piazza La Bomba E Scappa
Lamezia Terme
:smiley-yell: :smiley-yell:

Quote

Come vedi nel 1999 il venerdi' risulta il numero 5, nel 2012 il venerdi' risulta il numero 4
Sembrava a prima vista un bug in weekday, invece e' un bug del timestamp perche' ho controverificato i dati:
- 924267591 corrisponde al 16 di Aprile del 1999, quindi Venerdi', quindi 5
- 1334235591 invece corrispode al 12 di Aprile del 2012, quindi essendo Giovedi', weekday mette 4

Adesso non sono a casa per cui non posso fare prove ma non vorrei che il problema fosse il "2000" nel mezzo, che è un anno centenario ma anche quadricentenario quindi per il primo caso non sarebbe bisestile ma per il secondo sì. E' la prima ipotesi che mi viene a mente. Oggi o domani indago meglio.

Quote

Proposta:
Visto che devi fare le correzioni alla documentazione, per il discorso TimeStamp-->Timestamp



Quote

Visto che devi correggere il bug timestamp



Quote

Perche' non approfitti per eliminare il comando rtc.weekDay e crearne uno piu' comodo per gli utenti rtc.getWeekday. In questo modo sarebbe tutto piu' lineare, e chi vuole il giorno della settimana lo stampa in modo diretto senza dover prima capire cosa e', e come usare il timestamp.

Ci penso  :P

Quote

Tanto era dovuto, porgo distinti saluti  :)


Altrettanto a lei  ;)
Title: Re: swRTC
Post by: PaoloP on Apr 15, 2012, 02:12 pm

Non pensavo di scalarti test su questa questione.
Mi devo ricredere, oltre a scalarti 3 test devo mandarti anche fattura perche'
i test sono gratuiti, ma la documentazione dei bug e' a pagamento  :)

Bug TIMESTAMP:

Comandi usati:
Code: [Select]
Serial.println(rtc.getTimestamp(), DEC);
Serial.println(rtc.weekDay(rtc.getTimestamp()), DEC);


Risultato su un Venerdi' del 1999
Quote
Data settata manualmente: 16,04,1999 (venerdi)
924267591 timestamp
5 weekday


Risultato su un Venerdi' del 2012
Quote
Data settata manualmente: 13,04,2012 (venerdi)
1334235591 timestamp
4 weekday


Come vedi nel 1999 il venerdi' risulta il numero 5, nel 2012 il venerdi' risulta il numero 4
Sembrava a prima vista un bug in weekday, invece e' un bug del timestamp perche' ho controverificato i dati:
- 924267591 corrisponde al 16 di Aprile del 1999, quindi Venerdi', quindi 5
- 1334235591 invece corrispode al 12 di Aprile del 2012, quindi essendo Giovedi', weekday mette 4

Proposta:
Visto che devi fare le correzioni alla documentazione, per il discorso TimeStamp-->Timestamp
Visto che devi correggere il bug timestamp
Perche' non approfitti per eliminare il comando rtc.weekDay e crearne uno piu' comodo per gli utenti rtc.getWeekday. In questo modo sarebbe tutto piu' lineare, e chi vuole il giorno della settimana lo stampa in modo diretto senza dover prima capire cosa e', e come usare il timestamp.

Tanto era dovuto, porgo distinti saluti  :)


Provo anche io a fare dei test.
Title: Re: swRTC
Post by: testato on Apr 15, 2012, 03:47 pm

inserendo qui http://www.mario-online.com/timestamp.php il timestamp controlli se il numero è corretto,

ATTENZIONE
questo server ha diversi bug, ho gia' contattato l'autore.

Piu' precisamente:
1- di base sbaglia di 1 ora, basta inserire come timestamp 1 (quindi il pimo secondo) di gen 1970 ed invece segna Ore 1:00 e 1sec

2- spesso sbaglia di 2 ore, ad esempio se si mette il timestamp di oggi sbaglia di due ore, forse c'e' in gioco qualche conversione che tiene conto dell'ora legale lato server ? non so ma di certo non e' giusto sbagliare, specialmente se a volte di una sola ora ed altre volte di due ore.

3- non accetta l'inserimento di 0 come timestamp, ma solo di 00 (al fine di ricevere gen 1970). Credo sia corretto che se accetta 1 deve accettare anche 0

Usate questo, consigliato anche da Leo a suo tempo, http://www.onlineconversion.com/unix_time.htm
Title: Re: swRTC
Post by: PaoloP on Apr 15, 2012, 04:46 pm
il timestamp, almeno quello ufficiale dei server ntp, segue l'orario UTC, quello di Greenwich. Il fuso orario e l'ora legale non sono considerati.
Title: Re: swRTC
Post by: testato on Apr 15, 2012, 05:11 pm
lo so, infatti se rileggi ho ipotizzato problemi legati all'ora solare lato server, nel senso che magari, senza saperlo, si affida a qualche orologio per la conversione che tiene conto di questa cosa. Ripeto non lo so, ma il bug esiste, di base aggiunge un'ora, ed in alcune condizioni ne aggiunge una seconda.

Questo non c'entra nulla con il bug della swRTC che invece di suo sbaglia di un giorno esatto con timestamp successivi al 1999.
Ho scoperto il millennium bug della swRTC  :)
Title: Re: swRTC
Post by: lestofante on Apr 16, 2012, 12:00 pm
se non ho capito male l'errore è in setClockWithTimestamp
controlla che il valore ritornato dalla funzione sia 0, se non lo è dimmi che valore ha che identifica quale operazione è andata storta

sarebbe anche utile sapere che anno di riferimento hai usato, e se usare un altro anno cambia la data di bug (se poi mi trovi anche l'altra data di bug sei un tesoro)

ps. Leo non ho notato la sezione "bug noti" sulla pagina di download, io la metterei
pps. grazie per la menzione  :smiley-mr-green:
Title: Re: swRTC
Post by: leo72 on Apr 16, 2012, 12:13 pm

ps. Leo non ho notato la sezione "bug noti" sulla pagina di download, io la metterei

Forse aggiungerlo al readme.

Quote

pps. grazie per la menzione  :smiley-mr-green:

Non mi devi ringraziare, è il minimo per l'aiuto ricevuto  ;)
Title: Re: swRTC
Post by: leo72 on Apr 16, 2012, 12:40 pm

o.t. sono stato in giro nel tuo blog, ho letto le radici del dos, interessantissimo articolo  :)

Scusa se non ho dato seguito a questo tuo msg ma mi sa che mi sono mangiato la risposta.  :smiley-sweat:
Te la ripropongo.

Sono un amante di tutto ciò che è informatica anni '70/'80. Sulla Wiki ho tradotto un sacco di pagine in merito ed ho contribuito ad ampliarne tante altre.
Se vai sulla mia pagina utente sulla wiki (qui (http://it.wikipedia.org/wiki/Utente:Leo72)) vedi che cosa ho combinato  :smiley-sweat:
Title: Re: swRTC
Post by: menniti on Apr 22, 2012, 06:04 pm

ok, la cosa strana è che questi display li puoi alimentare direttamente con 5V, senza limitazione di corrente, e assorbono poco. Appena posso faccio due prove: voglio misurare l'assorbimento della sola retro, poi mi collego a valle della R da 501, con una R esterna, per vedere che succede; tanto ho un display che ha il controller sballato e non rischio nulla ;)

Scoperto l'arcano, mi scuso ancora con Leo, ma la cosa è nata qui e la devo chiudere qui, un Topic mi pare ridicolo.
La R è effettivamente in serie al catodo (non all'anodo come pensavo ma è la stessa cosa), ma non è da 510 ohm; 510 è la sua sigla che in smd significa 51 + 0 zeri = 51 ohm (510 ohm in realtà sono siglati 511). Il consumo effettivo, misurato con strumento serio, è di 37-38mA circa sia per un 4x20 che per un 2x16. Direi che l'hanno reso pilotabile direttamente con un pin di Arduino. Se poi il pin fosse un pwm e si evitassero i valori limite alti io penso che si possa proprio alimentarlo direttamente senza rischiare nulla, poi un BC non fa mai male, ma in casi particolari....
Scusa ancora Leo :smiley-mr-green:
Title: Re: swRTC
Post by: leo72 on Apr 22, 2012, 06:38 pm

Scusa ancora Leo :smiley-mr-green:

E di che?  ;)
Title: Re: swRTC
Post by: testato on Apr 22, 2012, 07:24 pm
scusa Leo, ma stai lavorando al bug riscontrato o non te ne puo' fregar di meno ?  :smiley-mr-green:
http://arduino.cc/forum/index.php/topic,73496.msg760934.html#msg760934
Title: Re: swRTC
Post by: leo72 on Apr 22, 2012, 10:59 pm

scusa Leo, ma stai lavorando al bug riscontrato o non te ne puo' fregar di meno ?  :smiley-mr-green:
http://arduino.cc/forum/index.php/topic,73496.msg760934.html#msg760934

Non me lo ricordavo neanche  XD
Cmq sono un po' incasinato in questi giorni. Ho i figlioli sempre in casa perché domani è il patrono del paese dove vivo per cui non vanno a scuola, forse riesco a darci un'occhiata martedì. Se me lo ricordo  :smiley-sweat:c'è con
Title: Re: swRTC
Post by: testato on Apr 22, 2012, 11:18 pm
infatti non e' mia norma fare degli UP del genere, ma conoscendoti avevo intuito che te ne fossi dimenticato.
Visto che questa volta sono seriamente intenzionato di usare la swRTC mi serve sapere se assegnare 0 per la domenica o per il lunedi'  :)

logicamente non c'e' nessuna fretta di fare nulla, "se fa pe' ride"  :)
Title: Re: swRTC
Post by: lestofante on Apr 23, 2012, 12:33 am

se non ho capito male l'errore è in setClockWithTimestamp
controlla che il valore ritornato dalla funzione sia 0, se non lo è dimmi che valore ha che identifica quale operazione è andata storta

sarebbe anche utile sapere che anno di riferimento hai usato, e se usare un altro anno cambia la data di bug (se poi mi trovi anche l'altra data di bug sei un tesoro)

ps. Leo non ho notato la sezione "bug noti" sulla pagina di download, io la metterei
pps. grazie per la menzione  :smiley-mr-green:


se mi date queste info ci do un'occhiata io
Title: Re: swRTC
Post by: leo72 on Apr 23, 2012, 11:18 am
L'errore è proprio in getTimestamp.
Usando questo servizio qui:
http://www.unixtimestamp.com/index.php
(più affidabile degli altri link, anche il secondo citato ha un bug)

Inserendo 29/02/2000-12:00:00 il timestamp calcolato dalla swRTC e da quel sito corrispondono perfettamente; ah, piccola cosa: dovete mettere 06:00:00 come orario sul sito perché lo script calcola il fuso orario dal vostro browser, adeguando i calcoli delle ore per l'UTC ed il DST.

Il 28/02/2001 ha già un ritardo di 24 ore. Però calcolando per il 13/04/2012-12:00:00 ho una differenza di 23 ore!  Poi perché tornano 23 ore di scarto? Boh.
Title: Re: swRTC
Post by: leo72 on Apr 23, 2012, 11:58 am
Eh sì, l'errore è in getTimestamp. 29/02/2000 e 01/03/2000 danno lo stesso timestamp, per cui il calcolatore ha qualche problema con il 29/02/2000, che è un bisestile particolare (l'anno è divisibile per 4, per 100 e per 400 e come tale non è bisestile per la regola dei secoli ma lo è per la regola dei 400 anni).

Allegata c'è la nuova versione 1.0.2 che introduce un fix temporaneo per il calcolo dei timestamp appartenenti a giorni successi al 29/02/2000. E' temporaneo perché ho notato una certa imprecisione nel calcolo del timestamp dovuto all'uso dei float. Mi sa che prima o poi devo ricontrollare l'algoritmo.

Ah, ho modificato il nome interno della variabile che mantiene i secondi dell'orologio. All'esterno non cambia nulla per l'utente ma internamente questa modifica permette di compilare la libreria anche a chi ha modificato il core secondo i miei suggerimenti per introdurre la gestione dei secondi accanto a quella dei millis.
Title: Re: swRTC
Post by: lestofante on Apr 23, 2012, 12:11 pm
uhmmm

Code: [Select]
if (time>951847199) { time +=86400; } //year 2000 is a special leap year, so 1 day must be added if date is greater than 29/02/2000


che è questa roba? perchè l'anno 2000 dovrebbe essere un caso particolare di leap year? perchè hai messo il valore in secondi, quindo invece il punto di riferimento può variare in base a che l'anno sia 1900 o 1970? è forse un tentativo di correzione al bug sopracitato, o magari la sua origine??
Title: Re: swRTC
Post by: leo72 on Apr 23, 2012, 12:43 pm
E' una correzione temporanea. Come ho spiegato in cima al thread, questa soluzione è "posticcia", nel senso che ci sono errori interni ben più subdoli introdotti dall'uso dei float. Difatti se si calcola il timestamp per il 13/04/2012 e lo si confronta con quello calcolato sul sito segnalato, si nota una differenza di 1 ora. Non va bene.

Il 2000 è un anno particolare perché in teoria non dovrebbe essere bisestile dato che è sì divisibile per 4 ma lo è anche per 100, e la regola dice che gli anni divisibili per 100 non sono bistestili. Ma lo diventa perché contemporaneamente è divisibile anche per 400. Perché è particolare? Perché gli anni quadrisecolari servono per introdurre un giorno aggiuntivo per correggere gli arrotondamenti minori introdotti dall'uso dell'arrotondamento nel computo della durata dell'anno solare.
Si assume infatti che l'anno solare duri 365.25 giorni, per cui 0.25*4=1 che è il giorno che ogni 4 anni si aggiunge al calendario. In realtà la durata dell'anno solare è di 365.2422 giorni. Ecco la spiegazione dalla Wiki:
Quote
Nel calendario giuliano è bisestile un anno ogni 4 (quelli la cui numerazione è divisibile per 4): la durata media dell'anno diventa così di 365,25 giorni (365 giorni e 6 ore) e la differenza rispetto all'anno tropico si riduce da 5,8128 ore in difetto ad appena 11 minuti e 14 secondi in eccesso. Il calendario gregoriano riduce ulteriormente questa approssimazione eliminando 3 anni bisestili ogni 400 anni di calendario rispetto al calendario giuliano: in questo modo la durata media dell'anno diventa di 365,2425 giorni (365 + 97/400), riducendo la differenza a soli 26 secondi di eccesso.


Insomma, ciò che ho fatto io è un sistema rozzo: controllo se la data è successiva al 29/02/2000. Nel caso, aggiungo un ulteriore giorno (86400 secondi) per far sì che sia tenuto conto dell'anno bisestile "forzato".

Rivedrò la formula mettendo un vero conteggio dei giorni realmente passati, perché questo sistema basato sui float non è preciso.
Title: Re: swRTC
Post by: lestofante on Apr 23, 2012, 01:14 pm
ma noi usiamo già 365.2422, quindi ne tieni già conto.

Non capisco perchè usi i float a questo punto, passa agli unsigned long direttamente.

per quanto riguarda il fatto che la funzione deve riconoscere il 2000, fai
if (anno%100 == 0) return '1'
Title: Re: swRTC
Post by: leo72 on Apr 23, 2012, 02:26 pm

ma noi usiamo già 365.2422, quindi ne tieni già conto.

Non capisco perchè usi i float a questo punto, passa agli unsigned long direttamente.

per quanto riguarda il fatto che la funzione deve riconoscere il 2000, fai
if (anno%100 == 0) return '1'

Sì si usa 365.2422 però il problema è che a livello civile è che l'anno bisestile viene introdotto ogni 4 anni, quindi un anno dura 365.25. Ecco che l'arrotondamento viene fuori.
L'algoritmo basato sui float lo presi da internet però non era il sistema migliore, solo uno che funzionava.
Title: Re: swRTC
Post by: lestofante on Apr 23, 2012, 02:32 pm
o fai l'arrotondamento con l'if e usi il .25 o fai senza if e usi il valore preciso. visto che in questo caso vuoi i secondi, vai di preciso e fregatene dell'if.
Title: Re: swRTC
Post by: leo72 on Apr 23, 2012, 02:58 pm

o fai l'arrotondamento con l'if e usi il .25 o fai senza if e usi il valore preciso. visto che in questo caso vuoi i secondi, vai di preciso e fregatene dell'if.

A parte che ho capito metà di quello che mi hai scritto  :smiley-sweat: ma la parte decimale serve in quell'algoritmo proprio per come è strutturato.
Title: Re: swRTC
Post by: testato on Apr 28, 2012, 09:29 pm
ho testato la 1.0.2, tutto ok con il time stamp

ricordati di rtc.getWeekDay quando ci rimetterai mano.

Inoltre credo sarebbe comodo e bello che nello sketch di esempio ci inserissi tutte le funzioni, quindi includere timestamp e weekday

non so se e' una svista, ma nel primo post del topic sono inserite due versioni, perche' non lasci solo l'ultima ?
Title: Re: swRTC
Post by: leo72 on Apr 28, 2012, 11:16 pm

ho testato la 1.0.2, tutto ok con il time stamp

ricordati di rtc.getWeekDay quando ci rimetterai mano.

Inoltre credo sarebbe comodo e bello che nello sketch di esempio ci inserissi tutte le funzioni, quindi includere timestamp e weekday

non so se e' una svista, ma nel primo post del topic sono inserite due versioni, perche' non lasci solo l'ultima ?

Sarà fatto.
Title: Re: swRTC
Post by: unoracing on May 01, 2012, 09:53 am
Buongiorno a tutti, stò provando da un bel pò di giorni ad usare la swRTC, come ben sapete, però non riesco a trovare il delta corretto per far in modo che l'arduino non perda moltissimo in un giorno... Al momento ho risultati discontinui e sbaglia anche di diversi minuti in un giorno, può dipendere dal fatto che è alimentato dal pc?
Title: Re: swRTC
Post by: leo72 on May 01, 2012, 10:02 am

Buongiorno a tutti, stò provando da un bel pò di giorni ad usare la swRTC, come ben sapete, però non riesco a trovare il delta corretto per far in modo che l'arduino non perda moltissimo in un giorno... Al momento ho risultati discontinui e sbaglia anche di diversi minuti in un giorno, può dipendere dal fatto che è alimentato dal pc?

Se usi un Arduino UNO dipende dal suo risonatore ceramico, che ha una precisione molto ridotta (con scarti anche di +-20% rispetto al clock reale). Una maggior precisione la puoi ottenere o con una scheda tipo Arduino 2009, dotata di un cristallo, o costruendo un circuito standalone sempre con un quarzo oppure usando un modulo RTC vero e proprio.
Title: Re: swRTC
Post by: unoracing on May 01, 2012, 10:13 am
Grazie Leo, allora aspetterò di aver tutti i pezzi, speravo di riuscire cmq a centrare un pochino con swrtc ma sembra davvero che l'arduino uno sia instabile per quanto riguarda il clock. Ho letto da qualche parte che c'era la possibilità di metter un secondo quarzo, è vero oppure ho capito male? se si come si potrebbe fare?
Title: Re: swRTC
Post by: testato on May 01, 2012, 11:18 am
se hai la Release 1 di arduino Uno, puoi modificarla, dissaldando il risuonatore e mettendo un quarzo e i due condensatori, e' pero' un lavoro da fare con componenti smd, come puoi vedere tu stesso
Title: Re: swRTC
Post by: leo72 on May 07, 2012, 12:23 am
Nel 1° post trovate la versione 1.0.3. Ho introdotto il supporto al clock a 4 MHz. Questa frequenza è però supportata solo per i micro della serie Atmega (Atmega8, Atmega48/88/168/328, Atmega644/1284, Atmega640/1280/1281/2560/2561) per via dei differenti prescaler dei micro della serie Attiny.
Title: Re: swRTC
Post by: testato on Jun 03, 2012, 12:13 am
leo oggi ho fatto caso ad una cosa, se diamo in pasto alla tua libreria questo:
Code: [Select]
Serial.print(rtc.getHours(), DEC);
    Serial.print(":");
    Serial.print(rtc.getMinutes(), DEC);
    Serial.print(":");
    Serial.println(rtc.getSeconds(), DEC);


Il risultato e' (per la mezzanotte)
Quote
0:0:0


dopo un secondodiventa:
Quote
0:0:1


ora la mia riflessione e' questa, normalmente un orario lo si immagina con 6 cifre 00:00:00
l'eliminazione degli zeri dal valore delle ore ci sta anche, cioe' e' una scelta soggettiva voler leggere alle 2 di notte 02 oppure solo 2

Pero' questa soggettivbita' secondo me viene meno nella gestione dei minuti e dei secondi, un orario scritto 0:1 non va bene, potrebbe far pensare che sia mezzanotte e 10.
Non ci sono dubbi che e' meglio scrivere 00:01 oppure come dicevo e' accettabile 0:01

Stesso discorso con i secondi, 1 secondo e' meglio scriverlo 01 e non 1

Ora secondo te ha senso implementare questa risposta lato libreria ? oppure per te va bene cosi' e quindi chi lo vuole se lo fa lato codice ?
Logicamente si puo' fare, ma resta il discorso che secondo me una libreria che risponde 0:01:01 alla mezzanotte un minuto un secondo e' meglio.

Se ti va potresti cambiare questa cosa ed anche creare la getWeekday al posto di dover fare (rtc.weekDay(rtc.getTimestamp()));
Title: Re: swRTC
Post by: dalubar on Jun 03, 2012, 10:48 am
Quote
Ora secondo te ha senso implementare questa risposta lato libreria ? oppure per te va bene cosi' e quindi chi lo vuole se lo fa lato codice ?

Si, secondo me ha senso, perchè i valori numerici restituiti sono utili per fare calcoli e/o confronti lato codice.
A parer mio, invece, si potrebbero aggiungere altri tre metodi che restituiscano la corrispondente versione "string" (ad esempio: rtc.getStrMinutes(), rtc.getStrSeconds(), etc.)
Al limite anche una comoda rtc.getStrClock() per stampare velocemente l'orario completo senza dover concatenare i vari pezzi.  :)
Title: Re: swRTC
Post by: leo72 on Jun 03, 2012, 11:07 am
@testato:
La libreria restituisce valori numerici, se controlli che ore sono alle 08:00 è normale che ti restituisca il byte 8 per le ore ed il byte 0 per i minuti. Sta a te poi trattare i dati per come ti servono, eventualmente anche convertendoli in stringa se li vuoi stampare.

@dalubar:
forse ha senso solo il metodo che restituisce l'ora completa in formato stringa, al max con l'opzione di averla in formato OO:MM oppure OO:MM:SS. Mettere i 3 distinti metodi (per le ore, i minuti ed i secondi) mi pare solo un aggravio di calcoli dato che alla fine se si vuole l'orario in formato stringa immagino che non si voglia solo le ore o i minuti ma proprio tutto l'orario.
Title: Re: swRTC
Post by: testato on Jun 03, 2012, 11:31 am
capisco, infatti non intendevo che la libreria sbagliasse.
Alla fine sto' chiedendo la stessa cosa che ha chiesto dalubar, perche' in realta' per come risponde la libreria se sono le 12:30:55 la stampa mi rida' i 6 numeri, ma se mi quando ci sono in gioco gli zeri si deve trattare il risultato lato sketch.

Sarebbe utile poter avere il risultato sia con i secondi che senza, i miei due orologi sono casualmente uno con i secondi uno senza  :)

Ricapitolando:
rtc.getWeekday()
rtc.getStrClock() senza secondi
rtc.getStrClock() con secondi

forza a lavoro
:smiley-yell: :smiley-yell: :smiley-yell:
Title: Re: swRTC
Post by: dalubar on Jun 03, 2012, 11:40 am


Ricapitolando:
rtc.getWeekday()
rtc.getStrClock() senza secondi
rtc.getStrClock() con secondi

forza a lavoro
:smiley-yell: :smiley-yell: :smiley-yell:

XD
Title: Re: swRTC
Post by: menniti on Jun 03, 2012, 11:42 am
[OT] In tutta questa vicenda della swRTC c'è qualcosa di incredibile: la patologica ricerca della precisione oraria da parte di un Napoletano :smiley-yell: quando un suo illustrissimo predecessore, tale Pulcinella, diceva solennemente
Quote
Tanno voglio murì, quanno tre rilorge vann' eguale
XD XD XD
Title: Re: swRTC
Post by: dalubar on Jun 03, 2012, 12:08 pm

[OT] In tutta questa vicenda della swRTC c'è qualcosa di incredibile: la patologica ricerca della precisione oraria da parte di un Napoletano :smiley-yell: quando un suo illustrissimo predecessore, tale Pulcinella, diceva solennemente
Quote
Tanno voglio murì, quanno tre rilorge vann' eguale
XD XD XD


Oggi Pulcinella sarebbe vittima della sua stessa affermazione, dato che ci sono ben cinque orologi che fanno la stessa ora  :P
1) Istituto Federale Fisico-Tecnico di Braunschweig (Germania)
2) National Physical Laboratory a Teddingtion (Londra)
3) National Institute for Standards e Tecnology di Fort Collins (Colorado)
4) Communications Research Laboratory (Tokio)
5) National Time Service Center (Cina).
Title: Re: swRTC
Post by: leo72 on Jun 03, 2012, 12:14 pm

capisco, infatti non intendevo che la libreria sbagliasse.

1a legge della Leobotica: La libreria non sbaglia, sono gli utenti che la usano in modo sbagliato  :smiley-yell: :smiley-yell:

Quote

Alla fine sto' chiedendo la stessa cosa che ha chiesto dalubar, perche' in realta' per come risponde la libreria se sono le 12:30:55 la stampa mi rida' i 6 numeri, ma se mi quando ci sono in gioco gli zeri si deve trattare il risultato lato sketch.

2a legge della Leobotica: Gli utenti devono usare gli strumenti così come gli vengono forniti  XD XD

Quote

Sarebbe utile poter avere il risultato sia con i secondi che senza, i miei due orologi sono casualmente uno con i secondi uno senza  :)

Ricapitolando:
rtc.getWeekday()
rtc.getStrClock() senza secondi
rtc.getStrClock() con secondi

forza a lavoro
:smiley-yell: :smiley-yell: :smiley-yell:

3a legge della Leobotica: Il Creatore non può apportare modifiche che infrangano la 1a o la 2a legge della Leobotica (soprattutto se ciò viene chiesto dopo che il Creatore ha lavorato il 2 giugno ]:D ]:D )
Title: Re: swRTC
Post by: astrobeed on Jun 03, 2012, 12:18 pm

1a legge della Leobotica: La libreria non sbaglia, sono gli utenti che la usano in modo sbagliato  :smiley-yell: :smiley-yell:


+1

Quote

2a legge della Leobotica: Gli utenti devono usare gli strumenti così come gli vengono forniti  XD XD


+2

Quote

3a legge della Leobotica: Il Creatore non può apportare modifiche che infrangano la 1a o la 2a legge della Leobotica (soprattutto se ciò viene chiesto dopo che il Creatore ha lavorato il 2 giugno ]:D ]:D )


+3  :smiley-mr-green:
Title: Re: swRTC
Post by: testato on Jun 03, 2012, 12:24 pm
:)
grandi tutti

vado a mangiare
buon appetito
Title: Re: swRTC
Post by: menniti on Jun 03, 2012, 12:30 pm

:)
grandi tutti

vado a mangiare
buon appetito

APPROVO in pieno tutte le leggi di Leo72th (una specie di Imperatore :D)
A Testato, dimentichi il più importante:
6) Nixie Clock temperature compensated (Casa di Testato, dintorni di Napoli)
Buon appetito a tutti, oggi sono dalla mia adorata mamma, dubito di ritornare operativo prima delle 17 :smiley-fat:
Title: Re: swRTC
Post by: dalubar on Jun 03, 2012, 01:23 pm
Quote
A Testato, dimentichi il più importante:
6) Nixie Clock temperature compensated (Casa di Testato, dintorni di Napoli)

Immagino ti riferissi al mio post...e comunque è verooo, chiedo scusa a Testato e al suo orologio :smiley-yell:

@Testato:potresti pubblicare qualche foto? Sono curioso di vederlo.  :P
Title: Re: swRTC
Post by: menniti on Jun 03, 2012, 02:55 pm

Quote
A Testato, dimentichi il più importante:
6) Nixie Clock temperature compensated (Casa di Testato, dintorni di Napoli)

Immagino ti riferissi al mio post...e comunque è verooo, chiedo scusa a Testato e al suo orologio :smiley-yell:
scusa ma l'idea degli gnocchi fatti in casa da mia madre mi ha annebbiato leggermente la vista :smiley-red:

Quote

@Testato:potresti pubblicare qualche foto? Sono curioso di vederlo.  :P

lascia stare, vedere quell'opera d'arte montata su uno scatolo di cartone forato mi ha già ferito la vista e l'animo una volta, ti vuoi guastare la domenica forse?
Title: Re: swRTC
Post by: testato on Jun 03, 2012, 09:07 pm
e si, dalubar, l'ho gia' postato una volta (forse proprio su questo topic, prova a guardare le altre pagine), non faccio lo stesso errore 2 volte, cmq il mio avatar e' proprio lui.
Title: Re: swRTC
Post by: dalubar on Jun 03, 2012, 10:09 pm
Mmmh..ok, anche se io sarei stato decisamente più interessato all'opera d'arte interna che al contenitore che la ospitava.
Ma siete così "sensibili" alla forma estetica di un progetto?  :smiley-surprise:
Me ne ricorderò nel caso dovessi pubblicare il "Berlin"  :D

Title: Re: swRTC
Post by: leo72 on Jun 03, 2012, 10:13 pm
Diciamo che ci aspettavamo di più  XD
Testato è uno mooooooooolto restio a mostrare i suoi lavori (diciamo che è un po' closed source, va'  :smiley-yell: ). Alla fine ce l'abbiamo fatta ad avere la foto..... ed abbiamo visto il nixie clock "imballato" (è proprio il termine giusto) in una scatola di cartone  XD  XD
Title: Re: swRTC
Post by: dalubar on Jun 03, 2012, 10:20 pm
Quote
...ed abbiamo visto il nixie clock "imballato" (è proprio il termine giusto) in una scatola di cartone

XD XD
Title: Re: swRTC
Post by: menniti on Jun 03, 2012, 11:06 pm

Quote
...ed abbiamo visto il nixie clock "imballato" (è proprio il termine giusto) in una scatola di cartone

XD XD

sì insomma è un po' come la storia di quella che ti fa penare per mostrarti la topolina e poi ce l'ha tutta rasata :smiley-eek-blue: :smiley-yell: quindi regolati col Berlin ]:D
Title: Re: swRTC
Post by: leo72 on Jun 03, 2012, 11:13 pm

è un po' come la storia di quella che ti fa penare per mostrarti la topolina e poi ce l'ha tutta rasata :smiley-eek-blue: :smiley-yell:

E poi ero io quello malato  :smiley-yell: :smiley-yell:
Title: Re: swRTC
Post by: menniti on Jun 03, 2012, 11:16 pm


è un po' come la storia di quella che ti fa penare per mostrarti la topolina e poi ce l'ha tutta rasata :smiley-eek-blue: :smiley-yell:

E poi ero io quello malato  :smiley-yell: :smiley-yell:

Nel nostro ambiente si chiama "contagio" :smiley-mr-green:
Title: Re: swRTC
Post by: dalubar on Jun 03, 2012, 11:21 pm

sì insomma è un po' come la storia di quella che ti fa penare per mostrarti la topolina e poi ce l'ha tutta rasata :smiley-eek-blue: :smiley-yell: quindi regolati col Berlin ]:D

ROTFL! Quando si dice: "il potere evocativo e chiarificatore dei paragoni"  XD XD
Perfetto, allora sono avvisato: per il Berlin niente rasat...ehm volevo dire, cercherò di curare anche il lato estetico.
Dopotutto "anche l'occhio vuole la sua parte" (come disse Polifemo).
Title: Re: swRTC
Post by: menniti on Jun 03, 2012, 11:27 pm


sì insomma è un po' come la storia di quella che ti fa penare per mostrarti la topolina e poi ce l'ha tutta rasata :smiley-eek-blue: :smiley-yell: quindi regolati col Berlin ]:D

ROTFL! Quando si dice: "il potere evocativo e chiarificatore dei paragoni"  XD XD
Perfetto, allora sono avvisato: per il Berlin niente rasat...ehm volevo dire, cercherò di curare anche il lato estetico.
Dopotutto "anche l'occhio vuole la sua parte" (come disse Polifemo).

AZZ XD XD XD che banda di squilibrati, spettacolare questa citazione del tuo illustre compaesano, già me l'immagino se Ulisse fosse stata una lei. Polifemo a chiedere con voce tonante "dove ce l'hai?" e lei "da nessuna parte" :D
Title: Re: swRTC
Post by: leo72 on Jun 03, 2012, 11:52 pm
Non ho parole..... dalle modifiche ad una lib a parlare delle lib..ertine!  :smiley-yell: :smiley-yell:
Title: Re: swRTC
Post by: menniti on Jun 04, 2012, 12:09 am

Non ho parole..... dalle modifiche ad una lib a parlare delle lib..ertine!  :smiley-yell: :smiley-yell:

ROTFL, ma dai, non te la prendere, ti stiamo solo facendo da squadra per tirarti la volata dei 10kpost ;) hai presente i gregari nelle squadre di bici, quelli che pedalano come pazzi fino a scoppiarsi i polpacci, per stancare gli avversari e creare dietro di loro un'area protetta dal vento d'impatto, nel quale si infila il ciclista capitano, che può in tal modo correre alla stessa velocità ma stancandosi molto meno? Ecco, siamo noi, vai Gimondi! :D
Title: Re: swRTC
Post by: leo72 on Jun 04, 2012, 12:13 am
Il mio idolo era Marco, pace all'anima sua.  Grande. Peccato si fosse circondato di gente sbagliata.
Title: Re: swRTC
Post by: leo72 on Jun 04, 2012, 11:20 am
Allegato al 1° post di questa discussione c'è la nuova versione 1.0.5 della libreria.
Ho inserito la funzione getWeekDay che restituisce l'attuale giorno della settimana in formato numerico, con 0->domenica...6->sabato.
Ho inoltre aggiunto (ma questo già dalla versione 1.0.4 della lib che però non avevo messo nel 1° post) il supporto all'Attiny4313.
Ho infine rivisto gli sketch di esempio: in swRTCtest ho messo molti dei metodi della libreria mentre ho inserito un nuovo sketch denominato swRTCprintTime. Con esso vediamo se mettiamo a tacere le voglie di orari stampati nel formato OO:MM(:SS) di Testato  :P

Perché ho messo questa funzione in uno sketch e non nella libreria? Per il semplice motivo che la libreria è nata per gestire l'orario internamente, quindi appesantire con qualche centinaio di byte (tanti erano i byte che venivano aggiunti alla lib) il codice solo per stampare sulla seriale l'orario non mi sembrava logico. Di tutti quelli che useranno la swRTC (pochi  :smiley-sweat:) ci sarà l'1% che si sollazzerà con essa stampando sul terminale l'orario. Quindi ho deciso di mettere la funzione in uno sketch, in modo che chi voglia usarla, sa dove trovarla. Così ho deciso, l'udienza è tolta!  ]:D
Title: Re: swRTC
Post by: pablos71 on Jun 04, 2012, 11:49 am
Bhe io la uso da diverso tempo e mi piace, poi se c'e' 08:08:08 o 8:8:8 mi importa poco tendente a zero. Quando scrivo su SD l'ora e l'evento basta e avanza. Se qualcuno vuole un extralusso ci mette un Rolex e si leva il pensiero  ]:)

ciao
Title: Re: swRTC
Post by: testato on Jun 04, 2012, 05:50 pm
ottimo Leo,
va benissimo anche cosi', credo che questa sia la versione definitiva, almeno fino ad altre mie richieste  :smiley-yell:

Testo e riporto  :)
Title: Re: swRTC
Post by: lupastro81 on Jun 06, 2012, 05:44 pm
:smiley-sweat: domanda idiota....   da http://www.leonardomiliani.com/?p=411  sono riuscito a scaricare solo la release 1.0.1 ... 
la 1.0.5. ?

Grazie Leo72!
Title: Re: swRTC
Post by: PaoloP on Jun 06, 2012, 05:54 pm

:smiley-sweat: domanda idiota....   da http://www.leonardomiliani.com/?p=411  sono riuscito a scaricare solo la release 1.0.1 ... 
la 1.0.5. ?


Nel primo post --> http://arduino.cc/forum/index.php/topic,73496.msg552421.html#msg552421
Title: Re: swRTC
Post by: lupastro81 on Jun 06, 2012, 06:01 pm
ecco... lo sapevo che era una domanda idiota... domani vado dall'oculista.. :smiley-yell:

grazie mille ciao!
Title: Re: swRTC
Post by: leo72 on Jun 06, 2012, 06:39 pm

:smiley-sweat: domanda idiota....   da http://www.leonardomiliani.com/?p=411  sono riuscito a scaricare solo la release 1.0.1 ... 
la 1.0.5. ?

Grazie Leo72!


Uh oh... mi sono scordato di aggiornare la versione sul mio sito  :smiley-sweat: :smiley-sweat:
Title: Re: swRTC
Post by: testato on Sep 02, 2012, 06:26 pm
ho visto che in firma hai messo un unico riferimento, il tuo sito.
pero' sul sito non hai aggiornato i vari lavori, ad esempio questa libreria e' ancora alla 1.0.1 con i problemi che ne derivano (non mi funzionava getWeekday  :smiley-yell:)
bye  :)
Title: Re: swRTC
Post by: leo72 on Sep 03, 2012, 10:48 am
Ieri ho aggiornato un po' di cose sul mio sito, ma degli ultimi aggiornamenti della swRTC me ne ero proprio dimenticato. Grazie della segnalazione   ;)
Title: Re: swRTC
Post by: lestofante on Sep 03, 2012, 02:49 pm
non conviene se linki direttamente a github per il download, e anche i link che metti quì li fai puntare alle varie versioni della libreria? in questo modo hai sia arduino che il tuo sito puntano ad una variabile unica :)
Title: Re: swRTC
Post by: leo72 on Sep 03, 2012, 06:48 pm
Sì, quando tutti i miei lavori li ho trasferiti su GitHub linkerò direttamente lì. Per ora sto sistemando il mio sito e pian pianino cerco di mettere tutti i contenuti in inglese. Fatto questo, passerò a sistemare i download.
Title: Re: swRTC
Post by: testato on Sep 05, 2012, 09:41 pm
maledette basi  :smiley-fat:

leo mi dici perche' non funziona il tuo sketch modificandolo in questo modo ?
thanks

Code: [Select]
#include <swRTC.h>
swRTC rtc; //create a new istance of the lib
const byte WITHOUT_SECONDS = 0;
const byte WITH_SECONDS = 1;

void setup() {
rtc.stopRTC(); //stop the RTC
rtc.setTime(12,0,0); //set the time here
rtc.setDate(4,6,2012); //set the date here
rtc.startRTC(); //start the RTC
Serial.begin(19200); //choose the serial speed here
delay(2000); //delay to let the user opens the serial monitor
}

void loop() {
   
     Stampa_Ora();
    delay(1000);
}



void Stampa_Ora()

{
   printTime_SER(WITH_SECONDS);
   
void printTime_SER(byte withSeconds) {
    sendNumber_SER(rtc.getHours());
    Serial.print(":");
    sendNumber_SER(rtc.getMinutes());
    if (withSeconds) {
        Serial.print(":");
        sendNumber_SER(rtc.getSeconds());
    }
    Serial.println("");
}


void sendNumber_SER(byte number) {
    byte temp;
    if (number>9) {
        temp=int(number/10);
        Serial.print(char(temp+48));
        number-=(temp*10);
    } else {
        Serial.print("0");
    }
    Serial.print(char(number+48));
}
}
Title: Re: swRTC
Post by: leo72 on Sep 05, 2012, 10:05 pm
Premetto che non ho testato (uh oh....  :smiley-yell:) lo sketch perché i miei Arduini sono al piano di sopra ed io sono sdraiato a bivaccare sul letto al piano di sotto...  XD XD
Però il tuo sketch a me non compila neanche, perché ti sei messo a "giocare" con le parentesi graffe  ;)

Code: [Select]
#include <swRTC.h>
swRTC rtc; //create a new istance of the lib
const byte WITHOUT_SECONDS = 0;
const byte WITH_SECONDS = 1;

void setup() {
rtc.stopRTC(); //stop the RTC
rtc.setTime(12,0,0); //set the time here
rtc.setDate(4,6,2012); //set the date here
rtc.startRTC(); //start the RTC
Serial.begin(19200); //choose the serial speed here
delay(2000); //delay to let the user opens the serial monitor
}

void loop() {
 
    Stampa_Ora();
    delay(1000);
}



void Stampa_Ora()  {
   printTime_SER(WITH_SECONDS);
}

   
void printTime_SER(byte withSeconds) {
    sendNumber_SER(rtc.getHours());
    Serial.print(":");
    sendNumber_SER(rtc.getMinutes());
    if (withSeconds) {
        Serial.print(":");
        sendNumber_SER(rtc.getSeconds());
    }
    Serial.println("");
}


void sendNumber_SER(byte number) {
    byte temp;
    if (number>9) {
        temp=int(number/10);
        Serial.print(char(temp+48));
        number-=(temp*10);
    } else {
        Serial.print("0");
    }
    Serial.print(char(number+48));
}


Era questo il problema?
Title: Re: swRTC
Post by: testato on Sep 05, 2012, 10:38 pm
maledette parentesi graffe, e pensare che era l'unica cosa sulla quale avrei scommesso che era corretta  :smiley-yell:

grazie  :)
Title: Re: swRTC
Post by: lestofante on Sep 06, 2012, 01:46 pm

maledette parentesi graffe, e pensare che era l'unica cosa sulla quale avrei scommesso che era corretta  :smiley-yell:

grazie  :)


prova notepad++, ha un ottimo sistema per aiutarti a scrivewre il codice. Ti evidenzia la parentesi di chiusura, puoi nascondere blocchi di codice etc..
Title: Re: swRTC
Post by: testato on Sep 06, 2012, 04:16 pm
lo conosco, ma ti assicuro che il metodo di scrittura e' l'ultimo dei miei problemi,
io non e' che avevo sbagliata a metterla, credevo proprio che era quella la posizione giusta  :smiley-yell:
Title: Re: swRTC
Post by: Madwriter on Sep 06, 2012, 04:22 pm

lo conosco, ma ti assicuro che il metodo di scrittura e' l'ultimo dei miei problemi,
io non e' che avevo sbagliata a metterla, credevo proprio che era quella la posizione giusta  :smiley-yell:

ahhahahah ti piaceva li, ma tu pensa che dopo molto anni che programmo le parentesi graffe ancora le copio e le incollo dalle altre parti,odio dover fare ALT + etc punto 1 perchè mi dimentico sempre come si fa punto 2 perchè sul mio pc attivare il tastierino numerico è un incubo  :smiley-yell:
Title: Re: swRTC
Post by: leo72 on Sep 07, 2012, 07:44 am
Su Linux si usa la combinazione AltGr+[ oppure ], è molto comodo. Così non devi impazzire con il tastierino numerico assente dei portatili.
Ma non si può su Windows impostare delle scorciatoie da tastiera per assegnare ad una combinazione di tasti un determinato carattere?
Title: Re: swRTC
Post by: Madwriter on Sep 07, 2012, 09:28 am

Su Linux si usa la combinazione AltGr+[ oppure ], è molto comodo. Così non devi impazzire con il tastierino numerico assente dei portatili.
Ma non si può su Windows impostare delle scorciatoie da tastiera per assegnare ad una combinazione di tasti un determinato carattere?

probabilmente si,ma ctrl c,ctrl v è sempre più pratico :D
Title: Re: swRTC
Post by: astrobeed on Sep 07, 2012, 09:46 am

Su Linux si usa la combinazione AltGr+[ oppure ], è molto comodo.


Vale anche per Windows e la sequenza è shift+AltGr+[ per { e shift+AltGr+] per } , pure con Linux è la stessa cosa perché se fai solo AltGr [ ottieni [, non dipende dal sistema operativo ma dalla tastiera stessa che a seconda di come premi i tasti invia i necessari scancode.
Sulla mia tastiera per dektop in corrispondenza dei tasti [ e ] ho anche i simboli { e } disegnati in blu.


Title: Re: swRTC
Post by: Madwriter on Sep 07, 2012, 09:58 am


Su Linux si usa la combinazione AltGr+[ oppure ], è molto comodo.


Vale anche per Windows e la sequenza è shift+AltGr+[ per { e shift+AltGr+] per } , pure con Linux è la stessa cosa perché se fai solo AltGr [ ottieni [, non dipende dal sistema operativo ma dalla tastiera stessa che a seconda di come premi i tasti invia i necessari scancode.
Sulla mia tastiera per dektop in corrispondenza dei tasti [ e ] ho anche i simboli { e } disegnati in blu.

{Grazie astro :D }
Title: Re: swRTC
Post by: testato on Sep 07, 2012, 09:59 am
confermo, ho provato sulla mia, ed anche se non ci sono disegnate le graffe appaiono lo stesso.
Non si finisce mai di imparare, con Astro (ed anche con tutti Voi altri)
In compenso fornisco un bel link di riepilogo http://en.wikipedia.org/wiki/AltGr_key  :)
Title: Re: swRTC
Post by: leo72 on Sep 07, 2012, 10:04 am
sì, la combinazione è shift+AltGr+[, mia dimenticanza.
E confermo anch'io che funziona anche su Windows, ho provato su un computer che ho qui e va come su Linux. Mi pareva infatti una cosa strana che le scorciatoie da tastiera non fossero uniformi.
Title: Re: swRTC
Post by: Madwriter on Sep 07, 2012, 10:06 am

sì, la combinazione è shift+AltGr+[, mia dimenticanza.
E confermo anch'io che funziona anche su Windows, ho provato su un computer che ho qui e va come su Linux. Mi pareva infatti una cosa strana che le scorciatoie da tastiera non fossero uniformi.

sono sicuro che sul mac non và  ;) quando torno a casa ve lo confermo  :smiley-mr-green:
Title: Re: swRTC
Post by: leo72 on Sep 07, 2012, 10:18 am

sono sicuro che sul mac non và  ;) quando torno a casa ve lo confermo  :smiley-mr-green:

Ah ah ah  :smiley-yell:
Comunque non può andare sicuramente dato che il Mac non ha il tasto AltGr. Forse ha "Option" al suo posto?
Title: Re: swRTC
Post by: Madwriter on Sep 07, 2012, 10:25 am


sono sicuro che sul mac non và  ;) quando torno a casa ve lo confermo  :smiley-mr-green:

Ah ah ah  :smiley-yell:
Comunque non può andare sicuramente dato che il Mac non ha il tasto AltGr. Forse ha "Option" al suo posto?

Si ma noi abbiamo la mela morsicata  :smiley-yell:
(http://www.trigeminal.com/images/MacBookProKbd.png)
Title: Re: swRTC
Post by: leo72 on Sep 07, 2012, 10:52 am
Bellissimo  :D

Stasera modifico la mia tastiera e ci metto questo, al posto del tastino con le finestre:
Title: Re: swRTC
Post by: Madwriter on Sep 07, 2012, 10:54 am

Bellissimo  :D

Stasera modifico la mia tastiera e ci metto questo, al posto del tastino con le finestre:


io stasera devo fare un operazione difficile,devo operare il mio vecchio mac per metterci linux,speriamo che il trapianto vada bene  :smiley-mr-green:
estetica mac,sistema linux cosa vuoi di più  :smiley-mr-green:
Title: Re: swRTC
Post by: pablos71 on Dec 27, 2012, 02:10 am
Ciao

Le librerie  <swRTC.h> <IRremote.h> non possono coesistere l'orologio non avanza quando viene aggiunta la lib IR, forse perchè usano lo stesso timer?
A parte non avanzare, quando interrogo il server NTP ottengo l'aggiornamento correttamente, ma IRemote si inchioda e smette di ricevere, restartando la libreria IR dopo l'aggiornamento la stessa tornava a funzionare, ma l'orologio resta piantato all'ultimo aggiornamento.
Come posso risolvere?

Grazie

bye
Title: Re: swRTC
Post by: PaoloP on Dec 27, 2012, 02:51 pm
Mi pare che nella SwRtc il timer sia selezionabile. Ma devi attendere Leo per info più precise.  :P
Title: Re: swRTC
Post by: leo72 on Dec 27, 2012, 03:52 pm
Non conosco la IRremote, però la swRTC usa un timer prefissato, che non è cambiabile. Quale timer dipende dal tipo di chip, sull'Atmega328 è il timer2.
Title: Re: swRTC
Post by: leo72 on Dec 27, 2012, 03:56 pm
OK. Ho dato un'occhiata alla IRremote.

Di default usa il timer 2 ma ho visto da un suo file di configurazione che questa scelta può essere cambiata. Basta editare il file IRremoteInt.h
Per l'Arduino UNO (quindi Atmega328), si devono invertire i commenti alle linee 66/67:
Code: [Select]
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  //#define IR_USE_TIMER1   // tx = pin 9
  #define IR_USE_TIMER2     // tx = pin 3
#endif


Per l'Arduino MEGA (quindi Atmega2560) si sceglie il timer alle righe 33/37:
Code: [Select]
// Arduino Mega
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  //#define IR_USE_TIMER1   // tx = pin 11
  #define IR_USE_TIMER2     // tx = pin 9
  //#define IR_USE_TIMER3   // tx = pin 5
  //#define IR_USE_TIMER4   // tx = pin 6
  //#define IR_USE_TIMER5   // tx = pin 46
Title: Re: swRTC
Post by: pablos71 on Dec 27, 2012, 04:44 pm
Grazie per l'interessamento, l'ho messo sul timer 3 e sembra ok

Tu usi il timer 1 no? mi sembra di capire dalla linea #define TIMER_TO_USE_FOR_MILLIS  1 dal file core_build_option.h
mentre la IR usava il timer 2, come potevano disturbarsi?

ciao
Title: Re: swRTC
Post by: leo72 on Dec 27, 2012, 05:43 pm

Grazie per l'interessamento, l'ho messo sul timer 3 e sembra ok

Tu usi il timer 1 no? mi sembra di capire dalla linea #define TIMER_TO_USE_FOR_MILLIS  1 dal file core_build_option.h
mentre la IR usava il timer 2, come potevano disturbarsi?

ciao

Ma di che scheda stiamo parlando? Della MEGA?
No, sull'Atmega2560 e Atmega328 uso il timer 2. Perché è un timer ad 8 bit e riesco a configurarlo in modo più semplice e preciso per i miei scopi. Il file core_build_options.h serve per il core Tiny, è scritto nel file readme.txt.
Title: Re: swRTC
Post by: testato on Dec 27, 2012, 05:43 pm
la swrtc usa il timer 2, se usasse il timer 1 andrebbe in conflitto con il delay
Title: Re: swRTC
Post by: leo72 on Dec 27, 2012, 05:56 pm

la swrtc usa il timer 2, se usasse il timer 1 andrebbe in conflitto con il delay

Sull'Arduino la funzione delay è sul timer 0, sia sul 328 che sul 2560.
Title: Re: swRTC
Post by: testato on Dec 27, 2012, 06:11 pm
scusa errore di sbaglio, thanks  :)
Title: Re: swRTC
Post by: pablos71 on Dec 27, 2012, 07:15 pm
Capito

Quindi i pin che utilizzano i timer per altri scopi non possono essere usati per i pwm è corretto?
Title: Re: swRTC
Post by: testato on Dec 27, 2012, 09:13 pm
non capisco la domanda. i timer sono interni, non e' che usano dei pin. puoi usare la swrtc senza che questa infici nessun pin.
i pin pwm saranno legati si' ai timer, e quindi se per qualche motivo viene alterata la normale funzione dei timer ci possono essere conseguenze su pwm
Title: Re: swRTC
Post by: pablos71 on Dec 27, 2012, 10:00 pm
la domanda sarebbe ...sto usando:

timer 2 sulla swrtc abbinato al pin 9
timer 3 per la trasmissione IR abbinato al pin 5

su questi 2 pin posso usare il PWM, quindi variare il  duty cycle senza compromettere il normale funzionamento delle librerie?
Ma forse questo faccio prima a provarlo, piuttosto un problema che mi da preoccupazioni del timer è il suo overflow, ho un massimo di 800 timer programmabili nell'arco di un anno, 400 ON e 400 OFF distribuiti su 50 pin, ciascun pin reagisce con altre programmazioni impulsive da 1 a 250 secondi ciascuno, se questi timer mi cadono nel 41 esimo giorno succede un casino a tutti gli apparati collegati ai relays.

Pensavo di creare un overflow di 4 anni usando 2 long (41ggx41gg = 1681gg/365 circa 4 anni) ma non mi viene in mente nulla per registrare i valori così lunghi e leggerli.
Non so, la butto lì, ma in qualche modo devo evitarlo :)



ciao
Title: Re: swRTC
Post by: leo72 on Dec 27, 2012, 10:49 pm
La swRTC imposta il timer 2 in modalità di funzionamento normale: con questa modalità viene disattivata la generazione del segnale PWM perché non c'è cambio di stato dei pin OC2A e/o OC2B.

Tornando ai tuoi timer... da dove li hai tirati fuori 800 timer scusa??
Comunque nessuno ti impedisce di usare un tipo "unsigned long long", se vuoi. E' un tipo di dati a 64 bit, che va in overflow dopo 500 e passa anni! Paghi però il fatto che per gestire dati a 64 bit aumenti considerevolmente il quantitativo di Flash occupata dal tuo programma.
In alternativa devi cambiare modo di gestire il controllo dello scorrere del tempo. In questo modo puoi continuare ad usare millis() e variabili a 32 bit e non avere più problemi di overflow:
http://www.leonardomiliani.com/?p=576
Title: Re: swRTC
Post by: testato on Dec 27, 2012, 10:52 pm
io credo che sbagli approccio sul concetto dei pin. se ad esempio colleghi il pin 6 ad un led e gli vari la luminosita', non e' che alteri il delay di arduino (il pin 6 fa capo al timer 0, cosi' come il delay)

quindi dire "timer 2 sulla swrtc abbinato al pin 9" e' fuorviante

per il discorso dell'overflow qui sul forum c'e' uno scienziato, un certo leo, non so se lo conosci, lui ha anche un suo sito sul quale viene spiegato come evitare il problema con una semplice operazione  :)
Title: Re: swRTC
Post by: testato on Dec 27, 2012, 10:54 pm
il Maestro mi ha anticipato  :)
Title: Re: swRTC
Post by: leo72 on Dec 27, 2012, 11:02 pm

io credo che sbagli approccio sul concetto dei pin. se ad esempio colleghi il pin 6 ad un led e gli vari la luminosita', non e' che alteri il delay di arduino (il pin 6 fa capo al timer 0, cosi' come il delay)

Il motivo è presto detto. Il core di Arduino imposta i timer per funzionare in una determinata maniera all'avvio dello sketch.
Il timer 0, nello specifico, viene regolato in modalità Fast PWM. Grazie alla modalità Fast PWM può anche generare appunto un segnale PWM sui pin collegati. Viene inoltre impostato per generare una frequenza di 976 Hz. Questo valore non è casuale: è quello più prossimo a 1000 Hz che possiamo ottenere senza andare ad alterare manualmente il funzionamento del timer, sfruttandolo cioè per la sua interezza: il contatore del timer 0 parte da 0 ed arriva a 255, per poi ripartire da 0 ecc...
Per variare il duty cicle si sfruttano i registri OCR0A/B. Basta mettere in essi il valore del duty cicle (da 0 a 255) che, senza alterare né la frequenza del segnale né altro del timer si ottiene sul corrispondente pin il segnale PWM voluto.

Oltre a questo, si aggancia anche un interrupt all'overflow del contatore. In questo modo, tramite dei piccoli accorgimenti software che illustrai tempo fa, si va ad ottenere un incremento del contatore interno millis pari a 1000 volte al secondo.
Title: Re: swRTC
Post by: leo72 on Dec 27, 2012, 11:02 pm

il Maestro mi ha anticipato  :)


ma va'....  :D
Title: Re: swRTC
Post by: pablos71 on Dec 28, 2012, 12:05 am
@Leo

Nel tuo sito metti questo esempio
Code: [Select]
if (millis() - tempo_precedente > intervallo) {
    tempo_precedente = millis();
    ....
}
 

dicendo :
Quote
Ammettiamo che tempo_precedente valga  4.294.967.000 e che intervallo valga 1000. Ad un certo punto millis() va in overflow e riparte da zero.


il confronto diventa 0 - 4294967000 > 1000
Si tenderebbe a pensare che il confronto diventi: -4294967000 > 1000

ma usando interi di tipo unsigned la sottrazione in realtà restituisce come valore 296.


ma tu qui
if (millis() - tempo_precedente > intervallo) {

nel millis() non usi l'unsigned è sott'inteso da qualche parte?



comunque io ho sempre usato questa

Code: [Select]
unsigned long Millis_corrente = millis();   
    if(Millis_corrente - Millis_Precedente > intervallo)
    {   
      Millis_Precedente = Millis_corrente;
      ...
      ... 
    }


che direi sia la stessa, ma ovviamente non ho mai taroccato i valori per vedere che succede, quindi così anche trovandomi vicino al punto 0 non mi salta l'opearzione? parola di lupetto :) :) o devo provare  :D

ciao


Title: Re: swRTC
Post by: testato on Dec 28, 2012, 12:29 am
Leo mi sorge un dubbio, ma se questo semplice trucco che pablos sta gia' usando e che tu hai descritto sul blog, cioe'
Code: [Select]
millis() - tempo_precedente > intervallo elimina il problema overflow di millis, a che serve la tua secTimer ?
Title: Re: swRTC
Post by: leo72 on Dec 28, 2012, 06:43 am

nel millis() non usi l'unsigned è sott'inteso da qualche parte?

Non ho capito questa domanda. Millis() è una funzione predefinita di Arduino che restituisce un unsigned long.
Il suo valore è quindi un 32 bit senza segno.

Quote

comunque io ho sempre usato questa

Code: [Select]
unsigned long Millis_corrente = millis();  
   if(Millis_corrente - Millis_Precedente > intervallo)
   {  
     Millis_Precedente = Millis_corrente;
     ...
     ...  
   }


che direi sia la stessa, ma ovviamente non ho mai taroccato i valori per vedere che succede, quindi così anche trovandomi vicino al punto 0 non mi salta l'opearzione? parola di lupetto :) :) o devo provare  :D

ciao




E' lo stesso ma fai uso di una variabile tampone inutile, sprecando quindi 4 byte di SRAM per nulla  ;)
Se ottimizzi il controllo così:
Code: [Select]

if(millis() - Millis_Precedente > intervallo)
   {  
     Millis_Precedente = millis();
     ...
     ...  
   }

ottieni l'identica cosa.

EDIT:
pablos, potresti rispondermi sul thread del leOS?
Title: Re: swRTC
Post by: leo72 on Dec 28, 2012, 06:49 am

Leo mi sorge un dubbio, ma se questo semplice trucco che pablos sta gia' usando e che tu hai descritto sul blog, cioe'
Code: [Select]
millis() - tempo_precedente > intervallo elimina il problema overflow di millis, a che serve la tua secTimer ?

Avevo scritto la secTimer diversi mesi prima di pubblicare una soluzione al problema di millis.
A parte questo, la secTimer è un contasecondi non un contamillisecondi. Per cui puoi usarla per misurare intervalli in secondi in tutti i casi in cui serve gestire questa unità di misura.
Title: Re: swRTC
Post by: pablos71 on Dec 28, 2012, 05:32 pm
Quote
Millis() è una funzione predefinita di Arduino che restituisce un unsigned long.

va bene se è così allora tolgo la variabile di appoggio unsigned .... grazie ciao


EDIT: ho risposto al topic LEOS2
Title: Re: swRTC
Post by: leo72 on Dec 28, 2012, 06:35 pm

Quote
Millis() è una funzione predefinita di Arduino che restituisce un unsigned long.

va bene se è così allora tolgo la variabile di appoggio unsigned .... grazie ciao


EDIT: ho risposto al topic LEOS2

OK per entrambe.
Title: Re: swRTC
Post by: testato on Dec 28, 2012, 08:17 pm
Scusa Leo, ma vista la grandezza della notizia, hai aperto un topic tipo "il problema millis non esiste ?"
Title: Re: swRTC
Post by: pablos71 on Dec 28, 2012, 09:16 pm

Scusa Leo, ma vista la grandezza della notizia, hai aperto un topic tipo "il problema millis non esiste ?"


Prima l'overflow fa schiantare il micro, poi, no quando arriva a termine riparte da 0, poi si riparte da 0 senza schiantare niente, ma i risultati ottenuti saranno falsi, ora mi dici che il problema millis non è mai esistito ahahahahhaha sta storia è peggio dei maya.

anche qui il tutorial mostra la stessa formula l'abbiamo sempre avuta sotto il naso :) http://arduino.cc/en/Tutorial/BlinkWithoutDelay

EDIT: Testato .... ti posso dare una testata?  :D
Title: Re: swRTC
Post by: leo72 on Dec 28, 2012, 10:40 pm
Che il contatore vada in overflow e che riparta da zero è indubbio.
Dopo questo, entra in gioco il "come" viene gestito il controllo. E' tutto lì. Se il controllo viene fatto in un certo modo, il problema non affligge il codice.

Di come fosse fatto nel BlinkWithoutDelay sinceramente non mi ero mai preoccupato  :smiley-yell:
Title: Re: swRTC
Post by: testato on Dec 29, 2012, 01:35 am
pablos accomodati pure, ma ritengo non sia giusto riceverla.
credo siamo sulla stessa barca, anche io come te, ho avuto il terrore dell'overflow del millis, ora scopro che il problema non c'e', basta usare bene la formula.
Ti assicuro che in questi termini non si era mai espresso nessuno, infiniti commenti ci sono sul forum sul terrore millis, e lo stesso Leo ci ha scritto fiumi prima di arrivare alla soluzione definitiva.
Sottolineare che il problema non esiste credo sia cosa buona e giusta per il mondo intero  :) e Leo deve ricevere un premio nobel  :)
Title: Re: swRTC
Post by: leo72 on Dec 29, 2012, 06:30 am

pablos accomodati pure, ma ritengo non sia giusto riceverla.
credo siamo sulla stessa barca, anche io come te, ho avuto il terrore dell'overflow del millis, ora scopro che il problema non c'e', basta usare bene la formula.
Ti assicuro che in questi termini non si era mai espresso nessuno, infiniti commenti ci sono sul forum sul terrore millis, e lo stesso Leo ci ha scritto fiumi prima di arrivare alla soluzione definitiva.
Sottolineare che il problema non esiste credo sia cosa buona e giusta per il mondo intero  :) e Leo deve ricevere un premio nobel  :)


^_^
Title: Re: swRTC
Post by: pablos71 on Dec 29, 2012, 09:47 am
Quote
accomodati pure, ma ritengo non sia giusto riceverla.


Ueee guarda che scherzavo  :D
Title: Re: swRTC
Post by: testato on Dec 29, 2012, 10:52 am
:)
Title: Re: swRTC
Post by: lestofante on Dec 29, 2012, 12:52 pm
uhh nessuna citazione?  =(
Title: Re: swRTC
Post by: leo72 on Dec 29, 2012, 01:10 pm

uhh nessuna citazione?  =(

Vero vero...
La seconda soluzione me l'hai suggerita tu. Anzi, per dirla tutta, mi ha fatto presente tu via PM che si poteva evitare il casting perché usando l'ordine delle operazioni ed il secondo metodo di confronto, che poi è risultato essere quello del BlinkWithoutDelay, il problema non si poneva.
Title: Re: swRTC
Post by: testato on Dec 29, 2012, 02:01 pm
Il premio nobel non si puo' dividere in due, quindi uno ciascuno.
Leo pero' ora devi mettere ufficialmente la citazione sul tuo Blog, e' il minimo  :)
Title: Re: swRTC
Post by: lestofante on Dec 29, 2012, 02:40 pm

Il premio nobel non si puo' dividere in due, quindi uno ciascuno.


veramente il massimo sono due persone. Per esempio i coniugi Cuirie hanno fatto a metà con un altro tizio (per un'altra ricerca), mi pare fosse quello in fisica.. ora cerco altre info (quindi 50% Curie e 50% altro tizio, perchè il premio va alla ricerca, non alle persone)

ecco il link: http://www.nobelprize.org/nobel_prizes/physics/laureates/1903/index.html
Antoine Henri Becquerel "in recognition of the extraordinary services he has rendered by his discovery of spontaneous radioactivity" (scoperta della radioattività spontanea)

Pierre Curie and Marie Curie, née Sklodowska "in recognition of the extraordinary services they have rendered by their joint researches on the radiation phenomena discovered by Professor Henri Becquerel" in pratica se ricordo bene Antonie aveva trovato la teoria, i Cuirie invece l'hanno messa in pratica, bombardando di elettroni l'argento(o l'alluminio). Nello stesso periodo Fermi in Italia, scoperto questo fatto, usò del Bario e del Radon creando una sorgente di bombardamento di Neutroni, e quindi molto più efficaci non essendo rallentati o disturbati dai campi elettrici del nucleo.
L'inizio dell'era atomica. C'è una biografia carina di Pierre de Latil su Fermi, interessante come la scienza si mischi con la politica del periodo, e di come sia stato portato avanti il progetto Manhattan.
Title: Re: swRTC
Post by: leo72 on Dec 29, 2012, 06:12 pm

Il premio nobel non si puo' dividere in due, quindi uno ciascuno.
Leo pero' ora devi mettere ufficialmente la citazione sul tuo Blog, e' il minimo  :)

;)
Title: Re: swRTC
Post by: marcello.romani on Dec 29, 2012, 06:15 pm


Scusa Leo, ma vista la grandezza della notizia, hai aperto un topic tipo "il problema millis non esiste ?"


Prima l'overflow fa schiantare il micro, poi, no quando arriva a termine riparte da 0, poi si riparte da 0 senza schiantare niente, ma i risultati ottenuti saranno falsi, ora mi dici che il problema millis non è mai esistito ahahahahhaha sta storia è peggio dei maya.

anche qui il tutorial mostra la stessa formula l'abbiamo sempre avuta sotto il naso :) http://arduino.cc/en/Tutorial/BlinkWithoutDelay

EDIT: Testato .... ti posso dare una testata?  :D


Il tutorial che hai linkato è errato. previousMillis deve essere dichiarata unsigned long.

Il compilatore dovrebbe emettere una warning a proposito di signed vs. unsigned comparison...
Title: Re: swRTC
Post by: leo72 on Dec 29, 2012, 06:36 pm

Il tutorial che hai linkato è errato. previousMillis deve essere dichiarata unsigned long.
Il compilatore dovrebbe emettere una warning a proposito di signed vs. unsigned comparison...

Viene fatto il casting a signed long.
Title: Re: swRTC
Post by: pablos71 on Dec 29, 2012, 06:57 pm
Code: [Select]
Il tutorial che hai linkato è errato. previousMillis deve essere dichiarata unsigned long.

ehhh dai mettici un unsigned long previousMillis = 0;   se ti fa piacere  ]:D
l'argomento era se fare + o -.
Date a lui il premio nobel per la pignoleria  :D :D :D

ciao


Title: Re: swRTC
Post by: marcello.romani on Dec 29, 2012, 07:37 pm
Massì, signed, unsigned, chissenefrega... tanto finché il programma funziona...

Mah...

Il problema è legato al rollover di millis().

Qui http://www.utopiamechanicus.com/article/handling-arduino-microsecond-overflow/ il primo link che ho trovato. Non è uno dei migliori, ma sono di fretta...
Title: Re: swRTC
Post by: pablos71 on Dec 29, 2012, 11:20 pm
Code: [Select]
Massì, signed, unsigned, chissenefrega... tanto finché il programma funziona...

ahahaha .... massiii dai :)

Strano che non sia intervenuto  Uwe a mettere giù punti e virgole a tutti noi dettagliando qualche formula scientifica delle sue  :smiley-yell:

ciao
Title: Re: swRTC
Post by: testato on Jan 05, 2013, 10:22 pm
Leo ci ho rpovato, davvero ci ho rpovato, ma ora e' tardi e chiedo aiuto.
Credevo fosse una cosa banale invece non lo e', almeno per me.
Ricordi l'esempio che hai aggiunto nella swRTC che stampa sulla seriale l'orario con gli Zeri ?

Volevo modificarlo in modo da dirottare l'orario con gli zeri non verso la seriale, ma verso una Stringa, tipo:
Code: [Select]
String Orario = questobenedettoorologioconglizeri;

Ho speso un po' di tempo a capire la tua formula per inserire gli zeri, credo di averla capita, ma fa uso fortemente dell'hardware, cioe' stampi sulla seriale un carattere per volta e poi vai avanti con i calcoli, aggiungi i due punti :, ecc.
Ma fare le stesse cose tenendo come serbatoio una variabile mi e' oscuro, dove e' il trucco ?

Grazie
Title: Re: swRTC
Post by: leo72 on Jan 05, 2013, 11:16 pm
Fa uso dell'hardware?  :smiley-sweat:
E' una semplice formula che controlla se il numero è più grande di 9, in caso affermativo aggiunge uno "0".
Con un oggetto string la cosa è ancora più semplice perché gli string possono essere concatenati per cui al posto di Serial.print fai un semplice "+". Esempio:  Orario += "0"

Una cosa così:
Code: [Select]

String Orario;

void setup() {....}
void loop() {
  Orario = "";
  printTime(WITHOUT_SECONDS);
}

void printTime(byte withSeconds) {
    sendNumber(rtc.getHours());
    Orario += ":";
    sendNumber(rtc.getMinutes());
    if (withSeconds) {
        Serial.print(":");
        sendNumber(rtc.getSeconds());
    }
}


void sendNumber(byte number) {
    byte temp; Serial.prin
    if (number>9) {
        temp=int(number/10);
        Orario +=(char(temp+48));
        number-=(temp*10);
    } else {
        Orario += "0";
    }
    Orario += (char(number+48));
}


Non so se funziona, l'ho scritto al volo
Title: Re: swRTC
Post by: testato on Jan 06, 2013, 12:03 am
uso dell'hw nel senso che si appoggia alla memoria della seriale, intesa come hw, cioe' vai a scrivere il primo numero, poi vai a scrivere il secondo, poi vai a scrivere i due punti. usando sempre gli stessi comandi.
Avevo pensato alla concatenazione, ma cosi' a naso credevo non funzionasse. Ti fo sapere se va.
Grazie mille  :)
Title: Re: swRTC
Post by: testato on Jan 06, 2013, 12:47 pm
Funziona, e mi sono spiegato anche perche' ero fuori strada.
ho trovato un comportamento strano, forse dovuto alla 1.5 che uso ?
Alla stringa Orario, oltre all'ora, concatenavo anche degli spazi "    ", delle barre '/' altri valori, ecc

ebbene usando due concatenazioni a seguire, con la prima inserisco solo l'orario con gli zeri, e poi nel rigo sotto inserisco le altre cose va.
se invece lascio tutto su un solo rigo si blocca il micro:
Questo si blocca
Code: [Select]
Stampa = Orario + "    " + rtc.getDay() + '/' + ....ecc.ecc.ecc

Questo va bene
Code: [Select]
Stampa = Orario;
Stampa += "    " + rtc.getDay() + '/' + ....ecc.ecc.ecc



Va bene cosi', i Bug sono brutta bestia, sono conctento che non ero io completamente rincoglionito perche' la concatenazione l'avevo provata e poi abbandonata subito visto il blocco del micro
Title: Re: swRTC
Post by: leo72 on Jan 06, 2013, 01:09 pm
Forse sarebbe il caso di segnalare il problema nel forum internazionale.
Io personalmente la 1.5.x ancora non la adopero per sviluppare per Arduino UNO ed altri micro. Mi tengo la 1.0.4 ( :P)
Title: Re: swRTC
Post by: testato on Jan 06, 2013, 02:28 pm
onestamente non sono convinto del bug, tu dici che e' bug ? sai cosa pensavo ? Che Orario e' gia' di per se una concatenazione perche' viene creato pezzo per pezzo per aggiungere gli zeri. Non e' che si crea qualche conflitto visto che non uso delay, e quindi con millis avevo pensato che In un determinato momento Orario non era disponibile a concatenazione da due lati ?
Separando su due righe le due concatenazioni mi assicuro che Orario viene concatenato e conluso, e solo dopo gli si aggiunge altro. Che ne pensi ?
Title: Re: swRTC
Post by: leo72 on Jan 06, 2013, 05:08 pm
No, non è possibile. Non può esserci un'istruzione "troppo veloce" da eseguire. Ogni istruzione viene eseguita solo dopo la precedente.  ;)

Puoi passarmi lo sketch che usavi?
Title: Re: swRTC
Post by: pablos71 on Jan 13, 2013, 05:26 pm
C'è qualcosa che non quadra nella swRTC,  oggi mi dice che è lunedì 14

Prendiamo un epoch di oggi 13/01/2013: 1358093934    

il convertitore online mi restituisce
1358093934    [batch convert timestamps to human dates]
GMT: Sun, 13 Jan 2013 16:18:54 GMT
Your time zone: domenica 13 gennaio 2013 17:18:54 GMT+1

la libreria mi restituisce
passando il valore di epoch 1358093934  
gg della settimana = 1    14/1/2013 16:19   <<<<<< errato

---------------------------------------------------------------------

Prendiamo un epoch del 25/12/2012: 1356453600

il convertitore online mi restituisce
1356453600 [batch convert timestamps to human dates]
GMT: Tue, 25 Dec 2012 16:40:00 GMT
Your time zone: martedì 25 dicembre 2012 17:40:00 GMT+1

la libreria mi restituisce
passando il valore di epoch 1356453600
gg della settimana = 2  25/12/2012 16:40   <<<<<< esatto

nel 2014 è ancora errato
nel 2015 è ancora errato
nel 2016 la librirea tornerà ad essere corretta :) :)

ciao
Title: Re: swRTC
Post by: leo72 on Jan 13, 2013, 09:54 pm
Ma che servizio di conversione online hai usato? Alcuni sono sballati e danno risultati errati.
Questo qui:
http://www.onlineconversion.com/unix_time.htm
avevo visto che era corretto nei risultati.
Mettendo 1358093934 come timestamp ottengo:
Sun, 13 Jan 2013 16:18:54 GMT
Title: Re: swRTC
Post by: pablos71 on Jan 13, 2013, 10:08 pm
http://www.epochconverter.com/ ho preso il primo che è uscito da google
però il mio orologio è sbagliato dal 1 gennaio, non c'è problema l'ho corretto con un -86400 fino al 31/12/2015 non ho problemi era solo a titolo informativo.

Title: Re: swRTC
Post by: leo72 on Jan 13, 2013, 10:13 pm
Riguarderò il codice.
Title: Re: swRTC
Post by: pablos71 on Jan 13, 2013, 10:27 pm
No Leo, voglio dire, non voglio il rimborso o avvarlermi di garanzia :) ti chiedo ..  ho qualche problema io? o puoi constatare che  siano intervenute delle varianti? perchè anch'io ho dei dubbi, non capisco perchè ho quei risultati.

ciao
Title: Re: swRTC
Post by: leo72 on Jan 13, 2013, 10:41 pm

No Leo, voglio dire, non voglio il rimborso o avvarlermi di garanzia :) ti chiedo ..  ho qualche problema io? o puoi constatare che  siano intervenute delle varianti? perchè anch'io ho dei dubbi, non capisco perchè ho quei risultati.

ciao
[/quote
Tempo fa scovai un problema con l'algoritmo che ho usato. Dopo il 29/2/2000 dovevo aggiungere a mano 1 giorno perché il 2000 è un anno particolare: secondo la classica formuletta non sarebbe bisestile (un anno è bisestile se è divisibile per 4 ma non per 100) però lo diventa perché è divisibile per 400.
Adesso quel giorno in più sembrerebbe di troppo. Tu poi mi dici che nel 2013 il timestamp è errato, così come lo sarà nel 2014 e 2015 ma nel 2016 sarà corretto. Guarda caso, il 2016 è bisestile. Sarà un caso?
Title: Re: swRTC
Post by: pablos71 on Jan 13, 2013, 10:52 pm
scusa non ho capito questo quote
Quote
Tempo fa scovai un problema con l'algoritmo che ho usato. Dopo il 29/2/2000 dovevo aggiungere a mano 1 giorno perché il 2000 è un anno particolare: secondo la classica formuletta non sarebbe bisestile (un anno è bisestile se è divisibile per 4 ma non per 100) però lo diventa perché è divisibile per 400.


ho detto io ste cose??
Title: Re: swRTC
Post by: leo72 on Jan 13, 2013, 11:00 pm
No, ti spiegavo che tempo fa dovetti aggiungere 1 giorno alla formula perché dopo il 29/2/2000 andava indietro di 1 giorno.
Ora però quel giorno parrebbe in più, tu mi dici infatti che devi togliere 86400 secondi affinché tutto torni.
Devo capire quindi cosa c'è che non va.
Title: Re: swRTC
Post by: pablos71 on Jan 13, 2013, 11:06 pm
ahhh scusa ho letto "Tempo fa scovavi" riferito a me ... :) sorry
Title: Re: swRTC
Post by: leo72 on Jan 14, 2013, 09:56 am
Credo di aver risolto. Il problema era sempre nella questione delle date post 29/2/2000. Non avevo corretto la funzione che trasformava un timestamp in un orario ma solo quella inversa, cioè quella che forniva il timestamp dell'orario corrente.
Quello sopra è il timestamp stampato dalla libreria dopo aver impostato l'orologio, quello sotto è l'orologio regolato con il timestamp. I valori coincidono.
Code: [Select]

16:18:53 -- 13/1/2013 (Leap year: no)
Day of week: 0 -- Timestamp: 1358093934



16:18:54 -- 13/1/2013 (Leap year: no)
Day of week: 0 -- Timestamp: 1358093934

La versione 1.0.6 è sul mio sito:
http://www.leonardomiliani.com/?p=411
Title: Re: swRTC
Post by: pablos71 on Jan 15, 2013, 11:08 am
ok funzia, grazie
Title: Re: swRTC
Post by: leo72 on Jan 15, 2013, 11:39 am

ok funzia, grazie

Bene.
Title: Re: swRTC
Post by: testato on Jan 20, 2013, 04:06 pm
scoprii io questo bug se ricordi,
ricordo anche che la soluzione fu cmq una pezza, nel senso che dovettimo decidere se tenere corretto il pre 2000 o il post 2000

e' acnora cosi' ? cioe' le date ante 2000 restano sbagliate ? (e' a titolo informativo, perche' onestamente non ce ne frega a nessuno, mica dobbiamo fare orologi che segnano gli anni 90  :))
pero' se e' csi' si mette una bella nota "la swRTC funziona solo con date anni 2000"
Title: Re: swRTC
Post by: leo72 on Jan 20, 2013, 04:23 pm

scoprii io questo bug se ricordi,
ricordo anche che la soluzione fu cmq una pezza, nel senso che dovettimo decidere se tenere corretto il pre 2000 o il post 2000

Tu scopristi il bug (il giorno discriminante è il 29/02/2000, per via del fatto che il 2000 è un anno quattrocentenario) e ci misi la pezza. Ma l'avevo messa solo sulla conversione data/timestamp, non sulla timestamp/data.

Quote

e' acnora cosi' ? cioe' le date ante 2000 restano sbagliate ? (e' a titolo informativo, perche' onestamente non ce ne frega a nessuno, mica dobbiamo fare orologi che segnano gli anni 90  :))
pero' se e' csi' si mette una bella nota "la swRTC funziona solo con date anni 2000"

No, adesso la swRTC gestisce i timestamp in modo corretto, sia nel caso di impostare la data col timestamp sia nel caso di fornire il timestamp dalla data interna.
Title: Re: swRTC
Post by: testato on Jan 20, 2013, 04:48 pm
ottimo, adesso possiamo fare un orologio che segna il 20/01/1990  :)
Title: Re: swRTC
Post by: leo72 on Jan 20, 2013, 07:38 pm

ottimo, adesso possiamo fare un orologio che segna il 20/01/1990  :)

La tua data di nascita?  ;)
Title: Re: swRTC
Post by: testato on Jan 21, 2013, 05:19 pm
magari, ci metterei subito la firma  :)
Title: Re: swRTC
Post by: leo72 on Jan 21, 2013, 07:33 pm

magari, ci metterei subito la firma  :)


E perché? A me è piaciuto un sacco vivere gli anni '80.
Title: Re: swRTC
Post by: testato on Jan 21, 2013, 11:22 pm
sotto questo aspetto certo, era solo per perdere un po' di anni.
la schiena fa male, la vista scende ...
Title: Re: swRTC
Post by: PaoloP on May 08, 2013, 10:53 am
Sul tuo sito è disponibile la 1.1.2 ma qui nel primo post "solo" la 1.0.5.
Potresti aggiornarlo?

Grazie.  :smiley-mr-green:
Title: Re: swRTC
Post by: leo72 on May 08, 2013, 02:37 pm
Ho tolto l'allegato perché non mi ricordo mai di aggiornare il pacchetto qui.
Ho deciso di mettere un link alla pagina del mio sito dove mantengo la libreria, come ho già fatto con le altre librerie che ho pubblicato qui sul sito, in modo che l'interessato possa scaricarsi sempre la versione più aggiornata.
Title: Re: swRTC
Post by: PaoloP on May 08, 2013, 03:08 pm
Perfetto.  ;)
Title: Re: swRTC
Post by: lupo3000 on May 09, 2013, 07:03 pm
Buonasera a tutti!! Ho modificato il swRTC di leo72 (GRANDE!!) per adattarlo a un quarzo da 32768 hz, quello da orologio. Il tutto funziona abbastanza bene, sta girando su ATMega328 in stand alone (clock a 8 MHz) con bootloader Arduino UNO. Praticamente ho costruito un orologio con sveglia. C'è solo una cosa che non riesco a capire: ho tolto il quarzo da una radio-sveglia che funzionava perfettamente, sempre precisa, e l'ho messo nel progetto...mi sfalsa di 4/5 secondi al giorno!! O.o ok, non è molto...ma non è un problema di quarzo, dato che prima non avevo problemi...mi sa che il nostro caro ATmega non è proprio precisissimo nel contare gli interrupt...o almeno credo, è l'unica spiegazione...
Allego il swRTC modificato per chi fosse interessato...
Title: Re: swRTC
Post by: lestofante on May 09, 2013, 08:36 pm
allega anche lo schema che hai usato! leggere un quarzo non è una cosa facile...
Title: Re: swRTC
Post by: lupo3000 on May 09, 2013, 09:17 pm
questo è lo schema... ho semplicemente settato gli interrupt sul swRTC_32768 e poi ho richiamato le funzioni delle libreria (rtc.getSeconds(), rtc.getMinutes()...ecc.)...
Non metto in dubbio che lo schema avrebbe potuto essere più snello...ho iniziato da poco e faccio ancora parecchi casini! XD
Title: Re: swRTC
Post by: leo72 on May 09, 2013, 10:04 pm
Hai anticipato ciò a cui sto lavorando con interruzioni. Avevo già messo in cantiere la swRTC2 proprio con la modifica di cui parli tu, ma l'ho lasciata a metà prima per il Led Clock e poi per la libreria per l'Arduino DUE.
Ecco uno screenshot del codice:
Title: Re: swRTC
Post by: leo72 on May 09, 2013, 10:09 pm

mi sfalsa di 4/5 secondi al giorno!!

E ti lamenti? E' una differenza accettabilissima  ;)
Title: Re: swRTC
Post by: leo72 on May 09, 2013, 10:11 pm
@lupo3000:
mi sembra che tu abbia preso il codice di setup del timer 2 del mio Micrologio e lo abbia ricopiato pari pari nel metodo setTimer della swRTC, vero?  ;)
Ci sono i miei commenti precisi come li ho scritti nello sketch del Micrologio  :P
Title: Re: swRTC
Post by: lupo3000 on May 09, 2013, 10:42 pm
esatto!! :P Ci ho provato!! XD
Title: Re: swRTC
Post by: lupo3000 on May 09, 2013, 10:49 pm


mi sfalsa di 4/5 secondi al giorno!!

E ti lamenti? E' una differenza accettabilissima  ;)


no no, infatti non mi lamento affatto...solo che non capisco perché con lo STESSO cristallo ci sia una differenza...non me lo spiego...
e poi non posso fare la correzione tramite "delta" dato che ho un interrupt ogni secondo, e non millisecondo...

dovrei fare una correzione software del tipo

Quote

if (rtc.getHours()==1 && rtc.getMinutes==0 && rtc.getSeconds()==0)
{  h=1;
   m=0;
   s=5;}
rtc.setTime(h, m , s)


in questo modo alla 01:00:00 di ogni notte me lo sposta a 01:00:05
Title: Re: swRTC
Post by: leo72 on May 09, 2013, 10:54 pm

esatto!! :P Ci ho provato!! XD

La swRTC2 sarà più sofisticata, permettendo di scegliere se usare il cristallo esterno da 32 kHz in tutti quei micro dotati del modulo Real-Time Counter come l'Atmega168/328.
In questo modo non si dovrà "spippolare" con copia-e-incolla sul codice ma tramite una semplice impostazione si potrà istruire il codice, che gestirà il setup del timer.
Title: Re: swRTC
Post by: leo72 on May 09, 2013, 11:00 pm

no no, infatti non mi lamento affatto...solo che non capisco perché con lo STESSO cristallo ci sia una differenza...non me lo spiego...

Ma tu stai usando il modulo Real-Time Counter di un microcontrollore, non un Real-Time Clock.
Ci sono anche altri interrupt su un microcontrollore che possono arrivare in concomitanza con l'overflow del timer 2 ed accavallarsi, per cui una piccolissima, infinitesima, differenza ogni secondo, sommata per 86400 secondi al giorno, alla fine dà un piccolo scostamento.
Title: Re: swRTC
Post by: lupo3000 on May 09, 2013, 11:07 pm
ah ecco, questo particolare mi mancava!! premetto che ho iniziato a "smanettare" con arduino due mesi fa con zero conoscenze di programmazione e un minimo iper-basico di conoscenze di elettronica...chiedo venia! :D
quindi la radio-sveglia che ho smontato ha un controller e real time clock tutto insieme...ha un solo integrato (minuscolo) che gestisce 10 (!!) cifre a sette segmenti, il real time clock, sveglia, temperatura, una decina di musichette preimpostate, la lettura sintetizzata dell'ora e 7 pulsanti!! Qui stiamo parlando di magia!! :P
non ha altri integrati, solo qualche resistenza, un paio di condensatori e un paio di transistor!!
Title: Re: swRTC
Post by: lupo3000 on May 09, 2013, 11:24 pm
con un'opinione esperta almeno sono sicuro di non aver sbagliato il codice, almeno quello...
GRAZIE MILLE!!
Title: Re: swRTC
Post by: lestofante on May 09, 2013, 11:48 pm

questo è lo schema... ho semplicemente settato gli interrupt sul swRTC_32768 e poi ho richiamato le funzioni delle libreria (rtc.getSeconds(), rtc.getMinutes()...ecc.)...
Non metto in dubbio che lo schema avrebbe potuto essere più snello...ho iniziato da poco e faccio ancora parecchi casini! XD


nono, intendo, come hai collegato il quarzo? mica genera un segnale 5v, senza un adeguato circuito.. o sbaglio?
Title: Re: swRTC
Post by: lupo3000 on May 10, 2013, 12:04 am


questo è lo schema... ho semplicemente settato gli interrupt sul swRTC_32768 e poi ho richiamato le funzioni delle libreria (rtc.getSeconds(), rtc.getMinutes()...ecc.)...
Non metto in dubbio che lo schema avrebbe potuto essere più snello...ho iniziato da poco e faccio ancora parecchi casini! XD


nono, intendo, come hai collegato il quarzo? mica genera un segnale 5v, senza un adeguato circuito.. o sbaglio?


classico...con due condensatori da 22pF con un'armatura a massa e l'altra sul piedino del quarzo...
Title: Re: swRTC
Post by: lestofante on May 10, 2013, 12:16 am
ma scusa, hai detto che hai fatto il micreo stand alone con quarzo da 8MHz


Il tutto funziona abbastanza bene, sta girando su ATMega328 in stand alone (clock a 8 MHz) con bootloader Arduino UNO.


quindi.. non ho capito. Puoi usare il quarzo interno per il micro e quello esterno per il modulo RTC? pensvo che attivando l'RTC l'atmega avrebbe lavorato a ~32kHz!!
Title: Re: swRTC
Post by: testato on May 10, 2013, 12:40 am
Si lesto ê questo il compito del RTC interno al micro
Il micro viaggia ad una velocità ed il riferimento di precisione per RTC lo prende dal quarzo da 32k
Title: Re: swRTC
Post by: leo72 on May 10, 2013, 08:42 am

ma scusa, hai detto che hai fatto il micreo stand alone con quarzo da 8MHz


Il tutto funziona abbastanza bene, sta girando su ATMega328 in stand alone (clock a 8 MHz) con bootloader Arduino UNO.


quindi.. non ho capito. Puoi usare il quarzo interno per il micro e quello esterno per il modulo RTC? pensvo che attivando l'RTC l'atmega avrebbe lavorato a ~32kHz!!

Sicuramente ha impostato l'oscillatore interno ad 8 MHz per il semplice motivo che l'Atmega328 non ha 2 coppie di pin per 2 quarzi separati, uno per il clock di sistema ed uno per il modulo RTC per cui passa tutto da XTAL1 e XTAL2. Dipende poi da come si setta il timer 2: impostandolo per lavorare in modalità asincrona, il timer si sgancia dal clock di sistema e preleva la frequenza dal cristallo esterno.
Title: Re: swRTC
Post by: lupo3000 on May 10, 2013, 09:21 am
Esatto!!! da quello che ho capito il controller esegue le istruzioni a 8 Mhz, prendendo come rifermento il clock interno, mentre in Timer2 è asincrono e prende come riferimento il quarzo esterno. Almeno credo, io ho impostato i fuses per lavorare a 8 Mhz, ma non ho modo di verificare che non lavori tutto a 32 Khz...questo dovrEBBE essere il comportamento del micro...
Title: Re: swRTC
Post by: leo72 on May 10, 2013, 09:25 am
Non ti preoccupare, stai lavorando col clock interno a 8 MHz.
Title: Re: swRTC
Post by: testato on May 10, 2013, 01:12 pm
leo mi chiedevo, ma visto che anche con il quarzo da 32kHz si hanno errori di 5 sec al giorno, la precisione del clock interno come e' ? Hai mai usato la tua RTC senza quarzo e quindi con solo gli 8MHz interni ?
Title: Re: swRTC
Post by: lestofante on May 10, 2013, 02:02 pm
lo fece, con risultati prevedibili: l'oscilatore è peggio del quarzo.
Title: Re: swRTC
Post by: testato on May 10, 2013, 05:16 pm
lo immaginavo, pero' imprecisione per imprecisione a quel punto non h senso usare quarzi esterni, si usano gli 8MHz interni e sotto di DeltaT,
che senso ha andare ad aggiungere manualmente i secondi a fine giornata, mettere un quarzo esterno, modificare le cose ?
Title: Re: swRTC
Post by: lupo3000 on May 10, 2013, 06:12 pm
prima di metterci il quarzo l'ho testato con l'oscillatore interno...beh, c'è un errore allucinante, tipo 4/5 minuti al giorno!!
Title: Re: swRTC
Post by: testato on May 10, 2013, 07:45 pm
si, ma senza taratura ?
con la deltaT dovresti poter correggere il tutto
Title: Re: swRTC
Post by: lupo3000 on May 10, 2013, 07:58 pm
l'oscillatore interno dipende dal voltaggio e dalla temperatura, c'è scritto sul datasheet...il voltaggio dovrebbe essere più o meno costante, la temperatura varia e dovrei aggiungere una delta(temp), diventa un casino! Il quarzo dovrEBBE essere mooooolto più stabile. Se solo si riuscisse a contare con precisione le oscillazioni sarebbe precisissimo, come lo era la sveglia da cui l'ho smontato. ma ahimé, qui penso che si eccedano le capacità tecniche del controller...come dice leo, non è un Real Time Clock, stiamo solo simulando questa funzione usando il Real Time Counter.
Title: Re: swRTC
Post by: lestofante on May 11, 2013, 12:24 am

con la deltaT dovresti poter correggere il tutto


assolutamente no!!! ilnumero di clock è di 8MHz +- un fattore random dato da temperatura, qualità delsegnale, delle connessioni, interferenze esterne etc... Il deltaT è una pezza per "il grosso", ma di certo non sufficiente.
Title: Re: swRTC
Post by: astrobeed on May 11, 2013, 08:34 am

si, ma senza taratura ?
con la deltaT dovresti poter correggere il tutto


L'oscillatore interno degli AVR è di tipo RC, non può essere ne preciso e tantomeno stabile, anche se c'è un registro che permette di "tararlo" in modo da ottenere circa 8.000 MHz ad una certa temperatura è comunque soggetto a sensibili fluttuazioni di frequenza, in parte random, in parte dovute a parametri fisici come la tensione di alimentazione e la temperatura.
Per farla breve, l'oscillatore RC interno non va bene per applicazioni che richiedono temporizzazioni molto precise come un orologio.
Title: Re: swRTC
Post by: leo72 on May 11, 2013, 09:44 am
L'oscillatore interno è quanto di peggio possa esistere  ]:D
E' un RC ma è anche dato per un errore astronomico: +/- 10%!
(datasheet pag. 309, par. 29.4).

PS:
ieri ho lavorato alla swRTC modificata. Tra poco la pubblico. Essa permette di attivare il modulo RTC con quarzo esterno con una semplice define da inserire nello sketch prima dell'inclusione della libreria. Sta poi alla libreria impostare i registri per usare l'RTC interno. Che, ricordo, non sta per Real-Time Clock ma per Real-Time Counter (solo il SAM3X dell'Arduino DUE ha un vero Real-Time Clock). E' comunque un modulo che è molto più preciso, come dimostra il mio progetto Micrologio.
Non cambiate canale  ;)
Title: Re: swRTC
Post by: testato on May 11, 2013, 09:49 am
Pensavo meno peggio  :)
Thanks
Title: Re: swRTC
Post by: astrobeed on May 11, 2013, 10:28 am

Pensavo meno peggio  :)


Sei un ottimista inguaribile :)
Title: Re: swRTC
Post by: leo72 on May 11, 2013, 11:36 am
swRTC 1.2.0
aggiunto il supporto al modulo RTC (Real-Time Counter) presente su alcuni microcontrollori (Atmega88/168/328, Atmega8, Atmega344/644/1284, Atmega1280/2560/2561).

Ricordo che link è nel 1° post di questo thread.
Title: Re: swRTC
Post by: lupo3000 on May 11, 2013, 02:02 pm
grande leo!! mitico!!
Title: Re: swRTC
Post by: leo72 on May 11, 2013, 02:12 pm
L'uso è banalissimo. Basta mettere un
Code: [Select]
#define USE_INTERNAL_RTC
proprio prima dell'inclusione della libreria, in questo modo il compilatore aggiusta il codice della lib in modo da usare il modulo, senza interventi nei file del sorgente. La lib fa un check anche per verificare l'effettiva presenza del modulo.

PS: ho notato che ancora non ho inserito il supporto alla Leonardo ed al suo Atmega32U4, provvederò al più presto.
Title: Re: swRTC
Post by: lupo3000 on May 11, 2013, 04:16 pm
mi è venuta un'idea...se usassi un quarzo da 16 mhz impostando il timer 2 asincrono su quel quarzo, tenendo l'atmega con il clock interno a 8 mhz?? Teoricamente con una frequenza di oscillazione superiore dovrebbero esserci meno errori, ma può funzionare a velocità superiore a quella di clock??
Title: Re: swRTC
Post by: testato on May 11, 2013, 04:32 pm
No
Con oscillo interno l unico quarzo gestibile è quello da 32kHz
Title: Re: swRTC
Post by: lupo3000 on May 11, 2013, 04:47 pm
ovviamente modificando il codice... tipo...

Quote

...altro codice...

//disabilito tutti gli interrupt
   TIMSK2 &= ~(1<<TOIE2);
   TIMSK2 &= ~((1<<OCIE2A) | (1<<OCIE2B));

//modo asincrono, quarzo esterno
   ASSR |= (1<<AS2);

// imposto il prescaler per  16 Mhz
        TCCR2B |= (1<<CS22);
        TCCR2B &= ~((1<<CS21) | (1<<CS20));
        prescaler = 64.0;

//il timer incrementa con un overflow
   TCCR2A &= ~((1<<WGM21) | (1<<WGM20));
   TCCR2B &= ~(1<<WGM22);

//valore iniziale del counter
starter = 256 - (int)((float)F_CPU * 0.001 / prescaler);

...altro codice...




in questo modo elimino tutti gli "if" e aggiro la dipendenza dal clock interno, ma viene mpostato "manualmente" per utilizzare una fonte esterna di clock, pur avendo settato i fuses per lavorare con clock interno...
Title: Re: swRTC
Post by: leo72 on May 11, 2013, 05:38 pm
Non credo funzioni perché in modalità asincrona il micro viene impostato per lavorare proprio con un quarzo da 32 kHz.
Per clock differenti devi impostare i fuse correttamente, sono quelli che poi impostano il micro per poter gestire la fonte di clock sui pin XTAL1 e 2.
Title: Re: swRTC
Post by: lupo3000 on May 11, 2013, 06:25 pm
ah già è vero...dimenticavo...c'è scritto sul datasheet!! Invece un'altra idea...mettere su un pin il segnale a 2 Hz che deriva da un CD4060 quarzato a 32768 Hz. Un segnale da 2 Hz è facile da gestire, non credo ci siano problemi...qualcosa tipo:

Quote

digitalRead(Pin)
if ((statoPin) != (riferimento))
   {
      riferimento++;
           if (riferimento == 2)
                 {riferimento=0;
                   SecondsX++;
                  }
   }




potrebbe essere un'idea?
Title: Re: swRTC
Post by: leo72 on May 11, 2013, 06:32 pm
Questa idea è praticabile, la uso nel mio Led Clock  :P

Alcune cose:
1) Perché 2 secondi? Usa direttamente il segnale da 1 secondo.  ;)
2) io ci attacco un interrupt, così sono sicuro di non perdere un colpo;
3) che senso ha usare la swRTC se hai un RTC esterno?  :smiley-yell:
Title: Re: swRTC
Post by: testato on May 11, 2013, 06:57 pm
Infatti  :)
Se vuoi mettere componenti esterni allora prendi un rtc da pochi euro ed hai anche la batteria tamponata per 5anni  :)
Title: Re: swRTC
Post by: lupo3000 on May 11, 2013, 09:32 pm

Infatti  :)
Se vuoi mettere componenti esterni allora prendi un rtc da pochi euro ed hai anche la batteria tamponata per 5anni  :)



in effetti...mica hai tutti i torti!! XD
Title: Re: swRTC
Post by: genny77 on Feb 23, 2015, 10:31 am
Ciao a tutti,
perdonate l'ignoranza ma posso usare questa libreria su arduino YUN ?

Grazie
Title: Re: swRTC
Post by: leo72 on Feb 23, 2015, 02:58 pm
A che ti serve questa lib su Arduino Yun dato che lato Linux hai un SO che può gestire il tempo tramite server NTP? ;)
Title: Re: swRTC
Post by: testato on Mar 15, 2015, 03:08 pm
magari per progetti non connessi ad internet ?
non tutte le reti cablate/wifi si creano per accedere ad internet  ;)

dovrebbe gia' funzionare di suo o no ? il 32u4 e' supportato
Title: Re: swRTC
Post by: paolone86 on Mar 22, 2015, 01:22 pm
ragazzi io ho un problema a tempo di compilazione come Arduino Uno e IDE 1.6.1.
Ho importato la libreria, eseguo swRTCtest ma ottengo:

In file included from swRTCtest.ino:16:0:
C:\Users\User\Documents\Arduino\libraries\swRTC/swRTC.h:524:6: error: prototype for 'byte swRTC::setClockWithTimestamp(long unsigned int, int)' does not match any in class 'swRTC'
 byte swRTC::setClockWithTimestamp(unsigned long timeT, int yearRef) {
      ^
C:\Users\User\Documents\Arduino\libraries\swRTC/swRTC.h:92:11: error: candidate is: boolean swRTC::setClockWithTimestamp(long unsigned int, int)
   boolean setClockWithTimestamp(unsigned long timeT, int yearT = 0);
           ^
Errore durante la compilazione

come mai ?
grazie in anticipo
Title: Re: swRTC
Post by: gpb01 on Mar 22, 2015, 01:55 pm
 Prima di tutto, essendo il tuo primo post, ti consiglio di presentarti QUI (http://forum.arduino.cc/index.php?topic=113640.0) (spiegando quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO (http://forum.arduino.cc/index.php?topic=149082.0) ...

... poi, perché nella 1.6.1, contrariamente alle versioni precedenti, il boolean ed il byte sono diventati due cose differenti.

Così a naso direi che ... puoi aprire i sorgenti della swRTC (swRTC.h) e sostituire dove trovi "boolean" con "byte" ...
... senza alcun "danno collaterale"  :smiley-roll:

Guglielmo
Title: Re: swRTC
Post by: paolone86 on Mar 22, 2015, 02:53 pm
Prima di tutto, essendo il tuo primo post, ti consiglio di presentarti QUI (http://forum.arduino.cc/index.php?topic=113640.0) (spiegando quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO (http://forum.arduino.cc/index.php?topic=149082.0) ...

... poi, perché nella 1.6.1, contrariamente alle versioni precedenti, il boolean ed il byte sono diventati due cose differenti.

Così a naso direi che ... puoi aprire i sorgenti della swRTC (swRTC.h) e sostituire dove trovi "boolean" con "byte" ...
... senza alcun "danno collaterale"  :smiley-roll:

Guglielmo
Innanzitutto chiedo scusa per non essermi presentato.
L'ho fatto solo da poco...
Sostituendo tutte le variabili da boolean a byte adesso compila.
Grazie mille!
Title: Re: swRTC
Post by: gpb01 on Mar 22, 2015, 03:05 pm
Ottimo ...   :)
... ho comunque avvertito Leo (l'autore della libreria) che provvederà a verificare sulle sue varie librerie ed a sistemare la cosa in una prossima release ;)

Guglielmo
Title: Re: swRTC
Post by: testato on Mar 22, 2015, 05:27 pm
perché nella 1.6.1, contrariamente alle versioni precedenti, il boolean ed il byte sono diventati due cose differenti.
INteressante, alla fine sempre un byte occupano :-)

ma dove hai letto questa cosa ? nel changelog non c'e'
http://arduino.cc/en/Main/ReleaseNotes (http://arduino.cc/en/Main/ReleaseNotes)
Title: Re: swRTC
Post by: gpb01 on Mar 22, 2015, 05:39 pm
Non l'ho letta, se ne è discusso in un altro thread (http://forum.arduino.cc/index.php?topic=309675.0) perché il codice che usa i boolean ora occupa di più (... ovvio, invece che puro C usa una classe C++ (http://braguglia.net/Smiles/birgits_gal.gif) ) ed è bastato andare a vedere nel "core", file Arduino.h, come sono definiti:

Code: [Select]
#include <stdbool.h>
...
...
typedef bool boolean;
typedef uint8_t byte;


... mentre prima entrambi erano definiti come semplici uint8_t !

Guglielmo
Title: Re: swRTC
Post by: testato on Mar 22, 2015, 10:03 pm
E per quale diavolo di motivo hanno fatto una cosa del genere ?
Io lo catalogherei come Bug  :smiley-eek:
Si è creata incompatibilità con le librerie, consumo maggiore di flash, rallentamento delle operazioni, a fronte di cosa ?

Facciamo una pull request rimettendo le cose come prima   :)
Title: Re: swRTC
Post by: astrobeed on Mar 23, 2015, 08:06 am
E per quale diavolo di motivo hanno fatto una cosa del genere ?
Io lo catalogherei come Bug  :smiley-eek:
Per allinearsi con il C/C++ dove il tipo boolean è diverso dal tipo unsigned char, la differenza è che il primo può assumere solo valore 0 o 1 mentre il secondo qualunque valore compreso tra 0 e 255.
Anche se la cosa ti sembra una cavolata ha una sua ragione di essere e ti garantisco che quella è sempre stata una bella cavolata di Arduino definire il tipo bool come unsigned char invece che come boolean, comunque presente nel avrgcc, il tipo boolean è stato introdotto nel C Ansi a partire dalla versione C90.
Il vero bug era nelle precedenti versioni del IDE dove, arbitrariamente, avevano definito bool come unsigned char, cosa che potrebbe causare problemi a run time con codice scritto in C/C++ dove viene utilizzato il tipo boolean per quello che è realmente.
Esempio pratico se in una if si aspetta che il dato boolean sia esclusivamente  0 o 1 e fa un confronto if (pippo == 1), con pippo definito bool con il vecchio sistema, e pippo ha assunto il valore '5' a causa dei calcoli la if non funziona, se pippo è un vero boolean anche se il calcolo fornisce 5 pippo diventa 1.


Title: Re: swRTC
Post by: astrobeed on Mar 23, 2015, 08:07 am
Si è creata incompatibilità con le librerie,
L'incompatibilità è di chi ha scritto le librerie senza tenere conto del vero significato di un dato boolen :)
Title: Re: swRTC
Post by: PaoloP on Mar 23, 2015, 10:22 am
INteressante, alla fine sempre un byte occupano :-)

ma dove hai letto questa cosa ? nel changelog non c'e'
http://arduino.cc/en/Main/ReleaseNotes (http://arduino.cc/en/Main/ReleaseNotes)

Si che c'è
Quote
ARDUINO 1.6.0rc2 - 2015.01.20

[ide]
* Reenabled speed of 38400 on serial monitor
* Improved Find/Replace dialog layout (Eberhard Fahle)
* Fixed missing .dll error on some Windows box

[core]
* Arduino "boolean" type is now mapped to "bool" instead of "uint8_t" (Christopher Andrews)
Title: Re: swRTC
Post by: testato on Mar 23, 2015, 12:45 pm
Quindi non è dalla 1.6.1 ma gia dalla 0

Ma in questo caso dove la lib di leo non funziona lui che colpa ne ha ?
Title: Re: swRTC
Post by: gpb01 on Mar 23, 2015, 08:11 pm
Ma in questo caso dove la lib di leo non funziona lui che colpa ne ha ?
Perché, qualcuno gli sta dando delle COLPE ? ? ?  :o  :o  :o

Tutt'al più Leo si è fidato di quanto fatto nell'IDE e non s'è preoccupato molto di mischiare boolean e byte ...
... ora che hanno cambiato le carte in tavola, si adeguerà di nuovo  :smiley-mr-green:

Guglielmo
Title: Re: swRTC
Post by: testato on Mar 23, 2015, 08:20 pm
Da quello che scrive Astro mi sembra di capire che chi scrive la libteria avrebbe dovuto in anticipo tener conto della cosa, oppure cosa intende ?
Title: Re: swRTC
Post by: leo72 on Mar 26, 2015, 09:27 pm
Sì, Guglielmo mi ha già avvertito del problema. Purtroppo in questi ultimi tempi sono all'opera su una cosa che mi sta portando via tutto il tempo libero che mi resta al netto di famiglia, lavoro, czz e mazzi vari. Spero di metterci mano quanto prima e di controllare e, eventualmente, adeguare.

Tengo comunque a precisare che nella lib usai il tipo "boolean" dove volevo restituito da una funzione un semplice "true" o "false". Quindi non ho fatto un uso "sconsiderato" del tipo boolean, a mio avviso :)

Title: Re: swRTC
Post by: Etti on Jan 18, 2016, 12:31 pm
Ciao Leo,
esiste una versione aggiornata per la versione IDE 1.6.5.?
A me interessa calcolo del giorno dell'anno e della settimana, sai dove prendere spunto?
Ciao saluti
Etti
Title: Re: swRTC
Post by: PaoloP on Jan 18, 2016, 12:56 pm
Questa --> http://www.leonardomiliani.com/2016/swrtc-1-2-2/ (http://www.leonardomiliani.com/2016/swrtc-1-2-2/)

Ho scaricato la libreria ma c'è un evidente bug che non permette la compilazione.
Alla riga 94 del file swRTC.h il metodo setClockWithTimestamp è definita boolean mentre nel resto del codice la funzione è definita byte e restituisce valori da 0 a 6.
Basta cambiare nella riga 92 boolean in byte e la libreria compila anche con IDE 1.6.7.
Title: Re: swRTC
Post by: testato on Jan 18, 2016, 09:37 pm
È dalla 1.6.0 che non va, a causa della nuova, e corretta, mappatura del tipo boolen a bool.
Se ne parlo' nella pagina precedente a questa.
Title: Re: swRTC
Post by: PaoloP on Jan 19, 2016, 09:24 am
Testato, non è causa della nuova mappatura, è un errore del programmatore. Perché la funzione è il suo prototipo sono stati dichiarati con due tipi diversi. Uno boolean e l'altro byte.
Che poi su Arduino, prima, fossero la stessa cosa a causa di #define, ciò nascondeva solo un errore di concetto.
Non si possono definire come tipi diversi prototipo e funzione, altrimenti il compilatore va in errore.
Quindi o entrambi boolean o entrambi byte, ma non uno così e uno cosà.  :smiley-confuse:

P.S. Leo, bentornato.  :smiley-mr-green:
Title: Re: swRTC
Post by: testato on Jan 19, 2016, 12:41 pm
Che la lib non funziona dalla modifica del team arduino è vero, che poi in più c'è anche un errore nella libreria ne prendo atto.
Ma non è che di queste due affermazioni una è vera ed una è falsa  ;)

ps: dove lo vedi leo ?
Title: Re: swRTC
Post by: gpb01 on Jan 19, 2016, 01:35 pm
ps: dove lo vedi leo ?
QUI (http://forum.arduino.cc/index.php?topic=73496.msg2158988#msg2158988)  :D :smiley-mr-green: :D


Guglielmo
Title: Re: swRTC
Post by: PaoloP on Jun 05, 2016, 10:00 am
Ciao Leo.
Cosa è cambiato nella versione 1.2.6?
Title: Re: swRTC
Post by: IW3RED on Jan 05, 2017, 11:12 am
Buon giorno e buon anno a tutti.
Volevo sapere se vi è capitato o solo a me sta capitando che dal 1/1/2017 il mio orologio che usa la
libreria swRTC e avanti di un giorno quindi , 2/1/2017.
Grazie by Maurizio.
Title: Re: swRTC
Post by: testato on Jan 06, 2017, 05:49 pm
ho acceso l'orologio a valvole per controllare, no, nessun problema a me  :)

Title: Re: swRTC
Post by: IW3RED on Jan 07, 2017, 06:00 pm
Bene........ !!!!
Accipicchia il bello e che lo usata anche in altri due dispositivi che fanno tut'altro e mi danno lo stesso problema........ahah !!!!
Uso IDE 1.6.5 e girano sul MEGA.
A questo punto mi sa che dovrò passare delle nottolate !!!!!
Ti ringrazio, un saluto dal Friuli.
Maurizio
Title: Re: swRTC
Post by: testato on Jan 07, 2017, 06:28 pm
Spetta, ma io ad un certo punto tolsi la swRTC e misi un hwRTC, scusa  mi e' venuto in mente ora  :)

Visto che il 2016 e' un anno bisestile una buona ipotesi e' che dipenda da quello.
riprova manualmente a portare indietro alla mezzanotte del 31 2016, se lo rifa' rifai la prova anche con il 2020, prossimo anno bisestile.

Nel frattempo giro la cosa all'autore, vediamo se lo facciamo passare di qua  ;)

Title: Re: swRTC
Post by: leo72 on Jan 18, 2017, 10:37 am
Buon giorno e buon anno a tutti.
Volevo sapere se vi è capitato o solo a me sta capitando che dal 1/1/2017 il mio orologio che usa la
libreria swRTC e avanti di un giorno quindi , 2/1/2017.
Grazie by Maurizio.
Ciao Maurizio, qual è esattamente il problema?
Title: Re: swRTC
Post by: IW3RED on Feb 09, 2017, 07:00 pm
Ciao Leo.
Scusa se ti rispondo solamente ora ma per impegni sia lavorativi che famigliari era da gg che non aprivo il pc.
Allora il prob. e che risulta avanti di un giorno. Se oggi è giovedì lui mi dice che è venerdì.
Il mio orologio ogni tot tempo si sincronizza via server ntp e ricarica con il valore nuovo la libreria swRTC e salva
anche sul ds1307......sai non si sa mai......!!!!
Tutto e andato bene fino al 31/12/2016 appena passati al 2017 ecco che mi segna un giorno in avanti.

Ciao e Grazie by Maurizio.