DS1307 e scrittura su memoria interna dati

djdanielb:

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

Quest'errore potrebbe dipendere dal fatto che la lib DS1307RAM includa nuovamente la DS1307.h, da qui l'errore di doppia inclusione.

djdanielb:

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

Guardando il codice mi pare che tu non abbia istanziato la libreria.

Cosa vuol dire non aver instanziato ?
Il conflitto tra le die librerie si è risolto commentando quella che aevo ovvero ds1307 e lasciata ds1307ram

Non avreste uno sketch minimale dove funziona saveram e readram ?

Anche se onestamente ora non capisco proprio perchè non funzioni.

E non ci sarebbe nemmeno una libreria alternativa !?

Grazie mille

Daniele

djdanielb:
Cosa vuol dire non aver instanziato ?

Una classe mette a disposizione dei metodi pubblici, per poterli usare devi però creare un oggetto reale da quella classe, questa creazione si dice "istanza".
E' un po' quando dichiari una variabile usando il tipo. Ecco, con la classe fai una cosa simile:

classe mioOggetto;

con questo codice dici al compilatore che un oggetto di nome "mioOggetto" eredita tutti i metodi della classe "classe".

Il conflitto tra le die librerie si è risolto commentando quella che aevo ovvero ds1307 e lasciata ds1307ram

Probabilmente perché DS1307RAM include autonomamente la DS1307 per cui il compilatore nota la doppia inclusione e segnala l'errore. Ma siccome non ho visto il codice della DS1307RAM (mea culpa) faccio solo un'ipotesi.

Non avreste uno sketch minimale dove funziona saveram e readram ?

Aspettiamo Uwe, che ha creato la classe.

Anche se onestamente ora non capisco proprio perchè non funzioni.

E non ci sarebbe nemmeno una libreria alternativa !?

Grazie mille

Daniele

Non so se c'è una libreria alternativa.
Sennò puoi prendere il datasheet del DS1307 e spedire il comando via I2C per salvare il dato in RAM.

Questa ultima ipotesi a me sarebbe anche andata bene. Del resto la soluzione della libreria mi piace ma se fosse semplicemente un paio di righe per leggere e un paio per scrivere mi andrebbe bene.

Se ci fossero un paio di esempi io avrei risolto.

Grazie mille.

Ho due miei progetti in attesa di questo comando !

Dunque nella speranza che Uwe non mi abbandoni sto cercando di percorrere altre strade

per esempio

Wire.beginTransmission(clockAddress);
  Wire.send(0x90);
  
  Wire.endTransmission();

questo per esempio potrebbe funzionare ?

ho corretto l'indirizzo da (0x00) a (0x90) per scrivere nell'indirizzo 9 del ds1307

ora dovrei leggerlo... così potrebbe andare ?

Wire.requestFrom(clockAddress, 9);


 int flag  = Wire.receive();

spero di non aver sparato cavolate.

sono fiducioso che qualche anima pia sappia dirmi di più

Grazie ancora

Daniele

non proprio esatto.

questo e' corretto

  byte data = 0x14 ; // valore da salvare
  
  Wire.beginTransmission(clockAddress);
  Wire.send(0x09); //imposta l'indirizzo a cui accedere
  Wire.send(data) ; // salva il valore 
  Wire.endTransmission();

  // ----------------------------------------------------
  // ****** recupera il valore all'indirizzo 0x09

  Wire.beginTransmission(clockAddress);
  Wire.send(0x09); //imposta l'indirizzo a cui accedere
  Wire.endTransmission();
  Wire.requestFrom(clockAddress,1); // imposta UNA locazione da leggere
  byte dato = Wire.receive() ; // legge il dato

djdanielb:
Ciao testato e grazie per la risposta
Purtroppo avevo pensato a questa eventualità , ma sono a corto di spazio nel 328.

E qui casca l'asino :slight_smile:
Io parlo della eeprom integrata nel micro stesso, non della flash. Quindi non togli nessuno spazio al tuo programma.
Piazza il flag nella eeprom e non te ne pentirai, ci sono gli esempi nell'IDE stesso :slight_smile:

Grazie mille per il tuo aiuto però dovrei chiederti una informazione

La prima riga che hai scritto è
Byte data = 0x14

Me lo spiegheresti ? Nel senso non posso scriverci 1 oppure 0 ?
E poi l'address del ds devo mettere 0x68 ?
Per testato
Adesso voglio provare anche con il metodo che mi hai detto tu. Se trovo un buon eaempio facile.
Ne hai qualcuno da suggerire ?
DANIELE

brunello:
non proprio esatto.

questo e' corretto

  byte data = 0x14 ; // valore da salvare

Wire.beginTransmission(clockAddress);
 Wire.send(0x09); //imposta l'indirizzo a cui accedere
 Wire.send(data) ; // salva il valore
 Wire.endTransmission();

// ----------------------------------------------------
 // ****** recupera il valore all'indirizzo 0x09

Wire.beginTransmission(clockAddress);
 Wire.send(0x09); //imposta l'indirizzo a cui accedere
 Wire.endTransmission();
 Wire.requestFrom(clockAddress,1); // imposta UNA locazione da leggere
  byte dato = Wire.receive() ; // legge il dato

te l'ho detto, nell'IDE ci sono gli esempi fatti, apri il menu' ESEMPI-EEPROM-eeprom write

oppure leggi il reference qui: http://arduino.cc/en/Reference/EEPROM

Grazie mille

Ora sto modificando il codice per inserire la scrittura su eprom esterna

Tuttavia spero che UWE non si sia dimenticato di me e che ora che è sisponibile tutto il codice mi aiuti a trovare risposta al mio quesito

Infine qualcuno mi spiegherebbe la storia circa il byte 0x14 ?

