Etiket arşivi: oscillator configuration

Initialize( )

İşlemcinin başlatılmasına sistem saatini ayarlayarak başlıyorum. 12MHz kristal ile 120MHz osilatör çalıştıracağım (bu 60MHz sistem saati demek).
Mevcut ayarlarla bende sorun olmuyor ama PLL’i konfigüre ederken çarpım/bölüm işlemlerinin hiçbir ara adımında belirtilen sınırların dışına çıkmamanız gerekiyor. Bu, özellikle düşük harici kristal değerleri için olanaksız olabilir. Böyle durumlarda en mantıklı olan işlemciyi RC osilatörle başlatıp sonra kristale geçmek ve PLL’i açmak.

PLL bloğunun kristal girişini sistem saati çıkışına dönüştürmesi aşağıdaki sıralamayla oluyor:

XTAL >>>> /N1 (PLLPRE+2) >>>> xM (PLLDIV+2) >>>> /N2 (2*PLLPOST+1) >>>> Fosc


// PLL konfigürasyonu:
PLLFBD = 38;              // (2) : M=40  : 6*40  = 240
CLKDIVbits.PLLPRE = 0;    // (1) : N1=2  : 12/2  = 6
CLKDIVbits.PLLPOST = 0;   // (3) : N2=2  : 240/2 = 120 MHz

// Bu PLL ayari bize 60MHz komut cycle'i veriyor..
// Clock Switch: Primary Oscillator with PLL (NOSC=0b011)
__builtin_write_OSCCONH(0x03);
__builtin_write_OSCCONL(OSCCON | 0x01);
// Clock switch bekle:
while (OSCCONbits.COSC!= 0b011);
// PLL'in kilitlenmesini bekle:
while (OSCCONbits.LOCK!= 1);