Devo poter scrivere 4 byte consecutivi nella memoria della EEPROM sopracitata, partendo dalla cella 0.
Dovrei poter vedere il dato memorizzato che va da 1 a 4.
Sto provando questo sketch, ma mi scrive in due celle non consecutive, da quello che vedo dal monitor seriale.
/***************** ***************************
* 10 gennaio 2020
* Scrive in quattro byte consecutivi incrementatdo il dato
* Arduino UNO, 24LC256
**********************************************************/
#include <EEPROM.h>
#include <Wire.h>
int dato = 1;
void setup()
{
Serial.begin(9600);
//inizializzo la porta I2C di Arduino
Wire.begin();
}
void loop()
{
Serial.println("Inizio Scrittuta");
for (int indirizzo = 0; indirizzo < 4; indirizzo++){
Wire.beginTransmission(0x50);
Wire.write(indirizzo);
Wire.write(byte(dato));
Wire.endTransmission();
Serial.print(indirizzo);
Serial.print(" => ");
Serial.println(dato);
indirizzo++;
delay(5);
delay(1000);
}
Serial.println("Fine Scrittura");
Ho bisogno di un consiglio.
Saluti
Lello
Mai usato quella memoria esterna I2C ma da una rapida ricerca su internet, guardando i primi esempi che saltano fuori tutti indicano l'indirizzo in cui scrivere cosi:
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
Magari è quello, prova
fabpolli:
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
Magari è quello, prova
L'avevo già provato ma non risolve il problema.
Ho visto nel playground di arduino che esiste una libreria chiamata "EEPROMMex library" che potrebbe andare bene, ma un po mi frena il mio inglese scolastico e anche perchè non ho trovato su internet, informazioni sulle funzioni da utilizzare.
Saluti
Lello
Ho risolto prendendo spunto da questa funzione che ho trovato nel playfround.
https://playground.arduino.cc/Code/EEPROMReadWriteLong/
Saluti
Lello
Se tu potessi postare il codcie funzionante potrebbe essere utili per altri utenti che si trovano ad affrontare il medesimo problema sarebbe una bella cosa
Ho risolto parzialmente, il listato scrive e legge il dato "long" solo partendo dalla cella 0.
Io avrei bisogno anche di andare avanti dalla cella successiva (la 4), a salvare i dati.
Almeno per il momento...
Il listato è il seguente:
/*********************** **************
* 10 febbraio 2020
*
****************************************************/
#include <EEPROM.h>
#define Ingresso A0 // sensore AD
long dato = 0; // variabile per ingresso AD
//This function will write a 4 byte (32bit) long to the eeprom at
//the specified indirizzo to indirizzo + 3.
void EEPROMWritelong(int indirizzo, long dato)
{
//Decomposition from a long to 4 bytes by using bitshift.
//One = Most significant -> Four = Least significant byte
byte four = (dato & 0xFF);
byte three = ((dato >> 8) & 0xFF);
byte two = ((dato >> 16) & 0xFF);
byte one = ((dato >> 24) & 0xFF);
//Write the 4 bytes into the eeprom memory.
EEPROM.write(indirizzo, four);
EEPROM.write(indirizzo + 1, three);
EEPROM.write(indirizzo + 2, two);
EEPROM.write(indirizzo + 3, one);
Serial.print(" indirizzo:");
Serial.print(indirizzo);
Serial.print(" scritto:");
Serial.print(dato);
}
//This function will read a 4 byte (32bit) long from the eeprom
//at the specified indirizzo to indirizzo + 3.
long EEPROMReadlong(long indirizzo)
{
//Read the 4 bytes from the eeprom memory.
long four = EEPROM.read(indirizzo);
long three = EEPROM.read(indirizzo + 1);
long two = EEPROM.read(indirizzo + 2);
long one = EEPROM.read(indirizzo + 3);
//Return the recomposed long by using bitshift.
return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
}
void setup()
{
Serial.begin(9600);
}
void loop(){
delay(5000);
dato = analogRead(Ingresso);
Serial.print("ADS: ");
Serial.print(dato);
//Starting at the first byte on the eeprom.
long indirizzo = 0;
//Writing first long.
EEPROMWritelong(indirizzo, dato);
indirizzo+=4;
Serial.print(" letto:");
Serial.println(EEPROMReadlong(0));
}
Saluti
Lello