Grazie mille

Daniele

Infine qualcuno mi spiegherebbe la storia circa il byte 0x14

e' un valore scelto a caso.
se devi scriverci un 1, scrivici un 1

byte data = 1 ; // valore da salvare

Salve ragazzi, perdonatemi se vi riscrivo ma avrei bisogno di una spiegazione ( e vi assicuro che ho provato a cercare di capire )

UWE dopo che aveva chiesto di uplodare il codice è scomparso o è avvinghiato nei meandri della risoluzione del perchè la sua libreria non funziona ( aimè son costretto a pensare questo )

comunque sorvolando su questo piccolo OT ho provveduto sia a scrivere il codice con la scrittura su eprom interna sia utilizzare il codice postato da brunello ( che ringrazio vivamente ) per scrivere nella ram

ora siccome la scrittura su ram interna ha una vita di 100.000 volte sono costretto ad utilizzare la ram del ds ( cosa che gradisco poichè togliendo la pila si resetta tutto )

ora arriva la mia domanda e spero che qualcuno mi aiuti a capire perchè a funzionare funziona

dunque il codice così funziona

alarm_hours = 7  // esempio visto che li passa un funzione
alarm_mins = 30  
alarm_status = 1

Wire.beginTransmission(0x68);                               // inizio scrittura delle tre varibili nella RAM del DS1307
  
         Wire.send(0x08);                                            // imposta l'indirizzo a cui accedere
         Wire.send(alarm_hours) ;                                    // salva il valore
         Wire.send(alarm_mins) ;                                     // salva il valore 
         Wire.send(alarm_status) ;                                   // salva il valore 
  
         Wire.endTransmission();

ora io non mi aspettavo che funzionasse così visto che prima avevo provato in questo modo

 Wire.beginTransmission(0x68);
  Wire.send(0x09);                 //imposta l'indirizzo a cui accedere  [color=red][font=Verdana]OVVERO 9[/font][/color]
  Wire.send(alarm_hours) ;    // salva il valore 
  Wire.endTransmission();

  Wire.beginTransmission(0x68);
  Wire.send(0x10);                 //imposta l'indirizzo a cui accedere  [color=red][font=Verdana]OVVERO 10[/font][/color]
  Wire.send(alarm_mins) ; // salva il valore 
  Wire.endTransmission();

  Wire.beginTransmission(0x68);
  Wire.send(0x11);                 //imposta l'indirizzo a cui accedere  [color=red][font=Verdana]OVVERO 11[/font][/color]
  Wire.send(alarm_status) ; // salva il valore 
  Wire.endTransmission();

ora fermo restando che NON restituisce errore in compilazione ma gli orari sono sfalzati e lo status non corrisponde alchè sono convinto di NON aver capito come è strutturato lo schema della ram e dei byte

Ho letto e riletto il datasheet del ds1307 ma senza venirne a capo e avvinghiandomi su me stesso

In pratica io scrivo tutto nell'indirizzo 0x08 di seguito ( suppongo 7,30,1)

ma poi mi chiedo per quando posso estendermi in lunghezza ?

e se volessi poi scrivere solo il terzo valore come chiedere di leggere solo quello ?

io adesso per rileggerli faccio

Wire.beginTransmission(0x68);
  Wire.send(0x08);                 //imposta l'indirizzo a cui accedere
  Wire.endTransmission();
  Wire.requestFrom(0x68,3);        [color=red]// imposta 3 locazione da leggere ma tutte di seguito !!! ed se ne volessi solo la terza ?[/color]  
alarm_hours = Wire.receive() ;   // legge il dato
  alarm_mins = Wire.receive() ;    // legge il dato
  alarm_status = Wire.receive() ;  // legge il dato

grazie mille

Daniele

come prima cosa leggiti meglio le differenze ed i significati delle memorie di cui parli, la ram non ha nessun limite di scrittura, proprio perche' e' una ram.
La flash del micro ha limiti di scrittura, la eeprom del micro ha limiti di scrittura 10 volte piu' alti, la ram dell'RTC non ha limiti di scrittura. non confondere i vari tipi

Guarda che c'e' un errore di base nei dati che invii
il prefisso 0x (0x09, 0x10 etc etc ) indica che e' in formato esadecimale
quindi 0x09 = 9
0x10 = 16
0x11 = 17

nelle prove che facevi andavi a scrivere su locazioni diverse.

se vuoi leggere una sola locazione ,devi puntare a quella locazione

Wire.beginTransmission(0x68);
Wire.send(locazione; //imposta l'indirizzo a cui accedere ( 08, 09, 0A, etc etc )
Wire.endTransmission();
Wire.requestFrom(0x68,1);
alarm_xxxx = Wire.receive() ; // legge il dato

Scusate il ritardo.
Ho modificato la libreria per renderla compatibile alla versione IDE 1.0.x e adesso funziona.
Lo sketch di esempio:

/*
esempio che srive sulla RAM indirizzo 10 del RTC un numero da 0 a 255 e lo legge dopo un secondo.
*/

#include <Wire.h>
#include <DS1307RAM.h>
int dato = 0; 
int indirizzo=10;

void setup() {                
  Serial.begin(9600);  
  Serial.println("Seriale inizializzato");
  delay(2000);
}
void loop() {
  for (int i=0; i<256;i++)
  {
  RTC.saveram(indirizzo, i);
  Serial.println("scritto dato");
  delay(1000);           
  dato = RTC.readram(indirizzo);
  Serial.print("dato scritto: "); Serial.print(i);
  Serial.print(" dato letto: "); Serial.println(dato);
  delay(1000);         
  }
}

Ciao Uwe.

DS1307RAM.cpp (4.44 KB)

DS1307RAM.h (1.42 KB)