EEPROM put/get

Smith2007
Offline
Зарегистрирован: 30.10.2017

Не могу понять как работает EEPROM.

В setup() вызываю ReadAllEEPROM();

В void по кнопке вызываю запись SaveAirCompEEPROM()

В терминале вижу вывод Serial

Меняю скетч, перекомпилирую и заливаю заново. При этом с переменными и адресами в EEPROM ни чего не меняю. Но после загрузки нового скетча, в setup считывается совершенно не то, что я записывал. 

boolean имеет странные значения типа 57, FF, 134

А все uint16_t равны ff. (в скетче я их преобразую к 0, что бы за рамки 10 бит не выйти.)

Контроллер iskra neo (leonardo)

EEPROM затирается при загрузке нового скетча?

 

//  Задаём адреса в EEPROM

#define START_ADDRESS     4
#define AIRCOMP_ENABLE    START_ADDRESS
#define AIRCOMP_MAXP      ( AIRCOMP_ENABLE + sizeof(airComp.enable) )
#define AIRCOMP_MINP      (AIRCOMP_MAXP + sizeof(airComp.maxP) )
#define BLOCKFRONT_ENABLE (AIRCOMP_MINP + sizeof(airComp.minP) )
#define BLOCKFRONT_F0     (BLOCKFRONT_ENABLE + sizeof(BlockFront.enable) )
#define BLOCKFRONT_F2     (BLOCKFRONT_F0 + sizeof(BlockFront.f0) )
#define BLOCKREAR_ENABLE  (BLOCKFRONT_F2 + sizeof(BlockFront.f2) )
#define BLOCKREAR_F0      (BLOCKREAR_ENABLE + sizeof(BlockRear.enable) )
#define BLOCKREAR_F2      (BLOCKREAR_F0 + sizeof(BlockFront.f0) )
#define VOLTAGE_ENABLE    (BLOCKREAR_F2 + sizeof(BlockFront.f2) )
#define VOLTAGE_MINU      (VOLTAGE_ENABLE + sizeof(voltage.enable) )
#define AIRCOMP_BLOCKP    (VOLTAGE_MINU + sizeof(voltage.minU) )

void ReadAllEEPROM(){
  EEPROM.get(AIRCOMP_ENABLE, airComp.enable);
  EEPROM.get(AIRCOMP_MAXP, airComp.maxP);
  if (airComp.maxP = 0xffff) {airComp.maxP = 0;}
  EEPROM.get(AIRCOMP_MINP, airComp.minP);
  if (airComp.minP = 0xffff) {airComp.minP = 0;}
  EEPROM.get(AIRCOMP_BLOCKP, airComp.blockP);
  if (airComp.blockP = 0xffff) {airComp.blockP = 0;}
  EEPROM.get(BLOCKFRONT_ENABLE, BlockFront.enable);
  EEPROM.get(BLOCKFRONT_F0, BlockFront.f0);
  if (BlockFront.f0 = 0xffff) {BlockFront.f0 = 0;}
  EEPROM.get(BLOCKFRONT_F2, BlockFront.f2);
  if (BlockFront.f2 = 0xffff) {BlockFront.f2 = 0;}
  EEPROM.get(BLOCKREAR_ENABLE, BlockRear.enable);
  EEPROM.get(BLOCKREAR_F0, BlockRear.f0);
  if (BlockRear.f0 = 0xffff) {BlockRear.f0 = 0;}
  EEPROM.get(BLOCKREAR_F2, BlockRear.f2);
  if (BlockRear.f2 = 0xffff) {BlockRear.f2 = 0;}
  EEPROM.get(VOLTAGE_ENABLE, voltage.enable);
  EEPROM.get(VOLTAGE_MINU, voltage.minU);
  if (voltage.minU = 0xffff) {voltage.minU = 0;}
}

