Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отсчет времени и сброс микроконтроллера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
GSK
Как решить следующую задачку:

Таймер микроконтроллера вырабатывает прерывания через определенные промежутки времени. По этому прирыванию увеличиваеться значение переменной. При провале питания происходит перезапуск контроллера. Как сделать, чтобы значение этой переменной не пропадало?

Я думаю, что подобная задача решаеться в электронных часах. Нет ли у кого примера на С.
Семён
Использовать внутренней флеш или внешнею память. Но и то и другое имеет ограниченное количество циклов записи. Если питание прерывается не надолго, то лучшем выходом будет использования внешней памяти (не флеш) с резервным источником питания.
prottoss
Цитата(GSK @ Oct 23 2006, 14:11) *
Как решить следующую задачку:
Таймер микроконтроллера вырабатывает прерывания через определенные промежутки времени. По этому прирыванию увеличиваеться значение переменной. При провале питания происходит перезапуск контроллера. Как сделать, чтобы значение этой переменной не пропадало?
Я думаю, что подобная задача решаеться в электронных часах. Нет ли у кого примера на С.


Для начала объявить эту переменную как __no_init, что бы она не инициализировалась стартовым кодом, генерируемым компилятором. Если в Вашем контроллере есть MCU control and Status Register (MCUCSR), и в нем присутсвует флаг PORF (Power On Reset), программа может контролировать, "холодный" или "горячий" старт произошел, соответсвенно инициализировать переменную или нет.

В электронных часах (стационарных), ИМХО, обычно решается двумя питаниями - сетевым и батарейным
Dog Pawlowa
Цитата(GSK @ Oct 23 2006, 09:11) *
Как сделать, чтобы значение этой переменной не пропадало?
Я думаю, что подобная задача решаеться в электронных часах. Нет ли у кого примера на С.

Решение зависит от того, насколько пропадает питание. Я использую два подхода.

1. Питание пропадает ненадолго (происходит только сброс контроллера, а сам микроконтроллер без питания не остается - такая ситуация происходит и при воздействии помех)
В этом случае достаточно перед именем переменной поставить __no_init
Она не будет инициализироваться после сброса.
Риск того, что значение действительно не изменилась, сейчас не обсуждаем.

2. Выключение питания надолго приводит к сохранению нужных значений в EEPROM.
Для этого нужно знать о падении напряжения питания (АЦП или компаратор), измеряя до стабилизатора.

Тогда в в основной цикл добавить:

if (LowPower())
{ SaveVarIntoEEPROM();
for (;;)
}

Ну а после сброса прочитать из EEPROM.

3. В часах все не так. В электронных часах сами часы питаются от батарейки. Кстати, некоторые микросхемы часов имеют несколько байтов ОЗУ, в которые можно писать свою информацию.
gormih
Можно сформировать, завести сигнал о исчезновении питания на внешние прерывание, а в обработчике данного прерывания записsdfnm значение переменной в flash память. После сброса МК по питанию производить соответсвующие действие - восстановление.
Для тех, кто не понял - пока конденсатор по питанию разряжается (он должен обладать соответствующей емкостью) контроллер легко может успеть сохранить данные во flash.
Семён
Цитата(prottoss @ Oct 23 2006, 10:23) *
Для начала объявить эту переменную как __no_init, что бы она не инициализировалась стартовым кодом, генерируемым компилятором. Если в Вашем контроллере есть MCU control and Status Register (MCUCSR), и в нем присутсвует флаг PORF (Power On Reset), программа может контролировать, "холодный" или "горячий" старт произошел, соответсвенно инициализировать переменную или нет.

В электронных часах (стационарных), ИМХО, обычно решается двумя питаниями - сетевым и батарейным

У меня для AtTiny2313, программа была написана на asm, не получилось для этой цели использовать MCUCSR. Переменная достаточно часто портилась.
prottoss
Цитата(Семён @ Oct 23 2006, 16:35) *
Цитата(prottoss @ Oct 23 2006, 10:23) *

Для начала объявить эту переменную как __no_init, что бы она не инициализировалась стартовым кодом, генерируемым компилятором. Если в Вашем контроллере есть MCU control and Status Register (MCUCSR), и в нем присутсвует флаг PORF (Power On Reset), программа может контролировать, "холодный" или "горячий" старт произошел, соответсвенно инициализировать переменную или нет.

В электронных часах (стационарных), ИМХО, обычно решается двумя питаниями - сетевым и батарейным

У меня для AtTiny2313, программа была написана на asm, не получилось для этой цели использовать MCUCSR. Переменная достаточно часто портилась.
Значит речь не о провале а о пропадании питания на относительно большое время. Возможно конденсаторы большей, чем есть, емкости решат проблему?
CDT
Цитата(prottoss @ Oct 23 2006, 11:52) *
Значит речь не о провале а о пропадании питания на относительно большое время. Возможно конденсаторы большей, чем есть, емкости решат проблему?

Видимо так. Значит есть следующие варианты:

1. Резервное питание контроллера от батарейки с засыпанием на время пропадания основного питания.
2. Хранение переменной в энергонезависимом месте постоянно.
3. Сохранение переменной в энергонезависимом месте на время пропадания питания.

Для увеличения времени пропадания питания:
- использовать step-down стабилизатор;
- достаточной емкости накопители энергии до и после стабилизатора:
- контроль питания на входе стабилизатора.

Для увеличения числа циклов жизни ЭПРОМ для сохранения переменной использовать не одну, а несколько ячеек, меняя их при каждом цикле записи.
GSK
А можно пример схемы ПРАВИЛЬНОЙ организации питания?
prottoss
Цитата(GSK @ Oct 24 2006, 11:21) *
А можно пример схемы ПРАВИЛЬНОЙ организации питания?
Вот "бюджетный" вариант. Питание подается через ИЛИ ячейку на двух диодах (желательно Шоттки - для уменьшения падения напряжения на диодах). Пропадание питания приводит к питанию от батареи и инициализации обработчика прерывания от INT0...
gormih
Не вижу смысл резервного питания применительно к этой задаче вообще.
blink.gif
Зачем оно надо, если контроллер ЛЕГКО успеет записать значение в eeprom при его пропадании за время разряда конденсатора.
unsure.gif
Igor_K
Если требуется гарантированно сохранять переменную, значит надо писать в EEPROM. У меня в одном проекте есть несколько переменных, растущих "всю жизнь". Для того чтобы не замучить внутренний EEPROM контроллера, каждая переменная "растянута" в памяти. То есть, младший байт трехбайтовой переменной пишется с инкрементом адреса каждый раз, в пределах 256-байтной области. Со средним и старшим байтами проще,- они обновляются редко. Получается что при переполнении счетчика максимальное число перезаписей ячеек EEPROM составит 65536, а это меньше заявленного ресурса в 100000.
GSK
Прошу прощения за назойливость.
А как контролировать пропадение питания, чтобы контроллер успел записать "значение в eeprom при его пропадании за время разряда конденсатора".

Алгоритм, схемное и програмное решение?
gormih
Цитата(GSK @ Oct 24 2006, 10:52) *
Прошу прощения за назойливость.
А как контролировать пропадение питания, чтобы контроллер успел записать "значение в eeprom при его пропадании за время разряда конденсатора".

Алгоритм, схемное и програмное решение?


До стабилизатора напряжения ставишь компаратор, который будет выдавать логический сигнал на ножку внешнего прерывания микроконтроллера (в моем примере ниже INT0). Сигналы сравнения - сигнал на входе стабилизатора (через делитель), и на его выходе (емкость).
Пишешь обработчик данного прерывания, в котором сохраняешь значение в eerprom.
Готового схемно программного решения у меня нет, даю только идею... Нужно подобрать значение емкости после ИМС стабилизатора с учетом тока потребления МК. А программно здесь все довольно просто, если умеешь писать в eeprom и знаешь директиву

interrupt [INT0] void Power_down(void)
{
//Подпрограмма обработчика прерывания исчезновения питания.
}

удачи!
GinRider
Если питание пропадает ненадолго, то можно использовать внешнее ОЗУ или даже просто регистр и запитать их через диод с электролитом. Хороший электролит сможет поддерживать питание достаточное время.

Цитата(Михаил Горюнов @ Oct 24 2006, 10:20) *
До стабилизатора напряжения ставишь компаратор, который будет выдавать логический сигнал на ножку внешнего прерывания микроконтроллера (в моем примере ниже INT0).


Можно ещё проще - транзисторный ключ до выпрямителя и таймером отслеживать пропадание импульсов.
gormih
Цитата(GinRider @ Oct 24 2006, 14:06) *
Можно ещё проще - транзисторный ключ до выпрямителя и таймером отслеживать пропадание импульсов.


Ну не всегда есть под рукой незадействованый таймер :-)
А привязываться к задействованому не очень надежно.
Хотя схемотехнически проще конечно.. то есть дешевле, и места на плате меньше занимает...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.