DS1307 e scrittura su memoria interna dati

Salve ragazzi avrei un problemino credo di essere ad un oasso dalla soluzione ma avrei bisogno di un aiutino.

Utilizzo Arduino 0023
Utilizzo la libreria DS1307.h

setto senza problemi ora e data sia da seriale che da tasti.

Devo però impostare una flag per la gestione dell'ora solare legale, in pratica se il valore è a 1 sono passato ad ora legale se sono all'ora solare è a zero.

Attualmente la gestione la faccio in maniera diversa ovvero con una funzione if verifico se mi trovo all'ultima di marzo se sono alle 2 di notte e se sì faccio fermare il rtc aggiungo al byte ore +1 e ristarto il ds

il problema che così facendo anche se infinitesimale ho un ritardo nel ds

Vorrei quindi impostare un flag nel ds ( per evitare che se spengo l'oroglogio perdo il valore salvato ) che verrebbe mantenuto dalla batteria tampone.

Con che comando posso scrivere ( e poi leggere )questa variabile ?

grazie mille googlenado non ho trovato nulla di adeguatamente esplicato.

Daniele

Ho aggiunto 2 funzioni alla libreria:
int = RTC.readram(int adr) che da di ritorno il contenuto della cella di memoria al indirizzo adr
void RTC.saveram(int adr, int data) che memorizza data sul indirizzo adr,
Entrambe accettano solo valori di indirizzo da 8 a 56.

in allegato i file. Devi metterli nella cartella DS1307RAM
Ciao Uwe

[EDIT]La libreria sottostante funziona con IDE < 1.0.0[/EDIT]

DS1307RAM.cpp (4.33 KB)

DS1307RAM.h (1.37 KB)

Se dovessi usare l'IDE della serie 1.x c'è questa libreria --> https://code.google.com/p/ds1307new/

Ciao e perdonatemi se rispondo solo ora ma non ho avuto la notifica via email di risposta.

Grazie mille
Adesso proverò, o meglio volevo provare qualche stringa trovata ma spero che qui in questo modo sià più semplice

Tornerò a riferirvi

Provo ad intuito

voglio salvare un valore di un flag in ram del ds1307 supponiamo 1
int flag = 1;

il comando è

saveram(int adr, int data)

quindi ( scelgo l'address compreso tra 8 e 56 suponiamo 8 e scrivo )

saveram(8, flag); ( giusto ?)

per leggere il valore di questo flag e metterlo nella variabile read flag

readflag = readram (8, flag) ;

sbaglio ?

grazie in anticipo

djdanielb:
saveram(8, flag); ( giusto ?)

Giusto!

djdanielb:
per leggere il valore di questo flag e metterlo nella variabile read flag
readflag = readram ( 8, flag ) ;
sbaglio ?


metti il contenuto della EEprom al indirzzo 8 nella variabile readflag:
readflag = readram ( 8 ) ;

Ciao Uwe

Grazie per la risposta ma ci sto sbattendo sopra da ore

 int flag = 1;
      int readflag ;
      void saveram(8, flag);
      readflag = readram (8);

ma ecco l'errore

In function 'void clock_time()':
variable or field 'saveram' declared void
error: 'readram' was not declared in this scope

io ho messo tutto dentro la cartella DS1307RAM
ma ho comunque lasciato la mia DS1307

dove sbaglio ?

grazie mille

Daniele

dunque l'unico modo per non avere errori è

      int adr = 8;
      int data = 1;
      
      void saveram(int adr, int data);
     
      int readram (int adr);
     // flou = readram;
    Serial.print (readram (int adr));

ma sul Serial.print mi dà errore

sto uscendo matto

dunque così funziona ( o meglio non restituisce errori e compila )

    int adr = 8;
    int data = 1;
    void saveram(int adr, int data);
 
    int readram ( int adr ) ;

ma come faccio a "maneggiare" il valore letto ?

se faccio

Serial.print (readram);

ecco saltar fuori l'errore e che errori

pongclock_v5_fusiorari.cpp: In function 'void clock_time()':
pongclock_v5_fusiorari:878: error: call of overloaded 'print(int (&)(int))' is ambiguous
C:\Users\Raffaella\Desktop\Daniele\arduino-0023\hardware\arduino\cores\arduino/Print.h:44: note: candidates are: void Print::print(const String&) <near match>
C:\Users\Raffaella\Desktop\Daniele\arduino-0023\hardware\arduino\cores\arduino/Print.h:46: note:                 void Print::print(char, int) <near match>
C:\Users\Raffaella\Desktop\Daniele\arduino-0023\hardware\arduino\cores\arduino/Print.h:47: note:                 void Print::print(unsigned char, int) <near match>
C:\Users\Raffaella\Desktop\Daniele\arduino-0023\hardware\arduino\cores\arduino/Print.h:48: note:                 void Print::print(int, int) <near match>
C:\Users\Raffaella\Desktop\Daniele\arduino-0023\hardware\arduino\cores\arduino/Print.h:49: note:                 void Print::print(unsigned int, int) <near match>
C:\Users\Raffaella\Desktop\Daniele\arduino-0023\hardware\arduino\cores\arduino/Print.h:50: note:                 void Print::print(long int, int) <near match>
C:\Users\Raffaella\Desktop\Daniele\arduino-0023\hardware\arduino\cores\arduino/Print.h:51: note:                 void Print::print(long unsigned int, int) <near match>

bha sto impazzendo

ho provato anche ad andare dentro la libreira e copiare in codice direttamente le chiamate delle funzioni

La scrittura và a buon fine ( credo lo suppongo visto che non restituisce errori)

ma la lettura proprio non la capisco

edit by mod:
per favore pubblica il codice usando i tag appositi, è il terzo tuo post che correggo in questo thread...

Dovresti studiarti un po' di linguaggio C per comprendere almeno le basi.
--> C (linguaggio): tutorial per imparare programmare | Guida HTML.it
puoi iniziare dal cap. 11 se vuoi.

djdanielb:
Grazie per la risposta ma ci sto sbattendo sopra da ore

int flag = 1;
int readflag ;
void saveram(8, flag);
readflag = readram (8);

ma ecco l'errore

In function 'void clock_time()':
variable or field 'saveram' declared void
error: 'readram' was not declared in this scope

io ho messo tutto dentro la cartella DS1307RAM
ma ho comunque lasciato la mia DS1307

dove sbaglio ?

grazie mille

Daniele

Stai dando sempre pezzettini del codice mai il codice completo.
Hai incluso la libreria DS1307RAM?

Ciao Uwe

salve ragazzi
innanzitutto grazie per le risposte

mi scuso per non aver usato l'apposito comando per postare il codice ( mea culpa )

non posto tutto il codice poichè sono circa 2550 righe di codice di cui circa 800 scritte da me.

Ammetto di non essere un genio di programmazione in C ma una decina di anni fà studiai cobol pascal e basic e sebbene fossero stati fatti a scuola per 3 anni qalcosa di logica è rimasto.

Il codice in oggetto appartiene alla mia personale modifica del famosissimo progretto di PONG CLOCK realizzato con Arduino e doppio display SURE 2416

postare l'intero codice credo abbia poco senso: lo scopo della mia domanda che apriva il post è la gestione dell'ora solare - legale da qui la necessità di immagazzinare il risultato di una funzione che controlla se ci troviamo tra l'ultima di marzo e l'ultima di ottobre, in una memoria che fosse tenuta sotto controllo anche in assenza di alimentazione o reset.

devo scrivere un benedetto flag 0 o 1 dentro la ram del ds1307

googlando c'è il comando che prevede l'indirizo in esadecimale delle posizioni successive a quelle usate per immagazzinare la data e l'ora

ora i comandi store e read sono andato a ricercarmeli nella libreria gentilmente postata qui ma non ho trovato in rete nessuna applicazione pratica pertanto mi sono sorti non pochi dubbi

ora dopo svariati tentativi e meditazioni sono giunto a fare quanto segue ( compila ma mi restituisce in serial print un valore inesatto )

alla fine del codice insieme a tutti i metodi ( o funzioni ) ho aggiunto quanto segue

void saveram(int adr, int data){
}

int readram(int adr){
}

a questo punto nella parte di codice che mi interessa aggiungo :

saveram (8,1);   // scrivo nella posizione 8 della ram del ds1307 il valore 1   GIUSTO ?

ora non mi resta che leggerlo e stamparlo via seriale

 Serial.print (readram ( 8 ));

solo che mi legge tutti zero ( dico tutti zero poichè è in un ciclo di for e quindi ad ogni lettura legge zero

credo di essere vicino alla soluzione ma non sò dove sbaglio

grazie a chi mi aiuterà

Daniele

piu' semplicemente in questi casi memorizzo il flag nella eeprom di arduino, fai tutto in modo standard senza aggiunta di librerie.
Guarda gli esempi gia' integrati nell'IDE.
E' preferibile fare come dico io perche' non sei legato all'rtc. se ad esempio userai un rtc software, tipo la swrtc di leo, iltuo codice continua a funzionare.
oppure nei casi in cui usi rct esterni ma che non hanno memoria interna.

Ciao testato e grazie per la risposta

Purtroppo avevo pensato a questa eventualità , ma sono a corto di spazio nel 328.

Considerato che ho ancora da aggiungere la sveglia e che quindi avrò bisogno di altri due byte preferisco usare quelli disponibili nel ds.

sento di essere vicino alla soluzione anche s emi viene il dubbio che possa sbagliare non a leggere ma a scrivere ovvero leggo ZERO non perchè sbaglio nella procedura di lettura ma nella procedura di scrittura.

Attendo infatti la risposto di chi qui mi ha aiutato per questo.

Grazie mille

Daniele

djdanielb:

void saveram(int adr, int data){

}

int readram(int adr){
}





a questo punto nella parte di codice che mi interessa aggiungo :



saveram (8,1);   // scrivo nella posizione 8 della ram del ds1307 il valore 1   GIUSTO ?





ora non mi resta che leggerlo e stamparlo via seriale



Serial.print (readram ( 8 ));




solo che mi legge tutti zero ( dico tutti zero poichè è in un ciclo di for e quindi ad ogni lettura legge zero

credo di essere vicino alla soluzione ma non sò dove sbaglio


grazie a chi mi aiuterà

Daniele

È giusto che Ti legge zero. Tu hai creato una funzione senza funzionalitá che stai chiamando, non chiami quella della libreria.
Ma hai incluso la libreria che Ti ho dato?
Ciao Uwe

Grazie per la risposta

dunque

#include <ht1632c.h>                     // Holtek LED driver by WestFW - updated to HT1632C by Nick Hall
#include <avr/pgmspace.h>                // Enable data to be stored in Flash Mem as well as SRAM              
#include <Font.h>                        // Font library
#include <WProgram.h>                    // DS1307 clock
#include <Wire.h>                        // DS1307 clock
#include <DS1307.h>                      // DS1307 clock library by mattt on the arduino forum with various revisons from other users
#include <Button.h>                      // Button library by Alexander Brevig
#include <DS1307RAM.h>                   // Include libreria gestione RAM
 saveram( 8, 1 );
 int flag ;
 flag = readram(8);
 Serial.print (flag);

ecco l'errore

In file included from pongclock_v5_fusiorari.cpp:23:
C:\Users\daniele\Desktop\varie2\arduino-0023\libraries\DS1307RAM/DS1307RAM.h:42: error: redefinition of 'class DS1307'
C:\Users\daniele\Desktop\varie2\arduino-0023\libraries\DS1307/DS1307.h:47: error: previous definition of 'class DS1307'
pongclock_v5_fusiorari.cpp: In function 'void gettime()':
pongclock_v5_fusiorari:241: error: 'saveram' was not declared in this scope
pongclock_v5_fusiorari:243: error: 'readram' was not declared in this scope

caspita ma dov'è l'errore ?

arduino 0023

ho provato a commentare la libreria precedente DS1307 e lasciare solo la nuova

#include <ht1632c.h>                     // Holtek LED driver by WestFW - updated to HT1632C by Nick Hall
#include <avr/pgmspace.h>                // Enable data to be stored in Flash Mem as well as SRAM              
#include <Font.h>                        // Font library
#include <WProgram.h>                    // DS1307 clock
#include <Wire.h>                        // DS1307 clock
//#include <DS1307.h>                      // DS1307 clock library by mattt on the arduino forum with various revisons from other users
#include <Button.h>                      // Button library by Alexander Brevig
#include <DS1307RAM.h>                   // Include libreria gestione RAM

il codice scritto è sempre

 saveram( 8, 1 );
 int flag ;
 flag = readram(8);
 Serial.print (flag);

ma ecco l'errore

pongclock_v5_fusiorari.cpp: In function 'void gettime()':
pongclock_v5_fusiorari:241: error: 'saveram' was not declared in this scope
pongclock_v5_fusiorari:243: error: 'readram' was not declared in this scope

si direbbe che non legge la libreria

eppure ho creato la cartella DS1307RAM e l'ho messa dentro la cartella "library" di arduino insieme a tutte le altre librerie

tra poco mi ricoverano al manicomio

Daniele

Adesso sembra che non ci sia piú un errore di libreria non trovata o doppia.
Fai una cosa: dacci lo sketch completo oppure dallo sketch togli tutto quello che non serve per memorizzare un valore sulla Ram e di leggerlo e stamparlo sulla seriale.
Ciao Uwe

adesso posto il codice completo
ma quello scritto precedentemente è tutto quello che riguarda la scrittura sulla ram e lettura.

prima di integrarlo nel codice sono andato dentro il metodo e ho fatto una semplice prova. diciamo che non lo avevo ancora "spalmato " nel codice

Ecco il codice
mancano le varie librerie mie

riga 242 le 4 righe di codice in questione

spero di uscirne !!!

Grazie mille per l'aiuto

Daniele

pongclock_v5_fusiorari.zip (18.7 KB)