Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 01:16:43

Здравствуйте.
Заинтересовал такой вопрос: как успеть записать в EEPROM мк AVR (любая mega) значение перед отключением питания.
Смысл вот в чем. есть устройство, которое постоянно считает фронты на своем входе. фронты меняются часто - 1 раз в секунду в среднем.
Значение счетчика должно сохраняться между выключениями питания устройства (= храним в энергонезависимой памяти).
Постоянно писать в EEPROM нельзя - относительно мало циклов записи (100 000). Хватит чуть больше чем на сутки работы.
Если взять внешнюю EEPROM память - не сильно облегчит - хватит только на пару недель.
Один из выходов - мониторить питание, и в момент отключения (это ведь все-таки какое-то время занимает) дергать атмегу за ногу, чтобы та сохранила значение счетчика из оперативки в EEPROM.
Но, как я понимаю, супервизор питания здесь не совсем подходит.
Как быть?

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 01:56:39

Сказать наверняка не зная устройства сложно, т.к. неясно как быстро пропадает напряжение питания. Но можно питать МК от основного источника и от конденсатора через развязывающие диоды. Напряжение основного источника мониторить МК - как оно пропадет, прекращать программу и записывать данные в ЕЕПРОМ. Конденсатор подзаряжать от основного источника через диод.

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 01:56:57

отслеживать не питание мк, а входное напряжение стабилизатора питания, например, стало меньше 8 В, надо записывать....а конденсатор по входу стабилизатора выбрать такой, чтобы хватило на время записи...

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 02:06:28

Конденсатор - это хорошо.
Входное питание - 12в (от импульсника). Часть схемы (обмотки релюшек и кой-какая мелочь) питается именно от +12. Помимо этого есть стабилизатор 7805 для получения +5в.
Поэтому можно уловить падение напряжения еще до стабилизатора.

Но не уверен, что заряда конденсатора хватит. В схеме используется около 10ти светодиодов (10мА х 10 = 100мА) и шесть семисегментных индикатора(80мА при динамическом использовании).
Кроме того, есть еще другие микрухи - логика, RTC. Какой по емкости должен быть конденсатор в питании?

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 02:19:03

В предлагаемым мною способе от конденсатора будет питаться только сам МК. При пропадании напряжения будет запитан только МК (ножно применить суперкап), а вся остальнасхема обесточится, если толко светодиоды не подключены к портам МК напямую (я имею в виду плюс к МК, выход на землю). Если это так, можно подсоединить их между плюсом питания и выводом МК.

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 02:24:29

12 В с импульсника - это хорошо, значит, уже 11,5 можно сделать порогом, дальше диод, этот конденсатор и 7805....4700 поставь, например...или по сигналу сразу выключить все доступные мк потребители, а потом записывать, тогда и гораздо меньшей ёмкостью обойдётся...
Последний раз редактировалось Enman Вс янв 22, 2012 02:30:09, всего редактировалось 2 раз(а).

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 02:25:20

На счёт постоянного использования EEPROM подтверждаю. Пару лет назад, когда AVR-ки осваивал, на тиньке (2313) часы сделал и, на случай сбоя питания, каждую минуту текущее время в EEPROM записывал. Так менее, чем через пол года эта функция перестала работать, из EEPROM читался какой-то мусор.
А на счёт супервизора, в AVR-ках есть BOD, который опционально следит за питанием, но он может толко давать сброс. Так что или схема с диодом и конденсатором, или можно внутренний компаратор использовать. Один его вход программно подключается к внутреннему ИОН, а второй к внешнему резистивному делителю на нужное значение и разрешаются прерывания по изменению состояния выхода компаратора. А по срабатыванию компаратора все нагрузки гасить. Ёмкость - С=I*T/U, размерности всех величин по системе СИ, T-необходимое время, I-потребляемый ток, U-разность напряжений, на которую допустимо опуститься для сохранения рабочих параметров микроконтроллера.

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 02:58:37

Хорошая идея насчет BOD. В Меге фьюзами можно выставить уровень BOD 4.3 В. Из-за двух развязывающих диодов напряжение на аварийном кондере при отключении питания будет 3.8 В - достаточное для записи в EEPROM. Произойдет Reset и программа начнется сначала. В самом ее начале можно проверять бит BORF в регистре MCUSR и по его установке производить запись в ЕEПРОМ.

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 03:04:45

Вот что у меня получилось на данный момент.

Изображение
Компаратор сравнивает опорное напряжение 3.3в (просто такой стабилитрон был в наличие) и исходное +12в.
В нормальном режиме все "ок" - на выходе компаратора высокий уровень.
Если отключается входное напряжение, то оно будет снижаться быстрее всех. и компаратор своим выходом с открытым коллектором притянет выход к земле, что есть сигнал для мк.
По этому сигналу мк отключает все светодиоды, всю нагрузку. Останется только питание прочей логики. В этот момент питание схемы поддерживается конденсаторами C2 и C5. И их как раз и должно хватить на то, чтобы МК успел записать значение счетчика в ЕЕПРОМ.
С3 нужен для поддержания опорной точки после отключения питания - разряжаться с 3.3в будет ох как долго.

Грабли: пробовал поставить стабилитрон на 9.1 вольт - в итоге на выходе компаратора всегда 0. Подозреваю, что в этом случае его и питать надо от +12в. Но тогда возникает проблема с преобразованием уровня на выходе.

Я правильно все понял/сделал?

Есть другой вариант. В схеме в качестве RTC я использую DS1307. У нее вроде на борту есть целых 56 байт памяти, резервно питаемой от батарейки 3в.
Насколько я понимаю, там неограниченное число циклов записи (память, по сути, энергозависимая). Может значение счетчика каждый раз туда писать?
Вложения
Sch1.png
(64.71 KiB) Скачиваний: 6348

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 03:08:50

Ser60 писал(а):Хорошая идея насчет BOD. В Меге фьюзами можно выставить уровень BOD 4.3 В. Из-за двух развязывающих диодов напряжение на аварийном кондере при отключении питания будет 3.8 В - достаточное для записи в EEPROM. Произойдет Reset и программа начнется сначала. В самом ее начале можно проверять бит BORF в регистре MCUSR и по его установке производить запись в ЕEПРОМ.

Так ведь сначала произойдет РЕСЕТ, вызванный BOD-ом. Я так понимаю, что значения всех переменных будут сброшены. Что тогда писать в ЕЕПРОМ после сброса?

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 03:19:11

смысла в большой ёмкости на ВЫХОДЕ 7805 нет, только на входе.....
Изображение

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 03:33:46

RVL писал(а):Так ведь сначала произойдет РЕСЕТ, вызванный BOD-ом. Я так понимаю, что значения всех переменных будут сброшены. Что тогда писать в ЕЕПРОМ после сброса?


При ресете состояние RAM не меняется, если только напряжение питания будет выше порога сохранения RАМ - заведомо больше 1.8В

Если в системе есть 1307 - можно писать в ее RAM неограниченно. Данные сохранятся пока у нее будет работать своя баратея.

А насчет схемы: Д1 уберите, анод Д2 переключите на выход 7805 а вжод питания МК подсоедините через диод к выходу 7805 и через другой диод к C1.

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 11:45:42

BOD не катит.

RVL, я же написал, кмпаратор и источник встроенного внутри меги есть, надо только внешний делитель.

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 11:50:50

Ser60 писал(а):Хорошая идея насчет BOD. В Меге фьюзами можно выставить уровень BOD 4.3 В. Из-за двух развязывающих диодов напряжение на аварийном кондере при отключении питания будет 3.8 В - достаточное для записи в EEPROM. Произойдет Reset и программа начнется сначала. В самом ее начале можно проверять бит BORF в регистре MCUSR и по его установке производить запись в ЕEПРОМ.

