Раз уж подели тему 10-летней давности... Конечно, FRAM - хорошее решение. Но всё же - внешний элемент, не дешёвый к тому же. Но для ответственных применений - лишнего 1$ не жалко.
А еще копеечные SPI Serial EERAM и I2C Serial EERAM, которым вообще кроме одного внешнего конденсатора ничего не нужно.
Это которые внутри имеют ОЗУ и EEPROM и запись из 1-й во 2-ю по сигналу аварии питания? Когда то давно заменили FRAM в одном из серийных изделий на такой чип (от Cypress). В результате получили периодические разрушения содержимого памяти. ПО не менялось, и по идее - что FRAM что такой чип ОЗУ+EEPROM должны вроде работать одинаково. Но что то было не так. Происходило изредка, невоспроизводимо (если бы это было не серийное изделие, может и не заметили бы). Причину так и не нашли (были подозрения на сбои системы аварийного сохранения из-за каких-то помех в момент аварии питания, но подтвердить не удалось). Просто откатили обратно на FRAM - экономия копеечная по сравнению с FRAM, а гемору на порядок больше.
С тех пор не доверяю им. Но это только моё личное впечатление.
Конечно, FRAM - хорошее решение. Но всё же - внешний элемент, не дешёвый к тому же.
Не обязательно. Можно заменить МК на MSP430FRxxxx и будет вполне себе внутренний элемент. Есть у меня работающий проектик на MSP430FR5739 - хорошая вещица для простых задач!
насвсяк для программистов-электротехников маленький скетч: питание падает с 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. ток что емкость можно и поменьше скореевсего.
Только кроме кондёра нужно ещё построить остальную схему монитора питания. И написать код, в котором сделать выравнивание износа. И учесть вариант, когда входное питание может дергаться скажем так пару раз в секунду в течение нескольких месяцев - чтобы дырка в EEPROM-е не протёрлась при этом. Потом выпустить серию девайсов и внезапно обнаружить, что если в момент после срабатывания монитора питания, при работе кода сохранения проскакивает помеха и МК перезапускается (например от WDT), то никакого сохранения не происходит, а происходит разрушение содержимого EEPROM.
А затем зайти в магазин и обнаружить, что цена одного такого кондёра будет уже побольше, чем у минимальной FRAM. С которой организовать систему хранения, устойчивую к перезагрузкам и протираниям на порядок проще, чем с EEPROM. И нафига тогда оно надо?
а сколько времени тратится на запись одного байта, например, в АТмега8 - ты никогда не интересовался?
+++ И не просто записи, а "записи с предварительным стиранием". Которая выполняется ещё дольше. Про атмегу не скажу, но например у XMC4700 (с которым сейчас работаю) только одно стирание выполняется до 5.5 сек(!) Это ж какой кондёр надо впендюрить, чтобы столько продержаться?!
а сколько времени тратится на запись одного байта, например, в АТмега8 - ты никогда не интересовался?
около 8mS в старых мегах, в свежих (1.8..6V) мегах и тайни 1.8mS. немножко преувеличил, не всю eeprom, но создать условия чтоб успеть несколько байт загнать на предворительно подготовленное место - вовсе не проблема.
jcxz писал(а):
+++ И не просто записи, а "записи с предварительным стиранием".
заранее стереть конечно нельзя
jcxz писал(а):
И написать код, в котором сделать выравнивание износа.
его тоже писать надо после аварии питания, чтоб интереснее было ... это опция, если байты не используются - да можно таким способом увеличить число допустимых выключений... со 100k скажем до 10M но невсегда это нужно. алгоритм же приметивен и не требует увеличения времени записи, напр: записываем актуальное число на границе стертого участка, когда стертого места не остается - стираем весь массив выделенный под это (заранее стираем, до аварии)
jcxz писал(а):
Только кроме кондёра нужно ещё построить остальную схему монитора питания.
2 резистора это сложно)) посчитаем нестабильность порога?)
jcxz писал(а):
если в момент после срабатывания монитора питания, при работе кода сохранения проскакивает помеха и МК перезапускается (например от WDT), то никакого сохранения не происходит, а происходит разрушение содержимого EEPROM.
а если то же самое произойдет при записи в fram?
jcxz писал(а):
И учесть вариант, когда входное питание может дергаться скажем так пару раз в секунду в течение нескольких месяцев - чтобы дырка в EEPROM-е не протёрлась при этом.
а еще взрываются мины и гаммалучи плавающие затворы флэша теребят если такой частный случай то нужен просто больше запас, буфферный литиевый аккумулятор , или микроватное питание на msc переведенном в саспенд сохранять, или да fram, почему нет, просто это редкий частный случай, неболее.
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); }
я вот так сделал: поставил от блока питания на плюсовой вывод диод и на +5 v ардуино. и конденсатор на 1000мкф на +5 v адуино , остальные потребители просто от блока питания запитал (то есть после пропадания питания конденсатор на 1000мкф питает одну ардуину) и если не поставить задержку delay(3500); то код успевает пробежать несколько раз и перезаписать значения day_0, month_0, bme_temp_0 в day_1, month_1, bme_temp_1 и day_2, month_2, bme_temp_2 значения 0_дня, 0_месяца, 0_тепературы. с июня 2020года пока все работает как задумывал
Заранее это когда? При выключенном питании? Попробуйте представить ситуацию: питание включилось и сразу выключилось. И так 100 раз подряд. Когда предлагаете стирать?
но невсегда это нужно. алгоритм же приметивен и не требует увеличения времени записи, напр: записываем актуальное число на границе стертого участка, когда стертого места не остается - стираем весь массив выделенный под это (заранее стираем, до аварии)
Я вам конкретный пример привёл: XMC4700 у которого время стирания сектора может доходить до 5.5сек. Предложите алгоритм, который позволит фиксировать время выключения при кратковременном включении/выключении. В студию.
Может и редкий, но мы с таким сталкивались. Точнее - наши заказчики. И не однократно. И обнаружить эти факты смогли только потому, что выключения писались в журнал во FRAM. Без этого - гадали бы почему некоторые устройства у заказчика иногда почему-то не работают по несколько дней....
что реальных аргументов нет и осталось только высасывать из пальца сравнивая розничную цену самого дорого электролита с оптовой ценой самого дешевого fram.
Я сравнил цены первых попавшихся конденсатора указанной вами ёмкости и минимальной FRAM (объёма достаточного для сохранения события выключения), на одном и том же ресурсе: Почувствуйте разницу! Кроме того ещё один плюс FRAM: для записи события выключения достаточно несколько байт, а остальной объём из 512байт можно использовать ещё для чего-то (например хранения конфига). Бесплатно! И гораздо удобнее использовать чем с EEPROM.
Попробуйте представить ситуацию: питание включилось и сразу выключилось. И так 100 раз подряд. Когда предлагаете стирать?
это не нормальный режим жля устройства с mcu. это норм режим для светодиода в режиме передатчика морзе но и это элементарно обходится если такое тз, я выше писал. и тогда уже неважно питать только fram или весь mcu )). и если исходить из того что питание всетаки чаще есть чем наоборот и выключается не 100раз подряд то подготовить (стереть) сектор eeprom заранее нет никаких проблем. хоть 5.5s хоть 6.
jcxz писал(а):
То всё нормально - время выключения во FRAM остаётся.
если _в процессе записи_ будет сбой то консистентность данных неизбежно будет нарушена обойти это можно лок-алгоритмами записи, независимо от вида носителя, да с eeprom запись будет дольше и ресурс перезаписей ограничен но с этим никто и не спорил
честно говоря не понимаю о чем тут спорить, есть способы: -периодическая (сравнительно редкая) запись в eeprom -запись в eeprom по аварии -периодическая (частая) запись в fram или запись по аварии, неважно -резервное микро-питание остановленного mcu для сохранения sram -резервное питание работающего mcu каждый из способов имеет набор очевидных и неочень плюсов и минусов... абсолютно лучшего способа во всех смыслах не существует, это не "винилово-ламповый звук против 24x96" это "бензин против лития"
добавьте доставку и умножте на риски получить муляж. китайские электролиты в мешках всеравно дешевле потому что это более массовый товар, да дело даже не в том что дешевле, иногда еще +1 чип неприемлем потому что скажем нет места или свободных ног у att10 c 4 gpio )).
То всё нормально - время выключения во FRAM остаётся.
если _в процессе записи_ будет сбой то консистентность данных неизбежно будет нарушена обойти это можно лок-алгоритмами записи, независимо от вида носителя
ТЗ необходимо фиксировать время выключения устройства с точностью не хуже 1сек. Режим работы устройства = 24x8. Решение на FRAM - простой алгоритм: пишем непрерывно несколько раз в секунду, чередуя записи в 2 разных области FRAM. Если даже в момент записи (при выключении) последняя запись порушилась - останется предпоследняя, да точность времени будет чуть хуже (на период записи). Ну и что? Всё равно погрешность времени - менее 1сек. А с EEPROM как? Опишите алгоритм решения задачи по ТЗ "не зависимый от вида носителя" и устойчивый к сбоям/перезагрузкам при записи?
да дело даже не в том что дешевле, иногда еще +1 чип неприемлем потому что скажем нет места или свободных ног у att10 c 4 gpio )).
На чип в SOIC-8 нет места, а на в несколько раз больший электролит 4700мкФ x 16V - есть?
PS: И кстати - у электролитов со снижением температуры значительно падает ёмкость. А работоспособность устройства должна обеспечиваться во всём диапазоне температур. Так что ваш расчёт длительности работы при аварии неверен. Надо ещё добавить ёмкости, если необходим индастриал температурный диапазон.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения