Go Down

Topic: EEPROM.h su architettura ESP8266 (Read 1 time) previous topic - next topic

droidprova

Nov 15, 2018, 08:41 am Last Edit: Dec 06, 2018, 10:00 am by droidprova
Ciao,

dunque sto facendo delle prove per capire come usare la libreria EEPROM su schedine ESP, a tal proposito ho caricato questo listato di prova. Perchè ottengo come stampa sempre il valore di val2?

Cosa sbaglio?

Code: [Select]
#include <EEPROM.h>

int addr1 = 0;
int addr2 = 0;
int val1 = 125;
int val2 = 250;
int stampa1;
int stampa2;

void setup() {
  Serial.begin(9600);
  EEPROM.begin(512);
}

void loop() {

  EEPROM.write(addr1, val1);
  EEPROM.commit();
  delay(100);
  EEPROM.write(addr2, val2);
  EEPROM.commit();
  delay(100);

  stampa1 = EEPROM.read(addr1);
  delay(100);
  stampa2 = EEPROM.read(addr2);
  delay(100);
  Serial.println(stampa1);
  Serial.println(stampa2);
  
}

Patrick_M

:)
se all'indirizzo addr1 che vale 0 scrivi 125
e poi all'indirizzo addr2 che vale 0 scrivi 250

cosa vorrai leggere nell'indirizzo 0 e nell'indirizzo 0 ? :D
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

droidprova


SukkoPera

addr1 e addr2 sono uguali quindi la seconda scrittura sovrascrive la prima.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

Patrick_M

e in seguito, essendo i due indirizzi uguali leggi e stampi 2 volte lo stesso valore...
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

droidprova

Ok forse ho capito, non vi scoccio oltre il dovuto, prima provo e poi se fallisco chiedo.

Intanto grazie 1000

droidprova

Risolto, grazie a tutti!

Code: [Select]
#include <EEPROM.h>

// the current address in the EEPROM (i.e. which byte
// we're going to write to next)
byte addr = 0;
int val1 = 125;
int val2 = 250;
int stampa1;
int stampa2;

void setup() {
  Serial.begin(9600);
  EEPROM.begin(512);
}

void loop() {
  // need to divide by 4 because analog inputs range from
  // 0 to 1023 and each byte of the EEPROM can only hold a
  // value from 0 to 255.

  // write the value to the appropriate byte of the EEPROM.
  // these values will remain there when the board is
  // turned off.
  EEPROM.write(addr, val1);
  EEPROM.commit();
  EEPROM.write(addr+1, val2);
  EEPROM.commit();
  // advance to the next address.  there are 512 bytes in
  // the EEPROM, so go back to 0 when we hit 512.
  // save all changes to the flash.


 

  stampa1 = EEPROM.read(addr);
  delay(100);
  stampa2 = EEPROM.read(addr+1);
  delay(100);
  Serial.println(stampa1);
  Serial.println(stampa2);
 
}

SukkoPera

Nota però che stai sovrascrivendo un pezzo del primo valore con il secondo, dato gli int tengono più di 1 byte (su ESP8266 credo 4).
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

droidprova

quindi sarebbe meglio dichiarare:

byte val1 = 125;
byte val2 = 250;

???

Giusto?

SukkoPera

Quello devi saperlo tu, dipende dall'intervallo di valori che devi metterci dentro. Byte va da 0 a 255.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

droidprova

Nota però che stai sovrascrivendo un pezzo del primo valore con il secondo, dato gli int tengono più di 1 byte (su ESP8266 credo 4).

Rileggevo meglio,

è un caso che la stampa dei valori corrisponda a ciò che mi aspetto?

Standardoil

Nota però che stai sovrascrivendo un pezzo del primo valore con il secondo, dato gli int tengono più di 1 byte (su ESP8266 credo 4).

Ma la write non scrive comunque un solo byte?
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

docdoc

#12
Nov 16, 2018, 04:11 pm Last Edit: Nov 16, 2018, 04:12 pm by docdoc
Ma la write non scrive comunque un solo byte?
Esatto! Da reference infatti dice proprio quello, quindi immagino faccia un cast automatico il che significa che anche se metti un int devi avere un valore tra 0 e 255.

L'esempio presente nello stesso reference infatti usa un int:
Code: [Select]
#include <EEPROM.h>

void setup()
{
  for (int i = 0; i < 255; i++)
    EEPROM.write(i, i);
}

void loop()
{
}
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

SukkoPera

Giusto. Ma allora il problema è un altro, ovvero che se prova a scrivere numeri > 255 non saranno corretti!
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

docdoc

Si, non so come si comporti la write per valori maggiori di 255, se comunque scrive solo il byte meno significativo (voglio sperare che faccia un AND 0xFF) non dovrebbe sovrascrivere nulla ma riportare ovviamente un valore numerico diverso da quello atteso. Per questo è meglio definire la variabile come byte e non int.
In ogni caso lui legge i valori corretti perché in questo caso sono minori di 256.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Go Up