Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PIC18F6722 + sleep mode
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Arxi
Приветствую! Возникла проблема...никак не могу понять в чем ошибка. Есть некоторая система на данном МК. ЕЕ задачи: сбор данных по UART, их обработка, вывод данных на TFT дисплей и так далее. В том числе присутствует задача часов реального времени. Питания внешнее и батарейка. При пропадании внешнего питания устройство должно уходить в режим Sleep. Таймер 1 тактируется от внешнего кварца 32КГц... раз в 1 сек по прерыванию он должен будить МК, считать время, проверять появилось ли питания и, если нет, снова уходить в спячку. Так вот какой минимум операции нужно сделать чтобы уйти в спячку с минимум потребления тока? Отключаю все (UART, АЦП, всю подтяжку на портах.. и так далее) НО! Как только питания пропадает пропадает и колебания на часовом кварце, хотя в даташите написано что если таймер 1 был включен, то он продолжает работать...Перед батарейкой стоит резистор на 1кОм...так вот на нем падение напряжения почти 1,5В...то есть 1,5 мА потребляются... Пропадают колебания, соответственно и время не считает...как быть?
xemul
Цитата(Arxi @ Jun 28 2011, 08:14) *
При пропадании внешнего питания устройство должно уходить в режим Sleep.

Надеюсь, Вы различаете режимы Sleep и Idle (см. раздел 3.1 Selecting Power-Managed Modes ДШ; Вас должен интересовать режим SEC_IDLE).
По остальному потоку сознания сказать что-то определённое сложно. Расскажите/покажите, как определяете "Как только питания пропадает ..." и что делаете при этом, и обвязку ПИКа по питанию.
Arxi
М-да, действительно...путаница вышла... насчет режима sleep. Идею работы я описал. Режим sleep ---- таймер 1 продолжает считать--- по прерыванию от таймера 1 обслуживаем часы и проверяем вернулось ли напряжение. Насчет выбора режима sleep возможно я и ошибся. Тут маленько непонятно. В ДШ есть фраза в описании режима sleep: "...If the Timer1 oscillator is enabled, it will also continue to run...". Я и думал что в режиме sleep таймер 1 продолжает считать и может вызывать прерывания... Хотя там же, в таблице 3-1, сказано: "None – All clocks are disabled" - про режим sleep... вот и ломай тут голову...
xemul
Ну коль внятно рассказать Вам лень, см. 3.4.2 SEC_IDLE MODE. Привожу достаточный для понимания кусок:
Цитата
This mode is entered from SEC_RUN by setting the IDLEN bit and executing a SLEEP instruction.
If the device is in another Run mode, set the IDLEN bit first, then set the SCS1:SCS0 bits to ‘01’ and execute SLEEP.
Arxi
Значит начнем по порядку...использую модуль HLVD. Настраиваю его на напряжение 4,11. Питание пропадает и схема начинает питаться от батарейки 3,6В. Модуль HLVD вызывает прерывание в котором я выставляю флаг низкого напряжение и отключаю всю периферию. В main сделал цикл:
while(1)
{
if (low_upit == 1)
{
OSCCONbits.IDLEN = 1;
OSCCONbits.SCS0 = 1;
_asm sleep _endasm;
_asm NOP _endasm;
}
Таким образом с помощью битов IDLEN и SCS0 выставляю режим SEC_Idle, при котором тактирование ведется от кварца таймера 1 (часовой кварц 32КГц с копейками).
И , о чудо! Часовой кварц перестал выключаться!)
xemul
Цитата(Arxi @ Jun 28 2011, 10:58) *
И , о чудо! Часовой кварц перестал выключаться!)

Угу, я тоже люблю читать даташиты на ночь.sm.gif
Arxi
))) продолжим))))
таймер работает...но почему то секунды не считает...Стоит батарейка 3,6в...далее резистор 1кОм... так вот на нем падает 1,7В...это получается ток 1,7мА. и и на ножке питания МК остается примерно 1,9В... Маловато будет для выхода из спящего режима. Порты все настроил на выход, всю периферию отключил... где может быть собака зарыта?
xemul
Цитата(Arxi @ Jun 28 2011, 11:04) *
... где может быть собака зарыта?

