Режим защиты от сбоя кварца на msp430f149
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено demask 07 ноября 2003 г. 16:02

Поделитесь соображениями, как лучше на msp430f149 реализовать режим защиты от сбоя генерации основного кварца (допустим, он висит на XT2, а на LFXT1 висит часовой)? Нужно чтобы в такой ситуации прибор продолжал работать на максимальной скорости до стабилизации кварца (т.е. было прозрачным для программы) и чтобы все это занимало минимум ресурсов. Я написал следующий драфт. Вроде работает, но может кто выскажет какие-нибудь дополнительные соображения:

// This routine handles NMI

interrupt[NMI_VECTOR] void NMI_handler (void) {
// process oscillator fault - switch to DCO if XT2 is failed
if (IFG1&OFIFG) {
BCSCTL2=0; // ! not sure whether I need this
IFG1&=~OFIFG;
if (!(IFG1&OFIFG)) {
_BIC_SR(OSCOFF); // ! not sure whether I need following 3 lines as well
BCSCTL1=RSEL2+RSEL1+RSEL0;
BCSCTL2=SELM1+SELS;
}
}
return;
}

// This routine handles WDT (works as RTC)

interrupt[WDT_VECTOR] void WDT_handler (void) {
IE1=WDTIE|OFIE;
return;
}

void main(void) {
unsigned int i;

// configure watchdog timer
IE1|=WDTIE;
WDTCTL=WDT_ADLY_1000;

// configure DCO (it will be used in case of XT2 crystal failure)
DCOCTL=DCO2+DCO1+DCO0;

// configure LFXT1 (32KHz) and XT2 (8MHz) oscillators
_BIC_SR(OSCOFF);
BCSCTL1=RSEL2+RSEL1+RSEL0;
do {
IFG1&=~OFIFG;
for (i=0xff;i>0;i--);
}
while ((IFG1&OFIFG)!=0);
BCSCTL2=SELM1+SELS;

// enable some system interrupts
IE1|=OFIE;
_EINT();

...

}


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

Ответы



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

E-mail: info@telesys.ru