Начальные значения EEPROM

SmartRnd
Offline
Зарегистрирован: 13.09.2016

При записи программы в UNO требуется сразу записать значения в EEPROM. Каким образом можно это сделать?

BoBo4kA
Offline
Зарегистрирован: 15.01.2016

я сделал так, в сетапе

  if(EEPROM.read(0)==235)
    {
      br=(EEPROM.read(3),EEPROM.read(2));
      s=EEPROM.read(1);
    }
  else
    {
      EEPROM.write(3,highByte(br));
      EEPROM.write(2,lowByte(br));
      EEPROM.write(1,s);
      EEPROM.write(0,235);
    }

 

SmartRnd
Offline
Зарегистрирован: 13.09.2016

Надеялся, что есть  более простое решение. В CodeVision AVR можно описать переменную типа EEPROM:

eeprom unsigned char ee_params[eeprom_size]={ 4,251,11,254,253,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

Предложенный способ хороший, но ест память контроллера.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Создайте hex-файл содержимого EEPROM и залейте его в EEPROM.

Logik
Offline
Зарегистрирован: 05.08.2014

Способ, который ничего не ест - два приложения. Одно при запуске инитит EEPROM. Второе - не знает проблем.

Logik
Offline
Зарегистрирован: 05.08.2014

Yarik.Yar пишет:

Создайте hex-файл содержимого EEPROM и залейте его в EEPROM.

Так это предполагает наличие програматора.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Чтобы не расходовать впустую циклы записи рекомендуется сначала считать данные из ячеек, и только в случае их несовпадения - делать перезапись...

Logik
Offline
Зарегистрирован: 05.08.2014

Угу. Еще и быстрей получается. Использую типа

void WriteBlockToEEPROM(byte adr, void* d, byte l)
{
   for(byte i=0;i<l;i++,adr++)
   {
     if(EEPROM.read(adr)!=((byte*)d)[i])
       EEPROM.write(adr,((byte*)d)[i]);
   }
}

 

a5021
Offline
Зарегистрирован: 07.07.2013

Andrey_Y_Ostanovsky пишет:
Чтобы не расходовать впустую циклы записи рекомендуется сначала считать данные из ячеек, и только в случае их несовпадения - делать перезапись...

В крайности наверное тоже не стоит впадать. Для атмеги производитель гарантирует не менее ста тысяч циклов записи в EEPROM. Даже если перезаписывать одну и ту же яйчейку каждый час, угроза для ее работоспособности возникнет через одиннадцать лет.

SmartRnd
Offline
Зарегистрирован: 13.09.2016

Сделал так:

// Массив для загрузки
int temp_i; // мусорная переменная
#define eeprom_size 64 // Размерность массива eeprom
unsigned char ee_params[eeprom_size]={ 1,251,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
/*                                    00  01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
00 - версия модуля
01 - номер модуля
02 - тип модуля
Остальные параметры программист может использовать для нужд устройства
*/ 

void setup() {
  if (EEPROM.read(0)!=ee_params[0]) // Если EEPROM не задан
  {
    //присваиваем начальные значения
    for (temp_i=0; temp_i<eeprom_size; temp_i++)
    {
     EEPROM.write(temp_i,ee_params[temp_i]);
    };
  };
}

Работает и хорошо. :)

BoBo4kA
Offline
Зарегистрирован: 15.01.2016

в библиотеке есть такое

EEPROM.update(address, val);

 

SmartRnd
Offline
Зарегистрирован: 13.09.2016

А в чём отличие? По описанию не понял.

BoBo4kA
Offline
Зарегистрирован: 15.01.2016

при ициализации памяти(в setup'е) оно, скорее всего, не пригодится, а в работе(в loop'e) удобнее, имхо))