Не целы числа в EEPROM

Тема в разделе "Arduino & Shields", создана пользователем avgaz, 21 ноя 2015.

  1. avgaz

    avgaz Нерд

    Здравствуйте, подскажите как записывать в eeprom не целы числа, ну например как записать число 36.6 и прочитать его в дальнейшем?
     
  2. Onkel

    Onkel Гуру

    в code vision C делают так
    eeprom float t=36.6;
    что- то аналогичное должно быть и в ide ардуины.
     
  3. vvr

    vvr Инженерище

    #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
     
  4. Onkel

    Onkel Гуру

    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);
     
  5. DrProg

    DrProg Вечный нерд

    EEPROM.put пишет в память любые переменные, даже структуры. Проверено.
     
    ИгорьК нравится это.
  6. avgaz

    avgaz Нерд

    Что то не понял что там он пишет, вот простейшие
    Код (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
     
  7. DrProg

    DrProg Вечный нерд

    Попробуйте get.

    И еще, лучше использовать update вместо put, это более щадаще к EEPROM.
     
    ИгорьК нравится это.
  8. avgaz

    avgaz Нерд

    дак результат тот же выводит 102.00
     
  9. DrProg

    DrProg Вечный нерд

    Код (C++):
    EEPROM.get(addr, value);
    ;)
     
    ИгорьК нравится это.
  10. Simon

    Simon Нерд

    Результат тот же...;)
     
  11. b707

    b707 Гуру

    весь код покажите
     
  12. Simon

    Simon Нерд

    Код (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(){}
     
  13. b707

    b707 Гуру

    Simon. вы разумный человек или как?
    Вам написали - вместо EEPROM.read() используйте .get
    А вы что написали?
    И где. кстати, у вас в коде запись числа в EEPROM ?
     
  14. b707

    b707 Гуру

    и вообще, такие вещи не на форуме надо спрашивать, а в справочнике смотреть.
     
  15. parovoZZ

    parovoZZ Гуру

    никогда ничего не пишите в нулевой адрес. После чтения или записи EEPROM, всегда возвращайте указатель га нулевой адрес.
     
  16. SergeiL

    SergeiL Оракул Модератор

    Об этом в даташите написано, или "Рабинович напел" в интернете?
     
  17. вообще тема 15 года
     
  18. SergeiL

    SergeiL Оракул Модератор

    Может и 15-го, но с нулевой ячейкой проблем не замечал :)
    И в даташите не видел ограничений :)
     
  19. Asper Daffy

    Asper Daffy Иксперд

    В апнотах не пишут именно про нулевую ячейку потому, что формально проблема может возникнуть с любой, НО - по умолчанию в регистре адреса находится ноль, потому проявляется проблема чаще всего именно с нулевой ячейкой. А проблема в том, что при некоторых условиях возникает левое прерывание, которого не должно быть и происходит запись в EEPROM по тому адресу, который сидит в регистре адреса. У них эта беда была и в AVR, и в PIC

    Поищи гуглом "site:microchip.com spurious EEPROM writes". Там много есть и в документации и на их форумах.

    P.S. Microchip говорит, что всё исправлено (см., например, здесь раздел 7.6), но я от греха подальше не использую, потому как не знаю какую именно версию чипа передрали китайцы у которых я их покупаю - новую или ещё до исправления.
     
    Последнее редактирование: 27 июн 2020
    Daniil нравится это.
  20. SergeiL

    SergeiL Оракул Модератор

    А может проблемы были у тех кто не включал BOD?
    Напряжение ниже нормы, выборка команд идет непонятно как, процессор может выполнять непонятно какие инструкции...