EEPROM

Prima di capire meglio che avesse 100k di cicli di vita ho utilizzato la funzione write inclusa in EEPROM.h di Arduino e la Mia domanda 90% retorica è, utilizza il metodo update per scrivere il dato sulla memoria giusto?

EEPROM.write(addr, 19);

  addr = addr + 1;
  if (addr == EEPROM.length()) {
    addr = 0;
  }

Inoltre le ultime righe se ho capito bene incrementa L indirizzo e poi controlla se address in questo caso diventato 1 è uguale a eeprom.length() che ritorna valore totale della memoria (255) + 1 quindi passa a zero. Ma non son sicuro succeda questo. In teoria se L indirizzo arriva a 255.... no, mi arrendo, essendo poco documentato eeprom.length ho trovato solo questo

uint16_t length(){ return E2END + 1}

E2END 
The last EEPROM address.

Anzi ci provo, se addr arriva all ultimo indirizzo di memoria si riparte dal primo sovrascrivendo in tal caso i dati che ci sono all addr zero?
Confido in ques ultima

Buona l’ultima.

Se la EEPROM è lunga 1024 byte (1k) si può anche fare semplicemente:

addr = (addr + 1) % 1024;

Le 100mila scritture per cella sono quelle garantite nelle peggiori condizioni possibili, io sono arrivato a 10milioni prima di riscontrare errori (ma per un’applicazione seria non supererei quelle garantite).

Claudio_FF:
Buona l'ultima.

Se la EEPROM è lunga 1024 byte (1k) si può anche fare semplicemente:

addr = (addr + 1) % 1024;

Ma così facendo non ti torna sempre 1 o 0?
Usando L operatore modulo ti ritorna il resto.

Comunque non hai risposto, usa sempre la funzione update e di conseguenza non ha scritto migliaia di volte in memoria giusto? Siccome L ho lasciato accesso per alcuni secondi avrà fatto migliaia di cicli

Se usi update non hai riscritto la memoria se quello che provavi a scrivere è già uguale al contenuto della EEPROM.
Il resto non da semrpe zero o 1 :-[ da... il resto :slight_smile: ovvero nel tuo caso un valore tra 0 e 1023, quando add+1 è uguale a 1024 torna a dare zero, 1025 da 1 e così via

Se invece usi la write ogni volta sovrascrivi

fabpolli:
Se invece usi la write ogni volta sovrascrivi

L ho chiesto perché ho usato la funzione writ di quella libreria e volevo sapere se è aggiornata e quindi fa update oppure sovrascrive!!

Se faccio il modulo non dovrebbe vedere cosa avanza dalla divisone? E nel caso di 230/1024 avrei zero nella parte intera!

Oggi andrò a compilare e guardare cosa accade

La write scrive sempre, l'update è un altro metodo quindi sando write sovrascrivi sempre.
Stai facendo confusione tra risultato della divisione e resto della divisione, lavorando con gli interi se fai 230/1024 (divisione) è normale che hai zero nella parte intera ma se fai 230%1024 (modulo) il risultato sarà 230
Nel codice di cui sopra partendo da zero

addr = (addr + 1) % 1024;
addr = (0+1) % 1024; ==> 1%1024 = 1

addr = (230+1) % 1024; ==> 231%1024 = 231

fabpolli:
La write scrive sempre, l'update è un altro metodo quindi sando write sovrascrivi sempre.
Stai facendo confusione tra risultato della divisione e resto della divisione, lavorando con gli interi se fai 230/1024 (divisione) è normale che hai zero nella parte intera ma se fai 230%1024 (modulo) il risultato sarà 230
Nel codice di cui sopra partendo da zero

addr = (addr + 1) % 1024;

addr = (0+1) % 1024; ==> 1%1024 = 1

addr = (230+1) % 1024; ==> 231%1024 = 231

Ok va bene. No no divisione, divisione e modulo modulo :slight_smile: ora guardo meglio

@fabpolli, scusa ma L operatore % ritorna il resto da una divisione.
Se faccio a/b ed a è minore di b non ho resto...
Ora scrivendo ho capito! Siccome non divido per nulla il resto è il valore contenuto in a.
Es: 9%10 ritorna 9 giusto?

Si giusto, ti faccio una battuta, non prenderla a male:
Metti da parte il mauale del C un attimo e riprendi il libro di matematica :slight_smile:

a/b = 3/5 a è minore di b = non hai resto??? :o :o :o :o :o

Non è che non dividi per nulla prendi il resto della divisione e non è il valore contenuto in a è il resto ha un suo nome perché non è ne il dividendo, ne il divisore e neppure il risultato della divisione è per l'appunto il resto

fabpolli:
Metti da parte il mauale del C un attimo e riprendi il libro di matematica :slight_smile:

Non avevo pensato al fatto che stiamo lavorando sull insieme dei Naturali, usando l'operatore % di conseguenza se divido due interi ed il primo e' minore del secondo, come gia' detto il primo sara' il resto!

Questo non accade quando lavoro sui Reali perche' avro' (quasi) sempre un risultato.
Ecco tutto, non serve riprendere il libro!

Se poi si puo' usare (operatore %) anche con i numeri float (immagino si possa) allora ben venga ma non l ho mai usato perche' mai avute necessita'.

>Triko93: ma perché prima di scrivere non apri il reference e guardi cosa fa l'operatore "remainder (%)" ?

Se NON usi numeri interi avrai una risultato con decimali, ma non il resto (o comunque dovresti sapere a che punto troncare la divisione ovvero con che precisione) ... l'operatore "%" è fatto per le divisioni tra interi !!!

Guglielmo

Stai facendo un po' di confusione a livello matematico.

La divisione tra due numeri decimali ("reali", "con la virgola", float insomma) dà sempre un altro numero decimale come risultato.

La divisione tra due numeri interi ("naturali", senza virgola insomma) a / b dà due numeri, ovvero un quoziente q e un resto r tali che q * b + r = a. Se b > a allora q = 0e r = a.

L'operatore modulo (%) dà appunto il resto r della divisione intera e non ha senso su numeri non interi.

gpb01:
>Triko93: ma perché prima di scrivere non apri il reference e guardi cosa fa l'operatore "remainder (%)" ?

Se NON usi numeri interi avrai una risultato con decimali, ma non il resto (o comunque dovresti sapere a che punto troncare la divisione ovvero con che precisione) ... l'operatore "%" è fatto per le divisioni tra interi !!!

Guglielmo

Letto e risolto tutto!
Userò più spesso non pensavo ci fosse praticamente tutto!

SukkoPera:
Stai facendo un po' di confusione a livello matematico.

La divisione tra due numeri decimali ("reali", "con la virgola", float insomma) dà sempre un altro numero decimale come risultato.

Guarda semplicemente non avevo mai letto cosa fa quell operatore nello specifico. L avevo usato solo per vedere se un numero è pari o dispari.
A livello matematico la divisione di 2 num decimali può dare sia decimali che interi :slight_smile: vedi caso diviso per se stesso e fa 1 oppure diviso per sottomultipli!

Comunque mi bastava leggere quel reference! Ora ho anche scoperto L uso negli array.
Thank you both

Senza aprire un altro post avrei un altra domanda: ho letto il pdf che @gpb01 mi ha linkato riguardo L high endurance della EEPROM Ed utilizzando un buffer circolare dicono di raddoppiare (non fisicamente) le scritture disponibili.
Potreste spiegarmi in che modo perché non mi è chiaro.