Цитата(lolful @ Feb 4 2009, 22:26)

PS Хотелось бы посмотреть на правильную инициализацию регистров DCO, BSL при использовании встроенного кварца, чтобы было минимальное потребление.
Кварцы в MSP430 не встраивают, DCO и VLO это генераторы RC-типа. Инициализация Basic Clock System у вас вроде правильная, вот только написана так, что "без бутылки" не разберешься

Вам что-то претит использовать шестнадцатиричное представление чисел или стандартное символьное обозначение бит? Без вашей функции 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?