как только напряжение снизится ниже порога BOD, МК будет не просто сброшен, а войдет в состояние сброса и там будет оставаться, пока напряжение не станет выше порога BOD. не выйдет номер.

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 12:06:32

Прошу прощения за офф

Мастер Ломастер, а ты не думаешь, что твоя аватарка является оскорбительной для твоих идейных собратьев?

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 12:08:35

РЕбята!
А почитать тему проваттметр тяжело?

там же всё расписано!!!

ставиш 10 000...100 000 мкф 6.3 вольт на выходе 7805

на компаратор через переменник 1-100 килоом заводиш 3.3 вольта, второй вывод внутреннего компаратора на внутреннюю опору 2.56 и ВУАЛЯ!
в прерывании по перекидыванию компаратора все выходы в Z состояние и пишеш свою еепром

BOD обязательно на 3.3 вольта и после завершения всех записей ОБЯЗАТЕЛЬНО почитать / записать ЛЮБУЮ другую НЕНУЖНУЮ ячейку еепрома...с вероятностью 70% последняя прочитанная или записанная ячейка ПОРТИТСЯ при выключении питания !!!

Ещё рекомендую в компараторном прерывании вконце войти в вечный цикл и взвести вачдог...тогда при кратковременном пропадании питания МК не перезагрузится но сохранится - лучше бы в таком случае МК Перезагрузить! вот вачдог(который не надо сбрасывать в вечном цикле вконце прерывания компаратора) и передернет красиво и аккуратно МК!

8 моих ваттметров и 2 теплосчетчика пищущих от 8-ми до 120-ти БАЙТ в еепром при выключении питания УСПЕШНО работают УЖЕ ПОЛ ГОДА и сбоев записи ещё небыло...единственное что - надо правильно подобрать напругу на выходе из переменника - она должна быть больше 2.56 при самом минимальном значении питания - процент помехи - (Корень с двух*значение RMS питания)тоесть для 16-тивольтового транса на делителе должно получиться вольт 5
Последний раз редактировалось clawham Вс янв 22, 2012 12:10:33, всего редактировалось 1 раз.

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 12:09:05

ELcat писал(а):Прошу прощения за офф

Мастер Ломастер, а ты не думаешь, что твоя аватарка является оскорбительной для твоих идейных собратьев?

если хотите об этом поговорить - пишите в ЛС.

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 12:52:41

Наблюдается 4 варианта решения данной задачи.
1. Вести обмен с RAM RTC. Если переменные не быстро изменяются, то оперировать напрямую с ячейками RAM.
2. Организовать размазанную запись в ячейки EEPROM. Соответствующие даташиты есть на сайте атмела.
3. Через резистивный делитель с сопротивлением верхнего резистора> 20 кОм завести сигнал на ногу прерывания МК от выхода БП, развязанного через диод от конденсатора с кренкой. Вход МК зашунтировать мелкой керамикой.
4. Через оптопару мониторить переходы через "0" сетевого питания. В случае выпадания нескольких- записывать.

Какой способ более предпочителен нужно решать исходя из архитектуры системы.

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 13:05:19

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

мой вариант не исключает возможности "размазывания" данных по EEPROM.

Re: Как записать в EEPROM перед отключением питания

Вс янв 22, 2012 13:10:55

У меня подобная задача решена так: на входе стабилизатора 2200 мкФ, стабилизатор ключевой, на MC34063. На выходе стабилизатора 220 мкФ. Входное напряжение через делитель 68 к и 10 к подается на встроенный компаратор ATmega8, второй вход компаратора подключен к внутренней опоре. При падении питания выключаю всё и сохраняюсь в EEPROM. Работает надежно.

Если есть DS1307, можно хранить данные в RAM, число записей не ограничено.

Можно поставить FRAM от Ramtron, FM24xxx, так тоже делал, когда данных нужно было много сохранять.
Ответить