Сохранение переменных при отключении питания.

Даниил Сухарев
Offline
Зарегистрирован: 03.04.2021

Не прошу обьяснять (но если наведете буду благодарен ) просьба просто сказать возможно ли это.

Суть такова: я в цикле LOOP меняю значение некоторых переменных и хочу чтобы в следующий раз когда я включу ардуино данные переменные сохранили свои измененные значения.

(не очень хочется долбатся с их записью на sd-карту(eeprom - использовать не хочу) )

Но если это невозможно значит буду sd-карту подключать(

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

Даниил Сухарев пишет:
eeprom - использовать не хочу

видима, по религиозным соображениям?  тогда тебе ничего не поможет, сохранение в eeprom штатная возможность МК. А SD как раз - навороты, да и не запустишь ты ее на 328й. 

b707
Offline
Зарегистрирован: 26.05.2017

Даниил Сухарев пишет:

Не прошу обьяснять (но если наведете буду благодарен ) просьба просто сказать возможно ли это.

Суть такова: я в цикле LOOP меняю значение некоторых переменных и хочу чтобы в следующий раз когда я включу ардуино данные переменные сохранили свои измененные значения.

возможно. Через ЕЕПРОМ.

Почему не хотите использовать? мама запретила?

Pyotr
Offline
Зарегистрирован: 12.03.2014

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

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

тока, они хоть и говорят, что победили ошибку, но, на всякий случай, по адресу 0x0000 ничего не храни.  Начинай с адреса 0x0010

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

тока, они хоть и говорят, что победили ошибку, но, на всякий случай, по адресу 0x0000 ничего не храни.  Начинай с адреса 0x0010

а я что-то не нарывался на ошибки, храню с нулевого адреса

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

я тоже не нарывался последнее время, но DiHALT так сказал, надо его слушаца.  Я слушаюсь 

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

А микрочип пишет, что это древние предания всё - про адрес 0x00 и сейчас уже нечего ссать.

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

Даниил Сухарев пишет:

eeprom - использовать не хочу

Не хочете EEPROM - возьмите EERAM. FRAM, NVRAM.

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

sadman41 пишет:

А микрочип пишет, что это древние предания всё - про адрес 0x00 и сейчас уже нечего ссать.

«Ален Делон на пьёт одеколон».

Микрочип не покупает клоны своих микросхем на алиэкспрессе, где никогда не знаешь с какой именно версии они передирали чип.

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

С точки зрения логики довод звучит убедительно. Думаете, что склады Алиэкспресса до сих пор забиты чипами старых ревизий?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

За 4года работы с ардуино, ни разу не сталкивался с ошибкой в адресах eeprom 0х00 и 0х01

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

sadman41 пишет:

Думаете, что склады Алиэкспресса до сих пор забиты чипами старых ревизий?

Нет, не думаю. Я вообще об этом не дума, просто не пользуюсь младшими адресами. Не "принципиально на пользуюсь", а совершенно беспринципно.

isupov_andrey
Offline
Зарегистрирован: 21.08.2021

На питание ардуины ставишь конденсатор с диодом. Не используемый пин подключаешь до диода. В цикле мониторишь пин изменил свое состояние то сохраняешь все в EEPROM. При старте ардуины выгружаешь из EEPROM в RAM

rkit
Offline
Зарегистрирован: 23.11.2016

isupov_andrey пишет:

На питание ардуины ставишь конденсатор с диодом. Не используемый пин подключаешь до диода. В цикле мониторишь пин изменил свое состояние то сохраняешь все в EEPROM. При старте ардуины выгружаешь из EEPROM в RAM

Или не усложняешь себе жизнь бесполезной чушью, а просто работаешь с eeprom.

isupov_andrey
Offline
Зарегистрирован: 21.08.2021

У eeprom ресурс 100тысяч записи. Если делать устройство которое редко будет отключатся к примеру раз в день то можно и напрямую работать, но если в час по 20 раз то стоит задуматься

rkit
Offline
Зарегистрирован: 23.11.2016

Ну так задумайся. Посчитай на бумажке.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Посчитаю за него.
Пишем в память по кругу.
Скажем 20байт полезных и 4служебных(поиск нужной ячейки).
Итого :
1024/20=51 запись влезет в 328ю

Делаем 20записей в час.

100000/20=5000ч хватит без смены ячеек
(5000*51)/2=127500часов (на 2 делим потому, что служебные ячейки будем при каждой записи затирать)
127500/24=5312 дней или 14,5лет.

Вам зачем больше ?
Если действительно нужно, ставьте внешнюю еепром у нее и ресурс больше и объем

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

Kakmyc пишет:
Посчитаю за него....  Делаем 20записей в час.

Используя для расчета предположения с потолка и результат получим отфонарный.  Откуда 20 записей в час? Почему не в минуту, секунду, миллисекунду? 

Воще лучший вариант - с конденсатором и диодом. Только пин на прерывание завести. Лучший тем, что позволяет производить действия при выключении, а не загружать МК левой, довольно глупой и не быстрой работой. При том делать не только сохранение переменной, если требуется. 

При запуске и чтении сохраненной в флеше  переменной всегда возникает каверзный вопрос -  а корректное ли там значение? Ну например при запуске свежезалитой прошивки значение получим не инициализированное. Это может вызвать сбой. Как вариант - использовать CRC для контроля корректности сохраненных в флеше данных. Но каждый раз, после записи переменной возится с CRC тяжеловато (например для переменной - счетчика инкрементируемого десятки раз в сек.), а вот раз при выключении питания - самое оно.

"просто работаешь с eeprom." - путь к глюкавости. Ну хорошо если переменная -  байт и ни как не завязана по логике с другими сохраняемыми переменными. А если переменная - 2 байта? Появляется вероятность отключения МК в момент, когда только один байт перезаписан а второй еще нет. И после запуска получим воще чорте-шо. Вероятность конечно не большая (от этого на самом деле только хуже, иди лови глюк возникающий раз в год...) но вероятность эта быстро растет с повышением частоты перезаписи и длинны записываемого.

Для снижения износа флешки тоже есть фокус - перед записью проверить, а менялось ли значение. Иногда помогает радикально. Иногда - нет.

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

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

Есть ещё прикольная штука - EERAM. Никак не могу найти на "потыкать".

Green
Offline
Зарегистрирован: 01.10.2015

Редко изменяемые сохраняю сразу, быстро (потенциометры, энкодеры) - по паузе (таймауту). В случае выключения во время регулировки - ну извини, будут предыдущие значения. При восстановлении храню диапазон и дефолт. Не попадаем в диапазон - устанавливаю дефолт.
Опять таки, всё зависит от важности - а то и CRC с дублированием.