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

 
 
> Борьба за микроамперы, ATmega324P, RTC
ivainc1789
сообщение Dec 14 2009, 20:02
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



В текущей программе реализован элементарный счетчик секунд на базе таймера2 и часы на его основе. Хотелось бы добиться уменьшения потребления и сделать так, чтобы в sleep mode микроконтроллер просыпался 1 раз в 8 сек (или реже?), а при нажатии пользователем на клавишу просыпался и автоматически корректировал счет времени и показывал его пользователю в формате HH:MM:SS. При этом пользователь не должен заметить самого переключения (по индикации секунд).
Сходу мне удалось только при wake up ждать пока наступит переполнение от таймера, прибавлять 8 сек и только потом переключаться в режим 1 раз в сек используя OC2A. Ясно, что пользователь максимум в течение 8 сек видит что ЧАСЫ ОСТАНОВИЛИСЬ ))). Это плохо. Учитывая, что индикация времени задача типовая может кто-нибудь поделится идеями?
Интересно, почему прескалер таймера2 имеет такой "небольшой" предделитель? Ведь при тактировании от 32.768kHz можно пробуждать контроллер не реже 1 раза в 8 сек. Стоит ли заморачиваться, если потребуется раз в минуту? И вообще заметно ли увеличится при этом жизнь батареи? Количественно оценить не смог...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ivainc1789
сообщение Dec 15 2009, 16:37
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Цитата
Пардон, а на кой черт там импульсный стабилизатор ?
То есть как? Вкл/выкл нагрузок просаживают питание! А нагрузки-то нехилые: что сс1100, что подсветка (LED) LCD. Как вы обходитесь без стабилизатора, если применяете сс1100??? У меня сделано так, что пока батарея свежая - стабилизатор выключен, как только при сильной нагрузке ее напряжение снизится до 2V стаб. включается и уже не откл. в sleep/wakeup. Далее, первое же прерывание от L6920(~LBO) (Vbat = 1.2V) и предупреждаем пользователя "батарея разряжена". Далее, первый же сброс по BOD 1v8 - и попадаем в замкнутый цикл "замените батарею". ИМХО такой подход обеспечит более длит работу от батарей чем вариант без стабилизатора...
Цитата
Вы можете при просыпании пересчитывать на ходу значения таймера и переинициализировать на прерывания 1с.
Об этом то и речь - как это сделать получше. Только нужно учесть, что мало перейти при просыпании в режим 1с, нужно еще и правильно зайти при засыпании в режим 8с. Причем ждать пока окончатся текущие 8с не хотелось бы... Вообщем, наверное тут достаточно использовать вроде только прерывание OC2A, его должно хватить. Остальные процедуры коррекции можно расположить в основной программе. Щас попробую...
Цитата
Для уменьшения можно действительно поставить RTC внешний типа ds1307 к примеру. CR2032 на пару лет хватит.
Это уже изврат в данном контексте. Уже есть две батарейки AAA и мощные потребители.

Сейчас вот подумал: если сс1100 находится в PWD, то стоит ли его это состояние "обновлять" стробом при каждом пробуждении MCU когда нужны только часы (wakeup 1раз в 8 сек)? Для обработки строба сс1100 должен проснуться? Нет ли здесь ресурса для экономии? Но появляется риск, что, например, в грозу сс1100 может сбойнуть сам по себе, перейти в состояние IDLE и разрядить батарею...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 15 2009, 19:50
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(ivainc1789 @ Dec 15 2009, 20:37) *
Об этом то и речь - как это сделать получше. Только нужно учесть, что мало перейти при просыпании в режим 1с, нужно еще и правильно зайти при засыпании в режим 8с. Причем ждать пока окончатся текущие 8с не хотелось бы... Вообщем, наверное тут достаточно использовать вроде только прерывание OC2A, его должно хватить. Остальные процедуры коррекции можно расположить в основной программе. Щас попробую...


Я немного попроще решение предложил. Представте, что помимо прерывания от RTC(Timer2) вы инициируете прерывание с периодом 1с (Timer0 к примеру). Оно работает только при просыпании и при просыпании пересчитываете текущее время. Именно по этому прерыванию вы и отображаете врямя на индикаторе.

Просто при работе с внешними часами придётся городить что-то подобное. Я, например, DS перечитываю раз в минуту, и по нему корректирую внутренний таймер.
Go to the top of the page
 
+Quote Post



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

 


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


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