Здравствуйте. Заинтересовал такой вопрос: как успеть записать в EEPROM мк AVR (любая mega) значение перед отключением питания. Смысл вот в чем. есть устройство, которое постоянно считает фронты на своем входе. фронты меняются часто - 1 раз в секунду в среднем. Значение счетчика должно сохраняться между выключениями питания устройства (= храним в энергонезависимой памяти). Постоянно писать в EEPROM нельзя - относительно мало циклов записи (100 000). Хватит чуть больше чем на сутки работы. Если взять внешнюю EEPROM память - не сильно облегчит - хватит только на пару недель. Один из выходов - мониторить питание, и в момент отключения (это ведь все-таки какое-то время занимает) дергать атмегу за ногу, чтобы та сохранила значение счетчика из оперативки в EEPROM. Но, как я понимаю, супервизор питания здесь не совсем подходит. Как быть?
Сказать наверняка не зная устройства сложно, т.к. неясно как быстро пропадает напряжение питания. Но можно питать МК от основного источника и от конденсатора через развязывающие диоды. Напряжение основного источника мониторить МК - как оно пропадет, прекращать программу и записывать данные в ЕЕПРОМ. Конденсатор подзаряжать от основного источника через диод.
отслеживать не питание мк, а входное напряжение стабилизатора питания, например, стало меньше 8 В, надо записывать....а конденсатор по входу стабилизатора выбрать такой, чтобы хватило на время записи...
Конденсатор - это хорошо. Входное питание - 12в (от импульсника). Часть схемы (обмотки релюшек и кой-какая мелочь) питается именно от +12. Помимо этого есть стабилизатор 7805 для получения +5в. Поэтому можно уловить падение напряжения еще до стабилизатора.
Но не уверен, что заряда конденсатора хватит. В схеме используется около 10ти светодиодов (10мА х 10 = 100мА) и шесть семисегментных индикатора(80мА при динамическом использовании). Кроме того, есть еще другие микрухи - логика, RTC. Какой по емкости должен быть конденсатор в питании?
В предлагаемым мною способе от конденсатора будет питаться только сам МК. При пропадании напряжения будет запитан только МК (ножно применить суперкап), а вся остальнасхема обесточится, если толко светодиоды не подключены к портам МК напямую (я имею в виду плюс к МК, выход на землю). Если это так, можно подсоединить их между плюсом питания и выводом МК.
12 В с импульсника - это хорошо, значит, уже 11,5 можно сделать порогом, дальше диод, этот конденсатор и 7805....4700 поставь, например...или по сигналу сразу выключить все доступные мк потребители, а потом записывать, тогда и гораздо меньшей ёмкостью обойдётся...
Последний раз редактировалось Enman Вс янв 22, 2012 02:30:09, всего редактировалось 2 раз(а).
Заголовок сообщения: Re: Как записать в EEPROM перед отключением питания
Добавлено: Вс янв 22, 2012 02:25:20
Друг Кота
Карма: 46
Рейтинг сообщений: 590
Зарегистрирован: Вт май 19, 2009 09:27:30 Сообщений: 3258 Откуда: Украина
Рейтинг сообщения:0
На счёт постоянного использования EEPROM подтверждаю. Пару лет назад, когда AVR-ки осваивал, на тиньке (2313) часы сделал и, на случай сбоя питания, каждую минуту текущее время в EEPROM записывал. Так менее, чем через пол года эта функция перестала работать, из EEPROM читался какой-то мусор. А на счёт супервизора, в AVR-ках есть BOD, который опционально следит за питанием, но он может толко давать сброс. Так что или схема с диодом и конденсатором, или можно внутренний компаратор использовать. Один его вход программно подключается к внутреннему ИОН, а второй к внешнему резистивному делителю на нужное значение и разрешаются прерывания по изменению состояния выхода компаратора. А по срабатыванию компаратора все нагрузки гасить. Ёмкость - С=I*T/U, размерности всех величин по системе СИ, T-необходимое время, I-потребляемый ток, U-разность напряжений, на которую допустимо опуститься для сохранения рабочих параметров микроконтроллера.
Хорошая идея насчет BOD. В Меге фьюзами можно выставить уровень BOD 4.3 В. Из-за двух развязывающих диодов напряжение на аварийном кондере при отключении питания будет 3.8 В - достаточное для записи в EEPROM. Произойдет Reset и программа начнется сначала. В самом ее начале можно проверять бит BORF в регистре MCUSR и по его установке производить запись в ЕEПРОМ.
Компаратор сравнивает опорное напряжение 3.3в (просто такой стабилитрон был в наличие) и исходное +12в. В нормальном режиме все "ок" - на выходе компаратора высокий уровень. Если отключается входное напряжение, то оно будет снижаться быстрее всех. и компаратор своим выходом с открытым коллектором притянет выход к земле, что есть сигнал для мк. По этому сигналу мк отключает все светодиоды, всю нагрузку. Останется только питание прочей логики. В этот момент питание схемы поддерживается конденсаторами C2 и C5. И их как раз и должно хватить на то, чтобы МК успел записать значение счетчика в ЕЕПРОМ. С3 нужен для поддержания опорной точки после отключения питания - разряжаться с 3.3в будет ох как долго.
Грабли: пробовал поставить стабилитрон на 9.1 вольт - в итоге на выходе компаратора всегда 0. Подозреваю, что в этом случае его и питать надо от +12в. Но тогда возникает проблема с преобразованием уровня на выходе.
Я правильно все понял/сделал?
Есть другой вариант. В схеме в качестве RTC я использую DS1307. У нее вроде на борту есть целых 56 байт памяти, резервно питаемой от батарейки 3в. Насколько я понимаю, там неограниченное число циклов записи (память, по сути, энергозависимая). Может значение счетчика каждый раз туда писать?
Хорошая идея насчет BOD. В Меге фьюзами можно выставить уровень BOD 4.3 В. Из-за двух развязывающих диодов напряжение на аварийном кондере при отключении питания будет 3.8 В - достаточное для записи в EEPROM. Произойдет Reset и программа начнется сначала. В самом ее начале можно проверять бит BORF в регистре MCUSR и по его установке производить запись в ЕEПРОМ.
Так ведь сначала произойдет РЕСЕТ, вызванный BOD-ом. Я так понимаю, что значения всех переменных будут сброшены. Что тогда писать в ЕЕПРОМ после сброса?
Так ведь сначала произойдет РЕСЕТ, вызванный BOD-ом. Я так понимаю, что значения всех переменных будут сброшены. Что тогда писать в ЕЕПРОМ после сброса?
При ресете состояние RAM не меняется, если только напряжение питания будет выше порога сохранения RАМ - заведомо больше 1.8В
Если в системе есть 1307 - можно писать в ее RAM неограниченно. Данные сохранятся пока у нее будет работать своя баратея.
А насчет схемы: Д1 уберите, анод Д2 переключите на выход 7805 а вжод питания МК подсоедините через диод к выходу 7805 и через другой диод к C1.
Заголовок сообщения: Re: Как записать в EEPROM перед отключением питания
Добавлено: Вс янв 22, 2012 11:50:50
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
Ser60 писал(а):
Хорошая идея насчет BOD. В Меге фьюзами можно выставить уровень BOD 4.3 В. Из-за двух развязывающих диодов напряжение на аварийном кондере при отключении питания будет 3.8 В - достаточное для записи в EEPROM. Произойдет Reset и программа начнется сначала. В самом ее начале можно проверять бит BORF в регистре MCUSR и по его установке производить запись в ЕEПРОМ.
как только напряжение снизится ниже порога BOD, МК будет не просто сброшен, а войдет в состояние сброса и там будет оставаться, пока напряжение не станет выше порога BOD. не выйдет номер.
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
ставиш 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 раз.
Наблюдается 4 варианта решения данной задачи. 1. Вести обмен с RAM RTC. Если переменные не быстро изменяются, то оперировать напрямую с ячейками RAM. 2. Организовать размазанную запись в ячейки EEPROM. Соответствующие даташиты есть на сайте атмела. 3. Через резистивный делитель с сопротивлением верхнего резистора> 20 кОм завести сигнал на ногу прерывания МК от выхода БП, развязанного через диод от конденсатора с кренкой. Вход МК зашунтировать мелкой керамикой. 4. Через оптопару мониторить переходы через "0" сетевого питания. В случае выпадания нескольких- записывать.
Какой способ более предпочителен нужно решать исходя из архитектуры системы.
Заголовок сообщения: Re: Как записать в EEPROM перед отключением питания
Добавлено: Вс янв 22, 2012 13:05:19
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
я бы остановился на таком варианте: 1. схема перерабатывается так, что вся нагрузка МК запитывается от "мгновенно пропадающего" питания, а сам МК от питания, которое пропадает не мгновенно (например, через диодную развязку и конденсатор большой емкости). 2. встроенный компаратор настраивается, как было сказано ранее, и по прерыванию от него производится запись. можно использовать АЦП - в этом случае можно обойтись вообще без внешних компонентов (не для всех МК), но потребуется определенное ухищрение в программе.
мой вариант не исключает возможности "размазывания" данных по EEPROM.
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
У меня подобная задача решена так: на входе стабилизатора 2200 мкФ, стабилизатор ключевой, на MC34063. На выходе стабилизатора 220 мкФ. Входное напряжение через делитель 68 к и 10 к подается на встроенный компаратор ATmega8, второй вход компаратора подключен к внутренней опоре. При падении питания выключаю всё и сохраняюсь в EEPROM. Работает надежно.
Если есть DS1307, можно хранить данные в RAM, число записей не ограничено.
Можно поставить FRAM от Ramtron, FM24xxx, так тоже делал, когда данных нужно было много сохранять.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения