реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Отсчет времени и сброс микроконтроллера
GSK
сообщение Oct 23 2006, 06:11
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 157
Регистрация: 1-03-06
Пользователь №: 14 835



Как решить следующую задачку:

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

Я думаю, что подобная задача решаеться в электронных часах. Нет ли у кого примера на С.
Go to the top of the page
 
+Quote Post
Семён
сообщение Oct 23 2006, 06:17
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922



Использовать внутренней флеш или внешнею память. Но и то и другое имеет ограниченное количество циклов записи. Если питание прерывается не надолго, то лучшем выходом будет использования внешней памяти (не флеш) с резервным источником питания.


--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 23 2006, 06:23
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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), программа может контролировать, "холодный" или "горячий" старт произошел, соответсвенно инициализировать переменную или нет.

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


--------------------
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 23 2006, 06:28
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



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

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

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

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

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

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

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

3. В часах все не так. В электронных часах сами часы питаются от батарейки. Кстати, некоторые микросхемы часов имеют несколько байтов ОЗУ, в которые можно писать свою информацию.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
gormih
сообщение Oct 23 2006, 07:06
Сообщение #5


nofb
***

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



Можно сформировать, завести сигнал о исчезновении питания на внешние прерывание, а в обработчике данного прерывания записsdfnm значение переменной в flash память. После сброса МК по питанию производить соответсвующие действие - восстановление.
Для тех, кто не понял - пока конденсатор по питанию разряжается (он должен обладать соответствующей емкостью) контроллер легко может успеть сохранить данные во flash.


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
Семён
сообщение Oct 23 2006, 08:35
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 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-дюемовых дискетах
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 23 2006, 08:52
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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. Переменная достаточно часто портилась.
Значит речь не о провале а о пропадании питания на относительно большое время. Возможно конденсаторы большей, чем есть, емкости решат проблему?


--------------------
Go to the top of the page
 
+Quote Post
CDT
сообщение Oct 24 2006, 02:45
Сообщение #8


Местный
***

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



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

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

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

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

Для увеличения числа циклов жизни ЭПРОМ для сохранения переменной использовать не одну, а несколько ячеек, меняя их при каждом цикле записи.


--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
Go to the top of the page
 
+Quote Post
GSK
сообщение Oct 24 2006, 03:21
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 157
Регистрация: 1-03-06
Пользователь №: 14 835



А можно пример схемы ПРАВИЛЬНОЙ организации питания?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 24 2006, 03:51
Сообщение #10


Гуру
******

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



Цитата(GSK @ Oct 24 2006, 11:21) *
А можно пример схемы ПРАВИЛЬНОЙ организации питания?
Вот "бюджетный" вариант. Питание подается через ИЛИ ячейку на двух диодах (желательно Шоттки - для уменьшения падения напряжения на диодах). Пропадание питания приводит к питанию от батареи и инициализации обработчика прерывания от INT0...
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Go to the top of the page
 
+Quote Post
gormih
сообщение Oct 24 2006, 05:26
Сообщение #11


nofb
***

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



Не вижу смысл резервного питания применительно к этой задаче вообще.
blink.gif
Зачем оно надо, если контроллер ЛЕГКО успеет записать значение в eeprom при его пропадании за время разряда конденсатора.
unsure.gif


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
Igor_K
сообщение Oct 24 2006, 05:53
Сообщение #12


Частый гость
**

Группа: Validating
Сообщений: 113
Регистрация: 12-05-05
Пользователь №: 4 949



Если требуется гарантированно сохранять переменную, значит надо писать в EEPROM. У меня в одном проекте есть несколько переменных, растущих "всю жизнь". Для того чтобы не замучить внутренний EEPROM контроллера, каждая переменная "растянута" в памяти. То есть, младший байт трехбайтовой переменной пишется с инкрементом адреса каждый раз, в пределах 256-байтной области. Со средним и старшим байтами проще,- они обновляются редко. Получается что при переполнении счетчика максимальное число перезаписей ячеек EEPROM составит 65536, а это меньше заявленного ресурса в 100000.
Go to the top of the page
 
+Quote Post
GSK
сообщение Oct 24 2006, 06:52
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 157
Регистрация: 1-03-06
Пользователь №: 14 835



Прошу прощения за назойливость.
А как контролировать пропадение питания, чтобы контроллер успел записать "значение в eeprom при его пропадании за время разряда конденсатора".

Алгоритм, схемное и програмное решение?
Go to the top of the page
 
+Quote Post
gormih
сообщение Oct 24 2006, 07:20
Сообщение #14


nofb
***

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



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

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


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

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

удачи!


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
GinRider
сообщение Oct 24 2006, 10:06
Сообщение #15


Участник
*

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



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

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


Можно ещё проще - транзисторный ключ до выпрямителя и таймером отслеживать пропадание импульсов.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 05:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016