|
Часы реального времени на AVR, Шляпа в PowerSave режиме. |
|
|
|
Dec 31 2006, 02:03
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(kv_addr @ Dec 31 2006, 01:13)  Нельзя ли несколько детальнее? PowerSave никогда не использовал, но, не ровен час, может понадобится когда. Было бы неплохо знать о возможных граблях. Все грабли ещё не найдены. Потребление в режиме часов - 0.4ма!!! Ищу. Найдены грабли с потерей точности в PowerSave режиме. Подробности таковы. Таймер работает асинхронно (это указано в даташите). И вот тут шишка. Прерывание приходит, но если его сбрасываешь (обрабатываешь прерывание) быстрее, чем за 1 такт таймера 2, то благополучно входишь в повторную обработку. Таким образом я входил трижды за раз. Поэтому, когда выводил Инверсию порта видел красивые секундные импульсы.  А вот минуты считались ч/з 20 секунд. Из этого следует интересный вывод. Выгоднее запрограммировать с коэффициентом деления 128 и OCR=255, чем 1024 и OCR=31 (как у меня было изначально - задержка в этом случае необходима 220 циклов). Ищу грабли с потреблением. Поражаюсь оптимистичным заявлениям фирмы. Аппаратных хомутов не нахожу, - облазил всё. Програмно - выводил смотрел. Спит постоянно. И такое потребление!!! Все порты - 0, отключены WDT, BOD.
|
|
|
|
|
Dec 31 2006, 02:23
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(SasaVitebsk @ Dec 31 2006, 02:03)  Ищу грабли с потреблением. Поражаюсь оптимистичным заявлениям фирмы. Аппаратных хомутов не нахожу, - облазил всё. Програмно - выводил смотрел. Спит постоянно. И такое потребление!!! Все порты - 0, отключены WDT, BOD. debugWire включен? Цитата Из этого следует интересный вывод. Выгоднее запрограммировать с коэффициентом деления 128 и OCR=255, чем 1024 и OCR=31 (как у меня было изначально - задержка в этом случае необходима 220 циклов). OCR вообще не нужно использовать. Применяйте TOVF тогда не нужно будет и никаких 220 циклов задержки делать, т.к. прерывание triggered по факту переноса.
|
|
|
|
|
Dec 31 2006, 02:32
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(defunct @ Dec 31 2006, 03:23)  Цитата(SasaVitebsk @ Dec 31 2006, 02:03)  Ищу грабли с потреблением. Поражаюсь оптимистичным заявлениям фирмы. Аппаратных хомутов не нахожу, - облазил всё. Програмно - выводил смотрел. Спит постоянно. И такое потребление!!! Все порты - 0, отключены WDT, BOD.
debugWire включен? Да. Но неужели он столько жрёт??? И ещё, уважаемый 'defunct', (С Наступающим тебя и приятно видеть  ). Ищу поиском, и у меня такой вопрос. Согласно доке, в PowerSave режиме АЦП и Компаратор отключаются автоматически. Или я чего-то недочитал??? Цитата(SasaVitebsk @ Dec 31 2006, 03:30)  Цитата(defunct @ Dec 31 2006, 03:23)  Цитата(SasaVitebsk @ Dec 31 2006, 02:03)  Ищу грабли с потреблением. Поражаюсь оптимистичным заявлениям фирмы. Аппаратных хомутов не нахожу, - облазил всё. Програмно - выводил смотрел. Спит постоянно. И такое потребление!!! Все порты - 0, отключены WDT, BOD.
debugWire включен? Да. Но неужели он столько жрёт??? И ещё, уважаемый 'defunct', (С Наступающим тебя и приятно видеть  ). Ищу поиском, и у меня такой вопрос. Согласно доке, в PowerSave режиме АЦП и Компаратор отключаются автоматически. Или я чего-то недочитал??? Ну спасибо тебе Дед Мороз!  Выключил DebugWare - 7.8мка!
|
|
|
|
|
Dec 31 2006, 02:43
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(SasaVitebsk @ Dec 31 2006, 02:32)  Да. Но неужели он столько жрёт??? Естессно, т.к. он активирует OCD, в котором можно преспокойно следить за процом даже в PowerDown mode. Цитата И ещё, уважаемый 'defunct', (С Наступающим тебя и приятно видеть  ). Взаимно Цитата Ищу поиском, и у меня такой вопрос. Согласно доке, в PowerSave режиме АЦП и Компаратор отключаются автоматически. Или я чего-то недочитал??? По доке автоматом отключается все, кроме WDT/BOD/TWI детектора и Timer2.
|
|
|
|
|
Dec 31 2006, 15:01
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(defunct @ Dec 31 2006, 03:23)  OCR вообще не нужно использовать. Применяйте TOVF тогда не нужно будет и никаких 220 циклов задержки делать, т.к. прерывание triggered по факту переноса. Переписал на OCF, но без задержки - никак. Повторно входит в прерывание. В принципе меня всё устраивает спасибо! Для тех кто спрашивал, поясняю. 7.7-7.8 мка. Батарейка CR2032 и диод. BOD, WDT - отключены. Внешнее питание 3.3В. Отмечу ещё интересную деталь (может кому пригодится). Очень маленькая разница м/у внешним (3.3) и батарейным (3) питанием, приводит к тому что при простой схеме (два встречных диода) от батарейного питания идёт ток и в активном режиме. Правда не большой ~1.8мка. По-видимому диод не закрывается. Чтобы этого избежать, со стороны внешнего питания поставлен (сейчас, сразу не предусмотрел) диод шотки 1N518. Точность хода ~ 1cек в сутки.
|
|
|
|
|
Dec 31 2006, 20:14
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(umup @ Dec 31 2006, 17:57)  Что-то непонятно. Никаких задержек и т.п. там не нужно. Зачем нужен OCF ? Вам нужно сделать TOIE2=1 и прерывание по TOV2. TCCR2B=5, ASSR=0x20, TIMSK2=1.
Покажите свой код инициализации и обработки прерывания. Мне трудно с Вами спорить, но сложно не доверять своим глазам. В активным режиме всё прекрасно работает, и в Power save? - тоже. Если задержку включаю. Как это объяснить? По DebugWare ничего плохого не происходит. Во всяком случае не вижу .... Код __task void main( void ) { uint8_t i,Cnt1820;
// Инициализация портов и переменных
//==== Внешние прерывания ===== EICRA=1; // Прерывание по любому перепаду EIMSK=1; // от INT0 //==== Таймер (Часы реального времени) ===== if(TCCR2B != 5){ // Если первое включение, то // TCCR2A=0; // Режим OVF таймера 2 TCCR2B=5; // Делить на 128 (32768/128 = 256) TIMSK2=1; // Прерывание по OVF ASSR=0x20; // Тактирование от внешнего часового генератора Status.Year=6; // 2006 год Status.Month=12; // декабрь Status.Day=26; // 26 Status.Hour=0; // часов Status.Minute=0; // минут Status.Seconds=0; // секунд Status.ver=VERSIJA; // версия ПО for(i=0;i<8;i++) Status.Datchik[i]=0; // Обнулить датчики Status.Dat16[0]=Status.Dat16[1]=0; // Обнулить датчики } //==== I2C ===== TWAR=0x16; // Адрес Slave = 16/17 M_Init: //==== Порты ==== TWI_Init(); DDRC |= 0xCF; PORTC &= 0x30; DDRD=~(1<<INT0); PORTD=0; DDRB=0xff; PORTB=1; //==============
__enable_interrupt(); // Разрешить прерывания
Cnt1820=OW_cnt_device(); // Определить число ус-в на шине
......
#pragma vector=TIMER2_OVF_vect // Часы __interrupt static void RealTime(void) { uint8_t static LastDay; // Последний день месяца //========================================= Status.Seconds++; // Прошла секунда if(Status.Seconds>59){ Status.Seconds=0; // Начать сначала Status.Minute++; // Прошла минута Flag.ReadEn=1; // Пора читать данные с датчиков if(Status.Minute>59){ Status.Minute=0; // Начать сначала Status.Hour++; // Прошёл час if(Status.Hour>23){ Status.Hour=0; // Начать сначала Status.Day++; // Прошёл день if(Status.Day>LastDay){ // Последний день месяца? Status.Day=1; // Первый день Status.Month++; // Нового месяца LastDay=LastDayOfMonth[Status.Month]; // Определим последний день месяца if((Status.Month==2)&&((Status.Year&3)==0)) // Если февраль и високосный год LastDay++; // то 29 дней в месяце if(Status.Month>12){ // Если год прошёл Status.Month=1; // Первый месяц Status.Year++; // Нового Года } } } } } }
......
// Вырубание переферии для уменьшения потребления TWI_Sleep(); DDRB=0xff; PORTB=0; SMCR=7; // режим PowerSave // Ожидание подачи питания while(Flag.PWR_Dwn){ __sleep(); // Уснуть __delay_cycles(200); } SMCR=0; // выйти из режима PowerSave
....
|
|
|
|
|
Jan 4 2007, 13:01
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930

|
Цитата // Ожидание подачи питания while(Flag.PWR_Dwn){ __sleep(); // Уснуть __delay_cycles(200); } Понял. Еще вопрос. Flag.PWR_Dwn это вывод порта?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|