|
Отсчет времени и сброс микроконтроллера |
|
|
|
Oct 23 2006, 06:17
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922

|
Использовать внутренней флеш или внешнею память. Но и то и другое имеет ограниченное количество циклов записи. Если питание прерывается не надолго, то лучшем выходом будет использования внешней памяти (не флеш) с резервным источником питания.
--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
|
|
|
|
|
Oct 23 2006, 06:23
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(GSK @ Oct 23 2006, 14:11)  Как решить следующую задачку: Таймер микроконтроллера вырабатывает прерывания через определенные промежутки времени. По этому прирыванию увеличиваеться значение переменной. При провале питания происходит перезапуск контроллера. Как сделать, чтобы значение этой переменной не пропадало? Я думаю, что подобная задача решаеться в электронных часах. Нет ли у кого примера на С. Для начала объявить эту переменную как __no_init, что бы она не инициализировалась стартовым кодом, генерируемым компилятором. Если в Вашем контроллере есть MCU control and Status Register (MCUCSR), и в нем присутсвует флаг PORF (Power On Reset), программа может контролировать, "холодный" или "горячий" старт произошел, соответсвенно инициализировать переменную или нет. В электронных часах (стационарных), ИМХО, обычно решается двумя питаниями - сетевым и батарейным
--------------------
|
|
|
|
|
Oct 23 2006, 06:28
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(GSK @ Oct 23 2006, 09:11)  Как сделать, чтобы значение этой переменной не пропадало? Я думаю, что подобная задача решаеться в электронных часах. Нет ли у кого примера на С. Решение зависит от того, насколько пропадает питание. Я использую два подхода. 1. Питание пропадает ненадолго (происходит только сброс контроллера, а сам микроконтроллер без питания не остается - такая ситуация происходит и при воздействии помех) В этом случае достаточно перед именем переменной поставить __no_init Она не будет инициализироваться после сброса. Риск того, что значение действительно не изменилась, сейчас не обсуждаем. 2. Выключение питания надолго приводит к сохранению нужных значений в EEPROM. Для этого нужно знать о падении напряжения питания (АЦП или компаратор), измеряя до стабилизатора. Тогда в в основной цикл добавить: if (LowPower()) { SaveVarIntoEEPROM(); for (;;) } Ну а после сброса прочитать из EEPROM. 3. В часах все не так. В электронных часах сами часы питаются от батарейки. Кстати, некоторые микросхемы часов имеют несколько байтов ОЗУ, в которые можно писать свою информацию.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Oct 23 2006, 08:35
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922

|
Цитата(prottoss @ Oct 23 2006, 10:23)  Для начала объявить эту переменную как __no_init, что бы она не инициализировалась стартовым кодом, генерируемым компилятором. Если в Вашем контроллере есть MCU control and Status Register (MCUCSR), и в нем присутсвует флаг PORF (Power On Reset), программа может контролировать, "холодный" или "горячий" старт произошел, соответсвенно инициализировать переменную или нет.
В электронных часах (стационарных), ИМХО, обычно решается двумя питаниями - сетевым и батарейным У меня для AtTiny2313, программа была написана на asm, не получилось для этой цели использовать MCUCSR. Переменная достаточно часто портилась.
--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
|
|
|
|
|
Oct 23 2006, 08:52
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(Семён @ 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. Переменная достаточно часто портилась. Значит речь не о провале а о пропадании питания на относительно большое время. Возможно конденсаторы большей, чем есть, емкости решат проблему?
--------------------
|
|
|
|
|
Oct 24 2006, 02:45
|
Местный
  
Группа: Свой
Сообщений: 303
Регистрация: 3-03-05
Пользователь №: 3 044

|
Цитата(prottoss @ Oct 23 2006, 11:52)  Значит речь не о провале а о пропадании питания на относительно большое время. Возможно конденсаторы большей, чем есть, емкости решат проблему? Видимо так. Значит есть следующие варианты: 1. Резервное питание контроллера от батарейки с засыпанием на время пропадания основного питания. 2. Хранение переменной в энергонезависимом месте постоянно. 3. Сохранение переменной в энергонезависимом месте на время пропадания питания. Для увеличения времени пропадания питания: - использовать step-down стабилизатор; - достаточной емкости накопители энергии до и после стабилизатора: - контроль питания на входе стабилизатора. Для увеличения числа циклов жизни ЭПРОМ для сохранения переменной использовать не одну, а несколько ячеек, меняя их при каждом цикле записи.
--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
|
|
|
|
|
Oct 24 2006, 07:20
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(GSK @ Oct 24 2006, 10:52)  Прошу прощения за назойливость. А как контролировать пропадение питания, чтобы контроллер успел записать "значение в eeprom при его пропадании за время разряда конденсатора".
Алгоритм, схемное и програмное решение? До стабилизатора напряжения ставишь компаратор, который будет выдавать логический сигнал на ножку внешнего прерывания микроконтроллера (в моем примере ниже INT0). Сигналы сравнения - сигнал на входе стабилизатора (через делитель), и на его выходе (емкость). Пишешь обработчик данного прерывания, в котором сохраняешь значение в eerprom. Готового схемно программного решения у меня нет, даю только идею... Нужно подобрать значение емкости после ИМС стабилизатора с учетом тока потребления МК. А программно здесь все довольно просто, если умеешь писать в eeprom и знаешь директиву interrupt [INT0] void Power_down(void) { //Подпрограмма обработчика прерывания исчезновения питания. } удачи!
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Oct 24 2006, 10:06
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 13-10-06
Из: Финляндия
Пользователь №: 21 273

|
Если питание пропадает ненадолго, то можно использовать внешнее ОЗУ или даже просто регистр и запитать их через диод с электролитом. Хороший электролит сможет поддерживать питание достаточное время. Цитата(Михаил Горюнов @ Oct 24 2006, 10:20)  До стабилизатора напряжения ставишь компаратор, который будет выдавать логический сигнал на ножку внешнего прерывания микроконтроллера (в моем примере ниже INT0). Можно ещё проще - транзисторный ключ до выпрямителя и таймером отслеживать пропадание импульсов.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|