EEPROM e ONE WIRE

Buonasera sera a tutti...
Vorrei salvare una matrice d'indirizzi one wire di sensori di temperatura nella eeprom di Arduino... vorrei sapere se è possibile oppure devo salvare ogni singolo bit in ogni locazione di memoria???

Devi scomporre l'indirizzo in Byte e memorizzare ogni Byte.
Ciao Uwe

@mrk88: nella sezione dove avevi messo il post c’è chiaramente scritto, in grassetto, di non postare nulla … quindi, per favore, la prossima volta presta più attenzione.

Relativamente alla tua domanda, in realtà hai anche un’altra possibilità …
… se ti studi la AVR libc, che è sempre messa a disposizione dall’IDE, e guardi le funzioni che si trovano nella <avr/eeprom.h> scoprirai che ce ne sono per scrivere e leggere byte, word, dword, float e blocchi di bytes :wink:

Guglielmo

Le nuove funzioni EEPROM.put() e get() fanno al caso tuo:

DeviceAddress addr;  // In qualche modo conterrà l'indirizzo che vuoi salvare
EEPROM.put (0, addr);

Se salvi più indirizzi devi spaziarli a sufficienza nella EEPROM, per cui credo che il secondo vada all'indirizzo 8.

@SukkoPera: non capisco perché appesantire il codice con l'uso di una classe c++ che, al suo interno ...
... richiama le funzioni che ho appena indicato :smiling_imp:

Non fa prima, ed ha un programma più snello e veloce, a chiamarle direttamente ? :grin:

Guglielmo

È sempre lo stesso discorso gpb: per chi non ha dimestichezza con i puntatori, probabilmente put() e get() sono più intuitive. Inoltre non c'è tutto il discorso di aspettare che la EEPROM sia disponibile, ecc ecc.

Vi ringrazio per i consigli che mi avete dato, sono molto interessanti.
Credo che per velocità di programmazione utilizzerò la libreria EEPROM.H, però m'interesserebbe capire meglio il funzionamento della libreria avr/eeprom.h.
Perché ho visto la funzione che credo faccia al caso mio. Dato che un indirizzo onewire, non è altro che una matrice di uint8_t, penavo di scorrerla e di salvarla con la funzione :

uint8_t eeprom_read_byte ( const uint8_t * __p )

l'unica cosa è che non conosco la parte di attesa della disponibilità della EEPROM. In tal senso sapete consigliarmi della documentazione a riguardo di questa libreria???

Vi ringrazio

Per fare una prova ho inserito il seguente codice:

uint8_t i,num;

for(i=0;i<8;i++){
     eeprom_write_byte  ( &i,10);
     }
  for(i=0;i<8;i++){
     num = eeprom_read_byte  ( &i );
     lcd.setCursor(i+2,0);
      Serial.print(num);
  }

che per la prova ha funzionato. C’è però un modo più corretto e formale per accedere alla EEPROM, bisogna rispettare dei tempi??
Scusate la banalità della domanda…

mrk88:
C’è però un modo più corretto e formale per accedere alla EEPROM, bisogna rispettare dei tempi??

No, l’utilizzo della <avr/eeprom.h> è il modo migliore per accedere alla EEPROM e, riguardo ai tempi, se si esamina il sorgente in AVR libc del modulo eeprom.h, nei commenti, si legge:

All of the read/write functions first make sure the EEPROM is ready to be accessed.

… quindi NON devi preoccuparti.

Ti allego una interessante lettura …

Guglielmo

EEPROM.pdf (181 KB)

Grazie 1000 gpb01

La dispensa mi è stata di grandissimo aiuto. Ho risolto utilizzando la funzione

eeprom_update_block ((const void *) wr, (void *) 0, 8);
 eeprom_read_block ((void *) rd, (const void *) 0, 8);

dove rd e wd sono due variabili DeviceAddress.

Ho provato anche a creare due funzioni, una di lettura ed una di scrittura e a iterare il contenuto della variabile deviceaddress nella nella eppron e viceversa, ma lo sketch era più pesante di un 1% rispetto alla soluzione che ho utilizzato. Come mai???

mrk88:
Ho provato anche a creare due funzioni, una di lettura ed una di scrittura e a iterare il contenuto della variabile deviceaddress nella nella eppron e viceversa, ma lo sketch era più pesante di un 1% rispetto alla soluzione che ho utilizzato. Come mai???

... non so se ho capito la domanda ... ma ovviamente, se scrivi due nuove funzioni, aggiungi codice e quindi il risultato finale è sicuramente più ingombrante.

Guglielmo

Grazie 10000 ancora...