Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Потребление MSP430f2002
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
lolful
Пытаюсь разобраться с MSP430. В даташите заявлено, что потребление в LPM4 0.5 мкА. Ноги болтаются в воздухе - все сконфигурированы на выход в 0. Потребление не удается снизить ниже 62 мкА (LPM4 и LPM3). Потребление в LPM2 86 мкА.
На плате стоит конденсатор по питанию и подтяжка Reset 47кОм. Для отладки пользуюсь ez430-f2013. Ток измеряю мультиметром MASTECH MY65, включенным в разрыв питания. Питание беру как от JTAG, так и от стабилизатора на 3В - результат одинаковый. Среда IAR.

Код
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;

  DCOCTL = 0;
  BCSCTL1 = 0;
  BCSCTL2 = 200;
  BCSCTL3 = 35;  

  init();    //делает все IO на выход "0"
  _BIS_SR(LPM2_bits);
  while(1);
}


Никак не пойму где я допускаю ошибку. Как добиться этого потребления 0.5мкА?
rezident
Функцию init() покажите. Конденсатор по питанию какого типа? Часовой кварц имеется? Плата хорошо промыта?
lolful
Сегодня, к сожалению, не смогу скопировать init().
Конденсатор по питанию керамический, на 1мкФ по-моему или около того.
Процессор тактируется от VLO, кварца нет.
Плату промывал несколько раз - не помогало.

PS Хотелось бы посмотреть на правильную инициализацию регистров DCO, BSL при использовании встроенного кварца, чтобы было минимальное потребление.
rezident
Цитата(lolful @ Feb 4 2009, 22:26) *
PS Хотелось бы посмотреть на правильную инициализацию регистров DCO, BSL при использовании встроенного кварца, чтобы было минимальное потребление.
Кварцы в MSP430 не встраивают, DCO и VLO это генераторы RC-типа. Инициализация Basic Clock System у вас вроде правильная, вот только написана так, что "без бутылки" не разберешься smile.gif Вам что-то претит использовать шестнадцатиричное представление чисел или стандартное символьное обозначение бит? Без вашей функции init() что-то определенное сказать сложно, то попробуйте загрузить вот такую тестовую программу, которую я набросал по-быстрому
CODE
#include <msp430x20x2.h>

void main (void)
{
//--- WDT ---
WDTCTL = WDTPW | WDTHOLD;
//--- PORT1 ---
P1SEL=0x00;
P1DIR=0xFF;
P1OUT=0x00;
P1REN=0x00;
P1IE=0x00;
//--- PORT2 ---
P2SEL=0x00;
P2DIR=0xFF;
P2OUT=0x00;
P2REN=0x00;
P2IE=0x00;
//--- USI ---
USICTL0=USISWRST;
//--- TIMERA ---
TACTL=TACLR;
TACCTL0=0x0000;
TACCTL1=0x0000;
//--- ADC10 ---
ADC10CTL0=0x0000;
ADC10AE0=0x00;
ADC10DTC1=0x00;
//--- SYSCLK ---
DCOCTL=0x00;
BCSCTL1=XT2OFF;
BCSCTL3=LFXT1S_2;
BCSCTL2=SELM_3;
//--- LPM set ---
IE1=0x00;
__bis_SR_register(LPM3_bits);
while(1)
{ __no_operation();
}
}

#pragma vector=PORT1_VECTOR
#pragma type_attribute=__interrupt
void PORT1_ISR (void)
{ __no_operation();
}
#pragma vector=PORT2_VECTOR
#pragma type_attribute=__interrupt
void PORT2_ISR (void)
{ __no_operation();
}
#pragma vector=USI_VECTOR
#pragma type_attribute=__interrupt
void USI_ISR (void)
{ __no_operation();
}
#pragma vector=ADC10_VECTOR
#pragma type_attribute=__interrupt
void ADC10_ISR (void)
{ __no_operation();
}
#pragma vector=TIMERA1_VECTOR
#pragma type_attribute=__interrupt
void TIMERA1_ISR (void)
{ __no_operation();
}
#pragma vector=TIMERA0_VECTOR
#pragma type_attribute=__interrupt
void TIMERA0_ISR (void)
{ __no_operation();
}
#pragma vector=WDT_VECTOR
#pragma type_attribute=__interrupt
void WDT_ISR (void)
{ __no_operation();
}
#pragma vector=NMI_VECTOR
#pragma type_attribute=__interrupt
void NMI_ISR (void)
{ __no_operation();
}

В ней инициализированы все те регистры периферии, которые могли бы оказывать воздействие на потребление. Причем инициализированы явными значениями, а не накладыванием масок. Это чтобы, невзирая на начальное состояние регистров, знать, что там все будет так, как нам хочется. Кроме того, в этом тесте определены все вектора прерываний и можно зафиксировать случайное попадание по любому из них.
Ну и еще небольшая хитрость с порядком инициализации регистров модуля тактирования. Сначала останавливаем WDT, затем прописываем все регистры периферии и только потом (до этого момента ядро тактируется от DCO ~1МГц) инициализируем систему тактирования, переходя на такт от VLO. Причем у меня не случайно BCSCTL3 прописывается перед BCSCTL2. Посмотрите в User's Guide зависимости и вы вероятно согласитесь, что так корректнее. Если делать наоборот (BCSCTL2 перед BCSCTL3), то ядро зависнет на следующей операции, т.к. командой BCSCTL2=SELM_3; мы пытаемся перейти на тактирование от LFXT1CLK or VLOCLK, но к этому моменту у нас еще не выбран VLO, а источником тактирования является LFXT1CLK = 32768 Hz Crystal on LFXT1, который у вас отсутствует физически.
Еще нюанс. Надеюсь вы измеряете потребление "голого" кристалла? Без подключенного к нему ez430?
lolful
Код
void init(){
  P1OUT = 0;
  P1DIR = 0xff;
  P1SEL = 0;
  
  P2OUT = 0;
  P2DIR = 0xff;
  P2SEL = 0;
}
Цитата(rezident @ Feb 5 2009, 01:56) *
Кварцы в MSP430 не встраивают, DCO и VLO это генераторы RC-типа.
Виноват biggrin.gif исправлюсь.
Цитата(rezident @ Feb 5 2009, 01:56) *
Еще нюанс. Надеюсь вы измеряете потребление "голого" кристалла? Без подключенного к нему ez430?
И так тоже. Осмелюсь отметить, что ток почти или совсем не отличается при отладке и при работе (с условием, что программа не остановлена).

Ваша программа тоже дает ток потребления в 62мкА.

Добавлено позднее

Цитата(lolful @ Feb 5 2009, 10:46) *
Осмелюсь отметить, что ток почти или совсем не отличается при отладке и при работе (с условием, что программа не остановлена).
Ну я и дурак, просто жуть cranky.gif . Эта ошибка мне стоила целого дня. С вашей программой потребление стало меньше 1мкА. Огромное спасибо за все. rolleyes.gif
rezident
Цитата(lolful @ Feb 5 2009, 11:41) *
Эта ошибка мне стоила целого дня. С вашей программой потребление стало меньше 1мкА.
Дык "эта ошибка" которая именно: неправильная инициализация системы тактирования или измерение тока потребления с подключенным эмулятором?
lolful
Ошибка - измерение тока с эмулятором.
Дело было так. У меня есть 2 устройства: одно на f2002 (работает только через эмулятор), другое на f2001 (работает от стабилизатора). Оба устройства показвали примерно одинаковое потребление. Как выяснилось f2002 много потреблял из-за эмулятора, а вот почему f2001 много потребляет - загадка - пытаюсь выяснить (тут дело в железе по-ходу).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.