Здравствуйте, подскажите как записывать в eeprom не целы числа, ну например как записать число 36.6 и прочитать его в дальнейшем?
#include <EEPROM.h> void setup() { float val_1 = 36.6; float val_2 = 0; EEPROM_float_write(0, val_1); val_2 = EEPROM_float_read(0); // выводим в сериал Serial.begin(9600); Serial.println(val_2); } void loop(){} void EEPROM_float_write(int addr, float val) // запись в ЕЕПРОМ { byte *x = (byte *)&val; for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x); } float EEPROM_float_read(int addr) // чтение из ЕЕПРОМ { byte x[4]; for(byte i = 0; i < 4; i++) x = EEPROM.read(i+addr); float *y = (float *)&x; return y[0]; } ну и не забывать что float занимает в памяти 4 байта например если одну переменную вы записываете по адресу 10, то следующую можно записывать по адресу 14
float f = 123.456f; //Variable to store in EEPROM. int eeAddress = 0; //Location we want the data to be put. //One simple call, with the address first and the object second. EEPROM.put(eeAddress, f);
Что то не понял что там он пишет, вот простейшие Код (C++): #include <EEPROM.h> // the current address in the EEPROM (i.e. which byte // we're going to write to next) int addr = 0; float value; float f = 36.6; void setup() { EEPROM.put(addr, f); Serial.begin(9600); } void loop() { value = EEPROM.read(addr); Serial.println(value); delay(500); } выводит 102.00
Код (C++): #include <EEPROM.h> // the current address in the EEPROM (i.e. which byte // we're going to write to next) int addr = 0; float value; float f = 3.46f; void setup() { EEPROM.get(addr, f); Serial.begin(9600); Serial.print(EEPROM.read(addr)); } void loop(){}
Simon. вы разумный человек или как? Вам написали - вместо EEPROM.read() используйте .get А вы что написали? И где. кстати, у вас в коде запись числа в EEPROM ?
никогда ничего не пишите в нулевой адрес. После чтения или записи EEPROM, всегда возвращайте указатель га нулевой адрес.
В апнотах не пишут именно про нулевую ячейку потому, что формально проблема может возникнуть с любой, НО - по умолчанию в регистре адреса находится ноль, потому проявляется проблема чаще всего именно с нулевой ячейкой. А проблема в том, что при некоторых условиях возникает левое прерывание, которого не должно быть и происходит запись в EEPROM по тому адресу, который сидит в регистре адреса. У них эта беда была и в AVR, и в PIC Поищи гуглом "site:microchip.com spurious EEPROM writes". Там много есть и в документации и на их форумах. P.S. Microchip говорит, что всё исправлено (см., например, здесь раздел 7.6), но я от греха подальше не использую, потому как не знаю какую именно версию чипа передрали китайцы у которых я их покупаю - новую или ещё до исправления.
А может проблемы были у тех кто не включал BOD? Напряжение ниже нормы, выборка команд идет непонятно как, процессор может выполнять непонятно какие инструкции...