Начальные значения EEPROM
- Войдите на сайт для отправки комментариев
Втр, 13/09/2016 - 15:30
При записи программы в UNO требуется сразу записать значения в EEPROM. Каким образом можно это сделать?
При записи программы в UNO требуется сразу записать значения в EEPROM. Каким образом можно это сделать?
я сделал так, в сетапе
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); }Надеялся, что есть более простое решение. В 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};Предложенный способ хороший, но ест память контроллера.
Создайте hex-файл содержимого EEPROM и залейте его в EEPROM.
Способ, который ничего не ест - два приложения. Одно при запуске инитит EEPROM. Второе - не знает проблем.
Создайте hex-файл содержимого EEPROM и залейте его в EEPROM.
Так это предполагает наличие програматора.
Чтобы не расходовать впустую циклы записи рекомендуется сначала считать данные из ячеек, и только в случае их несовпадения - делать перезапись...
Угу. Еще и быстрей получается. Использую типа
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]); } }В крайности наверное тоже не стоит впадать. Для атмеги производитель гарантирует не менее ста тысяч циклов записи в EEPROM. Даже если перезаписывать одну и ту же яйчейку каждый час, угроза для ее работоспособности возникнет через одиннадцать лет.
Сделал так:
// Массив для загрузки 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]); }; }; }Работает и хорошо. :)
в библиотеке есть такое
А в чём отличие? По описанию не понял.
при ициализации памяти(в setup'е) оно, скорее всего, не пригодится, а в работе(в loop'e) удобнее, имхо))