Dubbi sulle funzioni Wire.read e Wire.write con 24LC256

Sto provando a scrivere e leggere nella EEPROM 24LC256 con questo sketch:

/**********************************************************
 * 11 gennaio 2020
 **********************************************************/
 #include <EEPROM.h>
 #include <Wire.h>
 #include <PCF8574_HD44780_I2C.h>

 //Funzioni
   void salvaDato();
   void leggeDato();
      
 //Variabili globali
   int sensorValueAD = 0;   // variabile per ingresso AD
   int indirizzo = 0;
      
  PCF8574_HD44780_I2C lcd(0x27,16,2);
      
 void setup(){
        lcd.init(); 
        lcd.setBacklight(0);
        Serial.begin(9600);
        Wire.begin();
        delay(1000);
        lcd.home();
        lcd.setCursor(2, 0);  // colonna 2, riga 0
        lcd.print("test 24LC256");
        lcd.setCursor(0, 1);  // colonna 0, riga 1
        lcd.print("11 febbraio 2020");
        lcd.setBacklight(1);
        delay(3000);
        lcd.clear();
        lcd.setBacklight(0);
      }
      
void loop() { 
   salvaDato();  
   leggeDato();
   indirizzo++;
   delay(100);
   if (indirizzo == 260){
    while(1);
   }
}

/*======================         Funzioni      =========================*/
  
void salvaDato(){
 sensorValueAD++;
  Wire.beginTransmission(0x32); // indirizzo I2C della 24LC256                          
  Wire.write(sensorValueAD);             // sends value byte  
  Wire.endTransmission();     // stop transmitting
  Serial.print("scritto: ");
  Serial.print(sensorValueAD);  
  Serial.print(" al indirizzo: ");
  Serial.print(indirizzo);
     
      }

void leggeDato(){
  Wire.beginTransmission(0x32); // indirizzo I2C della 24LC256   
  Wire.read(); 
  Wire.endTransmission();     // 
  Serial.print("     letto: ");
  Serial.print(sensorValueAD);
  Serial.print(" al indirizzo:");
  Serial.println(indirizzo);
}

Ma guardando scorrono sulla seriale i valori scritti e letti, vedo che scrive e poi legge anche valori superiori al byte (255).
Ogni singola cella di memoria dovrebbe contenere al massimo un byte (255).
Ho fermato intenzionalmente il listato al valore 260, per vedere cosa succedeva se superavo il fatidico numero 255.
A questo punto non mi è chiaro il funzionamento delle due funzioni di sceittura e lettura, menzionate sopra.
Oppure c'è qualche errore nello sketch che non capisco.
Saluti

Lello

Ma scusa, intanto alla write() dovresti dare un byte e tu gli dai un int (2 byte) e questo, come hai intuito, non va bene. Non so come si comporti, ma suppongo che scriva solo uno dei due byte dell'int che gli passi, quindi:

  • byte sensorValueAD = 0; // variabile per ingresso AD*

Poi quando leggi con la read() il valore restituito si può sapere dove lo metti? Se scrivi solo Wire.read() il valore letto non finisce mica nella variabile "sensorValueAD" per intervento divino! :smiley:
Devi fare:

void leggeDato(){
  Wire.beginTransmission(0x32); // indirizzo I2C della 24LC256   
  sensorValueAD = Wire.read();
  Wire.endTransmission();     //
  Serial.print("     letto: ");
  Serial.print(sensorValueAD);
  Serial.print(" al indirizzo:");
  Serial.println(indirizzo);
}

Non so dirti se la funzione di lettura è errata, ma quello che posso dirti è che stai facendo confusione tra indirizzo di memoria e contenuto. Il contenuto di un singolo indirizzo di memoria può contenere un byte, quindi da 0 a 255, ma l'indirizzo dipende dalla dimensione della memoria, una memoria da 10 byte accetta indirizzi da zero a nove, una da 2k accetta indirizzi da 0 a 1999

Come dice @fabpolli confondi le due cose.
quindi devi dare un valore ma anche un indirizzo. Ma hai letto qualche info in internet ?
Qui in italiano: 24LC256 UTILIZZARE UNA MEMORIA SERIALE SU BUS I2C
Per scrivere devi passare 3 byte, due per l'indirizzo e uno per il valore (quindi 3 .write() )
Per leggere devi passare 2 byte di indirizzo (2 write), una requestForm() e poi una read()

nid69ita:
Ma hai letto qualche info in internet ?
Qui in italiano: 24LC256 UTILIZZARE UNA MEMORIA SERIALE SU BUS I2C

Si, ho preso pari pari il sorgente da internet a questo indirizzo:

Interfacing to a 24LC256 EEPROM - Arduino Learning.

Adesso mi leggo la pagina che mi è stata consigliata.
Saluti

Lello

Ho scaricato il sorgente ma quando tento di compilarlo mi da questo errore sulla variabile "lt" alla linea 73 che non è stata dichiarata:

Arduino:1.8.11 (Windows 10), Scheda:"Arduino Uno"

C:\Users\sketch_feb11b\sketch_feb11b.ino: In function 'void loop()':

sketch_feb11b:35:27: error: 'lt' was not declared in this scope

   for (ciclo = 0; ciclo & lt; 32000; ciclo++)

                           ^~

sketch_feb11b:35:36: error: expected ')' before ';' token

   for (ciclo = 0; ciclo & lt; 32000; ciclo++)

                                    ^

sketch_feb11b:35:45: error: expected ';' before ')' token

   for (ciclo = 0; ciclo & lt; 32000; ciclo++)

                                             ^

sketch_feb11b:73:27: error: 'lt' was not declared in this scope

   for (ciclo = 0; ciclo & lt; 32000; ciclo++)

                           ^~

sketch_feb11b:73:36: error: expected ')' before ';' token

   for (ciclo = 0; ciclo & lt; 32000; ciclo++)

                                    ^

sketch_feb11b:73:45: error: expected ';' before ')' token

   for (ciclo = 0; ciclo & lt; 32000; ciclo++)

                                             ^

exit status 1
'lt' was not declared in this scope

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Saluti

Lello

... tu hai fatto un copia/incolla da una pagina web e... ti sei portato dietro le stringhe di controllo html "& lt" è quella per il "<".

Quando copi quelle cose, devi fare in modo di copiare in modo TESTO e NON i codici HTML.

Guglielmo

LelloGi:
Si, ho preso pari pari il sorgente da internet a questo indirizzo:
Interfacing to a 24LC256 EEPROM - Arduino Learning

Mi sembra strano, perché il sito scrive esattamente la procedura da seguire, oltre al fatto che l'indirizzo i2c della periferica (con A2 A1 A0 a massa) è 0x50 e non 0x32, in perfetto accordo con il datasheet pagine da 10 a 14.

gpb01:
... tu hai fatto un copia/incolla da una pagina web e... ti sei portato dietro le stringhe di controllo html "& lt" è quella per il "<".

Non ci avevo pensato visto che è la prima volta che mi capita.
Starò più attento la prossima volta.
Ho rivisto di nuovo il listato del link che mi è stato consigliato da "nid69ita" e ho notato che la riga
"for (ciclo = 0; ciclo & lt; 32000; ciclo++)" è presente così per ben due volte ed è quella che mi dava l'errore.

Saluti

Lello

Scusa ma direi di no: EEPROM esterna 24LC256 - Software - Arduino Forum

&lt è la rappresentazione in pagine web di less-than ovvero <

fabpolli:
Scusa ma direi di no: EEPROM esterna 24LC256 - Software - Arduino Forum

Se dai una occhiata al listato presente a questo link: utilizzare una memoria seriale esterna tipo 24LC256

che io ho copiato pari pari, puoi vedere che l'errore è presente per ben due volte.
Che poi significava il simbolo "<" che mi è stato chiarito da gbp01.
Resta il fatto che Arduino quando compila, trova l'errore.
Saluti

Lello

LelloGi:
Resta il fatto che Arduino quando compila, trova l'errore.

... cosa non ti è chiaro nel fatto che DEVI sostituire i due "& lt;" con il simbolo "<" ? ? ? :o

Se lo fai compila senza problemi !

Guglielmo

gpb01:
... cosa non ti è chiaro nel fatto che DEVI sostituire i due "& lt;" con il simbolo "<" ? ? ? :o

Infatti l'ho compreso benissimo grazie al tuo chiarimento.
Volevo solo fare presente che nel listato del sito internet c'era l'errore.
Compilo regolarmente lo sketch.
Argomento chiuso.
Saluti

Lello

LelloGi:
Volevo solo fare presente che nel listato del sito internet c'era l'errore.

SI, l'ho notato, hanno fatto anch loro lo stesso errore :smiley: :smiley: :smiley: ... quando io dico che il 90% di quello che si trova su internet è "monnezza", come vedi NON sbaglio :wink:

Guglielmo

gpb01:
quando io dico che il 90% di quello che si trova su internet è "monnezza", come vedi NON sbaglio :wink:

Condivido pienamente!

Lello