Dao động bằng thạch anh

thanhtdtttc

Trứng gà
mấy anh cho em hỏi khai báo như thế nào trong timer để có thể dùng dao động trong thạch anh !
cái bộ đếm DCO của chíp em có vấn đề ! đếm không đúng thời gian !
thank you
 

Manhdd

Cố Vấn CLB
Staff member
mấy anh cho em hỏi khai báo như thế nào trong timer để có thể dùng dao động trong thạch anh !
cái bộ đếm DCO của chíp em có vấn đề ! đếm không đúng thời gian !
thank you
Em chú ý xem qua Basic Clock Module+ Block Diagram, trang 279 trong User's Guide.
Clock DCO có ưu điểm là bộ đếm nội, tốc độ cao, nhưng chu kỳ không được chuẩn. Clock DCO thường là clock chính để chạy MCU, trong khi để căn chỉnh đúng thời gian thì ta thường dùng clock thạch anh ngoài thông qua Clock ACLK\LFXT1CLK.
Để sử dụng thạch anh, ta để P2.6 & P2.7 ở trạng thái mặc định khi reset (XIN & XOUT, không config thành GPIO).
Config bằng hàm Config_Clocks() trong lib Basic_config:
Code:
//*****************************************************************************
// Clocks Configurations
//*****************************************************************************
void Config_Clocks(void)
{
    if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) // Check if constants cleared
    {
      while(1);                        // If cal constants erased, trap CPU!!
    }
 
    BCSCTL1 = CALBC1_1MHZ;            // Set DCO range & ACLK prescaler
    // BCSCTL1 - Basic Clock System Control Register 1
        // XT2OFF  = XT2 off. This bit turns off the XT2 oscillator
        // XTS      = LFXT1 mode select. 1: High-frequency mode
        // DIVAx    = Divider for ACLK
        // RSELx    = Range select
    DCOCTL = CALDCO_1MHZ;              // Set DCO step + modulation
    // DCOCTL - DCO Control Register
        // DCOx    = DCO frequency select
        // MODx    = Modulator selection
    BCSCTL3 |= LFXT1S_2 + XCAP_3; // configure ACLK Source
    // BCSCTL3 - Basic Clock System Control Register 3
        // XT2Sx    = XT2 range select
        // LFXT1Sx  = Low-frequency clock select and LFXT1 range select
            // When XTS=0: 00 32768-Hz crystal on LFXT1
                        //10 VLOCLK 12 KHz
            // When XTS=1: 01 1-to 3-MHz crystal or resonator
                        //10 3-to 16-MHz crystal or resonator
        // XCAPx    = Oscillator capacitor selection. 11 ~12.5pF
        // XT2OF    = XT2 oscillator fault
        // LFXT1OF  = LFXT1 oscillator fault
    while(IFG1 & OFIFG)                // wait for OSCFault to clear
    {
      IFG1 &= ~OFIFG;
      __delay_cycles(100000);
    }
    // IFG1 - Interrupt Flag Register 1
        // OFIFG    = Oscillator fault interrupt flag
 
    //    _bis_SR_register(SCG1 + SCG0);    // Stop DCO
 
    BCSCTL2 |= SELM_0 + DIVM_0;        // select MCLK, SMCLK clock and prescaler
    // BCSCTL2 - Basic Clock System Control Register 2
        // SELMx  = Select MCLK. These bits select the MCLK source.
            //00 DCOCLK
            //01 DCOCLK
            //10 XT2CLK when XT2 present. LFXT1CLK or VLOCLK when XT2 not present
            //11 LFXT1CLK or VLOCLK
        // DIVMx  = Divider for MCLK
        // SELS    = Select SMCLK.This bit selects the SMCLK source.
            //0 DCOCLK
            //1 LFXT1CLK or VLOCLK when XT2 not present. XT2CLK when XT2 present.
        // DIVSx  = Divider for SMCLK
        // DCOR    = DCO resistor select
}
Hướng dẫn chi tiết có sẵn trong comment của hàm này. Sau đây là hướng dẫn sơ bộ:
- BCSCTL1, DCOCTL dùng config cho clock DCO (1->16MHz).
- BCSCTL3 cấu hình cho clock ACLK: gồm clock vào và tụ lọc. Ứng với XTS=0 (mặc định) thì:
+ LFXT1S_0 (00): clock vào là thạch anh 32768Hz (LFXT1CLK)
+ LFXT1S_2 (10): clock vào là xung nội 12KHz (VLOCLK)
- BCSCTL2: chọn clock vào và bộ chia tần số cho MCLK và SMCLK. Thường chọn đầu vào là DCO do tốc độ cao. MCLK là clock chính để chạy MCU nên thường không chia tần để không nhỏ hơn SMCLK.

Như vậy là xong phần clock nguồn, khi config các ngoại vi (Timer, ADC, ...) ta đều phải config clock đầu vào là MCLK, SMCLK hay ACLK. Chọn ngồn LFXT1CLK->ACLK->Ngoại vi thì ta sẽ dùng được dao động thạch anh cho ngoại vi.
 

Carue

Trứng gà
Trường hợp em muốn dung thạch anh 16MHz gắn bên ngoài để làm tần số dao động (chip msp430g2553 có hổ trợ không?) thì config thế nào:-s:-s em đọc không hiểu!?
 

Manhdd

Cố Vấn CLB
Staff member
Trường hợp em muốn dung thạch anh 16MHz gắn bên ngoài để làm tần số dao động (chip msp430g2553 có hổ trợ không?) thì config thế nào:-s:-s em đọc không hiểu!?
Không chạy được em ơi. MSP430 có dao động nội 16MHz. Mình chỉ dùng thạch anh 32768Hz bên ngoài để canh đúng chu kì thôi.
 

Carue

Trứng gà
Trường hợp em muốn dung thạch anh 16MHz gắn bên ngoài để làm tần số dao động (chip msp430g2553 có hổ trợ không?) thì config thế nào:-s:-s em đọc không hiểu!?
Không chạy được em ơi. MSP430 có dao động nội 16MHz. Mình chỉ dùng thạch anh 32768Hz bên ngoài để canh đúng chu kì thôi.
chỉ riêng họ Gxxx là không hổ trợ hả gì anh? hay là tất cả msp430 chỉ chạy xung nội thôi?
 

Manhdd

Cố Vấn CLB
Staff member
có dòng Value Line nó thế thôi, ít chân thì thế là tốt rồi :D
 
Top