Без схемы обвязки по питанию телепать, куда Вы прикопали несчастное животное, не буду.
Arxi
Питание +5В и батарейка отделены друг от друга диодами...от батарейки питается только проц батарейка---резистор 1кОм--диод---фильтрующие конденсаторы (0,1мкФ --- 220мкФ)---питание Vdd. так же через резистор 51 Ом это питание заводится на AVdd.
При пропаже питания отключаю:

///////*****отключаем всю периферию******////////
RCSTA1bits.SPEN = 0;//выкл. UART
SSP1CON1bits.SSPEN = 0;//выключаем SPI
ADCON0bits.ADON = 0; //АЦП откл
T2CONbits.TMR2ON = 0;//Timer2 выключен
T3CONbits.TMR3ON = 0;//Timer3 OFF
T0CONbits.TMR0ON = 0; //off Timer0
INTCON2bits.RBPU = 1; // выключили подтягивающие резисторы на PortB
TRISD = 0;
TRISC = 0;
TRISA = 0;
TRISF = 0;
LATA = 0;
LATB = 0;
LATC = 0;
LATD = 0;
LATE = 0;
LATF = 0;
LATG = 0;
Arxi
что попало написал...все порты настраиваю на выход...вы вожу во все 0...возник вопрос. К RC0 и RC1 подключен кварц часовой. Эти выводы как настраивать?
P.s Когда закорачиваю резистор 1кОм, схема работает...секунды считает, только потребление большое и батарейка быстро разрядится...
Вопрос то в том, куда может идти потребление если все отключил? конденсатор течет?..не должен по идее...
xemul
Цитата(Arxi @ Jun 28 2011, 13:36) *
возник вопрос. К RC0 и RC1 подключен кварц часовой. Эти выводы как настраивать?

Без разницы - включённая периферия имеет приоритет над стандартным I/O. Достаточно T1OSCEN = 1.
Цитата
P.s Когда закорачиваю резистор 1кОм, схема работает...секунды считает, только потребление большое и батарейка быстро разрядится...
Вопрос то в том, куда может идти потребление если все отключил? конденсатор течет?..не должен по идее...

Не знаю. Потроха ПИКа в IDLE столько хавать не должны/не могут.
Как у Вас HLVD подключен? (его на батарейке можно включать только на время проверки питания)
Arxi
Сейчас глняул, и действительно. Забыл его отключить. В обычном режиме он постоянно включен, но как только возникает прерывание от него, то я его отключаю..и потом 1 раз в секунду запускаю..опрашиваю флаг прерывания, и если его нет, то отключаю модуль... Исправил текст и не помогло....потребление все равно больше...буду копать дальше...
P.s за HLVD спасибо) сам выпустил из внимания

Просто ума не приложу что может "протекать"...
Arxi
Тут мысль возникла....а вдруг у меня МК не засыпает?...В спячку его отправляю командой
_asm sleep _endasm;

В сети встречаю высказывания что надо отправлять командой sleep(), но на нее компилятор ругается..
xemul
Цитата(Arxi @ Jun 29 2011, 08:17) *
Тут мысль возникла....а вдруг у меня МК не засыпает?...В спячку его отправляю командой
_asm sleep _endasm;

Дык лампочкой помигайте для быстрой диагностики... Или по очереди исключите все лишние источники просыпания, перечисленные в разделе "WAKE-UP FROM SLEEP".
Цитата
В сети встречаю высказывания что надо отправлять командой sleep(), но на нее компилятор ругается..

На sleep() не будет ругаться picc18. Но и у него с этим просто:
Код
#define    SLEEP()        asm("sleep")
ar__systems
1.5mA похоже на ток работающего процессора. выключите все прерывания и WDT, и посмотрите уходит ли он в sleep.

А может вы с питание где-то напортачили. Схему в студию.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.