NghiaJenius
Ban Chủ Nhiệm
Chào các bạn, trong buổi học ngày 27/03, các bạn đã được giới thiệu về bộ timer của MSP430G2553, cách đọc Datasheet và User Guide, và cách cấu hình timer trên CCS. Mình sẽ tóm tắt một số chỗ các bạn cần đọc thêm nếu hôm đó không đi học được:
1/ Đọc datasheet: trang 6,7,8,10,11, phần Port Pin Functions và Port Schematic từ trang 42.
Rút ra các nội dung sau:
- Pin nào thì có chức năng timer, capture input, tạo PWM, nhận xung clock từ bên ngoài.
- Đọc thêm phần Low Power Mode (trang 10) để biết về LPM, clock nào sẽ hoạt động, phần nào sẽ tắt khi vô LPM, khi nào thì thoát LPM.
2/ Đọc User Guide MSP430x2xx: từ trang 363 đến 403 (phần timer A và B) để nắm được:
- Khác nhau giữa Timer A và B.
- Một bộ timer có các chức năng gì (timer, capture, compare, xuất PWM), mỗi chức năng dùng để làm gì, ứng dụng khi nào.
- Cách cấu hình cho bộ timer: có bao nhiêu source clock có thể chọn, chọn qua bit nào, thanh ghi nào, cách chia clock ra sao, có bao nhiêu cách đếm timer ( up, down, continuous...), dùng interrupt timer như thế nào.
- Cách sử dụng các thanh ghi CCR (Capture Compare Register), tại sao cho tới 3 thanh ghi, dùng phối hợp với timer như thế nào. Cách dùng Interrupt và kiểm tra nội dung thanh ghi TAIV trong ngắt.
- Cách xuất PWM: có phải port nào cũng có sẵn chức năng đó không, dùng như thế nào, nếu không có thì làm sao để xuất xung PWM.
- Các bạn xem kĩ các phần: Timer Block Diagram, Các Mode và vị trí cờ ngắt được bật lúc đếm trong từng trường hợp, Output Example để biết cách sử dụng cờ ngắt và các thanh ghi CCR để xuất PWM.
3/ Bài tập về nhà:
Tương tự hôm trước, chúng ta có bài tập về nhà, sử dụng 8 LED và 2 nút nhấn.
Khác với hôm trước, sẽ có 2 LED sáng cùng 1 lúc, với độ sáng từng LED thay đổi được bằng 2 nút nhấn. Mỗi LED sẽ có 32 mức sáng từ 0% đến 100%.
- Không nhấn nút: 2 LED cạnh nhau sẽ sáng cùng 1 lúc, chạy qua chạy lại với chu kì 0.2s.
Ví dụ: LED 1&2 sáng, đến 2&3,..., đến 7&8, quay lại 6&7,...
- Nhấn nút 1: thay đổi độ sáng LED thứ 1, 1 lần nhấn tăng 1 mức sáng (có 32 mức sáng tương ứng từ 0% đến 100%), đến 100% rồi thì nhấn tiếp tục sẽ trở về 0% (mức thấp nhất) rồi tiếp tục.
- Nhấn nút 2: thay đổi độ sáng LED thứ 2, tương tự như trên.
*Gợi ý:
- Do không phải pin nào của cũng có hỗ trợ xuất PWM, nên các bạn phải kết hợp giữa bộ đếm Timer, Capture và bật tắt GPIO để tạo xung PWM.
- Nếu chu kỳ ngắt timer quá nhanh, chúng ta cả thể sử dụng kết hợp biến đếm để tạo clock với tần số mong muốn.
- Cấu hình và sử dụng thanh ghi CCR1 và CCR0 (up mode), thay đổi giá trị CCR1 để thay đổi độ rộng xung PWM mong muốn.
- Tần số chớp tắt của LED phải đủ nhanh để tạo hiện tượng lưu ảnh cho mắt, khi đó ta sẽ thấy LED sáng mờ thay vì thấy nó chớp tắt liên tục.
Mọi thắc mắc các bạn có thể post trên forum hoặc hỏi các Advisor để được giúp đỡ nhé.
4/ Code tham khảo: cách cấu hình timer, kết hợp Timer Interrupt và Low Power Mode.
Các bạn chú ý hàn thêm con thạch anh đi kèm với kit nếu muốn dùng code demo bên dưới (chân ngắn, hàn cẩn thận), hoặc chuyển clock source khác và chỉnh lại tần số nhé.
1/ Đọc datasheet: trang 6,7,8,10,11, phần Port Pin Functions và Port Schematic từ trang 42.
Rút ra các nội dung sau:
- Pin nào thì có chức năng timer, capture input, tạo PWM, nhận xung clock từ bên ngoài.
- Đọc thêm phần Low Power Mode (trang 10) để biết về LPM, clock nào sẽ hoạt động, phần nào sẽ tắt khi vô LPM, khi nào thì thoát LPM.
2/ Đọc User Guide MSP430x2xx: từ trang 363 đến 403 (phần timer A và B) để nắm được:
- Khác nhau giữa Timer A và B.
- Một bộ timer có các chức năng gì (timer, capture, compare, xuất PWM), mỗi chức năng dùng để làm gì, ứng dụng khi nào.
- Cách cấu hình cho bộ timer: có bao nhiêu source clock có thể chọn, chọn qua bit nào, thanh ghi nào, cách chia clock ra sao, có bao nhiêu cách đếm timer ( up, down, continuous...), dùng interrupt timer như thế nào.
- Cách sử dụng các thanh ghi CCR (Capture Compare Register), tại sao cho tới 3 thanh ghi, dùng phối hợp với timer như thế nào. Cách dùng Interrupt và kiểm tra nội dung thanh ghi TAIV trong ngắt.
- Cách xuất PWM: có phải port nào cũng có sẵn chức năng đó không, dùng như thế nào, nếu không có thì làm sao để xuất xung PWM.
- Các bạn xem kĩ các phần: Timer Block Diagram, Các Mode và vị trí cờ ngắt được bật lúc đếm trong từng trường hợp, Output Example để biết cách sử dụng cờ ngắt và các thanh ghi CCR để xuất PWM.
3/ Bài tập về nhà:
Tương tự hôm trước, chúng ta có bài tập về nhà, sử dụng 8 LED và 2 nút nhấn.
Khác với hôm trước, sẽ có 2 LED sáng cùng 1 lúc, với độ sáng từng LED thay đổi được bằng 2 nút nhấn. Mỗi LED sẽ có 32 mức sáng từ 0% đến 100%.
- Không nhấn nút: 2 LED cạnh nhau sẽ sáng cùng 1 lúc, chạy qua chạy lại với chu kì 0.2s.
Ví dụ: LED 1&2 sáng, đến 2&3,..., đến 7&8, quay lại 6&7,...
- Nhấn nút 1: thay đổi độ sáng LED thứ 1, 1 lần nhấn tăng 1 mức sáng (có 32 mức sáng tương ứng từ 0% đến 100%), đến 100% rồi thì nhấn tiếp tục sẽ trở về 0% (mức thấp nhất) rồi tiếp tục.
- Nhấn nút 2: thay đổi độ sáng LED thứ 2, tương tự như trên.
*Gợi ý:
- Do không phải pin nào của cũng có hỗ trợ xuất PWM, nên các bạn phải kết hợp giữa bộ đếm Timer, Capture và bật tắt GPIO để tạo xung PWM.
- Nếu chu kỳ ngắt timer quá nhanh, chúng ta cả thể sử dụng kết hợp biến đếm để tạo clock với tần số mong muốn.
- Cấu hình và sử dụng thanh ghi CCR1 và CCR0 (up mode), thay đổi giá trị CCR1 để thay đổi độ rộng xung PWM mong muốn.
- Tần số chớp tắt của LED phải đủ nhanh để tạo hiện tượng lưu ảnh cho mắt, khi đó ta sẽ thấy LED sáng mờ thay vì thấy nó chớp tắt liên tục.
Mọi thắc mắc các bạn có thể post trên forum hoặc hỏi các Advisor để được giúp đỡ nhé.
4/ Code tham khảo: cách cấu hình timer, kết hợp Timer Interrupt và Low Power Mode.
Các bạn chú ý hàn thêm con thạch anh đi kèm với kit nếu muốn dùng code demo bên dưới (chân ngắn, hàn cẩn thận), hoặc chuyển clock source khác và chỉnh lại tần số nhé.
Code:
#include <msp430g2553.h>
void main (void){
WDTCTL = WDTPW + WDTHOLD;
//initPort
P1DIR |= BIT0;
P1OUT |= BIT0;
//initTimerA0
TA0CTL = TASSEL_1 + MC_1 + ID_0+ TAIE ; //ACLK(crystal 32768 Hz), Divided by 1,Up Mode, Enable Interrupt
TA0CCR0 = 32767;
//TA0CCR1 = 62500;
//TA0CCTL0=CCIE; // Capture Interupt
//TA0CCTL1 = CCIE;
_BIS_SR(LPM0_bits + GIE); //Enable LPM0 and Global Interrupt
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TAIV_Interrupt (void) {
switch(TA0IV)
{
//case 0x02:
//{
// P1OUT ^= BIT0;
// TA0CCR1+=500;
// break;
//}
case 0x0A: // Search User Guide: TAIV Register
{
P1OUT ^= BIT0;
break;
}
}
}