Не ждешь, пока кварц запустится.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Сергей Борщ 26 октября 2004 г. 16:55
В ответ на: Программирование MSP430(+) отправлено Kukaracha 26 октября 2004 г. 16:27

Он у тебя после BCSCTL2 = SELM1+SELM0+SELS; обнаруживает, что кварц не запустился и перекидывается обратно на DCO.
Вариантов два: или между BCSCTL1 = XT2OFF+XTS+RSEL1+RSEL2; и BCSCTL2 = SELM1+SELM0+SELS; втавить задержку (сколько - зависит от кварца и его времени раскачки) или включить прерывание по OFIFG и в прерывании переключать на MCLK пока не переключится. Второй вариант надежнее - спасает и от случайных сбоев кварца.
пример:


/* Register BCSCTL1 (0x0057) */
#define _RSEL0 (1<<0)
#define _RSEL1 (1<<1)
#define _RSEL2 (1<<2)
#define InternalR0 0x00
#define InternalR1 (_RSEL0)
#define InternalR2 (_RSEL1)
#define InternalR3 (_RSEL0|_RSEL1)
#define InternalR4 (_RSEL2)
#define InternalR5 (_RSEL2|_RSEL0)
#define InternalR6 (_RSEL2|_RSEL1)
#define InternalR7 (_RSEL2|_RSEL1|_RSEL0)
#define _XT5V (1<<3)
#define _DIVA0 (1<<4)
#define _DIVA1 (1<<5)
#define ACLKdiv1 0x00
#define ACLKdiv2 (_DIVA0)
#define ACLKdiv4 (_DIVA1)
#define ACLKdiv8 (_DIVA0|_DIVA1)
#define _XT1Hi (1<<6)
#define _XT1Lo (0<<6)
#define _XT2OFF (1<<7)
#define _XT2ON (0<<7)

/* Register BCSCTL2 (0x0058) */
#define _Rint 0x00
#define _Rext (1<<0)
#define _DIVS0 (1<<1)
#define _DIVS1 (1<<2)
#define SMCLKdiv1 0x00
#define SMCLKdiv2 (_DIVS0)
#define SMCLKdiv4 (_DIVS1)
#define SMCLKdiv8 (_DIVS1|_DIVS0)
#define _SMDCO 0x00
#define _SMXT2 (1<<3)
#define _SMXT (1<<3)
#define _DIVM0 (1<<4)
#define _DIVM1 (1<<5)
#define MCLKdiv1 0x00
#define MCLKdiv2 (_DIVM0)
#define MCLKdiv4 (_DIVM1)
#define MCLKdiv8 (_DIVM1|_DIVM0)
#define _SELM0 (1<<6)
#define _SELM1 (1<<7)
#define MCLK_DCO 0x00
#define MCLK_DCO2 (_SELM0)
#define MCLK_XT2 (_SELM1)
#define MCLK_XT (_SELM1|_SELM0)


int low_level_init(void) {
BCSCTL1 = _XT2ON|_XT1Lo|ACLKdiv8|InternalR7;
BCSCTL2 = SMCLKdiv1|MCLKdiv2|_Rint|_SMDCO|MCLK_DCO;
BCSCTL2 |= MCLK_XT2; //SMCLK=XT2;MCLK=XT2;
IE1 = OFIE;

.....

}


#pragma vector = NMI_VECTOR
#pragma type_attribute = __interrupt
void OSCFault (void)
{
BCSCTL2 &= ~MCLK_XT2; //SMCLK=DCO;MCLK=DCO;
do
IFG1 &= ~OFIFG;
while (IFG1 & OFIFG);
BCSCTL2 |= MCLK_XT2; //SMCLK=XT;MCLK=XT;
IE1 |= OFIE;
}


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru