EEPROM put/get
- Войдите на сайт для отправки комментариев
Ср, 20/12/2017 - 00:28
Не могу понять как работает 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); }
А мы не можем понять, что именно Вы пишете, т.к. описание переменных Вы явно забыли привести.
Можно только сказать, что читаете Вы заметно больше, чем пишете.
Кстати, последнее можно было бы заключить, и не видя Ваш код: ff - так выглядять ячейки EEPROM, в которые еще ничего не писали.
Фьюз EESAVE проверьте
В void по кнопке вызываю запись SaveAirCompEEPROM()
А в int, что Вы делаете?
А мы не можем понять, что именно Вы пишете, т.к. описание переменных Вы явно забыли привести.
Можно только сказать, что читаете Вы заметно больше, чем пишете.
Кстати, последнее можно было бы заключить, и не видя Ваш код: ff - так выглядять ячейки EEPROM, в которые еще ничего не писали.
Упс.. ночью уже писал.
переменные .enable Boolean
Остальные uint16-t
Есть ещё 3 процедуры записи других параметров. Тут их не привел. Они аналогичны записи в этой процедуре.
Ff меняю на 0, чтобы при первичной загрузке не кликать 100 раз кнопку уменьшения уставки. Значение не может превышать 1023. Это временная мера. В реальном проекте заменю на 1023, тоесть на максимальное возможное
В void по кнопке вызываю запись SaveAirCompEEPROM()
А в int, что Вы делаете?
в int формируются значения от 0 до 1023. Это уставки для сравнения аналогового сигнала
В тело процедуры записи вставил вызов serial.print, что бы видеть вызов.
С этим все нормально.
"Стандартные" фьюзы для леонардо
EESAVE выключен...
"Стандартные" фьюзы для леонардо
EESAVE выключен...
ммммм... по правде говоря я совсем не понял про фьюзы.....
Что есть фьюз?
и что значит выключен?
http://homes-smart.ru/fusecalc/?prog=avrstudio&part=ATmega32U4 Калькулятор фьюзов
Открываете файл \arduino\hardware\arduino\boards.txt находите свою плату и правите те три строчки что я выше давал подставляю нужные числа посчитанные на калькуляторе фьюзов. Должно быть что-то типа лоу FF хай D0 расширенный CB.
Потом в ардуино иде выбераете прожечь загрузчик для нужной платы и все.
Я фьюзы через ISP шью всегда так что лучше уточнить у старших товарищей когда ардуино иде фьюзы шьет (при прошивке загрузчика или вообще каждый раз)
Ах да :) Все манипуляции делаете на свой страх и риск. Можно окирпичить камень (тафталогия) и потом придется искать нормальный программатор.
Получается, что по умолчанию на этой ардуинки возможность записи в eeprom отключена?
EESAVE отвечает не за возможность записи, а за стирание еепром каждый раз когда загружается прошивка. По умолчанию еепром стирается при прошивке поэтому вы ничего нормального не можете прочитать из еепром после очередной прошивки, даже если вообще ничего в программе не меняли, а просто прошили.
По умолчанию еепром стирается при прошивке
Нет.
Upd. За Леонардо не знаю.
Спасибо за инфу. Но если я залью скетч и запишу в еепром значения переменных, а затем при рестарте ардуино считаю их, то они сохранятся? Скетч перезаливать не буду
В void по кнопке вызываю запись SaveAirCompEEPROM()
А в int, что Вы делаете?
в int формируются значения от 0 до 1023. Это уставки для сравнения аналогового сигнала
Пацталом!!!
Похоже с фьюзами я погарячился. Если шить стандартными средства через бутлодер то еепром похоже не затрагивается (проверил сейчас на уно) вне зависимости от фьюза еесэйв. Я без бутлодера использую МК вот и понесло меня )
В void по кнопке вызываю запись SaveAirCompEEPROM()
А в int, что Вы делаете?
в int формируются значения от 0 до 1023. Это уставки для сравнения аналогового сигнала
Пацталом!!!
поясните пожалуйста, что я сказал не так?
если про int то я конечно имел в виду значения переменных типа int16
Похоже с фьюзами я погарячился. Если шить стандартными средства через бутлодер то еепром похоже не затрагивается (проверил сейчас на уно) вне зависимости от фьюза еесэйв. Я без бутлодера использую МК вот и понесло меня )
Совсем запутался )
менять фьюзы не нужно?
тогда с чем может быть связано поведение еепром, что описывал в первом посте?
Я не знаю, что ты сказал не так, т.к. я вообще не понимаю что ты сказал. Выражения "в void" и "в int" вообще не имеют никакой разумной интерепретации - никакой от слова совсем. Когда ты выдал бред про "в void" тебя потроллили насчёт "в int", а ты стал ещё что-то и про "в int" бредить.
Повторяю, эти выражения не имеют никакого разумного смысла и являются чистым бредом, потому понять что ты сказал не представляется возможным :)))
Я не знаю, что ты сказал не так, т.к. я вообще не понимаю что ты сказал. Выражения "в void" и "в int" вообще не имеют никакой разумной интерепретации - никакой от слова совсем. Когда ты выдал бред про "в void" тебя потроллили насчёт "в int", а ты стал ещё что-то и про "в int" бредить.
Повторяю, эти выражения не имеют никакого разумного смысла и являются чистым бредом, потому понять что ты сказал не представляется возможным :)))
кхм....
опечатка. В дороге пишу.
хотел сказать в loop()
И про int подумал это вопрос о том, что делаю с переменными типа Int )
Ну потролили, да ) а я не понял. Еду в машине после ночных исследований. Мозг полуотключен )))
В том коде который дали вижу только один косяк
if
(airComp.maxP = 0xffff) {airComp.maxP = 0;}
Это условие всегда будет выполняться и будите всегда 0 видеть. замените = на == и должно заработать.
Скорее всего поэтому и видите не то что записали. И таких условий у вас не одно.
Сыплю голову пеплом )
уже наступал на эти грабли.... спасибо, что заметили. Вывод: ночью спать нужно.
А еще лучше - ставьте константу поперед переменной, тогда компилятор начнет ныть по поводу того, что 0xFFFF не может быть присвоено значение airComp.maxP.
Отличная идея!
Вот из таких мелочей опыт произростает )