Как записать в EEPROM перед отключением питания
Re: Как записать в EEPROM перед отключением питания
А ещё есть RAM c I2C/SPI интерфейсом. На одном конденсаторе неделями живут.
А ещё есть источники питания с небольшими АКБ.
Вариантов много, желания изучать каталоги мало.
А ещё есть источники питания с небольшими АКБ.
Вариантов много, желания изучать каталоги мало.
Re: Как записать в EEPROM перед отключением питания
[uquote="jcxz",url="/forum/viewtopic.php?p=4153774#p4153774"]А ещё существует FRAM/MRAM память.[/uquote]
Раз уж подели тему 10-летней давности... Конечно, FRAM - хорошее решение. Но всё же - внешний элемент, не дешёвый к тому же. Но для ответственных применений - лишнего 1$ не жалко.
Раз уж подели тему 10-летней давности... Конечно, FRAM - хорошее решение. Но всё же - внешний элемент, не дешёвый к тому же. Но для ответственных применений - лишнего 1$ не жалко.
Re: Как записать в EEPROM перед отключением питания
[uquote="phalanx",url="/forum/viewtopic.php?p=4153803#p4153803"]А еще копеечные SPI Serial EERAM и I2C Serial EERAM, которым вообще кроме одного внешнего конденсатора ничего не нужно.[/uquote]Это которые внутри имеют ОЗУ и EEPROM и запись из 1-й во 2-ю по сигналу аварии питания?
Когда то давно заменили FRAM в одном из серийных изделий на такой чип (от Cypress). В результате получили периодические разрушения содержимого памяти.
ПО не менялось, и по идее - что FRAM что такой чип ОЗУ+EEPROM должны вроде работать одинаково. Но что то было не так. Происходило изредка, невоспроизводимо (если бы это было не серийное изделие, может и не заметили бы). Причину так и не нашли (были подозрения на сбои системы аварийного сохранения из-за каких-то помех в момент аварии питания, но подтвердить не удалось). Просто откатили обратно на FRAM - экономия копеечная по сравнению с FRAM, а гемору на порядок больше.
С тех пор не доверяю им. Но это только моё личное впечатление.
Добавлено after 2 minutes 14 seconds:
[uquote="tonyk",url="/forum/viewtopic.php?p=4153807#p4153807"]А ещё есть RAM c I2C/SPI интерфейсом. На одном конденсаторе неделями живут.
А ещё есть источники питания с небольшими АКБ.[/uquote]Это подойдёт если отключить надолго не могут. Или отключив, положить на холодный склад к примеру.
Добавлено after 5 minutes 16 seconds:
[uquote="Jack_A",url="/forum/viewtopic.php?p=4153811#p4153811"]Конечно, FRAM - хорошее решение. Но всё же - внешний элемент, не дешёвый к тому же.[/uquote]Не обязательно. Можно заменить МК на MSP430FRxxxx и будет вполне себе внутренний элемент.
Есть у меня работающий проектик на MSP430FR5739 - хорошая вещица для простых задач!
Когда то давно заменили FRAM в одном из серийных изделий на такой чип (от Cypress). В результате получили периодические разрушения содержимого памяти.
ПО не менялось, и по идее - что FRAM что такой чип ОЗУ+EEPROM должны вроде работать одинаково. Но что то было не так. Происходило изредка, невоспроизводимо (если бы это было не серийное изделие, может и не заметили бы). Причину так и не нашли (были подозрения на сбои системы аварийного сохранения из-за каких-то помех в момент аварии питания, но подтвердить не удалось). Просто откатили обратно на FRAM - экономия копеечная по сравнению с FRAM, а гемору на порядок больше.
С тех пор не доверяю им. Но это только моё личное впечатление.
Добавлено after 2 minutes 14 seconds:
[uquote="tonyk",url="/forum/viewtopic.php?p=4153807#p4153807"]А ещё есть RAM c I2C/SPI интерфейсом. На одном конденсаторе неделями живут.
А ещё есть источники питания с небольшими АКБ.[/uquote]Это подойдёт если отключить надолго не могут. Или отключив, положить на холодный склад к примеру.
Добавлено after 5 minutes 16 seconds:
[uquote="Jack_A",url="/forum/viewtopic.php?p=4153811#p4153811"]Конечно, FRAM - хорошее решение. Но всё же - внешний элемент, не дешёвый к тому же.[/uquote]Не обязательно. Можно заменить МК на MSP430FRxxxx и будет вполне себе внутренний элемент.
Есть у меня работающий проектик на MSP430FR5739 - хорошая вещица для простых задач!
Re: Как записать в EEPROM перед отключением питания
насвсяк для программистов-электротехников
маленький скетч:
питание падает с 11V(порог детектирования потери питания) до 5V(~4V после 78L05) при потреблении 30mA и конденсаторе 1000uF за время
~=(11-5)1e-3/30e-3 = 0.2s
это всю eeprom несколько раз перезаписать можно, кодом хеминга с избыточностью x10
теперь менее удачный вариант: конденсатор прямо на питании mcu, пусть с 3.3>>3.1V(порог нашего прерывания) падает до 2.7V(bod), те же 30mA,1000uF
~=(3.1-2.7)1e-3/30e-3 = 13mS -уже тяжелее, можно 4700uF и будет 60mS.
ps ну и 30mA это зверский ток, скажем att2313 это скорее 1-6mA. ток что емкость можно и поменьше скореевсего.
питание падает с 11V(порог детектирования потери питания) до 5V(~4V после 78L05) при потреблении 30mA и конденсаторе 1000uF за время
~=(11-5)1e-3/30e-3 = 0.2s
это всю eeprom несколько раз перезаписать можно, кодом хеминга с избыточностью x10
теперь менее удачный вариант: конденсатор прямо на питании mcu, пусть с 3.3>>3.1V(порог нашего прерывания) падает до 2.7V(bod), те же 30mA,1000uF
~=(3.1-2.7)1e-3/30e-3 = 13mS -уже тяжелее, можно 4700uF и будет 60mS.
ps ну и 30mA это зверский ток, скажем att2313 это скорее 1-6mA. ток что емкость можно и поменьше скореевсего.
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Как записать в EEPROM перед отключением питания
а сколько времени тратится на запись одного байта, например, в АТмега8 - ты никогда не интересовался?AlexS4 писал(а):это всю eeprom несколько раз перезаписать можно
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Как записать в EEPROM перед отключением питания
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154226#p4154226"]можно 4700uF и будет 60mS.[/uquote]Только кроме кондёра нужно ещё построить остальную схему монитора питания. И написать код, в котором сделать выравнивание износа. И учесть вариант, когда входное питание может дергаться скажем так пару раз в секунду в течение нескольких месяцев - чтобы дырка в EEPROM-е не протёрлась при этом.
Потом выпустить серию девайсов и внезапно обнаружить, что если в момент после срабатывания монитора питания, при работе кода сохранения проскакивает помеха и МК перезапускается (например от WDT), то никакого сохранения не происходит, а происходит разрушение содержимого EEPROM.
А затем зайти в магазин и обнаружить, что цена одного такого кондёра будет уже побольше, чем у минимальной FRAM. С которой организовать систему хранения, устойчивую к перезагрузкам и протираниям на порядок проще, чем с EEPROM. И нафига тогда оно надо?
Добавлено after 1 minute 29 seconds:
[uquote="Starichok51",url="/forum/viewtopic.php?p=4154330#p4154330"]а сколько времени тратится на запись одного байта, например, в АТмега8 - ты никогда не интересовался?[/uquote]
+++ И не просто записи, а "записи с предварительным стиранием". Которая выполняется ещё дольше.
Про атмегу не скажу, но например у XMC4700 (с которым сейчас работаю) только одно стирание выполняется до 5.5 сек(!) Это ж какой кондёр надо впендюрить, чтобы столько продержаться?!
Потом выпустить серию девайсов и внезапно обнаружить, что если в момент после срабатывания монитора питания, при работе кода сохранения проскакивает помеха и МК перезапускается (например от WDT), то никакого сохранения не происходит, а происходит разрушение содержимого EEPROM.
А затем зайти в магазин и обнаружить, что цена одного такого кондёра будет уже побольше, чем у минимальной FRAM. С которой организовать систему хранения, устойчивую к перезагрузкам и протираниям на порядок проще, чем с EEPROM. И нафига тогда оно надо?
Добавлено after 1 minute 29 seconds:
[uquote="Starichok51",url="/forum/viewtopic.php?p=4154330#p4154330"]а сколько времени тратится на запись одного байта, например, в АТмега8 - ты никогда не интересовался?[/uquote]
+++ И не просто записи, а "записи с предварительным стиранием". Которая выполняется ещё дольше.
Про атмегу не скажу, но например у XMC4700 (с которым сейчас работаю) только одно стирание выполняется до 5.5 сек(!) Это ж какой кондёр надо впендюрить, чтобы столько продержаться?!
Re: Как записать в EEPROM перед отключением питания
[uquote="Starichok51",url="/forum/viewtopic.php?p=4154330#p4154330"]а сколько времени тратится на запись одного байта, например, в АТмега8 - ты никогда не интересовался?[/uquote]
около 8mS в старых мегах, в свежих (1.8..6V) мегах и тайни 1.8mS.
немножко преувеличил, не всю eeprom, но создать условия чтоб успеть несколько байт загнать на предворительно подготовленное место - вовсе не проблема.

