Pages: 1 2 [3]   Go Down
Author Topic: DS1307 e scrittura su memoria interna dati  (Read 2580 times)
0 Members and 1 Guest are viewing this topic.
Tuscany
Offline Offline
Edison Member
*
Karma: 68
Posts: 1983
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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


Code:
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

Code:
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
Logged

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Tuscany
Offline Offline
Edison Member
*
Karma: 68
Posts: 1983
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21270
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
/*
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 - downloaded 8 times.)
* DS1307RAM.h (1.42 KB - downloaded 8 times.)
Logged

Pages: 1 2 [3]   Go Up
Jump to: