Friday, April 11, 2014

Bài 5.(MSP430_Basic) Clock

Trước hết trước khi bắt đầu các bạn nếu chưa có datasheet của dùng MSP430 thì có thể download tại đây : http://www.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=slaa559&fileType=pdf.
Lưu ý Datasheet vẫn luôn là tài liệu quan trọng nhất khi bạn tiếp cận bất cứ dòng vi điều khiển nào , nên việc thành thạo tiếng Anh và khả năng đọc Datasheet vẫn là quan trọng nhất. 
Tài liệu được viết cho MSP430G2553,các chip khác có module khác mã sẽ không sử dụng được thư viện đi kèm.
Khi lập trình cho một con vi điều khiển nào đó, một trong những điều quan trọng đầu tiên chúng ta phải làm đó là config clock (chọn nguồn xung nhịp sử dụng) . Đây là một việc rất quan trọng, đặc biệt khi các bạn làm các project liên quan đến xử lý thời gian thực. Yêu cầu độ chính xác cao về clock. Mục tiêu của tài liệu này:
1.  Các bạn sẽ hiểu về các thanh ghi điều khiển việc cấp xung clock
2.  Cấu hình chúng để phù hợp với project của mình
3.  Hiểu rõ các đặc điểm về nguồn xung DCO có sẵn bên trong VĐK(xung nội).
(dùng cho khi các bạn chưa sử dụng đến nguồn xung ngoại như thạch anh).

Tài liệu đầu tiên mà mình muốn các bạn xem ở đây là User guide của dòng Valueline. (VĐK trên kit launchpad thuộc dòng value line).
Các bạn có thể down ở đường link sau : http://www.ti.com/lit/pdf/slau144
Chú ý đến phần:     5. Basic Clock Module +


1.Giới thiệu:
Nguồn xung Clock của MSP430 được chia làm 2 lớp.


-          Lớp đầu tiên là các nguồn tạo ra xung clock:
o   LFXT1CLK: Bộ dao động tần số thấp/ tần số cao, nó có thể được sử dụng với tần số
thạch anh 32768 Hz hoặc tần số thạch anh chuẩn, hoặc bộ cộng hưởng từ  450 KHz đến 8 MHz.
o   XT2CLK: Bộ dao động tần số cao. Bộ dao động này có thể được sử dụng với thạch
anh chuẩn, bộ cộng hưởng, hoặc nguồn xung Clock bên ngoài có tần số từ 450 KHz đến 8 MHz.
o   DCOCLK: Bộ dao động được điều khiển bằng kĩ thuật số ( DCO).
o   VLOCLK : Bộ dao động tần số thấp giống DCOCLK

-          Có 3 tín hiệu clock đầu ra cơ bản là :
o   ACLK (Auxiliary clock ) : Có thể sử dụng nguồn LFX1CLK và VLOCLK. Có thể tạo được tần số nhỏ hơn nữa bằng cách sử dụng các bộ chia 1, 2, 4, 8. Dùng cho các module ngoại vi.
o   MCLK (Master clock) : Có thể sử dụng nguồn LFX1CLK, VLOCLK, XT2CLK và DCOCLK. Dùng cho hệ thống và CPU.
o   SMCLK (Sub-main clock) : Cũng có thể sử dụng 4 nguồn trên và dùng cho các module ngoại vi.
Clock của MSP430 có thể coi là bước cải tiếp lớn so với các dòng VĐK khác với rất nhiều ưu điểm như:
o   Xung nội có sai số nhỏ ( 1 – 3% tùy dòng)
o   Chỉnh tần số bằng phần mềm
o   Chế độ ngủ thông minh,có thể ngủ hoặc thức dậy rất nhanh,không bị treo khi ngủ
o   Có nhiều lựa chọn nguồn xung clock riêng biệt cho từng module


2.Hoạt động :

Ở trạng thái mặc định cơ bản chúng ta có 2 tín hiệu SMCLK và MCLK lấy nguồn từ xung nội DCO tần số f khoảng 1.1MHz. Về sau các bạn sẽ hiểu được vì sao ta lại có tần số này.

Để cấu hình module clock chúng ta sẽ sử dụng 4 thanh ghi :
DCOCTL : DCO control register
BCSCTL1: Basic clock system control register
BCSCTL2: Basic clock system control register
BCSCTL3: Basic clock system control register

Và 1 thanh ghi cũng được sử dụng nhưng mình không nói đến ở đây đó là Status register. Với 4 bit SCG1, SCG0,OSCOFF,CPUOFF nó sẽ quyết định các chế độ hoạt động của basic clock system.Trạng thái mặc định là 4 bit này đều bằng 0.



Mình sẽ giới thiệu sơ về cấu tạo và hoạt động của từng thanh ghi này. Và ở đây mình sẽ nói về hoạt động của DCO, các phần khác như LFXT1CLK hay XT2CLK và 1 phần cũng rất hay đó là đồng bộ clock mình sẽ nói ở các bài khác.


2.1.DCO control register:



-          DCOx : tần số DCO được lựa chọn. Có 3 bit nên ta sẽ có 8 mức được lựa chọn, nó sẽ kết hợp với range của nó (RSELx) xác định ở thanh ghi BCSCTL1, ta sẽ có được một tần số xác định.
-          MODx : điều chế tần số, sẽ có công thức tính được tần số mà chúng ta sẽ có được khi sử dụng điều chế. Công thức này có ghi trong tài liệu user guide.Nhưng ở đây mình sẽ bỏ qua phần này do đó các bạn để MOD = 0;

Minh họa về tần số được lựa chọn :



Như có thể thấy, ứng với mỗi mức DCO và RSEL ta sẽ xác định được 1 tần số xác định. Về con số cụ thể cho từng con thì các bạn có thể down datasheet của từng con để theo dõi,hoặc có thể dùng phần mềm để tính toán dựa trên thạch anh ngoài.
 Ví dụ như con MSP430 G2553 : (có trong kit launchpad )


Các bạn có thể thấy ví dụ với RSELx = 0 , DCOx = 3, MODx = 0 thì ta có f = 0.12Mhz.Chú ý là tần số này phụ thuộc vào điện áp nên với mỗi nguồn cấp khác nhau điện áp ra sẽ khác nhau.



Basic clock system control register 1 : BCSCTL1


Nhìn vào đây các bạn có thể thấy được hoàn toàn đơn giản thôi, ví dụ như chúng ta đang muốn sử dụng DCOCLK (việc chọn này sẽ có ở BCSCTL2 ) thì chúng ta sẽ bật bit 7; chọn range để xác định được tần số sẽ được sử dụng, có 4 bit nên ta sẽ có 16 mức range (có thể xem lại hình vẽ trước). Mình có thể đưa ra 1 ví dụ :

Ta đặt :
DCOCTL = 0x60;    \\ hay DCOCTL = 8’b01100000 ;
                 \\ hay DCOCTL |= DCO1 + DCO0 + MOD0;
                \\ DCOx = 3; MODx =0

BCSCTL1 = 0x80    \\ hay BCSCTL1 =  8’b10000000 ;
                \\ RSELx = 0

Ta vừa cấu hình để cho DCOCLK phát ra xung nhịp là 0.12Mhz.


Basic clock system control register 2: BCSCTL2


-          SELMx : Lựa chọn source cho MCLK.
-          DIVMx : hệ số chia , tần số clock của MCLK sẽ được chia cho hệ số chia tương ứng.
-          SELS : Chọn source cho SMCLK.
-          DIVSx : hệ số chia của SMCLK.



Basic clock system control register 3 :


Bây giờ mình sẽ giải thích vì sao ban đầu mặc định clock là khoảng 1.1Mhz và clock source là DCO



Các bạn chú ý đến cột cuối cùng initial state : Thế các giá trị tương ứng vào các thanh ghi và các bạn sẽ tạo ra xung 1.1Mhz


Thực hành:  
Bây giờ mình sẽ làm 1 ví dụ đơn giản về việc tạo xung clock đúng 1s. Tất nhiên không thể chính xác 100% và người ta cũng không hay sử dụng nguồn xung nội cho các ứng dụng thời gian thực vì sự không ổn định của nó. Nhưng ví dụ này sẽ giúp cho các bạn hiểu được basic clock module và cách vận hành nó, dễ dàng tiếp cận hơn khi chúng ta làm việc với nguồn xung ngoại. Hầu hết các tên thanh ghi, các bit quan trọng của 1 số thanh đều được defined trong file thư viện của nó, các bạn có thể tìm hiểu thêm trong file thư viện để có thể dễ dàng viết hơn.

Ví dụ như thay vì viết :

DCOCTL = 0xC0 ;
Ta có thể viết :
DCOCTL = DCO1 + DCO2 + MOD0 ;

Code :



#include "msp430g2553.h"
/*       Khai báo loại chip đang dùng
 *       Thư viện này chứa các khai báo tên #define cho địa
 *       chỉ các thanh ghi
 */
void main(void)
{
          WDTCTL = WDTPW + WDTHOLD;    // watchdog timer setup
          if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
          {
                   while(1);               // If cal constants erased,
          }                                     // trap CPU!!
          BCSCTL1 = 0x80;             // Set range = 0x80 ; RSEL = 0;
    // DCOCTL = 0xC0;                  // DCO=3; MOD = 0
    DCOCTL |= DCO1 + DCO0 + MOD0; // DCO=3; MOD = 0
          //=======> f = 0.12Mhz
          P1DIR = 0x40;                            // I/O setup
          P1OUT = 0;
          BCSCTL2 |= SELM_0 + DIVM_3; // select DCOCLK  ; divide = 8
          // ===> f = 0.12 / 8 MHz
          while(1)
          {
                   P1OUT = ~P1OUT;         // LED on
                   // ta có f =1/15000 Hz  để có xung 1s thì ta
                   //khởi tạo delay với số chu kì là15000.
                   _delay_cycles(15000);  // delay 15000 cycles
                   // tuong ung neu de divider = 1 (DIVM_0) thi so delay cycle = 120000
                   //==========> f_out = 1Hz
          }
}




Các bạn hãy chọn thử tìm 1 tần số khác và số chu kì phù hợp để tạo được chu kì 1s
để kiểm tra lại điều này.

Chú ý: MSP430 được cung cấp các define cái giá trị DCOCTLBCSCTL1 cho phép nhanh chóng chỉnh tần số có sẵn là 1MHZ , 8MHZ , 12MHZ , 16MHZ . Ví dụ để chỉnh tần số 8Mhz,có thể viết:
DCOCTL = CALDCO_8MHZ;
BCSCTL1 = CALBC1_8MHZ;
Các giá trị này được lưu ở SegmentA của Flash nên cần hết sức chú ý khi ghi dữ liệu vào Flash



Minh họa khả năng thay đổi tần số linh hoạt của MSP430:


#include "msp430g2553.h"
#include "Library/Clock.h"
#include "Library/UART.h"
/*         Khai báo loại chip đang dùng
 *         Thư viện này chứa các khai báo tên #define cho địa
 *         chỉ các thanh ghi
 */
unsigned char i=0;
void main(void)
{
            WDTCTL = WDTPW + WDTHOLD;    // watchdog timer setup
            P1DIR|=BIT0;
            Select_Clock(DCO_1MHZ);
            SMCLK_F=1000000;
            UART_Init();
            for(i=0;i<2;i++)
            {
                        P1OUT ^= BIT0;         // LED on
                        _delay_cycles(1000000);  // delay 15000 cycles
            }
            UART_Write_Char(10);
            UART_Write_Char(10);
            UART_Write_String("Test CLK 1Mhz");

            Select_Clock(DCO_12MHZ);
            SMCLK_F=12000000;
            UART_Init();
            for(i=0;i<2;i++)
            {
                        P1OUT ^= BIT0;         // LED on
                        _delay_cycles(12000000);  // delay 15000 cycles
            }
            UART_Write_Char(10);
            UART_Write_String("Test CLK 12Mhz");

            Select_Clock(DCO_8MHZ);
            SMCLK_F=8000000;
            UART_Init();
            for(i=0;i<2;i++)
            {
                        P1OUT ^= BIT0;         // LED on
                        _delay_cycles(8000000);  // delay 15000 cycles
            }
            UART_Write_Char(10);
            UART_Write_String("Test CLK 8Mhz");

            Select_Clock(DCO_16MHZ);
            SMCLK_F=16000000;
            UART_Init();
            UART_Write_Char(10);
            UART_Write_String("Test CLK 16Mhz");
            while(1)
            {
                        P1OUT ^= BIT0;         // LED on
                        _delay_cycles(16000000);  // delay 15000 cycles
            }
}


   Ngoài ra các bạn cũng cần biết khi sử dụng xung nội là xung nội của MSP430 phụ thuộc vào điện áp,tức là cùng 1 thông số DCOCTL và BCSCTL thì ở các điện áp khác nhau sẽ ra tần số khác nhau,hoặc trong một số trường hợp các bạn xóa Flash ở SegmentA,có thể chỉnh lại tần số chuẩn bằng chương trình sau : Calib_Clock
Download thư viện Clock tại đây
Chúc các bạn thành công!

Bài tiếp theo :Bài 6.(MSP430_Basic) Flash Memory



 

No comments:

Post a Comment

END COMMENT FACEBOOK-->