это опция, если байты не используются - да можно таким способом увеличить число допустимых выключений... со 100k скажем до 10M
но невсегда это нужно. алгоритм же приметивен и не требует увеличения времени записи, напр: записываем актуальное число на границе стертого участка, когда стертого места не остается - стираем весь массив выделенный под это (заранее стираем, до аварии)

если такой частный случай то нужен просто больше запас, буфферный литиевый аккумулятор , или микроватное питание на msc переведенном в саспенд сохранять, или да fram, почему нет, просто это редкий частный случай, неболее.
https://www.chipdip.ru/catalog/aluminum ... 6.3V&ps=x3 =14р
https://www.chipdip.ru/catalog-show/ic- ... fram&ps=x3 =210р
около 8mS в старых мегах, в свежих (1.8..6V) мегах и тайни 1.8mS.
немножко преувеличил, не всю eeprom, но создать условия чтоб успеть несколько байт загнать на предворительно подготовленное место - вовсе не проблема.
заранее стереть конечно нельзяjcxz писал(а):+++ И не просто записи, а "записи с предварительным стиранием".
его тоже писать надо после аварии питания, чтоб интереснее было ...jcxz писал(а):И написать код, в котором сделать выравнивание износа.
это опция, если байты не используются - да можно таким способом увеличить число допустимых выключений... со 100k скажем до 10M
но невсегда это нужно. алгоритм же приметивен и не требует увеличения времени записи, напр: записываем актуальное число на границе стертого участка, когда стертого места не остается - стираем весь массив выделенный под это (заранее стираем, до аварии)
2 резистора это сложно)) посчитаем нестабильность порога?)jcxz писал(а):Только кроме кондёра нужно ещё построить остальную схему монитора питания.
а если то же самое произойдет при записи в fram?jcxz писал(а):если в момент после срабатывания монитора питания, при работе кода сохранения проскакивает помеха и МК перезапускается (например от WDT), то никакого сохранения не происходит, а происходит разрушение содержимого EEPROM.
а еще взрываются мины и гаммалучи плавающие затворы флэша теребятjcxz писал(а):И учесть вариант, когда входное питание может дергаться скажем так пару раз в секунду в течение нескольких месяцев - чтобы дырка в EEPROM-е не протёрлась при этом.
если такой частный случай то нужен просто больше запас, буфферный литиевый аккумулятор , или микроватное питание на msc переведенном в саспенд сохранять, или да fram, почему нет, просто это редкий частный случай, неболее.
что реальных аргументов нет и осталось только высасывать из пальца сравнивая розничную цену самого дорого электролита с оптовой ценой самого дешевого fram.jcxz писал(а):А затем зайти в магазин и обнаружить,
https://www.chipdip.ru/catalog/aluminum ... 6.3V&ps=x3 =14р
https://www.chipdip.ru/catalog-show/ic- ... fram&ps=x3 =210р
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Как записать в EEPROM перед отключением питания
Код: Выделить всё
if(analogRead(0)<475){ //если попало питание запомнить в память
EEPROM.put(300, day_0);EEPROM.put(305, month_0);EEPROM.put(310, bme_temp_0); // Записать значение
EEPROM.put(315,day_1);EEPROM.put(320,month_1);EEPROM.put(325,bme_temp_1); // Записать значение
EEPROM.put(330,day_2);EEPROM.put(335,month_2);EEPROM.put(340,bme_temp_2); // Записать значение
delay(3500);
}в day_1, month_1, bme_temp_1 и day_2, month_2, bme_temp_2 значения 0_дня, 0_месяца, 0_тепературы.
с июня 2020года
- Вложения
-
- meteostanciya_moi.zip
- (8.01 КБ) 121 скачивание
Последний раз редактировалось Serzh2000 Ср янв 05, 2022 19:26:13, всего редактировалось 1 раз.
Re: Как записать в EEPROM перед отключением питания
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154591#p4154591"]заранее стереть конечно нельзя
[/uquote]Заранее это когда? При выключенном питании?
Попробуйте представить ситуацию: питание включилось и сразу выключилось. И так 100 раз подряд. Когда предлагаете стирать?
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154591#p4154591"]но невсегда это нужно. алгоритм же приметивен и не требует увеличения времени записи, напр: записываем актуальное число на границе стертого участка, когда стертого места не остается - стираем весь массив выделенный под это (заранее стираем, до аварии)[/uquote]Я вам конкретный пример привёл: XMC4700 у которого время стирания сектора может доходить до 5.5сек. Предложите алгоритм, который позволит фиксировать время выключения при кратковременном включении/выключении.
В студию.
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154591#p4154591"]а если то же самое произойдет при записи в fram?[/uquote]То всё нормально - время выключения во FRAM остаётся.
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154591#p4154591"]просто это редкий частный случай, неболее.[/uquote]Может и редкий, но мы с таким сталкивались. Точнее - наши заказчики. И не однократно. И обнаружить эти факты смогли только потому, что выключения писались в журнал во FRAM.
Без этого - гадали бы почему некоторые устройства у заказчика иногда почему-то не работают по несколько дней....
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154591#p4154591"]что реальных аргументов нет и осталось только высасывать из пальца сравнивая розничную цену самого дорого электролита с оптовой ценой самого дешевого fram.[/uquote]Я сравнил цены первых попавшихся конденсатора указанной вами ёмкости и минимальной FRAM (объёма достаточного для сохранения события выключения), на одном и том же ресурсе:

