Как сохранить значение после отключения питания мк?

Marts
Marts аватар
Offline
Зарегистрирован: 04.12.2018

Доброго времени суток.

Есть программка, она будет работать на роботе и питаться от usb. Во время ее работы будут меняться значения переменных. В какой-то момент робота выключают. Есть ли какие-то варианты как запомнить последнее измененное значение переменной? (чтобы когда робота опять включат он продолжил работать там где остановился). 

Писать в файл не подходит, потому что программа не на компе. Может где-то в ардуино можно хранить?

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Энергонезависимая память EEPROM.

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

Только после отключения питания не получится. Так что продумайте этот момент. 

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

Marts пишет:

Как сохранить значение после отключения питания мк?

После отключения уже поздно пить боржом. Никак!

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

Есть и другие варианты, но они скорее экзотические.

И да, чем файл-то плох? Присобачьте к ардуине sd-карту и пшите туда хоть всю память.

Marts
Marts аватар
Offline
Зарегистрирован: 04.12.2018

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

После отключения уже поздно пить боржом. Никак!

Ну да)))

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

И да, чем файл-то плох? Присобачьте к ардуине sd-карту и пшите туда хоть всю память.

Нужно хранить всего одно значение, тогда проще независимую память.

Marts
Marts аватар
Offline
Зарегистрирован: 04.12.2018

Я правильно понимаю, если я в программе запишу допустим EEPROM.write(0,value), залью в ардуино, а потом запишу новый скетч и залью, то в этом новом скетче можно будет вытащить старое значение по адресу 0 от предыдущей программы? (Мне это нужно, чтобы при самом первом запуске нужной программы на роботе значение value в EEPROM было уже не от балды)

EEPROM ограничивает количество перезаписи(100 тыс.), а читать же сколько угодно можно?

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Неправильно, если в fuse-бите EESAVE не ноль (unprogrammed) то при всех прочих при заливке нового скетча EEPROM сотрётся (можно подкрутить ключи запуска AVRDUDE, но там ещё искать надо - где и что менять).

Читать - да, можно сколько влезет.

Сразу лезть к avrdude в консоль (или при незнании консоли - в gui-обертку avrdude которая называется SinaProg) не советую. В крайнем случае, можно тренироваться на кошках все операции выполнять в консоли, дописав туда ключ -n (do not write anything, отключить любую запись в микруху полностью)

Вообще с программой непонятка. Вы её так часто перепрошиваете? По хорошему так, ограничения EEPROM тут меркнут, ибо ресурс флеша не 100000 циклов а все 10000. В остальных случаях - правила записи в EEPROM таковы:

1. Повод для записи - исключительный случай. То есть нажали кнопку, сохранили настройку и т. п. Не писать в EEPROM в цикле. Не писать в EEPROM без специального отведённого под это условия программы.

2. Перед записью - прочитать, если там то же самое что собирались записать - не писать.

Сохранение настройки при исчезновениии питания делается датчиком наличия питания: на ввод питания - диод последовательно + провод по которому отслеживается наличие питания (ADC или компаратор, чтобы отследить просадку ниже 4 В). После диода - большой конденсатор, и арда питается уже от конденсатора. В условии экстренного сохранения - блокировка, то есть флаг, который запрещает любые действия с EEPROM (и условия по штатной работе с EEPROM должны содержать этот флаг, чтобы информация не повредилась при исчезновении питания).

Когда питание отрубится, напряг на конденсаторе начинает падать. ИОН (стабилитрон либо TL431) задаёт образцовое напряжение компаратора или ADC (провод AREF). Как только конденсатор становится меньше образцового (допустим 4.000 В), считаем что надо экстренно сохранить, делаем следующие действия:

1. Прочитать то, куда будем писать.

2. Если совпадает не пишем.

3. Иначе пишем.

4. Включаем флаг запрета работы с EEPROM.

5. Если где-то в программе кто-то ещё пытался работать с EEPROM, этот флаг исключает последующую запись, чтобы на низком напр. питания запись не закосячилась.

После этого ничего не делаем или продолжаем работать. Потом конденсатор кончится и всё погаснет. Потом когда питание включат, кондёр снова нальётся, АЦП/компар будет видеть что входное напряжение больше чем напр. срабатывания (4.000) и всё работает штатно. Пропадёт снова - снова кондёр начинает сдуваться, и АЦП/компаратор сработает.

4.000 это не четыре тысячи, это четыре целых ноль десятых ноль сотых ноль тысячных.

Диод лучше Шоттки, ёмкость конденсатора без светодиодов достаточно 1500 мкФ, со светодиодами - не менее 4700 мкФ, со штатной ардой формфактора Uno/Duemilanove которая не переделывалась (микросхема сериал моста, светики, автовыбор питания) - не менее 10000 мкФ.

Если есть желание почитать что такое fuse-байты, то https://www.instructables.com/id/How-to-change-fuse-bits-of-AVR-Atmega328p-8bit-mic/

Их калькулятор http://www.engbedded.com/fusecalc/

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

А мне больше нравится внешний EEPROM. Cтоит копейки, подключается лекго и имеют до 1 миллиона циклов перезаписи.

Вот такие, например - https://www.aliexpress.com/item/AT24C02-AT24C02B-AT24C02BPU27-24C02N-DIP-8-EEPROM-Memory-IC-10pcs-lot/32874605289.html

Если паять лень, можно докупить модуль вроде такого - https://www.aliexpress.com/item/GREATZT-New-AT24C256-24C256-I2C-interface-EEPROM-Memory-Module-for-arduino/32850958047.html

 

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

asam пишет:

А мне больше нравится внешний EEPROM. Cтоит копейки, подключается лекго и имеют до 1 миллиона циклов перезаписи.

прошлый век :)

Давно есть еепромки с 10**14 (10 в 14 степени) циклами гарантированных записей, причем по цене вполне доступные - порядка 25р за корпус. Если писать каждую миллисекунду - хватит на 3 с лишним тысячи лет :)

https://ru.aliexpress.com/item/RIC-FM24

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Ну F-RAM вещь хорошая. Стоит, правда, в 5 раз дороже EEPROM. А самое главное, что-то я не видел их в DIP-8. Пайка SOIC для подавляющего большинства начинающих - непосильная задача.

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

b707 пишет:
хватит на 3 с лишним тысячи лет :)
А через три тысячи лет что делать? накроется ведь устройство! Не, так низзя! Безответсвенность сплошная!

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

asam пишет:

 что-то я не видел их в DIP-8

Смотрите

1) https://ru.aliexpress.com/item/10-FM24C04A-P-FM24C04A-C-FM24C04-DIP-8/32...

2) https://www.ebay.com/itm/1PCS-FM1208S-200CC-CDIP24-IC-/322490333543

и еще 100500

Вот, хороший сборник даташитов разных чипов (FRAM, EDRAM), можно сравнивать и выбирать - http://www.bitsavers.org/components/ramtron/_dataBooks/1994_Ramtron_Specialty_Memory_Products.pdf

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

#1 может оказаться обычной еепромкой, именно в названии FM24xx есть путаница, чем продавец может воспользоваться. Фотографии товара не внушают доверия - на корпусах нет надписей.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

заказать, что ли, и помучать? Интересно продавец примет претензию если блок накроется меньше чем за миллион стираний?

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

Обычная (внутренняя AVR) eeprom у людей портилась после 3 000 000 циклов, некоторые и того больше. Т.е. на порядок больше нежели по даташиту.