Maxzz 0 8 апреля, 2023 Опубликовано 8 апреля, 2023 · Жалоба Одна и та же плата. Один и тот же код переключения на внешний кварц в двух разных прошивках. XC16 1.31. MPLAB X 5.50 void ConfigureOscillator(void) { RCONbits.SWDTEN = 0; // Configure PLL prescaler, PLL postscaler, PLL divisor PLLFBD=41; // M = 32 CLKDIVbits.PLLPOST=0; // N1 = 2 CLKDIVbits.PLLPRE=0; // N2 = 2 // Initiate Clock Switch to Primary Oscillator with PLL (NOSC = 0b011) __builtin_write_OSCCONH(0x03); __builtin_write_OSCCONL(0x01); // Wait for Clock switch to occur while (OSCCONbits.COSC != 0b011); // Wait for PLL to lock while(OSCCONbits.LOCK!=1) {}; } В обеих прошивках вызывается первой строчкой в main(). Но первая прошивка работает нормально, а вторая - зависает на строчке ожидания готовности переключения источника клока - "while (OSCCONbits.COSC != 0b011);". Даже в новом пустом проекте, только со скопированной функцией переключения клока - не работает. А в старом проекте, сделанном в старой 4.х версии и XC16 1.24 и импортированной в 5.х - работает. Совсем голову поломал, может, кто сможет подсказать, где может быть причина? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 9 апреля, 2023 Опубликовано 9 апреля, 2023 · Жалоба В отсуствии volatile у OSCCONbits и присуствии уровня оптимизации >0. Проверьте, что в системных хидерах написано по поводу OSCCONbits. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться