mình đã config cho dsPIC chạy ở chế độ 16 MPIs như sau:
Code:
_FOSCSEL(FNOSC_FRC); // Select Internal FRC at POR
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT); // Enable Clock Switching and Configure POSC in XT mode
_FWDT(FWDTEN_OFF); // Disable Watchdog Timer
int main (void)
{
// Configure PLL prescaler, PLL postscaler, PLL divisor
PLLFBD = 62; // M = 64
CLKDIVbits.PLLPOST = 1; // N2 = 4 N2 = 2 x (PLLPOST+1)
CLKDIVbits.PLLPRE = 2; // N1 = 4 N1 = PLLPRE + 2
// Fosc calculation equation:
// Fosc = Fin x M/(N1+N2) = 8x64/(4x4) = 32MHz
// Fcy = 0.5Fosc = 16MIPs
/******* Clock Switching *******/
// Set New Oscillator Selection
__builtin_write_OSCCONH(3);
// Request Clock Switching by Setting OSWEN bit
__builtin_write_OSCCONL(1);
// Wait for Clock switch to occur
while(OSCCONbits.LOCK != 1);
...
}
tại vì trong datasheet của dsPIC33F, mình thấy nó ghi là không nên thay đổi những thông số của PLL, nên để lúc đầu là internal FRC rồi chỉnh thông số, rồi sau đó hãy chuyển sang PriO w/ PLL
Nhưng bạn thấy trên phần init_Timer1 của mình intialize như vậy thì đúng là nếu như dsPIC chạy ở 16 MIPs thì timer sẽ interrupt ở 1ms chứ?
Hơn nữa, đây là intterupt trong timer1 để mình kiểm tra:
Code:
// Timer 1 Interrupt Routine
void __attribute__((__interrupt__)) _T1Interrupt( void )
{
_count++;
home_it();
line_2();
LATAbits.LATA4 = ~LATAbits.LATA4;
if ( _count==1000 )
{
_count = 0;
LATAbits.LATA5 = ~LATAbits.LATA5; // PORTA.5 nối với đèn LED
}
IFS0bits.T1IF = 0; // Clear Timer 1 flag
}
đáng lý ra thì cứ phải 1s là đèn LED sẽ nhấp nháy, vậy mà chắc cũng 10s...