ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
23 апреля
281473 Топик полностью
Механик08 (02.11.2011 12:13, просмотров: 260) ответил rezident на Прошу пояснений. У вас все-таки используется внешний кварц 7,3728МГц или вы планируете работать от DCO, настроенный на 8МГц? Если внешний кварц, то почему функция настройки в прерывании по вектору NMI вызывается только один раз при старте
Я хочу использовать внешний кварц 7,3728МГц, но если с ним что-то случится, то переключиться на DCO, так сказать в аварийном режиме. Как организовать калибровку в этом случае пока не знаю. С инициализацией BCSCTL3 после проверки ошибки LFXT1OF, Вы правы, напортачил. Теперь всё исправил. #pragma vector = NMI_VECTOR __root __interrupt void OSCFault (void) { unsigned char i; BCSCTL1 = XTS + CALBC1_8MHZ; // ACLK = LFXT1 = HF XTAL, DCOCLK=8MHz DCOCTL = CALDCO_8MHZ; BCSCTL2 = 0; //MCLK=DCO; BCSCTL3 = LFXT1S1; // 3 – 16MHz crystal or resonator do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0xFF; i > 0; i--); // Time for flag to set } while ((IFG1 & OFIFG)&i); // OSCFault flag still set? if((BCSCTL3&LFXT1OF)==0){ BCSCTL2 = SELM_0 + SELS; // MCLK = DCO, SMCLK = LFXT1 IE1 |= OFIE; rfstate=0; // все в порядке, ошибок нет }else{ rfstate |= BIT1; //установка ошибки резонатора BCSCTL1 = CALBC1_8MHZ; BCSCTL2 = 0; BCSCTL3 = LFXT1S_2; do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0xFF; i > 0; i--); // Time for flag to set } while (IFG1 & OFIFG); // OSCFault flag still set? UCA0CTL1 |= UCSWRST; UCA0CTL1 |= UCSSEL1+UCSSEL0; //SMCLK UCA0CTL0 = 0x00; UCA0BR0 = 0xA0; // 8000000Hz/19200 = 0x01A0 UCA0BR1 = 0x01; UCA0MCTL = 6<<1; // Modulation UCBRSx = 6 P3DIR |= 0x10; P3SEL |= 0x30; UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; } }