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 ![]()
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 ![]()
Non fa prima, ed ha un programma più snello e veloce, a chiamarle direttamente ? ![]()
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...