[solved] EEPROM che non torna.

Ciao! Ho iniziato a fare qualcosa sulla eeprom dell'atmega 328.. ma ho letto che è da 1 k
I programmi dicono che l'indirizzo a 512 è il massimo, ma credo che sia a 1024 no? E poi comunque ho provato a fare un read/write del settore 2025, poi 3000 e scrive... e facendo scorrere da 0 fino a quel valore mi rilegge in quella locazione il numero che ho salvato. Cosa sbaglio? di sicuro non ho una eeprom con memoria infinita :smiley:
Ho pensato che dopo 1024 la libreria torni da zero.. ma quando leggo all'indirizzo 3000 di nuovo legge il valore precedentemente salvato. Mi potete illuminare? :slight_smile:

Da libreria per il 328 si hanno 1024byte di ram:

Attenzione a quando scrivi:The EEPROM memory has a specified life of 100,000 write/erase cycles
Per il fatto che vada sopra il valore 1024 non so dirti ma non vedo perchè devi superarla di proposito

non che riparte da 0 superato il 1024 o torna indietro?

thexeno:
Ciao! Ho iniziato a fare qualcosa sulla eeprom dell'atmega 328.. ma ho letto che è da 1 k
I programmi dicono che l'indirizzo a 512 è il massimo, ma credo che sia a 1024 no? E poi comunque ho provato a fare un read/write del settore 2025, poi 3000 e scrive... e facendo scorrere da 0 fino a quel valore mi rilegge in quella locazione il numero che ho salvato. Cosa sbaglio? di sicuro non ho una eeprom con memoria infinita :smiley:
Ho pensato che dopo 1024 la libreria torni da zero.. ma quando leggo all'indirizzo 3000 di nuovo legge il valore precedentemente salvato. Mi potete illuminare? :slight_smile:

Il ATmega168 ha 512 Byte EEProm. Per questo a lungo tempo era scritto che l'Arduino2009 avesse 512 Byte. Nel fratempo é stato corretto. Il ATmega328 che é montato su tanti 2009 e sul UNO ha 1024 Byte EEprom.

L'EEprom del ATmega328 ha 10 bit di indirizzo (Bit 0 a Bit 9). Se cerchi di scrivere un valore su una cella di memoria che supera questo indirizzo vengono preso solo i 10 bit meno sigificativi. Dopo 1023 incomincia di nuovo con 0 anche se il numero é 1024.

Se guardi nei dati tecnici del Atmega http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf trovi a pagina 21 il capitolo:
7.6.1 EEARH and EEARL – The EEPROM Address Register
Ci sono 2 registri a 8 Bit per l' indirizzare l'EEprom. (attenzione secondo me c'é un errore perché sono descritto 9 Bit non 10Bit nel caso del ATmega328). I bit 15 a 10 sono per definizione 0 anche se scrivi un 1 restano 0.

1023 é in binario (ho messo un trattino tra bit 10 e bit 9; incomincio la conta con 0).
0000 00-11 1111 1111
se incrementi di uno diventa
0000 01-00 0000 0000
Visto che vengono considerati i bit a destra del trattino questo numero equivale a 0
0000 01-00 0000 0001 corrisponde a 1 e non a 1024
0000 01-10 1111 0100 corrisponde a 756 decimale e non 1780

Se scrivi per esempio nella cella 1780 in realta scrivi nella cella 756. Se leggi la cella 1780 leggi in realtá dalla cella 756. Se vuoi leggere quello che avevi memorizzato nella cella 756 non lo trovi piú perché hai sovrascritto nella scrittura della cella 1780.

Il succo della storia. Se hai 1024 Byte di EEprom puoi scrivere nelle celle 0 a 1023. se superi questo numero sovrascrivi valori nelle prime 1024 celle.

Conclusione: Stai attento di non superare il limite perché perdi dei dati.

È un discorso un pó contorto ma spero comunque di essere stato chiaro.

@ garinus
dopo 1023 riincominca con 0.

@ypkdani
non confondere RAM con EEPROM.

Ciao Uwe

Cavolo ho visto ora che ho scritto ram invece di eeprom, scusate.

ypkdani:
Attenzione a quando scrivi:The EEPROM memory has a specified life of 100,000 write/erase cycles

Quindi? non ho capito che vuoi dire. in anticipo ti dico che se e' un allarmismo, non c'e cmq da preoccuparsi se non la si usa per eseguire un programma. in ogni caso, ho un pic che eeprom che uso da anni senza il minimo problema, quindi...

Cmq, grazie Uwe! chiarissimo!

Vuol dire che i EEprom hanno una scadenza, che il produttore garantisce 100000 cancellazioni/scritture. È un numero grande ma se usi il EEprom come se fosse RAM ci puoi arrivare. Dopo questo numero di cicli puó capitare che un bit scritto non sia giusto ma che resta L o H come vuole lui.
Ciao Uwe

uwefed:
Vuol dire che i EEprom hanno una scadenza, che il produttore garantisce 100000 cancellazioni/scritture. È un numero grande ma se usi il EEprom come se fosse RAM ci puoi arrivare. Dopo questo numero di cicli puó capitare che un bit scritto non sia giusto ma che resta L o H come vuole lui.
Ciao Uwe

Si si, ne sono perfettamente al corrente.
Però, la puoi usare come RAM? Come si fa? C'è qualcosa sul sito a riguardo? PErché forse ho cercato male.

Non non la puoi utilizzare come RAM proprio per quel problema, era un modo di dire quello di uwe.

thexeno:
... Però, la puoi usare come RAM? Come si fa? C'è qualcosa sul sito a riguardo? PErché forse ho cercato male.

Ci siamo fraintesi. Volevo dire se usi l'eeprom in modo che scrivi ogni microsecondo un dato ( che é possibile senza problemi con una RAM) lo rompi velocemente (oltre che un ciclo di scrittura dura alcuni microsecondi).
Ciao Uwe

Capito. Grazie a tutti! :slight_smile:

dimenticavo
per EEprom seriali (I2C o SPI) vengono garantiti 1000000 (un milione) di cicli di cancellazione/scrittura. Non so perché reggono un fattore 10 di piú.
Ancora di piú cicli di scrittura per le FRAM della Ramtron che sono RAM che non perdono il contenuto della memoria e esistono pincompatibili agli EEPROM SPI.

Ciao Uwe

uwefed:
dimenticavo
per EEprom seriali (I2C o SPI) vengono garantiti 1000000 (un milione) di cicli di cancellazione/scrittura. Non so perché reggono un fattore 10 di piú.

Forse per una questione di qualità della memoria stessa. Probabilmente per contenere il costo del microcontrollore è stata scelta una EEPROM che garantisca un numero di scritture discreto ma in linea con la sua capacità e l'uso che ne può fare l'utente, ossia quello di una piccola memoria tampone. Un piccolo chip EEPROM I2C da 32 kB costa infatti mediamente poco meno della metà di un Atmega328.