|
|
  |
PIC18F6722 + sleep mode |
|
|
|
Jun 28 2011, 04:14
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 28 2011, 06:43
|
Участник

Группа: Участник
Сообщений: 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... вот и ломай тут голову...
|
|
|
|
|
Jun 28 2011, 06:58
|
Участник

Группа: Участник
Сообщений: 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КГц с копейками). И , о чудо! Часовой кварц перестал выключаться!)
|
|
|
|
|
Jun 28 2011, 07:04
|
Участник

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

|
))) продолжим)))) таймер работает...но почему то секунды не считает...Стоит батарейка 3,6в...далее резистор 1кОм... так вот на нем падает 1,7В...это получается ток 1,7мА. и и на ножке питания МК остается примерно 1,9В... Маловато будет для выхода из спящего режима. Порты все настроил на выход, всю периферию отключил... где может быть собака зарыта?
|
|
|
|
|
Jun 28 2011, 07:37
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 28 2011, 09:36
|
Участник

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

|
что попало написал...все порты настраиваю на выход...вы вожу во все 0...возник вопрос. К RC0 и RC1 подключен кварц часовой. Эти выводы как настраивать? P.s Когда закорачиваю резистор 1кОм, схема работает...секунды считает, только потребление большое и батарейка быстро разрядится... Вопрос то в том, куда может идти потребление если все отключил? конденсатор течет?..не должен по идее...
Сообщение отредактировал Arxi - Jun 28 2011, 09:40
|
|
|
|
|
Jun 28 2011, 10:10
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Arxi @ Jun 28 2011, 13:36)  возник вопрос. К RC0 и RC1 подключен кварц часовой. Эти выводы как настраивать? Без разницы - включённая периферия имеет приоритет над стандартным I/O. Достаточно T1OSCEN = 1. Цитата P.s Когда закорачиваю резистор 1кОм, схема работает...секунды считает, только потребление большое и батарейка быстро разрядится... Вопрос то в том, куда может идти потребление если все отключил? конденсатор течет?..не должен по идее... Не знаю. Потроха ПИКа в IDLE столько хавать не должны/не могут. Как у Вас HLVD подключен? (его на батарейке можно включать только на время проверки питания)
|
|
|
|
|
Jun 29 2011, 02:50
|
Участник

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

|
Сейчас глняул, и действительно. Забыл его отключить. В обычном режиме он постоянно включен, но как только возникает прерывание от него, то я его отключаю..и потом 1 раз в секунду запускаю..опрашиваю флаг прерывания, и если его нет, то отключаю модуль... Исправил текст и не помогло....потребление все равно больше...буду копать дальше... P.s за HLVD спасибо) сам выпустил из внимания
Просто ума не приложу что может "протекать"...
|
|
|
|
|
Jun 29 2011, 04:17
|
Участник

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

|
Тут мысль возникла....а вдруг у меня МК не засыпает?...В спячку его отправляю командой _asm sleep _endasm;
В сети встречаю высказывания что надо отправлять командой sleep(), но на нее компилятор ругается..
|
|
|
|
|
Jun 29 2011, 10:27
|
    
Группа: Свой
Сообщений: 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")
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|