Почувствуйте разницу!
Кроме того ещё один плюс FRAM: для записи события выключения достаточно несколько байт, а остальной объём из 512байт можно использовать ещё для чего-то (например хранения конфига). Бесплатно! И гораздо удобнее использовать чем с EEPROM.
Попробуйте представить ситуацию: питание включилось и сразу выключилось. И так 100 раз подряд. Когда предлагаете стирать?
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154591#p4154591"]но невсегда это нужно. алгоритм же приметивен и не требует увеличения времени записи, напр: записываем актуальное число на границе стертого участка, когда стертого места не остается - стираем весь массив выделенный под это (заранее стираем, до аварии)[/uquote]Я вам конкретный пример привёл: XMC4700 у которого время стирания сектора может доходить до 5.5сек. Предложите алгоритм, который позволит фиксировать время выключения при кратковременном включении/выключении.
В студию.
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154591#p4154591"]а если то же самое произойдет при записи в fram?[/uquote]То всё нормально - время выключения во FRAM остаётся.
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154591#p4154591"]просто это редкий частный случай, неболее.[/uquote]Может и редкий, но мы с таким сталкивались. Точнее - наши заказчики. И не однократно. И обнаружить эти факты смогли только потому, что выключения писались в журнал во FRAM.
Без этого - гадали бы почему некоторые устройства у заказчика иногда почему-то не работают по несколько дней....
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154591#p4154591"]что реальных аргументов нет и осталось только высасывать из пальца сравнивая розничную цену самого дорого электролита с оптовой ценой самого дешевого fram.[/uquote]Я сравнил цены первых попавшихся конденсатора указанной вами ёмкости и минимальной FRAM (объёма достаточного для сохранения события выключения), на одном и том же ресурсе:
Почувствуйте разницу!
Кроме того ещё один плюс FRAM: для записи события выключения достаточно несколько байт, а остальной объём из 512байт можно использовать ещё для чего-то (например хранения конфига). Бесплатно! И гораздо удобнее использовать чем с EEPROM.
Re: Как записать в EEPROM перед отключением питания
это не нормальный режим жля устройства с mcu. это норм режим для светодиода в режиме передатчика морзеjcxz писал(а):Попробуйте представить ситуацию: питание включилось и сразу выключилось. И так 100 раз подряд. Когда предлагаете стирать?
но и это элементарно обходится если такое тз, я выше писал.
и тогда уже неважно питать только fram или весь mcu )).
и если исходить из того что питание всетаки чаще есть чем наоборот и выключается не 100раз подряд то подготовить (стереть) сектор eeprom заранее нет никаких проблем. хоть 5.5s хоть 6.
если _в процессе записи_ будет сбой то консистентность данных неизбежно будет нарушенаjcxz писал(а):То всё нормально - время выключения во FRAM остаётся.
обойти это можно лок-алгоритмами записи, независимо от вида носителя, да с eeprom запись будет дольше и ресурс перезаписей ограничен но с этим никто и не спорил
честно говоря не понимаю о чем тут спорить, есть способы:
-периодическая (сравнительно редкая) запись в eeprom
-запись в eeprom по аварии
-периодическая (частая) запись в fram или запись по аварии, неважно
-резервное микро-питание остановленного mcu для сохранения sram
-резервное питание работающего mcu
каждый из способов имеет набор очевидных и неочень плюсов и минусов...
абсолютно лучшего способа во всех смыслах не существует,
это не "винилово-ламповый звук против 24x96" это "бензин против лития"
добавьте доставку и умножте на риски получить муляж. китайские электролиты в мешках всеравно дешевле потому что это более массовый товар, да дело даже не в том что дешевле, иногда еще +1 чип неприемлем потому что скажем нет места или свободных ног у att10 c 4 gpio )).-=Vovka=- писал(а):от 20,20руб за штуку
Re: Как записать в EEPROM перед отключением питания
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154847#p4154847"]
обойти это можно лок-алгоритмами записи, независимо от вида носителя[/uquote]ТЗ необходимо фиксировать время выключения устройства с точностью не хуже 1сек. Режим работы устройства = 24x8.
Решение на FRAM - простой алгоритм: пишем непрерывно несколько раз в секунду, чередуя записи в 2 разных области FRAM. Если даже в момент записи (при выключении) последняя запись порушилась - останется предпоследняя, да точность времени будет чуть хуже (на период записи). Ну и что? Всё равно погрешность времени - менее 1сек.
А с EEPROM как? Опишите алгоритм решения задачи по ТЗ "не зависимый от вида носителя" и устойчивый к сбоям/перезагрузкам при записи?
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154847#p4154847"]да дело даже не в том что дешевле, иногда еще +1 чип неприемлем потому что скажем нет места или свободных ног у att10 c 4 gpio )).[/uquote]На чип в SOIC-8 нет места, а на в несколько раз больший электролит 4700мкФ x 16V - есть?
PS: И кстати - у электролитов со снижением температуры значительно падает ёмкость. А работоспособность устройства должна обеспечиваться во всём диапазоне температур. Так что ваш расчёт длительности работы при аварии неверен. Надо ещё добавить ёмкости, если необходим индастриал температурный диапазон.
если _в процессе записи_ будет сбой то консистентность данных неизбежно будет нарушенаjcxz писал(а):То всё нормально - время выключения во FRAM остаётся.
обойти это можно лок-алгоритмами записи, независимо от вида носителя[/uquote]ТЗ необходимо фиксировать время выключения устройства с точностью не хуже 1сек. Режим работы устройства = 24x8.
Решение на FRAM - простой алгоритм: пишем непрерывно несколько раз в секунду, чередуя записи в 2 разных области FRAM. Если даже в момент записи (при выключении) последняя запись порушилась - останется предпоследняя, да точность времени будет чуть хуже (на период записи). Ну и что? Всё равно погрешность времени - менее 1сек.
А с EEPROM как? Опишите алгоритм решения задачи по ТЗ "не зависимый от вида носителя" и устойчивый к сбоям/перезагрузкам при записи?
[uquote="AlexS4",url="/forum/viewtopic.php?p=4154847#p4154847"]да дело даже не в том что дешевле, иногда еще +1 чип неприемлем потому что скажем нет места или свободных ног у att10 c 4 gpio )).[/uquote]На чип в SOIC-8 нет места, а на в несколько раз больший электролит 4700мкФ x 16V - есть?
PS: И кстати - у электролитов со снижением температуры значительно падает ёмкость. А работоспособность устройства должна обеспечиваться во всём диапазоне температур. Так что ваш расчёт длительности работы при аварии неверен. Надо ещё добавить ёмкости, если необходим индастриал температурный диапазон.
