Hi, i want to save unsigned long values to external eeprom. I found code online and i don't understand why i one variable must be global:
unsigned long EEPROM_readLU(int address){
unsigned long EEPROM_result;
byte val = readEEPROM(address+3);
EEPROM_result = (EEPROM_result << 8) | val;
val = readEEPROM(address+2);
EEPROM_result= (EEPROM_result << 8) | val;
val = readEEPROM(address+1);
EEPROM_result= (EEPROM_result << 8) | val;
val = readEEPROM(address+0);
EEPROM_result= (EEPROM_result << 8) | val;
return EEPROM_result;
}
This code won't compile and i got error "'EEPROM_result' is used uninitialized in this function [-Werror=uninitialized]"
But when i make EEPROM_result a global variable (i define it outside this function) everything works. Why?
This code also won't work if i try to shorten some things like:
byte val = readEEPROM(address+3);
EEPROM_result = (EEPROM_result << 8) | val;
--- shorten to --->
EEPROM_result = (EEPROM_result << 8) | readEEPROM(address+3);
That's weird for me, cuz I always copy somebodys code and try to shorten it a little and i never had such problems yet. Is this code sketchy and i shouldn't use it or i'm just doing something dumb?
Can u give me example how can i do it correctly?
Thanks in advance!
I'm using ESP32 and this is full code:
#include "addresses.h"
void setup() {
Serial.begin(115200);
delay(5);
Wire.begin();
updateEEPROM(0, 5);
Serial.println(readEEPROM(0));
updateEEPROM(0, 5);
Serial.println(readEEPROM(0));
updateEEPROM(0, 0);
Serial.println(readEEPROM(0));
EEPROM_updateLU(4, 4294967295);
Serial.println(EEPROM_readLU(4));
EEPROM_updateLU(4, 0);
Serial.println(EEPROM_readLU(4));
}
void loop() {
}
// addresses.h
#define RTC_ADDRESS 0x68
#define PCF8574_1 0x23
#define i2c_address 0x50
#include <Wire.h>
byte readEEPROM(int address) {
byte rcvData = 0xFF; // Define byte for received data
Wire.beginTransmission(i2c_address);
// Send memory address as two 8-bit bytes
Wire.write((int)(address >> 8)); // MSB
Wire.write((int)(address & 0xFF)); // LSB
// End the transmission
Wire.endTransmission();
Wire.requestFrom(i2c_address, 1); // Request one byte of data at current memory address
rcvData = Wire.read();
return rcvData;
}
void updateEEPROM(int address, byte val) {
if (readEEPROM(address) != val){
Serial.println("OVERWRITING BYTE");
Wire.beginTransmission(i2c_address);
Wire.write((int)(address >> 8)); // MSB
Wire.write((int)(address & 0xFF)); // LSB
Wire.write(val);
Wire.endTransmission();
delay(3);
}
}
unsigned long EEPROM_readLU(int address){
unsigned long EEPROM_result;
byte val = readEEPROM(address+3);
EEPROM_result = (EEPROM_result << 8) | val;
val = readEEPROM(address+2);
EEPROM_result= (EEPROM_result << 8) | val;
val = readEEPROM(address+1);
EEPROM_result= (EEPROM_result << 8) | val;
val = readEEPROM(address+0);
EEPROM_result= (EEPROM_result << 8) | val;
return EEPROM_result;
}
void EEPROM_updateLU(int address, unsigned long value){
updateEEPROM(address, value & 0xFF);
updateEEPROM(address+1, (value & 0xFF00) >> 8);
updateEEPROM(address+2, (value & 0xFF0000) >> 16);
updateEEPROM(address+3, (value & 0xFF000000) >> 24);
}