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

 
 
 
Reply to this topicStart new topic
> PIC18F6722 + sleep mode
Arxi
сообщение Jun 28 2011, 04:14
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-09-10
Пользователь №: 59 523



Приветствую! Возникла проблема...никак не могу понять в чем ошибка. Есть некоторая система на данном МК. ЕЕ задачи: сбор данных по UART, их обработка, вывод данных на TFT дисплей и так далее. В том числе присутствует задача часов реального времени. Питания внешнее и батарейка. При пропадании внешнего питания устройство должно уходить в режим Sleep. Таймер 1 тактируется от внешнего кварца 32КГц... раз в 1 сек по прерыванию он должен будить МК, считать время, проверять появилось ли питания и, если нет, снова уходить в спячку. Так вот какой минимум операции нужно сделать чтобы уйти в спячку с минимум потребления тока? Отключаю все (UART, АЦП, всю подтяжку на портах.. и так далее) НО! Как только питания пропадает пропадает и колебания на часовом кварце, хотя в даташите написано что если таймер 1 был включен, то он продолжает работать...Перед батарейкой стоит резистор на 1кОм...так вот на нем падение напряжения почти 1,5В...то есть 1,5 мА потребляются... Пропадают колебания, соответственно и время не считает...как быть?

Сообщение отредактировал Arxi - Jun 28 2011, 04:16
Go to the top of the page
 
+Quote Post
xemul
сообщение Jun 28 2011, 06:26
Сообщение #2



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Arxi @ Jun 28 2011, 08:14) *
При пропадании внешнего питания устройство должно уходить в режим Sleep.

Надеюсь, Вы различаете режимы Sleep и Idle (см. раздел 3.1 Selecting Power-Managed Modes ДШ; Вас должен интересовать режим SEC_IDLE).
По остальному потоку сознания сказать что-то определённое сложно. Расскажите/покажите, как определяете "Как только питания пропадает ..." и что делаете при этом, и обвязку ПИКа по питанию.
Go to the top of the page
 
+Quote Post
Arxi
сообщение Jun 28 2011, 06:43
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-09-10
Пользователь №: 59 523



М-да, действительно...путаница вышла... насчет режима 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... вот и ломай тут голову...
Go to the top of the page
 
+Quote Post
xemul
сообщение Jun 28 2011, 06:54
Сообщение #4



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Ну коль внятно рассказать Вам лень, см. 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.
Go to the top of the page
 
+Quote Post
Arxi
сообщение Jun 28 2011, 06:58
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-09-10
Пользователь №: 59 523



Значит начнем по порядку...использую модуль 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КГц с копейками).
И , о чудо! Часовой кварц перестал выключаться!)
Go to the top of the page
 
+Quote Post
xemul
сообщение Jun 28 2011, 07:01
Сообщение #6



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Arxi @ Jun 28 2011, 10:58) *
И , о чудо! Часовой кварц перестал выключаться!)

Угу, я тоже люблю читать даташиты на ночь.sm.gif
Go to the top of the page
 
+Quote Post
Arxi
сообщение Jun 28 2011, 07:04
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-09-10
Пользователь №: 59 523



))) продолжим))))
таймер работает...но почему то секунды не считает...Стоит батарейка 3,6в...далее резистор 1кОм... так вот на нем падает 1,7В...это получается ток 1,7мА. и и на ножке питания МК остается примерно 1,9В... Маловато будет для выхода из спящего режима. Порты все настроил на выход, всю периферию отключил... где может быть собака зарыта?
Go to the top of the page
 
+Quote Post
xemul
сообщение Jun 28 2011, 07:31
Сообщение #8



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Arxi @ Jun 28 2011, 11:04) *
... где может быть собака зарыта?

Без схемы обвязки по питанию телепать, куда Вы прикопали несчастное животное, не буду.
Go to the top of the page
 
+Quote Post
Arxi
сообщение Jun 28 2011, 07:37
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-09-10
Пользователь №: 59 523



Питание +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 - Jun 28 2011, 07:41
Go to the top of the page
 
+Quote Post
Arxi
сообщение Jun 28 2011, 09:36
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-09-10
Пользователь №: 59 523



что попало написал...все порты настраиваю на выход...вы вожу во все 0...возник вопрос. К RC0 и RC1 подключен кварц часовой. Эти выводы как настраивать?
P.s Когда закорачиваю резистор 1кОм, схема работает...секунды считает, только потребление большое и батарейка быстро разрядится...
Вопрос то в том, куда может идти потребление если все отключил? конденсатор течет?..не должен по идее...

Сообщение отредактировал Arxi - Jun 28 2011, 09:40
Go to the top of the page
 
+Quote Post
xemul
сообщение Jun 28 2011, 10:10
Сообщение #11



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Arxi @ Jun 28 2011, 13:36) *
возник вопрос. К RC0 и RC1 подключен кварц часовой. Эти выводы как настраивать?

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

Не знаю. Потроха ПИКа в IDLE столько хавать не должны/не могут.
Как у Вас HLVD подключен? (его на батарейке можно включать только на время проверки питания)
Go to the top of the page
 
+Quote Post
Arxi
сообщение Jun 29 2011, 02:50
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-09-10
Пользователь №: 59 523



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

Просто ума не приложу что может "протекать"...
Go to the top of the page
 
+Quote Post
Arxi
сообщение Jun 29 2011, 04:17
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 16-09-10
Пользователь №: 59 523



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

В сети встречаю высказывания что надо отправлять командой sleep(), но на нее компилятор ругается..
Go to the top of the page
 
+Quote Post
xemul
сообщение Jun 29 2011, 10:27
Сообщение #14



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



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

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

На sleep() не будет ругаться picc18. Но и у него с этим просто:
Код
#define    SLEEP()        asm("sleep")
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jun 30 2011, 03:56
Сообщение #15


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



1.5mA похоже на ток работающего процессора. выключите все прерывания и WDT, и посмотрите уходит ли он в sleep.

А может вы с питание где-то напортачили. Схему в студию.
Go to the top of the page
 
+Quote Post

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

 


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


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