1 Tà i liệu hướ ng daችn thı́ nghiệm Vi xử lý và Vi đieቹu khieቻn, 2012 Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy ơnh, Khoa Điệntử Viễn thông, Trường ĐH Bách khoa, ĐH ĐàNẵng Mục tiêu: Sau khi đọc xong tài liệu này, sinh viên có thể: - Sử dụng KIT MSP-EXP430FG4618 để thực hiện các bài lab cơ bản. - Sử dụng bộ Debug MSP-FET430UIF để nạp chương trình cho chip MSP430 trên KIT MSP- EXP430FG4618 . - Sử dụng phần mềm IAR để lập trình một chương trình đơn giản. - Thực hiện các bài liên quan đến xuất/nhập, ngắt, timer. 1. Kit MSP-EXP430FG4618 1.1. Giới thiệu chung: KIT MSP-EXP430FG4618 của hãng TI là bo mạch tích hợp 2 chip MSP430FG4618 và MSP430F2013 nên cung cấp các ngoại vi ph ổ bi ế n trong họ MSP430. Đặ c bi ệ t, 2 chip 4618 và 2013 có thể giao tiếp với nhau (xem hình 2) hoặc giao tiếp với các thiết bị bên ngoài. Có thể sử dụng một trong 2 gói công cụ sau để lập trình và debug: IAR Embeeded Workbench, TI Code Composer Essential (CCE) và TI code Composer Studio (CCS). Thiết bị để lập trình và debug cho chip TI là TI USB Flash Emulation Tool (FET) Hình 1. KIT MSP-EXP430FG4618 do TI tài trợ cho bộ môn Kỹ thuật Máy tính
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
Mục tiêu: Sau khi đọc xong tài liệu này, sinh viên có thể:
- Sử dụng KIT MSP-EXP430FG4618 để thực hiện các bài lab cơ bản.
- Sử dụng bộ Debug MSP-FET430UIF để nạp chương trình cho chip MSP430 trên KIT MSP-
EXP430FG4618 .
- Sử dụng phần mềm IAR để lập trình một chương trình đơn giản.
- Thực hiện các bài liên quan đến xuất/nhập, ngắt, timer.
1. Kit MSP-EXP430FG4618 1.1. Giới thiệu chung:
KIT MSP-EXP430FG4618 của hãng TI là bo mạch tích hợp 2 chip MSP430FG4618 và MSP430F2013 nên cung cấp các ngoại vi phổ biến trong họ MSP430. Đặc biệt , 2 chip 4618 và 2013 có thể giao tiếp với nhau (xem hình 2) hoặc giao tiếp với các thiết bị bên ngoài.
Có thể sử dụng một trong 2 gói công cụ sau để lập trình và debug: IAR Embeeded Workbench, TI Code Composer Essential (CCE) và TI code Composer Studio (CCS). Thiết bị để lập trình và debug cho chip TI là TI USB Flash Emulation Tool (FET)
Hình 1. KIT MSP-EXP430FG4618 do TI tài trợ cho bộ môn Kỹ thuật Máy tính
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
1.2. Sơ đồ khối phân bổ linh kiện trên KIT MSP-EXP430FG4618
Hình 2. Sơ đồ khối phân bổ linh kiện trên KIT MSP-EXP430FG4618
1.2.1. JTAG Hai header JTAG1 và JTAG2 để lập trình và debug mỗi MSP430 riêng biệt: JTAG1 cho
MSP430FG4618 và JTAG2 cho MSP430F2013. JTAG1 cho MSP430FG4618 dùng kiểu kết nối JTAG chuẩn 4 dây, còn JTAG cho MSP430F2013 dùng kiểu giao tiếp JTAG Spy-Bi-Wire (2 dây). Điều này cho phép các chân ở các port được sử dụng trong quá trình debug.
1.2.2. Microphone: Microphone (MIC) được kết nối với MSP430FG4618 qua các chân trong hình 3. Microphone được
kích hoạt hay không qua chân của MSP430FG4618.
Hình 3. Sơ đồ nguyên lý Microphone trên KIT MSP430FG4618
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
1.2.3. Buzzer Buzzer được kết nối với port I/O P3.5 của MSP430FG4618. Buzzer có thể hoàn toàn bị cách ly với
jumper JP1. Lưu ý: trong quá trình thí nghiệm, sau khi thử nghiệm thành công, sinh viên nên tháo JP1 này để
tránh làm ảnh hưởng người xung quanh. 1.2.4. LCD
LCD trong kit này là loại SoftBaugh SBLCDA4, nó có 4 chế độ: tĩnh, 2-mux, 3-mux và 4-mux. LCD này được hỗ trợ khi giao tiếp với MSP430FG4618 qua LCD driver đã có sẵn.
1.2.5. Nút nhấn S1 và S2: Hai nút nhấn S1 và S2 được nối với cổng xuất/nhập số P1 có chức năng ngắt của MSP430FG4618.
Hình 4. Sơ đồ nguyên lý kết nối nút nhấn S1 & S2 với MSP430FG4618 1.2.6. Các LED đơn
KIT MSP430FG4618 có 4 LED: LED1, LED2, và LED4 được kết nối với chip MSP430FG4618, LED3 được kết nối với chip MSP430F2013. LED3 và LED4 có thể được ngắt khỏi kết nối bằng Jumper để tiết kiệm năng lượng cho kit (LED3 dùng jumper JP2, LED4 dùng JP3).
LED Kết nối với chip Port Ghi chú Jumper LED1 MSP430FG4618 P2.2 LED2 MSP430FG4618 P2.1 LED3 MSP430F2013 P1.0 JP2 LED4 MSP430FG4618 P5.1 JP3
Bảng 1: Kết nối LED
Hình 5. Sơ đồ nguyên lý kết nối LED1, LED2 & LED4 với MSP430FG4618
Hình 6. Sơ đồ nguyên lý kết nối LED3 với MSP430F2013
Không giao tiếp qua SPI Yêu cầu cho giao tiếp bên trong processor
Vcc VCC_1: 3 chân phía dưới. Dùng cho FG4618/JTAG1. VCC_2: 3 chân phía trên. Dùng cho F2013/JTAG2. LCL: cung cấp Vcc đến FET. FET: nguồn từ FET (jumper BATT không được thiết lập)
Nguồn từ JTAG Yêu cầu khi sử dụng không cần pin
Bảng 2. Liệt kê chức năng của jumper trên KIT MSP430FG4618 khi được kết nối
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
2.Đặc tính và cách cài đặt bộ Debug MSP-FET430UIF 2.1. Giới thiệu công cụ FET
FET (Flash Emulation Tool) cho phép lập trình - debug họ vi xử lý MSP430 qua chuẩn kết nối JTAG đầy đủ(4 dây) và JTAG tiết kiệm chân (2 dây, Spy Bi-Wire). Do đó, FET được dùng để phát triển các ứng dụng trên họ MCU này qua 2 cơ chế giao tiếp của FET là qua USB cổng song song, tương ứng với các loại MSP-FET430UIF (Hình 10) và MSP- FET430PIF. Hiện tại, Công ty TI chỉ tài trợ loại MSP – FET430UIF cho bộ môn Kỹ thuật Máy tính nên tất cả các bài thí nghiệm trên KIT MSP430FG4618 sẽ sử dụng loại này.
Hình 10. Bộ Debug MSP-FET430UIF
Đặc tính MSP-FET430UIF MSP-FET430PIF
Hỗ trợ tất cả họ MSP430 dựa trên Flash (F1xx, F2xx, F4xx, F5xx) x x
Cho phép cấu hình bảo mật JTAG để bảo vệ code x KHÔNGCho phép tạo ra nguồn cấp chỉnh được 1.8V-3.6V ở 100mA x KHÔNG Cố định tạo ra nguồn cấp 2.8V KHÔNG xDebug dùng JTAG chuẩn 4 dây x x Debug dùng JTAG chuẩn 2 dây (Spy-Bi-Wire) x KHÔNGHỗ trợ bởi CCE x x Hỗ trợ bởi IAR x x
Bảng 3. So sánh một vài tình năng giữa 2 loại MSP-FET430UIF và MSP- FET430PIF
2.2.Cài đặt driver của bộ Debug MSP-FET430UIF lên PC Hiện tại, phòng thí nghiệm Mô phỏng và Vi xử lý được trang bị PC cài đặt windows 7 nên việc thiết
lập driver cho bộ Debug MSP-FET430UIF đều tuân theo các bước sau
Bước 1: Download driver cho FET430UIF và lưu vào PC Đối với Windows 7-64 bit: processors.wiki.ti.com/images/d/dc/TUSBWINVCP_Win7-64.zip Đối với Windows 7-32 bit: processors.wiki.ti.com/images/6/6a/TUSBWINVCP_Win7-32.zip Đối với WindowsXP-32 bit: processors.wiki.ti.com/images/7/73/TUSBWINVCP_XP32.zip Đối với WindowsXP-64 bit: processors.wiki.ti.com/images/3/3b/TUSBWINVCP_XP64.zip Đối với các hệ điều hành khác, lựa chọn drive phù hợp tại địa chỉ:
Bước 2: Gắn FET430UIF vào máy vi tính qua cổng USB
Bước 3: Click phải chuột vào Computer/ chọn Properties sẽ cho cửa sổ sau.
Tiếp theo click vào Device Manager. Bước 4: Click phải trên phần thiết bị mà chưa được cài đặt, rồi chọn Properties. Tiếp đến chọn
tab Driver / Update Driver… và chọn đường dẫn đến file driver đã được download ở bước 1.
3. Công cụ soạn thảo, mô phỏng, biên dịch và nạp chương trình: Để lập trình và debug, người phát triển ứng dụng có thể sử dụng một trong 3 gói công cụ sau đây:
IAR Embeeded Workbench, TI Code Composer Essential (CCE) và TI Code Composer Studio (CCS). IAR được chọn sử dụng vì tính đơn giản, gọn nhẹ của nó.
Tham khảo website http://www.iar.com/ để biết thêm thông tin về IAR. Download IAR Embedded Workbench Code size limited Kickstart version tại: http://www.ti.com/lit/zip/slac050
Cơ bản về sử dụng IAR để tạo 1 project và lập trình trên MSP430 đều tuân theo các bước sau đây
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
Bước 1: chạy chương trình IAR Embedded Workbench IDE theo đường dẫn Start/All Programs/IAR Systems/ IAR Embeeded Workbench Kickstart for MSP430 4.21/ IAR Embeeded Workbench.
Hoặc click chuột vào Icon trên desktop . Sau đó cửa sổ giao diện chương trình sẽ hiển thị như hình dưới đây.
Bước 2: Từ cửa sổ giao diện chính, chọn Project/ Create New Project …
Bước 3: chọn ngôn ngữ sử dụng. Trong thí nghiệm này, chúng ta chọn Empty project hoặc
C/main hoặc Asm/asm và click OK. Ở đây, lựa chọn Empty project được sử dụng, sau đó click vào nút
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
Tiếp tục, chọn các tab khác để thiết lập như sau (các lựa chọn còn lại, xem help để rõ hơn) Trong tab Output: chọn Output file: Executable Trong tab Library Configuration: chọn Library: CLIB Trong mục C/C++ Compiler: (nếu lựa chọn ngôn ngữ lập trình là ngôn ngữ C)
Trong tab Optimizations: chọn level: None (để hỗ trợ tối đa quá trình debug) Trong tab List: chọn Output list file: Assembler mnemonics Trong mục Debugger: Trong tab Setup: chọn Driver: FET Debugger
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
Trong FET Debugger: Trong tab Setup: chọn Connection: Texas Instrument USB-IF. Xong các chọn lựa ở trên trong bước 5, click OK để lưu lại tùy chọn để tiếp tục bước 6 Bước 6: Thiết lập file lập trình (Nếu ở bước 3 đã chọn ngôn ngữ C hoặc Asm thì đã có sẵn một số file mặc định trên cửa sổ
làm việc, ta có thể sử dụng để lập trình, hoặc remove chúng để tạo các file khác, hoặc add thêm file vào.)
File/ New/File, cửa sổ có giao diện như hình sau:
Với màn hình soạn thảo phía bên phải cửa sổ làm việc, người lập trình có thể biên soạn chương trình.
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
Khi biên dịch và nạp thành công, ta có thể tiến hành debugger trực tiếp trên mạch bằng các Step
4. Thiết lập cơ bản cho thí nghiệm Sau đây là các bước cơ bản nhất mà người làm thí nghiệm phải nắm kỹ trước khi bắt tay vào sử dụng mọi công cụ để thực hiện các bài thí nghiệm. Trong từng bài thí nghiệm, sẽ trình bày các bước thiết lập thêm tùy thuộc từng bài.
Bước 1: Thiết lập MSP-EXP430FG4618 - Kiểm tra/sử dụng jumper PWR1 để cung cấp nguồn cho FG4618. (jumper PWR1 nằm
khoảng giữa kit, phía bên phải chip M430G4618, nếu đặt kit như vị trí hình 1) - Kiểm tra/ không sử dụng jumper BATT (jumper BATT ở phía dưới, bên phải kit). Khi thí nghiệm, thiết lập như vậy để không sử dụng pin cung cấp nguồn cho 2 chip với mục đích tiết kiệm pin. - Kiểm tra/ sử dụng jumper Vcc (jumper Vcc ở phía dưới, bên phải kit). Để thiết lập sử dụng nguồn từ FET (khi không dùng pin), thiết lập jumper ở vị trí FET cho cả 2 hàng 1 và 2 (nghĩa là 2 jumper kết nối, mỗi jumper kết nối 2 header tận cùng bên phải: 2 header phía dưới: dùng cho FG4618/JTAG1, 2 chân phía trên: dùng cho F2013/JTAG2).
Bước 2: Kết nối FET430UIF - Kết nối dây USB giữa máy tính và FET. - Kết nối dây 14 pin JTAG giữa FET và kit MSP-EXP430FG4618.
o Một chân của MSP430 thường có nhiều chức năng, ta muốn sử dụng chức năng gì thì định nghĩa cho nó. Ví dụ:
P1DIR = 0xFF; // toàn bộ port1 là Output P1DIR = 0x00; //toàn bộ port1 là Input Như vậy nếu muốn một số chân của port1 là Output và một số chân của port1 là Input thì làm thế
nào? Không giống một số VĐK khác, MSP430 không cho phép ta tác động trực tiếp đến 1 chân nào riêng lẻ, chỉ có thể tác động lên port (8 chân). Như vậy muốn tác động lên chân riêng lẻ nào thì ta dùng phép toán OR, AND và XOR.
Ví dụ: P1DIR |= BIT1; //chân P1.1 sẽ là chân Output, các chân khác ko bị ảnh hưởng bởi lệnh này P1DIR &= ~BIT1; // chân P1.1 sẽ là chân Input (nếu ta ko định nghĩa thì nó mặc định là Input) P2DIR |= BIT0 + BIT1 + BIT3; //chân P2.0, P2.1, P2.3 sẽ là Output Lệnh trên cũng có thể viết lại: P2DIR |= 0x0B; // BIT0 + BIT1 + BIT3 = 11d=0Bh P2DIR &= ~(BIT4+BIT5); //P2DIR &=~0x30; //chân P2.4, P2.5 là Input
o Xuất ra port theo từng bit riêng lẻ. Như việc định nghĩa các chân, MSP430 cũng không cho ta tác động trực tiếp đến từng chân nào,
muốn xuất ra một bit hay nhiều bit bất kỳ ta sử dụng cách như đã dùng với định nghĩa chân. Ví dụ muốn cho P1.1=1, P1.3=1, P2.1=0 P1OUT |= BIT1+BIT3 ; //P1.1=1, P1.3=1 P2OUT &=~ BIT1 ; //P2.1=0 Hoặc có thể đảo một bit ở chân bất kỳ bằng lện XOR ^ P1OUT ^= BIT4 ; //chân P1.4 đảo trạng thái
o Kiểm tra trạng thái một chân. Ngoài ngắt ra ta có thể kiểm tra trạng thái một chân nào đó đang ở mức thấp (0V) hay mức cao (1.8V
đến 3.6V). Ví dụ kiểm tra chân P1.2
if( (P1IN&BIT2)==0 ) //nếu chân P1.2 bằng 0 //do anything else //do anything // nếu viết if( P1IN&BIT2==0 ), thiếu 1 ngoặc là sai
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
6. Các bài thí nghiệm
Bài 1: GPIO
6.1. Các thanh ghi liên quan đến GPIO: 6.1.1. Direction Register PxDIR (P1DIR, P2DIR):
Đây là các thanh ghi 8 bit điều khiển chiều của 8 chân port. P1DIR điều khiển PORT1, P2DIR điều khiển PORT2.
Bit = 1: Chân PORT tương ứng được cấu hình thành output Bit = 0: Chân PORT tương ứng được cấu hình thành input
6.1.2. Input Register (PxIN): Đây là các thanh ghi 8 bit chứa giá trị đọc được từ các chân PORT.
Bit = 1: Chân PORT tương ứng ở mức cao Bit = 0: Chân PORT tương ứng ở mức thấp.
6.1.3. Output Register (PxOUT): Đây là thanh ghi điều khiển ngõ ra của các PORT.
Bit = 1: Xuất mức cao ra chân PORT tương ứng. Bit = 0: Xuất mức thấp ra chân PORT tương ứng.
6.1.4. Function Select Register: Đây là thanh ghi chọn chức năng cho chân PORT. Mỗi chân PORT có thể cấu hình chọn chức năng Input/Output hay là chức năng đặc biệt khác.
Bit = 1: Chọn chức năng đặc biệt. Bit = 0: Chọn chức năng GPIO.
Các lưu ý khi viết chương trình cho lab này: - Watchdog Timer
Trong lab này, chúng ta không cần sử dụng Watchdog timer. Để tắt Watchdog timer, ghi giá trị 5A vào 8 bit cao của thanh ghi WDTCTL và set thứ 7 của thanh ghi WDTCTL.
- Delay: Bởi vì trong chương trình chưa định nghĩa clock nên CPU sẽ sử dụng thạch anh 32.768 kHz. Để có thời gian delay khoảng 1s, vòng delay sẽ đếm xuống từ 30.000SV có thể dùng câu lệnh dưới đây để tạo delay:
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
Bài 1.2
Yêu cầu: Sinh viên viết chương trình để đảo trạng thái LED1 mỗi khi SW1 được nhấn.
Câu hỏi 1: Các SW(switch) được kết nối với MCU như hình trên. Điền vào chỗ trống để trả lời các câu hỏi dưới đây.
+ SW1 nối vào chân nào của MCU? (Cổng (Port) nào?)
Trả lời:……………………………………………
+ SW2 nối vào chân nào của MCU? (Cổng (Port) nào?)
Trả lời:……………………………………………
+ Để đọc trạng thái switch, các chân port phải là input hay output?
Trả lời:……………………………………………
Câu hỏi 2: Hoàn chỉnh chương trình bằng cách điền vào các chỗ trống:
#include <msp430xG46x.h> void main (void)
{ volatile unsigned int i; WDTCTL = ………………………….; //Stop Watchdog Timer P2DIR |= ……………………………..; //Configure P2.2 as Output (LED1) P1DIR &= ………………………........; //Configure P1.0 as Input (S1) while (1)
{ while ((P1IN & 0x01)); //Wait for the press of the button P2OUT ^= …………………….; //Toggle Port P2.2 for(……………………….........); //Delay, button debounce while (………………………....); //Wait for the release of the button for(……………………….........); //Delay, button debounce }
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
Bài 2. GPIO & INTERRUPT
MSP430 được thiết kế để làm việc với các ứng dụng công suất thấp. Vì vậy CPU thường ở trạng thái “off” trong phần lớn thời gian. Để đưa CPU vào trạng thái “off”, các bit SCG1, SCG0 và CPUOFF trong thanh ghi SR được set.
Một ngắt xảy ra sẽ đánh thức CPU. Khi đó thanh ghi SR được lưu vào stack và CPU thực thi ISR. Khi thoát khỏi ISR, thanh ghi SR được lấy ra từ stack và làm cho CPU tắt trở lại.
Đưa CPU vào trạng thái công suất thấp và cho phép ngắt: Bit GIE trong thanh ghi SR khi được set sẽ cho phép ngắt. Ta đưa CPU vào trạng thái công suất thấp, cho phép ngắt bằng lệnh: _BIS_SR (LPM3_bits + GIE); Trong đó: LPM3_bits = (SCG1+SCG0+CPUOFF) Định nghĩa chương trình phục vụ ngắt (ISR): Ta định nghĩa 1 ISR tại vector ngắt ISR_VECTOR bằng cấu trúc sau:
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
Bài 2.1
Yêu cầu: Sinh viên viết chương trình đảo trạng thái LED1 khi Switch 1 được nhấn. Trong chương trình sử dụng ngắt trên chân port giao tiếp Switch.
Câu hỏi 1: Các SW(switch) được kết nối với MCU như hình trên. Điền vào chỗ trống để trả lời các
câu hỏi dưới đây. + SW1 nối vào chân Port gì của CPU? Trả lời:…………………………………………… + Khi Switch được nhấn, sẽ có chuyển trạng thái như thế nào trên chân PORT?
+ Để cho phép ngắt trên chân P1.0, ta phải ghi …… vào bit…….của thanh ghi …………….? + Để chọn cạnh xuống cho ngắt trên chân P1.0, ta phải ghi ……vào bit…….của thanh ghi ………? Câu hỏi 2: Hoàn chỉnh chương trình bằng cách điền vào các chỗ trống: #include <msp430xG46x.h> #pragma vector=……………………………………… __interrupt void Port_1 (void)
{ //define an interrupt service routine at 0xFFE8 volatile unsigned int i; P2OUT ^= ………………………; //Toggle Port P2.2 for(………………………………); //Delay, button debounce while (…………………………...); //Wait for the release of the button for(……………………………….); //Delay, button debounce P1IFG &= ~0x01; //Clean P1.0 Interrupt Flag (bit 0 of P1IFG register) }
void main (void) { WDTCTL = ………………………; //Stop Watchdog Timer P2DIR |= …………………………; //Configure P2.2 as Output (LED1) P1DIR &= ………………………..; //Configure P1.0 as Input (S1) P1IE |= …………………………...; //Interrupt Enable in P1.0 P1IES |= ………………………….; //P1.0 Interrupt flag high-to-low transition _BIS_SR (………………………..); //Low Power Mode with interrupts enabled }
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
Bài 3: TIMER
Để cấu hình cho timer, đầu tiên bộ FLL+ tạo xung nhịp phải được cấu hình trước để chọn xung nhịp đưa vào timer. Sau đó các giá trị thích hợp sẽ được đưa vào các thanh ghi cấu hình cho timer để làm timer hoạt động theo chế độ mong muốn.
Timer của MSP430x4xxx:
- Basic Timer 1 - Timer_A - Timer_B
6.2. Basic Timer 1 Module:
Hình 6.2.1: Sơ đồ khối của Basic Timer 1
6.2.1. Basic Timer1 Counter 1 (BTCNT1): - Dùng để tạo tần số frame (frame frequency) cho bộ điều khiển LCD (LCD Controller) - Là thanh ghi 8 bit, có thể ghi/đọc - Nguồn clock: ACLK - Hệ số chia cho clock ngõ ra (fLCD) được chọn bởi các bit BTFRFQx trong thanh ghi BTCTL.
fLCD = ACLK / x 6.2.2. Basic Timer1 Counter 2 (BTCNT2): - Là bộ chia tần số có khả năng tạo ngắt, dùng để taọ những ngắt theo chu kỳ cho CPU hoặc tạo thành
hệ thống đồng hồ thời gian thực. - Là thanh ghi 8 bit, có thể ghi/đọc - Nguồn clock: ACLK, SMCLK, hoặc SMCLK/256 khi mắc nối tiếp với BTCNT1 - Hệ số chia cho clock ngõ ra (fLCD) được chọn bởi các bit BTFRFQx trong thanh ghi BTCTL. - Dùng để tạo ngắt Basic Timer 1 Interrupt BTIFG, thời gian ngắt được chọn bởi các bit BTIPx trong
thanh ghi BTCTL. 6.2.3. Các thanh ghi cho Basic Timer 1 Module: 6.2.3.1. BTCTL, Basic Timer 1 Control Register:
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
6.2.3.2. IE2, Interrupt Enable Register 2:
6.2.3.3. IFG2, Interrupt Flag Register 2:
6.3. Các nguồn xung nhịp: Xung nhịp hệ thống của MSP430x4xx được định nghĩa bởi bộ khóa tần số FLL+ (Frequency Locked
Loop). FLL+ có thể làm việc với thạch anh gắn ngoài hay bộ dao động nội. FLL+ gồm có 3 nguồn :
- LFXT1CLK: Bộ dao động có khả năng tạo xung nhịp tốc độ thấp với thạch anh đồng hồ 32.768 Hz, hoặc xung nhịp tốc độ cao với thạch anh, resonance hay nguồn xung nhịp ngoài với tần số từ 450Khz-8Mhz.
- XT2CLK: Bộ dao động có khả năng tạo xung nhịp tốc độ cao với thạch anh, resonance hay nguồn xung nhịp ngoài với tần số từ 450Khz-8Mhz.
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
- DCOCLK: Bộ dao động R-C nội, được ổn định tần số bởi FLL. Có 4 tín hiệu xung nhịp được tạo ra:
- Master Clock (MCLK): Được chọn bởi phần mềm từ các nguồn LFXT1CLK, XT2CLK hoặc DCO. MCLK có thể được chia bởi các hệ số 1, 2, 4, 8 trước khi sử dụng. MCLK được sử dụng bởi CPU và hệ thống.
- Sub-System Main Clock (SMCLK): Được chọn bởi phần mềm giữa XT2CLK và DCOCLK. SMCLK có thể được chọn bằng phần mềm cho các ngoại vi.
- Auxiliary Clock (ACLK): ACLK được taọ ra từ LFXT1CLK, có thể được chọn bằng phần mềm cho ngoại vi.
- Buffered Auxiliary Clock (ACLK/n): Là ngõ ra được đệm của ACLK. ACLK/n chính là ACLK chia cho hệ số chia 1, 2, 4, 8 và được sử dụng cho các ngoại vi bên ngoài. Sau khi reset, MCLK và SMCLK được lấy từ DCOCLK ở tần số gấp 32 lần ACLK. Nếu bộ dao
động LFXT1CLK sử dụng thạch anh 32.768 Hz, tần số của MCLK và SMCLK sẽ là 1.048576 Mhz.
Hình 6.2.2: Sơ đồ khối bộ tạo xung nhịp
6.3.1. Các bộ tạo dao động: 6.3.1.1. Low/High Frequency Oscillator (LFXT1):
Bộ dao động này có thể được dùng để tạo xung nhịp tốc độ thấp (low speed) từ thạch anh đồng hồ (tần số 32.768 Mhz) hoặc xung nhịp tốc độ cao (high speed) từ thạch anh ngoài hoặc bộ dao động ngoài với tầm từ 450 Khz đến 8 Mhz.
Bit XTS_FLL trong thanh ghi FLL_CTL0 dùng để chọn lựa chế độ hoạt động của LFXT1. - XTS_FLL = 0 : Low speed
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
- XTS_FLL = 1: High Speed Giá trị tụ điện bên trong của bộ dao động (1, 6, 8, 10pF) được chọn bởi các bit XCAPxPF. Bộ dao
động LFXT1 có thể được tắt bằng cách set bit OSCOFF lên 1 nếu LFXT1 không được chọn để tạo nguồn cho MCLK (SELM # 3 hoặc CPUOFF = 1).
6.3.1.2. Bộ giao động tần số cao (High Frequency Oscillator) (XT2): Bộ dao động XT2 dùng thạch anh ngoài để tạo dao động tần số cao XT2CLK. Bộ dao động XT2
không có tụ bên trong, vì vậy tụ ngoài sẽ cần được sử dụng khi giao tiếp thạch anh. Bộ dao động XT2 có thể được tắt bằng cách set bit XT2OFF lên 1 nếu XT2CLK không được chọn để
tạo nguồn cho MCLK (SELM # 2 hoặc CPUOFF = 1) và SMCLK (SELS = 0 hoặc SMCLKOFF = 1). 6.3.1.3. Bộ dao động nội DCO:
Bộ dao động DCO dùng FLL để nhân tín hiệu ACLK lên (N+1) lần, với N là 7 bit thấp của thanh ghi SCFQCTL.
Bit DCOPLUS chọn tần số fDCOCLK bằng fDCO hoặc fDCO/D. Số chia D bằng 1, 2, 4, 8 và được chọn bởi các bit FLLDx. Sau khi reset, DCOPLUS bằng 0 và D bằng 2.
- DCOPLUS = 0: fDCOCLK = (N+1) x fACLK. - DCOPLUS = 1: fDCOCLK = D x (N+1) x fACLK.
Giới hạn tần số của DCO: Giới hạn tần số dao động của DCO được chọn bởi các bit FNx. Người lập trình phải đảm bảo tần số của MCLK không vượt quá tần số hoạt động cao nhất của DCO.
6.3.2. Các thanh ghi điều khiển clock: 6.3.2.1. SCFQCTL, System Clock Control Register :
6.3.2.2. SCFI0, System Clock Frequency Integrator Register 0 :
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
6.3.2.5. FLL_CTL1, FLL+ Control Register 1:
6.4. Các chế độ hoạt động:
MSP430 được thiết kế để hoạt động ở chế độ công suất thấp. Các chế độ hoạt động được cấu hình bởi các bit CPUOFF, OSCOFF, SCG0, và SCG1 trong thanh ghi trạng thái SR.
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
Bài 3.1
Yêu cầu: Sinh viên viết chương trình đảo trạng thái LED1 và LED2 sau thời gian 1s, sử dụng ngắt Basic Timer 1 Interrupt.
Câu hỏi 1: Để vô hiệu hóa Watchdog Timer, ta phải ghi vào thanh ghi WDTCTL một giá trị bằng bao nhiêu?
WDTCTL = ……………………………………………..; Câu hỏi 2: Cấu hình FLL+ Một thạch anh tần số 32768 Hz đuợc nối vào bộ dao động LFXT1. Ta phải ghi vào thanh ghi
FLL_CTL0 giá trị gì để chọn tụ bên trong có giá trị 8PF? FLL_CTL0 |= …………………………………………...; Với các thanh ghi khác ở giá trị mặc định, tần số của các tín hiệu xung nhịp sẽ bang bao nhiêu? ACLK = ………………………; MCLK = ………………………; SMCLK = ……………………..; Câu hỏi 3: Cấu hình GPIO LED1 và LED2 được nối vào chân P2.2 và P2.1. Ta phải ghi vào thanh ghi nào với giá trị gì để cấu
hình cho 2 chân PORT này thành output, còn lại là input? …………………. = ……………………………….; Ta phải ghi vào thanh ghi nào với giá trị gì để làm cho LED1 sáng, LED2 tắt? …………………. = ……………………………….; Câu hỏi 4: Cấu hình cho Basic Timer 1: Ta dùng Basic Timer 1 để tạo ngắt. Basic timer gồm 2 bộ đếm mắc nối tiếp, trong đó ngõ vào của
BTCNT2 là ngõ ra của BTCNT1 chia cho 256. (Tham khảo hình 2.1). Ngõ vào của BTCNT1 là tín hiệu ACLK có tần số 32768 Hz. Ngõ ra của BTCNT2 phải được chia cho bao nhiêu để có ngắt Basic Timer 1 có chu kỳ là 1s? ……………..
Giá trị phải ghi vào các thanh ghi sau là bao nhiêu để có số chia cho BTCNT2 như trên và cho phép ngắt?
BTCTL = ………………………………; IE2 = …………………………………...; Câu hỏi 5: Chế độ công suất thấp: Chương trình đơn giản đảo trạng thái LED1 và LED2 trong ngắt. Chế độ công suất thấp nào nên được
sử dụng? ………………………. Khi đó, nguồn xung nhịp nào sẽ được tích cực trong suốt quá trình hoạt động? ..................................... Câu hỏi 6: Hoàn tất chương trình: #include <msp430xG46x.h> //***************************************************************** // Basic Timer interrupt service routine: refresh LCD with 0.5 sec //***************************************************************** #pragma vector=BASICTIMER_VECTOR __interrupt void basic_timer_ISR(void) { P2OUT ^=0x06; // LED2 toogle } //*****************************************************************
Biên soạn: Phạm Xuân Trung, Bộ môn Kỹ thuật Máy nh, Khoa Điện tử Viễn thông, Trường ĐH Bách khoa, ĐH Đà Nẵng
// Main routine //***************************************************************** void main(void) {
WDTCTL = ..................................; // Stop WDT FLL_CTL0 |= ...............................; // Set load cap for 32k xtal
// Basic Timer 1 Configuration BTCTL = ......................................; // (ACLK/256)/64 IE2 |= ............................................; // Enable BT interrupt with 0.5 period
// LED1 & LED2 configuration P2DIR = ........................................; // P2.2 and P2.1 as digital output P2OUT = ......................................; // LED1 on and LED2 off __bis_SR_register(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
}
Bài 3.2
Yêu cầu: Sinh viên viết chương trình hiển thị giá trị lần lượt từ 0 -> 9 lên led 7 đoạn P1 của LCD. Giá trị hiển thị tăng lên 1 sau 1 s. Nếu ấn SW2, chương trình ngừng đếm (giá trị ngừng tăng lên). Nếu ấn SW1, chương trình hoạt động bình thường. Chương trình sử dụng ngắt timer để hiển thị LCD, ngắt ngoài trên chân P2.1 và P2.2 để cho phép chương trình dừng đếm hay tiếp tục hoạt động.
LCD sử dụng trên board có các phần tử hiển thị như sau: