Как у Вас с разводкой платы? Частота кварца? Конденсаторы какие на кварце?
Я использую вместо кварца Муратовские керамические резонаторы со встроенными емкостями.
Программно я делаю примерно так. При сбое генератора вызовется прерывание и он опять заведется.
Код
unsigned int OSCFault_isr; // глобальная переменная - счетчик вызов прерывания по OSCFault - для контроля
void init( void )
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
IE1 |= OFIE; // разрешим прерывание по сбою тактового генератора XT1 (флаг устанавливается при POR и при сбое)
// это прерывание NMI, настройка ХТ1 произойдет после разрешения OFIE
......
OSCFault_isr = 0;
}
/* --- NMI_isr() ------------------------------------------------------------------------------------------ **
* прерывание по сбою тактового генератора XT1
* ЖДЕМ, когда заведется генератор
*
* Контроль вызова этого прерывания: при вызове в процессе измерения
* игнорировать результаты этого измерения
* -------------------------------------------------------------------------------------------------------- */
#pragma vector=NMI_VECTOR
__interrupt void NMI_isr( void ) // 14 * 2 - 0xfffc Non-maskable
{
// Настроим основное и вспомогательное тактирование
BCSCTL1 |= XTS; // вспомогательное тактирование ACLK = LFXT1 = HF XTAL
do
{ IFG1 &= ~OFIFG; // Clear OSCFault flag
delay_us( 100 ); // Time for flag to set (> 50 us)
} while (( IFG1 & OFIFG ) != 0 ); // OSCFault flag still set?
BCSCTL2 |= SELM_3; // основное тактирование MCLK = LFXT1
IE1 |= OFIE; // разрешим прерывание по сбою тактового генератора XT1 (флаг устанавливается при POR и при сбое)
if ( !++OSCFault_isr ) // счетчик вызов прерывания по OSCFault - для контроля сбоя генератора в программе
OSCFault_isr--; // защита от переполнения
}