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
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!
Devi fare:
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()
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"
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.
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
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
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 ... quando io dico che il 90% di quello che si trova su internet è "monnezza", come vedi NON sbaglio