// фрагмент записи одного пакета
// Запись настроек airComp
void SaveAirCompEEPROM(){
  Serial.println("SaveAirCompEEPROM");
  Serial.print("  airComp.enable = ");
  Serial.println(airComp.enable, HEX);
  Serial.print("  airComp.minP = ");
  Serial.println(airComp.minP, HEX);
  Serial.print("  airComp.maxP = ");
  Serial.println(airComp.maxP, HEX);
  EEPROM.put(AIRCOMP_ENABLE, airComp.enable);
  EEPROM.put(AIRCOMP_MAXP, airComp.maxP);
  EEPROM.put(AIRCOMP_MINP, airComp.minP);
  EEPROM.put(AIRCOMP_BLOCKP, airComp.blockP);
}
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А мы не можем понять, что именно Вы пишете, т.к. описание переменных Вы явно забыли привести.

Можно только сказать, что читаете Вы заметно больше, чем пишете.

Кстати, последнее можно было бы заключить, и не видя Ваш код: ff - так выглядять ячейки EEPROM, в которые еще ничего не писали.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Фьюз EESAVE проверьте

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Smith2007 пишет:

В void по кнопке вызываю запись SaveAirCompEEPROM()

А в int, что Вы делаете?

Smith2007
Offline
Зарегистрирован: 30.10.2017

andriano пишет:

А мы не можем понять, что именно Вы пишете, т.к. описание переменных Вы явно забыли привести.

Можно только сказать, что читаете Вы заметно больше, чем пишете.

Кстати, последнее можно было бы заключить, и не видя Ваш код: ff - так выглядять ячейки EEPROM, в которые еще ничего не писали.

Упс.. ночью уже писал.

переменные .enable Boolean 

Остальные uint16-t

Есть ещё 3 процедуры записи других параметров. Тут их не привел. Они аналогичны записи в этой процедуре.

Ff  меняю на 0, чтобы при первичной загрузке не кликать 100 раз кнопку уменьшения уставки. Значение не может превышать 1023. Это временная мера. В реальном проекте заменю на 1023, тоесть на максимальное возможное

 

 

Smith2007
Offline
Зарегистрирован: 30.10.2017

ЕвгенийП пишет:

Smith2007 пишет:

В void по кнопке вызываю запись SaveAirCompEEPROM()

А в int, что Вы делаете?

в int формируются значения от 0 до 1023. Это уставки для сравнения аналогового сигнала

Smith2007
Offline
Зарегистрирован: 30.10.2017

В тело процедуры записи вставил вызов serial.print, что бы видеть вызов. 

С этим все нормально.

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

"Стандартные" фьюзы для леонардо

leonardo.bootloader.low_fuses=0xff
leonardo.bootloader.high_fuses=0xd8
leonardo.bootloader.extended_fuses=0xcb

EESAVE выключен...

Smith2007
Offline
Зарегистрирован: 30.10.2017

Penni пишет:

"Стандартные" фьюзы для леонардо

leonardo.bootloader.low_fuses=0xff
leonardo.bootloader.high_fuses=0xd8
leonardo.bootloader.extended_fuses=0xcb

EESAVE выключен...

ммммм... по правде говоря я совсем не понял про фьюзы.....

Что есть фьюз?

и что значит выключен?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

http://homes-smart.ru/fusecalc/?prog=avrstudio&part=ATmega32U4 Калькулятор фьюзов

Открываете файл \arduino\hardware\arduino\boards.txt находите свою плату и правите те три строчки что я выше давал подставляю нужные числа посчитанные на калькуляторе фьюзов. Должно быть что-то типа лоу FF хай D0 расширенный CB. 

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

Я фьюзы через ISP шью всегда так что лучше уточнить у старших товарищей когда ардуино иде фьюзы шьет (при прошивке загрузчика или вообще каждый раз)

Ах да :) Все манипуляции делаете на свой страх и риск. Можно окирпичить камень (тафталогия) и потом придется искать нормальный программатор.

Smith2007
Offline
Зарегистрирован: 30.10.2017

Получается, что по умолчанию на этой ардуинки возможность записи в eeprom отключена?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

EESAVE отвечает не за возможность записи, а за стирание еепром каждый раз когда загружается прошивка. По умолчанию еепром стирается при прошивке поэтому вы ничего нормального не можете прочитать из еепром после очередной прошивки, даже если вообще ничего в программе не меняли, а просто прошили.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Penni пишет:

