Здравствуйте. Заинтересовал такой вопрос: как успеть записать в 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, так тоже делал, когда данных нужно было много сохранять.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения