Rostislav78 0 20 мая, 2011 Опубликовано 20 мая, 2011 (изменено) · Жалоба Всем привет! Суть проблемы: имеется устройство с питанием от сети и возможностью питания от батарейки. При нарастании (или определенном постоянном уровне) напряжения на входе стабилизатора ток потребления микроконтроллера в режие LPM3 увеличивается, а затем снижается. Все бы ничего, но напряжение просаживается на 0,2В. Возможно из-за этого устройство иногда не выходит из спячки. Да и работа модуля SVS микроконтроллера при напряжении менее 2,5В может быть нестабильна. Коллеги! К подскажет, в чем может быть дело? Я ничего не понимаю! :( :( :( На схеме указал точки замера напряжений. Синий луч показывает увеличение тока потребления (напряжение на резисторе 1кОм инвертировано). Помогите, пожалуйста! const unsigned char Key1 = 0x04; const unsigned char cSWON = 0x02; const unsigned char PJ = 0x04; const unsigned char cLED = 0x20; const unsigned char cTM = 0x02; const unsigned char cRW = 0x01; __task void main (void); int __low_level_init (void) { /* Insert your low-level initializations here */ /*============================================*/ /* Choose if segment initialization */ /* should be done or not. */ /* Return: 0 to omit initialization */ /* Return: 1 to run initialization */ /*============================================*/ // Stop WDT WDTCTL = WDTPW + WDTHOLD; // Если возвращаемый параметр =1, то вся память RAM обнуляется, иначе - нет. return (1); } // TimerA Interrupt Routine #pragma vector = TIMERA0_VECTOR __interrupt void TimerA0_ISR (void) { if ((LCDCTL & LCDON) == 0) { SVSCTL = 0x0F0; } // Часы ..... // if ((LCDCTL & LCDON) == 0) { // Выход из энергосбережения _BIC_SR_IRQ (LPM3_bits); // Clear LPM3 bits from 0(SR) } } // Bsic Timer 2 interrupt service routine #pragma vector = BASICTIMER_VECTOR __interrupt void basic_timer_isr (void) { ..... ..... ..... SVSConrol (); } void SVSConrol (void) { if ((SVSCTL & SVSOP) == SVSOP) // Если сработал супервизор, то уход в спячку { if ((ESPCTL & ESPEN) == ESPEN) { // Stop measurement (set Embedded Signal Processing into "Idle" mode) // Set Embedded Signal Processing into "Idle" mode set_esp_idle (); SD16CTL = (SD16LP + SD16DIV0 + SD16DIV1 + SD16SSEL0 + SD16SSEL1); } // Disable USART interrupt IE1 &= ~(URXIE0); // Disabled USART0 TXD/RXD U0ME &= ~(UTXE0 + URXE0); // Stop Basic Timer BTCTL = (BTHOLD + BTDIV); // Запрещаем прерывания от Basic Timer IE2 &= ~(BTIE); // LCD OFF LCDCTL &= ~(LCDON); // TM OFF P1DIR = (cLED + cRW); // СИД ON, RW ON (Подгрузка источника питания - дополнительный гистерезис по питанию для надежного срабатывания супервизора) P1OUT = (cTM); // SB1 OFF P2OUT = 0; // Разрешаем вложенные прерывания (нас интересуют только от таймера TimerA) _EINT (); // Enable Interrupts (глобально) do { do { SVSCTL = VLDOFF; while ((SVSCTL & SVSON) == SVSON); _BIS_SR (LPM3_bits); _NOP (); // SVSCTL = 0x0F0; while ((SVSCTL & SVSON) != SVSON); } while ((SVSCTL & SVSOP) == SVSOP); // Переинициализация FLL (запускаем для восстановления частоты DCO) InitFLL (); } while ((SVSCTL & SVSOP) == SVSOP); // Повторный контроль для надежности // Инициализация таймера B (TimerB) BTCTL = (BTIP2 + BTFRFQ0); // f(LCD) = ACLK / 64 = 512 Hz, f(INTB) = 1024 Hz // Разрешаем прерывания от Basic Timer IE2 |= (BTIE); } } void InitFLL (void) { SCFI0 = (FLLD_2 | FN_2); // Интегратор системной частоты - 4 МГц FLL_CTL0 = (DCOPLUS | XCAP18PF); // Регистр управления модулем FLL. DC генератор в диапазон 1.3-12.1 МГц. SCFQCTL = 63; // Регистр контроля тактирования системы // Ждем некоторое время для установления частоты DCO WaitNmks ((signed long) (32768)); } __task void main (void) { InitFLL (); for (;;) { _DINT (); SVSCTL = 0x0F0; P1DIR = (cRW + cLED + cTM); // Бит0 - R/W // Бит1 - ТМ // Бит5 - LED P2DIR = (cSWON + 0x010); // Бит1 - SWON // Бит2 - Key // Бит4 - TXD // Бит5 - RXD P1OUT = (cRW + cLED + cTM); P2OUT = (cSWON); P1SEL = 0; P2SEL = 0x038; // P2.4,5 = USART0 TXD enable, RXD enable // P2.3 = SVSIN P1IE = 0; // Disable Port 1 interrupts P2IE = 0; // Disable Port 2 interrupts P1IFG = 0; // Clear Port 1 interrupt Flags P2IFG = 0; // Clear Port 2 interrupt Flags // Конфигурирование LCD контроллера LCDCTL = (LCDON + LCD4MUX + LCDP1 + LCDP0); // LCD config : Duty = 1/4, Bias = 1/3 // Инициализация таймера A (TimerA) TACTL = (TASSEL0 + MC0); TACCR0 = 32767; // Период срабатывания таймера А TACCTL0 = (CCIE); // Инициализация таймера B (TimerB) BTCTL = (BTIP2 + BTFRFQ0); // f(LCD) = ACLK / 64 = 512 Hz, f(INTB) = 1024 Hz IE2 |= (BTIE); // Разрешаем прерывания от Basic Timer // Enable Interrupts (глобально) _EINT (); while (...) // Цикл выполняется пока не разрешен перезапуск системы { ..... ..... ..... ..... } } } Изменено 20 мая, 2011 пользователем Rostislav Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vas123 0 20 мая, 2011 Опубликовано 20 мая, 2011 · Жалоба Одна из возможных причин: В режиме спячки некоторые порты настроены на ввод. При плавном повышении напряжения питания, на этих выводах длительное время присутствует напряжение, не соответствующее ни "0", ни "1". Т.е. в диапазоне примерно 1...2 Вольта. Это приводит к существенному увеличению тока потребления микроконтроллера. Выход простой: при впадении в спячку такие порты нужно настраивать на вывод, и выводить "0" или "1" в зависимости от подключенных к ним цепей (критерий: отсутствие втекающего/вытекающего тока). Соответственно, после пробуждения, выполнять нормальные настройки. Если внешние цепи не позволяют настраивать порты на вывод в режиме спячки, нужно изменить внешние цепи :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rostislav78 0 20 мая, 2011 Опубликовано 20 мая, 2011 (изменено) · Жалоба При плавном повышении напряжения питания, на этих выводах длительное время присутствует напряжение, не соответствующее ни "0", ни "1". Т.е. в диапазоне примерно 1...2 Вольта. Василий, спасибо за ответ! Я вот как раз об этом сейчас подумываю и экспериментирую. У Вас эта информация достоверна, подтверждена опытом? Дело серьезное и касается надежности устройства. У MSP по входам стоят триггеры Шмитта имеющие гистерезис и вроде бы таких эффектов быть недолжно? :( Спасибо!!! Изменено 20 мая, 2011 пользователем Rostislav Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vas123 0 20 мая, 2011 Опубликовано 20 мая, 2011 · Жалоба Этот эффект был обнаружен в одном из разрабатывавшихся устройств. В документации упоминания об этом я не видел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость @Ark 20 мая, 2011 Опубликовано 20 мая, 2011 (изменено) · Жалоба Коллеги! К подскажет, в чем может быть дело? Я ничего не понимаю! ИМХО, первое что нужно сделать - это покопать даташит на предмет минимальной скорости нарастания напряжения питания при старте. Например, для PIC-ов этот параметр равен 50мВ/мс. То есть, если питание растет быстрее указанной величины - обеспечивается нормальный старт. Если медленнее - возможны проблемы. .... Вот еще, знающий человек посоветовал: Цитата(rezident @ 21.5.2011, 1:58) .... посоветуйте людям в этой теме почитать раздел 23.2.5 Comparator_A, Port Disable Register CAPD в MSP430x4xx Family User's Guide (Rev. J) - slau056j.pdf. А то "мужики-то и не знают", обсуждая в том топике странный на их взгляд эффект. http://focus.ti.com/lit/ug/slau056j/slau056j.pdf Изменено 21 мая, 2011 пользователем @Ark Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rostislav78 0 31 мая, 2011 Опубликовано 31 мая, 2011 (изменено) · Жалоба Всем привет! Вернулся из отпуска и с новыми силами приступил к штурму проблемы... :) Что выяснилось на данный момент: перевод всех линий порта 2 (непосредственно перед уходом в LPM3) на вывод к изменениям не приводит ( не понятно почему! :( ведь схемотехника портов 1 и 2 совпадает и следовательно такой же эффект должен давать и порт 2 ), а вот перевод всех линий порта 1 на вывод действительно помогает решить проблему. Увеличение потребления в режиме LPM3 не наблюдается. Буду думать дальше... ЗЫ. Василий123!!!! Огромное спасибо за наводку!!! Самое противное, что в даташитах ни слова об этом!!!! :laughing: Изменено 31 мая, 2011 пользователем Rostislav Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 10 июня, 2011 Опубликовано 10 июня, 2011 · Жалоба Судя по всему, топикстартер все же проигнорировал мое сообщение, которое я передал через @Ark. О том, что следует отключить схему bus-keeper, с целью снижения потребление входного каскада пина, который работает с аналоговым сигналом. А ведь в документации все описано и расписано, нужно только внимательно читать ее. Ну да ладно. Каждый сам себе "злобный Буратино" :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rostislav78 0 17 июня, 2011 Опубликовано 17 июня, 2011 · Жалоба Судя по всему, топикстартер все же проигнорировал мое сообщение, которое я передал через @Ark. О том, что следует отключить схему bus-keeper, с целью снижения потребление входного каскада пина, который работает с аналоговым сигналом. А ведь в документации все описано и расписано, нужно только внимательно читать ее. Ну да ладно. Каждый сам себе "злобный Буратино" :) Да нее! Не буратино я! Я просто не понял как это сделать в MSP430FE425. Приведите, пожалуйста, пример кода на Си или Asm`е. В PDF о bus-keeper ни слова не нашел. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 17 июня, 2011 Опубликовано 17 июня, 2011 · Жалоба Я просто не понял как это сделать в MSP430FE425. Приведите, пожалуйста, пример кода на Си или Asm`е. В PDF о bus-keeper ни слова не нашел. :laughing: В MSP430FE425 нет компаратора, но биты CAPD с функцей отключения схемы bus-keeper опосредованно доступны. Для P2.3, например, см. стр. 41 из datasheet (msp430fe425.pdf) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться