Showing posts with label LẬP TRÌNH MSP430. Show all posts
Showing posts with label LẬP TRÌNH MSP430. Show all posts

Tuesday, April 7, 2015

BÀI 6: (MSP430 - BASIC) - ADC

1. Giới thiệu chung ADC

Module ADC 10bit của MSP430x2xx là module chuyển tín hiệu tưng tự thành tín hiệu số 10bit , hỗ trợ việc đọc với tốc độ tối đa 200ksps(Tức là chu kỳ 200.000 lần lấy mẫu/s) ,có chế độ truyền dữ liệu DTC ( Truyền dữ liệu đến bất cứ đâu trong bộ nhớ mà không cần sự can thiệp của CPU).Đặc điểm cơ bản:
-       ADC 10 bit tốc độ lấy mẫu 200ksps
-       Chọn điện áp tham chiếu 1,5V hoặc 2,5V VCC hay điện áp tham chiếu ngoài
-       8 kênh chuyển đổi , kênh cảm biến nhiệt độ bên trong chip
-       Chuyển đổi đơn kênh,lặp 1 kênh,trình tự,lặp đi lặp lại
-       Tự động truyền dữ liệu vào bộ nhớ (Chức năng tượng tự DMA,ưu điểm so với các dòng VĐK đời cũ)

Sơ đồ khối:

Các chân có hỗ trợ chức năng ADC sẽ được ký hiệu Ax ,ví dụ A0 – Kênh ADC0 ; A1-Kênh ADC1

2. Lõi ADC10

         ADC 10bit có nhiệm vụ chuyển đổi điện áp đầu vào , so sánh với điện áp tham chiếu và xuất ra thanh ghi ADC10MEM . Điện áp tham chiếu là VR+ và VR- .Giá trị số hóa của điện áp đầu vào tính bằng công thức sau:
         Trong đó :    
o    Vin :Điện áp đầu vào
o   VR+:Điện áp tham chiếu mức dương (Có thể chọn bằng lập trình)
o   VR-: Điện áp tham chiếu mức âm (Có thể chọn bằng lập trình)
Khi tín hiệu đầu vào cao hơn hoặc bằng VR+ thì Nadc = 1023 và khi nhỏ hơn VR- thì bằng 0 .Kết quả có thể lưu ở dạng thường hoặc mã bù 2 . Lõi ADC được điều khiển bằng 2 thanh ghi ADC10CTL0 và ADC10CTL1 .Lõi chỉ hoạt động khi bit ADC10ON =1 . Bit ENC = 0 thì mới cho phép chỉnh sửa thông số các thanh ghi ADC và khi ENC =1 thì việc chuyển đổi mới được thực hiện .

3. Chọn tốc độ chuyển đổi

          ADC10 có thể dùng được cả nguồn xung nội và ngoại từ MCLK , SMCLK , ACLK , từ chân ADC10OSC bằng ADC10SEELx trong thanh ghi ADC10CTL1 .Các bạn cần chú ý khi dùng nguồn xung ngoại từ chân ADC10OSC là tần số cấp không được quá 5Mhz tuy dòng.

4. Chọn cổng chuyển đổi

         Thực chất trong mỗi chip MSP430 chỉ có một bộ chuyển đổi ADC,các cổng cần chuyển đổi ADC sẽ được lần lượt kết nối với bộ ADC qua một bộ MUX .Các cổng được phép chuyển đổi ADC có thể được chọn từ thanh ghi ADC10AEx,các bạn cần quan tâm đến các thanh ghi này vì các cổng khi được chọn ở chế độ ADC sẽ loại bỏ các bộ buffer input và output của chức năng GPIO,từ đo cho phép tiết kiệm điện.

5. Điện áp quy chiếu

Điện áp tham chiếu của ADC có thể chọn rất đa dạng , từ nguồn cấp nội 1.5V 2.5V hay nguồn cấp ngoài VCC hoặc từ chân VREF+ và VREF - .
-       REFON = 1 , Điện áp tham chiếu nội được chọn.
o   REF2_5=1,Điện áp tham chiếu là 2.5V
o   REF2_5=0,Điện áp tham chiếu là 1.5V
-       REFOUT = 1 , Điện áp tham chiếu ngoài được sử dụng nếu chip có sẵn pin Vref+ và Vref-  tương ứng ở chân A4 và A3.
Khi sử dụng điện áp tham chiếu ngoại thì nên tắt nguồn điện áp tham chiếu nội để bảo vệ nguồn.

6. Quá trình biến đổi và lấy mẫu


Biến đổi A-D được bắt đầu khi có xung cạnh lên của tín hiệu vào SHI. SHI được lựa chọn bởi bit SHSx từ các nguồn:
-       ADC10SC
-       Timer_Ax.1
-       Timer_Ax.0
-       Timer_Ax.2
Bit ISSH dùng để đảo chiều tín hiệu SHI. Bit SHTx dùng lựa chọn chu kỳ lấy mẫu là 4, 8, 16, hoặc 64 ADC10CLK. SAMPCON được điều khiển bằng bit ADC10SHTx và MSC trong thanh ghiADC10CTL0 (xem sơ đồ trên) . Tsample là thời gian lấy mẫu. Khi SAMPCON từ mức cao xuống thấp thì quá trình biến đổi A-D bắt đầu. Khi SAMPCON = 0 thì tất cả các ngã vào Ax có tổng trở cao. Khi SAMPCON = 1 thì ngã vào Ax giống như một bộ lọc thong thấp RC trong suốt thời gian lấy mẫu.

+ Thời gian lấy mẫu

         Khi bit SAMPCON = 0 , tất cả các chân Ax được chọn từ ADC10AEx ở trạng thái trở kháng cao.Khi SAMPCON = 1, chân Ax được chọn giống như một bộ lọc thông thấp RC (là bộ giúp loại bỏ nhiễu tần số cao) trong thời gian Tsample, khi đó chân Ax được nối với trở Ri và tụ Ci . Nói chung phải cài đặt thời gian lấy mẫu Tsample và điện trở ngoài Rs sao cho BĐT sau thỏa mãn :
Với :  Sr = 1us/V khi ADC10SR=0 và 2us/V khi ADC10SR=1
          Vref : Điện áp tham chiếu ngoài

7. Chế độ hoạt động

Nói chung có 4 chế độ hoạt động cho ADC ,về chi tiết các bạn có thể xem trong datasheet , ở đây mình chỉ hướng dẫn đặc điểm từng chế độ và các cài đặt. Thay đổi bit CONSEQx (trong thanh ghi ADC10CTL1) để chọn chế độ hoạt động. Kết quả lưu trong ADC10MEM.
-       Biến đổi từng kênh
o   CONSEQx = 00
o   Kênh cần biến đổi ADC được chọn từ bit INCHx.Bit ADC10SC dùng để kích hoạt sự biến đổi.ENC phải được đảo trạng thái sau mỗi lần biến đổi.
-       Biến đổi 1 dãy kênh
o   CONSEQx = 01
o   Biến đổi 1 dãy kênh,bắt đầu ở kênh được chọn trong INCHx,kết thúc ở A0. Bit ADC10SC dùng để kích hoạt sự biến đổi.ENC phải được đảo trạng thái sau mỗi lần biến đổi.
-       Biến đổi từng kênh lặp lại
o   CONSEQx = 10
o   Kênh được chọn trong INCHx được lấy mẫu và biến đổi liên tục
-       Biến đổi dãy kênh lặp lại
o   CONSEQx = 11
o   Dãy kênh bắt đầu ở INCHx và kết thúc ở A0 được lấy mẫu và biến đổi lần lượt.
Khi MSC = 1 và CONSEQx > 0 thì cạnh lên đầu tiên của SHI sẽ kích hoạt biến đổi. Sự biến đổi vẫn tiếp tục cho đến khi dãy kênh được biến đổi xong mặc dù trong quá trình biến đổi xuất hiện những xung cạnh lên ở tín hiệu kích hoạt SHI. Chức năng của Bit ENC không thay đổi khi sử dụng Bit MSC.  

8. Bộ điều khiển chuyển tiếp dữ liệu DCT

ADC10 có một bộ điều khiển chuyển giao dữ liệu ( DTC), nó sẽ tự động chuyển kết quả của biến đổi A-D từ thanh ghi ADC10MEM sang bộ nhớ của Chip. DTC được cho phép khi thiết lập thanh ghi ADC10DTC1 có giá trị khác 0. Khi DTC được cho phép, mỗi khi ADC10 hoàn thành việc biến đổi và lưu kết quả vào thanh ghi ADC10MEM thì việc chuyển giao dữ liệu được kích hoạt. Mỗi DTC yêu cầu một CPU MCLK. Không được sử dụng các bus có dữ liệu mà DTC truyền vào để tránh xung đột,nên để CPU ngừng chạy. DTC không được khởi tạo khi ADC10 đang bận.
Nếu bit ADC10CT được thiết lập thì chế độ DCT sẽ không dừng lại sau khi hoàn thành chuyển giao,mà sẽ reset và quay lại chuyển đổi trong chu kỳ mới.Ngược lại DCT sẽ dừng sau khi hoàn tất chu kỳ chuyển đổi.

8.1. Chế độ chuyển giao 1 khối

Được kích hoạt khi Bit ADC10TB Reset. Giá trị n trong ADC10TC1 xác định số lương chuyển giao cho một khối. Địa chỉ bắt đầu của khối là thanh ghi 16 Bit ADC10SA. Địa chỉ kết thúc là ADC10SA + 2n – 2.
Địa chỉ con trỏ bên trong được khởi tạo bằng ADC10SA và bộ đếm chuyển giao được khởi tạo bằng ‘n’. DTC chuyển giao giá trị từ ADC10MEM sang địa chỉ con trỏ ADC10SA. Sau mỗi lần chuyển giao thì địa chỉ con trỏ tăng 2 và bộ đếm giảm 1. DTC tiếp tục chuyển giao từ ADC10MEM cho đến khi bộ đếm giảm xuống băng 0. Khi sử dung DTC trong chế độ chuyển giao một khối thì cờ ADC10IFG được Set sau mỗi khối được chuyển giao hoàn thành.

8.2. Chế đội chuyển giao 2 khối

          Được chọn khi Bit ADC10TB được Set. Giá trị n trong ADC10TC1 xác định số chuyển giao trong một khối. Địa chỉ đầu tiên trong thanh ghi ADC10SA. Địa chỉ kết thúc của khối đầu tiên là ADC10SA + 2n – 2. Dãy địa chỉ của khối thứ 2 được xác định từ SA + 2n đến SA + 4n – 2. Địa chỉ con trỏ bên trong được khởi tạo bằng ADC10SA và bộ đếm chuyển giao được khởi tạo bằng ‘n’. DTC chuyển giao giá trị từ ADC10MEM sang địa chỉ con trỏ ADC10SA. Sau mỗi lần chuyển giao thì địa chỉ con trỏ tăng 2 và bộ đếm giảm 1. DTC tiếp tục chuyển giao từ ADC10MEM cho đến khi bộ đếm giảm xuống bằng 0. Ở thời điểm này, khối thứ nhất đầy, cờ ADC10IFG và Bit ADC10B1 thì được Set. DTC tiếp tục với khối 2. Bộ đếm chuyển giao bên trong tự động nạp lại giá trị n. DTC bắt đầu chuyển kết quả biến đổi từ ADC10MEM sang khối 2. Sau n lần chuyển giao hoàn thành thì khối 2 đầy. Cờ ADC10IFG Set, Bit ADC10B1 được clear.

8.3. Chu ký thời gian chuyển đổi DCT



9. Ngắt ADC10

        Một ngắt và một véc tơ ngắt được ghép với ADC10. Khi DTC không được sử dụng ( ADC10DTC1= 0), ADC10IFG được Set khi kết quả biến đổi A-D được tải xuống ADC10MEM. Khi DTC được sử dụng ( ADC10DTC1 > 0), ADC10IFG được Set khi sự chuyển giao một khối được hoàn thành và bộ đếm chuyển giao bằng 0. Nếu cả hai Bit ADC10IE và GIE được Set,ADC10IFG sẽ sinh ra một ngắt yêu cầu. Cờ ADC10IFG tự động Reset khi ngắt yêu cầu được duy trì hoặc có thể được Reset bằng phần mềm. 

10. Tập thanh ghi

         ADC10 của MSP430 có rất nhiều thanh ghi điều khiển,để xem chi tiết các bạn đọc thêm trong datasheet,ở đây mình không tiện liệt kê toàn bộ.

11. Lập trình

           Các chế độ hoạt động của ADC10 rất phức tạp,nên rất khó viết thư viện ADC hoàn chỉnh , dưới đây mình thực hiện thử 2 đoạn chương trình đó là đọc ADC ở chế độ đơn kênh và chế độ đơn kênh lặp lại.
      Trong ví dụ này mình sẽ thực hiện đọc điện áp ở chân A0 và điện áp VCC/2 dùng điện áp tham chiếu nội 2.5V .Các bạn có thể nối 1 biến trở có đầu xoay nối với chân A0 ,2 đầu còn lại nối VCC và GND trên Kit
Bắt đầu các bạn nên viết hàm khởi tạo cho ADC.Các cài đặt cần làm
-       Set bit ENC=0 thì mới có thể chỉnh sửa được thanh ghi ADC10CTL0 và ADC10CTL1
-       Chọn các chân Ax có chuyển đổi ADC (ADC10AE0),mục đích của việc này đế tách các chân này khỏi khối GPIO.
-       Chọn tần số lấy mẫu,bật module ADC10
-       Chọn điện áp tham chiếu.Cần chú ý bit SREFx.Phân biệt giá trị Vref+ là các điện áp tham chiếu nội ,trong khi Veref+ và Veref- là 2 chân điện áp tham chiếu ngoài(Xem Sơ đồ chân).Khi muốn dùng điện áp tham chiếu nội thì Vr+ phải được nối với Vref+(vì thế ta chọn SREF_1).Khi muốn dùng điện áp tham chiếu ngoài có thể chọn SREF_2.
-       Khi muốn dùng điện áp tham chiếu ngoài ở các chân Veref thì phải set REFOUT=1
-       Cuối cùng là bật ENC và ADC10ON để cho phép module hoạt động

Code tham khảo như sau:

#include "msp430g2553.h"
void main(void)
{
     P1DIR |= 0x01;
     ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE;
     ADC10CTL1 = INCH_1;
     ADC10AE0 |= 0x02;
     while(1)
     {
          ADC10CTL0 |= ENC _ADC10SC;
          while(ADC10CTL1&1);
          if(ADC10MEM < 0x88)
               P1OUT &=~ 0x01;
          else
               P1OUT |= 0x01;
     }
}

VIDEO HƯỚNG DẪN






Saturday, March 7, 2015

BÀI 5: (MSP430 - BASIC) - TIMER



Tổng quát về Timer_A


• Thanh ghi Timer/Counter 16 bit cùng với 2 thanh ghi Capture/Compare.
• Có thể hoạt động ở 4 chế độ khác nhau.
• Hỗ trợ đa chức năng:Capture /Compare,ngõ ra PWM và định thì từng khoảng thời gian.
• Có các chế độ ngắt Timer/Counter và Capture/Compare.
• Có thể lựa chọn để hoạt động với các nguồn xung Clock khác nhau.

Các chức năng cụ thể của Timer A như sau:
1. Nguồn xung Clock:Timer A có thể hoạt động với 1 trong 4 nguồn xung clock sau, tùy thuộc vào yêu cầu của ứng dụng mà bạn cần thực hiện.
• TACLK (Timer A clock): Là một nguồn xung clock ngoại
• ACLK (Auxiliary clock): Là một nguồn clock bổ sung cho Timer A, chỉ được cấp nguồn từ LFXTCL, thường dùng cho hệ thống phụ với clock hoạt động thấp để tiết kiệm năng lượng.
• SMCLK (Submaster clock): thường dùng cho ngoại vi, lấy nguồn từ DCO hoặc XT2.

2. Timer/Counter:Các chế độ hoạt động:
Stop : tắt Timer A.

Up : Chế độ đếm lên của Timer A. Giá trị của thanh ghi TAR (Timer A register) sẽ tăng liên tục từ 0 cho đến một giá trị được định sẵng trong thanh ghi TACCR0 rồi reset về giá trị 0,quá trình hoạt động cứ tiếp tục như vậy.




Continous: Chế độ đếm lên liên tục của Timer A.Trong một chu kỳ hoạt động giá trị của thanh ghi TARsẽ tăng liên tục từ 0 cho đến 0FFFFh rồi reset về giá trị 0.




Up/Down: Chế độ đếm lên/xuống của Timer A. Trong một chu kỳ hoạt động giá trị của thanh ghi TAR sẽ tăng liên tục từ 0 cho đến TACCR0 rồi giảm dần về giá trị 0.




2. Các phương pháp reset Timer_A
- Ghi 0 vào thanh ghi TAR
- Ghi 0 vào thanh ghi TACCR0
- Thiết lập Bit TACLR trong thanh ghi điều khiển Timer (TACTL)

3.Chế độ Capture
Được sử dụng cho sự đo lường chu kỳ thời gian của các sự kiện với các sự can thiệp rất nhỏ của CPU
- Set Bit CAP để lựa chọn chế độ này
- Set Bit SCS đề đồng hồ Capture với khối Timer kế tiếp
- Tín hiệu vào được lấy mẫu bởi CCIxA, được lựa chọn bởi Bit CCISx trong thanh ghi TACCTLx
- Thiết lập Bit CMx để lựa chọn các chế độ Capture
- Khi một xung hợp lệ được phát hiện trên ngã vào thì giá trị trong TAR được chốt trong thanh ghi TACCRx cung cấp một mốc thời gian cho sự kiện
- Cờ ngắt CCIFG được Set
- Bit COV = 1 điều khiển sự tràn sự kiện khi một capture thứ 2 được sử dụng, trước khi giá trị từ capture đầu tiên được đọc

4. Chế độ Compare
Sử dụng để tạo ra những xung ngã ra và điều chỉnh độ rộng xung ngã ra
- Reset Bit CAP để lựa chọn chế độ Compare
- TAR đếm lên đến giá trị được lập trình trong thanh ghi TACCRx
- Khi giá trị Timer bằng giá trị trong thanh ghi TACCRx thì ngắt được sinh ra. Cờ ngắt CCIFG thì Set, EQUx=1
- EQUx có tác dụng so sánh tín hiệu ngã ra OUTx phù hợp với OUTMODx
- Tín hiệu vào CCI được chốt trong SCCI

5. Hoạt động ngã ra




Các thanh ghi Timer_A



1. TACTL, Timer_A control

- TASSELx: Lựa chọn nguồn xung clock Timer_A

  • 00 TACLK
  • 01 ACLK
  • 10 SMCLK
  • 11 INCLK

- IDx: Bộ chia tín hiệu vào

  • 00   /1
  • 01   /2
  • 10   /4
  • 11   /8

- MCx: Bit điều khiển

  • 00 STOP
  • 01 UP
  • 10 CONTINUOUS
  • 11 UP/DOWN
- TACLR: Xóa Timer_A. Set bit này sẽ reset TAR, IDx
- TAIE: Cho phép ngắt Timer_A
  • 0  Không cho phép ngắt
  • 1  Cho phép ngắt
- TAIFG: Cờ ngắt Timer_A
  • 0  Không có trì hoãn ngắt
  • 1  Có trì hoãn ngắt
2. TAR, Timer_A counter

3. TACCTLx, Capture/Compare control

- CMx: Chế độ Capture
  • 00  Không Capture
  • 01  Capture trên cạnh lên
  • 10  Capture trên cạnh xuống
  • 11 Capture trên cả 2 cạnh lên và xuống
- CCisx: Lựa chọn ngã vào Capture/Compare
  • 00  CCIxA
  • 01  CCIxB
  • 10  GND
  • 11  VCC
- SCS: Đồng bộ nguồn Capture
  • 0  Không đồng bộ
  • 1  Đồng bộ
- SCCI: Đồng bồ ngã vào Capture/Compare. Lựa chọn tín hiệu vào CCI thì được chốt với tín hiệu EQUx và có thể đọc thông qua bit SCCI

- CAP: Chọn chế độ
  • 0  Compare
  • 1  Capture
- OUTMODx: Chọn chế độ ngã ra
  • 000  Out
  • 001  Set
  • 010  Toggle/Reset
  • 011  Set/Reset
  • 100  Toggle
  • 101  Reset
  • 110  Toggle/Set
  • 111  Reset/Set
- CCIE: Cho phép ngắt Capture/Compare.
  • 0  Không cho phép ngắt
  • 1  Cho phép ngắt
- CCI: Ngã vào Capture/Compare có thể đọc bới bit này
- OUT: Ngã ra
  • 0  Mức thấp
  • 1  Mức cao
- COV: Sự tràn Capture
  • 0  Không xuất hiện tràn Capture
  • 1  Xuất hiện tràn Capture
- CCIFG: Cờ ngắt Capture/Compare
  • 0  Không có trì hoãn ngắt
  • 1  Có trì hoãn ngắt
4. TACCRx, Timer_A Capture/Compare
TACCRx: là thanh ghi Timer_A Capture/Compare
- Chế độ Capture: TAR được copy vào thanh ghi TACCRx khi Capture được sử dụng
- Chế độ Compare: Thanh ghi TACCRx chứa dữ liệu của sự so sánh giá trị Timer trong TAR

5. TAIV, Timer_A interrupt vector
TAIVx: Giá trị vector ngắt Timer_A
  • 00h  Không có trì hoãn ngắt
  • 02h  Cờ TACCR1 CCIFG
  • 04h  Cờ TACCR2 CCIFG
  • 06h  Được dự trữ
  • 08h  Được dự trữ
  • 0Ah Cờ TAIFG
  • 0Ch Được dự trữ
  • 0Eh Được dự trữ

Video hướng dẫn Timer_A



Sunday, February 8, 2015

BÀI 4 HỖ TRỢ: (MSP430 - BASIC) - TẠO NGUỒN XUNG 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
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 MẪU:

#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ị DCOCTL và BCSCTL1 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
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 : http://www.mediafire.com/download/r9hmwd1dzly4n2i/Calib.rar
Chúc các bạn thành công!