По умолчанию еепром стирается при прошивке

Нет.

Upd.  За Леонардо не знаю. 

Smith2007
Offline
Зарегистрирован: 30.10.2017

Спасибо за инфу. Но если я залью скетч и запишу в еепром значения переменных, а затем при рестарте ардуино считаю их, то они сохранятся? Скетч перезаливать не буду

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Smith2007 пишет:

ЕвгенийП пишет:

Smith2007 пишет:

В void по кнопке вызываю запись SaveAirCompEEPROM()

А в int, что Вы делаете?

в int формируются значения от 0 до 1023. Это уставки для сравнения аналогового сигнала

Пацталом!!!

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Похоже с фьюзами я погарячился. Если шить стандартными средства через бутлодер то еепром похоже не затрагивается (проверил сейчас на уно) вне зависимости от фьюза еесэйв. Я без бутлодера использую МК вот и понесло меня )

Smith2007
Offline
Зарегистрирован: 30.10.2017

Ворота пишет:

Smith2007 пишет:

ЕвгенийП пишет:

Smith2007 пишет:

В void по кнопке вызываю запись SaveAirCompEEPROM()

А в int, что Вы делаете?

в int формируются значения от 0 до 1023. Это уставки для сравнения аналогового сигнала

Пацталом!!!

 

поясните пожалуйста, что я сказал не так?

если про int то я конечно имел в виду значения переменных типа int16 

Smith2007
Offline
Зарегистрирован: 30.10.2017

Penni пишет:

Похоже с фьюзами я погарячился. Если шить стандартными средства через бутлодер то еепром похоже не затрагивается (проверил сейчас на уно) вне зависимости от фьюза еесэйв. Я без бутлодера использую МК вот и понесло меня )

Совсем запутался )

менять фьюзы не нужно?

тогда с чем может быть связано поведение еепром, что описывал в первом посте?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Я не знаю, что ты сказал не так, т.к. я вообще не понимаю что ты сказал. Выражения "в void" и "в int" вообще не имеют никакой разумной интерепретации - никакой от слова совсем. Когда ты выдал бред про "в void" тебя потроллили насчёт "в int", а ты стал ещё что-то и про "в int" бредить.

Повторяю, эти выражения не имеют никакого разумного смысла и являются чистым бредом, потому понять что ты сказал не представляется возможным :)))

Smith2007
Offline
Зарегистрирован: 30.10.2017

Ворота пишет:

Я не знаю, что ты сказал не так, т.к. я вообще не понимаю что ты сказал. Выражения "в void" и "в int" вообще не имеют никакой разумной интерепретации - никакой от слова совсем. Когда ты выдал бред про "в void" тебя потроллили насчёт "в int", а ты стал ещё что-то и про "в int" бредить.

Повторяю, эти выражения не имеют никакого разумного смысла и являются чистым бредом, потому понять что ты сказал не представляется возможным :)))

 

кхм....

опечатка. В дороге пишу.

хотел сказать в loop()

И про int подумал это вопрос о том, что делаю с переменными типа Int )

Ну потролили, да ) а я не понял. Еду в машине после ночных исследований. Мозг полуотключен )))

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

В том коде который дали вижу только один косяк

 if (airComp.maxP = 0xffff) {airComp.maxP = 0;}

Это условие всегда будет выполняться и будите всегда 0 видеть. замените = на == и должно заработать.

Скорее всего поэтому и видите не то что записали. И таких условий у вас не одно.

Smith2007
Offline
Зарегистрирован: 30.10.2017

Сыплю голову пеплом )

уже наступал на эти грабли.... спасибо, что заметили. Вывод: ночью спать нужно.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А еще лучше - ставьте константу поперед переменной, тогда компилятор начнет ныть по поводу того, что 0xFFFF не может быть присвоено значение airComp.maxP.

Smith2007
Offline
Зарегистрирован: 30.10.2017

Отличная идея!
Вот из таких мелочей опыт произростает )