Phần I. Tổng quan về MSP430:MSP 430 là họ vi điều khiển cấu trúc RISC 16bit được sản xuất bởicông ty Texas Instruments.MSP là chữ viết tắt của “MIXED SIGNAL MICROCONTROLLER” Làdòng vi điều khiển siêu tiết kiệm năng lượng, sử dụng nguồn thấp, khoảng điệnáp nguồn cấp từ 1.8V – 3.6VMSP 430 kết hợp các đặc tính của một CPU hiện đại và tích hợp sẵn các module ngoại vi. Đặc biệt ChípMSP 430 là giải pháp thích hợp cho những ứng dụng yêu cầu trộn tín hiệu.Một kit LaunchPad gồm hai thành phần, với GND được phủ chung: Nửa trên: Là phần mạch nạp theo chuẩn spybiwire Jtag (2 dây), kết hợp với chuyển đổi giao tiếp UART với máy tính. Trên cùng là đầu USBmini để nối với máy tính, phía dưới là hàng Header để nối ra đối tượng cần giao tiếp, bao gồm các chân:
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ - VIỄN THÔNG
*******************************
MÔN ĐỒ ÁN II
Báo cáo tiến độ Đồ Án II:
Điều khiển thiết bị điện trong nhà qua
Module thu phát RF 315M
Giáo viên hướng dẫn :
Sinh viên:
Trang 2MỤC LỤC:
I.Tổng quan về MSP430.
II.Giới thiệu về KIT Launch Pad III.Phần thực hành trên KIT.
Trang 3Phần I Tổng quan về MSP430:
MSP 430 là họ vi điều khiển cấu trúc RISC 16-bit được sản xuất bởicông ty Texas Instruments.MSP là chữ viết tắt của “MIXED SIGNAL MICROCONTROLLER”
- Làdòng vi điều khiển siêu tiết kiệm năng lượng, sử dụng nguồn thấp, khoảng điệnáp nguồn cấp từ 1.8V – 3.6V
-MSP 430 kết hợp các đặc tính của một CPU hiện đại và tích hợp sẵn các module ngoại vi Đặc biệt ChípMSP 430 là giải pháp thích hợp cho những ứng dụng yêu cầu trộn tín hiệu
-Những đặc tính của dòng MSP 430 bao gồm:
+Điện áp nguồn: 1.8V – 3.6 V
+Mức tiêu thụ năng lượng cực thấp:
+Chế độ hoạt động: 270 μA tại 1MHz, 2,2 V
+Chế độ chờ: 0.7 μA
+Chế độ tắt (RAM vẫn được duy trì): 0.1 μA
+Thời gian đánh thức từ chế độ Standby nhỏ hơn 1μs
+Cấu trúc RISC-16 bit, Thời gian một chu kỳ lệnh là 62.5 ns
+Cấu hình các module Clock cơ bản:
+Tần số nội lên tới 16 MHz với 4 hiệu chỉnh tần số +- 1%
+Thạch anh 32 KHz
+Tần số làm việc lên tới 16 MHz
+Bộ cộng hưởng
+Nguồn tạo xung nhịp bên ngoài
+Điện trở bên ngoài
+Timer_A 16 bit với 3 thanh ghi hình, 3 thanh ghi so sánh độ rộng 16 bit
+Timer_B 16 bit với 3 thanh ghi hình, 3 thanh ghi so sánh độ rộng 16 bit
+Giao diện truyền thông nối tiếp:
+Hỗ trợ truyền thông nối tiếp nâng cao UART, tự động dò tìmtốc độ Baud
+Bộ mã hóa và giải mã IrDA (Infrared Data Associatio)
+Chuẩn giao tiếp động bộ SPI
+Chuẩn giao tiếp I2C
+Bộ chuyển đổi ADC 10 bit, 200 ksps với điện áp tham chiếu nội, Lấymẫu và chốt Tự động quét kênh, điều khiển chuyển đổi dữ liệu
+Hai bộ khuếch đại thuật toán (hoạt động) có thể định cấu hình (Đối vớiMSP 430x22x4)
+Bảo vệ sụt áp
+Bộ nạp chương trình
+Module mô phỏng trên chip
Trang 4+Các thành viên của dòng MSP 430 bao gồm:
+MSP430G2553: 16MB + 16kB Flash Memory 512B RAM
MSP43G2213: 16MB + 2KB Flash Memory 256B
RAM.-MSP430G2203: 16MB + 2KB Flash Memory 256B RAM
-MSP430G2303: 16MB + 4KB Flash Memory 256B
MSP430G2313: 16MB + 4KB Flash Memory 256B
RAM. MSP430 được sử dụng và biết đến đặc biệt trong những ứng dụng về thiết bịđo có
sử dụng hoặc không sử dụng LCD với chế độ nguồn nuôi rất thấp Với chế
độnguồn nuôi từ khoảng 1,8 đến 3,6v và 5 chế độ bảo vệ nguồn.Với sự tiêu thụ dòng rất thấp trong chế độ tích cực thì dòng tiêu thụ là 200uA,1Mhz, 2.2v; với chế
độ standby thì dòng tiêu thụ là 0.7uA Và chế độ tắt chỉ duy trì bộ nhớ Ram thì dòng tiêu thụ rất nhỏ 0.1uA.MSP430 có ưu thế về chế độ nguồn nuôi Thời gian chuyển chế độ từ chế độstandby sang chế độ tích cực rất nhỏ (< 6us) Và có tích hợp 96 kiểu hình cho hiểnthị LCD 16 bit thanh ghi, 16 bit RISC CPU.Có một đặc điểm của họ nhà MSP là khi MCU không có tín hiệu dao độngngoại, thì MSP sẽ tự động chuyển sang hoạt động ở chế độ dao động nội
Sơ đồ chân của các dòng MSP430G2x53va MSP430G2x13:
Trang 6Thanh ghi vào /ra
Trang 9-Bộ định thời:
MSP430 có hai bộ định thời 16 Bit là Timer_A và Timer_B nó cũng đồngthời đóng vai trò là bộ đếm
Timer_A:Đặc tính của Timer_A:
Là một bộ Timer/Counter 16 bit Với ba thanh ghi lưu trữ và 3 thanh ghi sosánh
Là một Timer đa chức năng Đếm thời gian, so sánh, PWM Timer_Acũng có khả năng ngắt khi counter đếm tràn hoặc mỗi thanh ghi đếm tràn Cácđặc tính chính của Timer_A bao gồm:+ Là một Timer/counter 16 Bit không đồng bộ với 4 chế độ hoạt động.+ Có thể lựa chọn và cấu hình nguồn xung+ Hai tới 3 thanh ghi có thể cấu hình capture/compare+ Cấu hình đầu ra với chế độ PWM+ Chốt ngõ vào và ngõ ra không đồng bộ
Trang 10Sơ đồ khối của Timer_A
Trang 11Phần 2: Giới thiệu về kit launch pad
1.1.Giới thiệu kit:
Hình minh họa kit LaunchPad Rev.1.1 (bản ổn định hiện tại là Rev.1.5) :
Một kit LaunchPad gồm hai thành phần, với GND được phủ chung:
- Nửa trên: Là phần mạch nạp theo chuẩn spy-bi-wire Jtag (2 dây), kết hợp với chuyển đổi giao tiếp UART với máy tính Trên cùng là đầu USBmini để nối với máy tính, phía dưới là hàng Header để nối ra đối tượng cần giao tiếp, bao gồm các chân:
· TXD, RXD: phục vụ giao tiếp UART với máy tính.
· RST, TEST: phục vụ nạp và debug (sửa lỗi) theo chuẩn spy-bi-wire Jtag.
· VCC: cấp nguồn 3V3 cho đối tượng (thường là nửa dưới LaunchPad).
Trang 12- Nửa dưới: là một mạch phát triển MSP430 đơn giản, bao gồm:
· Socket cắm MSP430 (thường gắn sẵn chip MSP430G2553), Pad hàn thạch anh, Nút nhấn Reset chip
· Nút nhấn gắn vào P1.3, hai Led hiển thị có jumper để gắn vào P1.0 và P1.6 Hai hàng header để kết nối hai hàng chân của chip ra ngoài, một hàng header
nguồnGND-GND-VCC để lấy nguồn 3V3 trên LaunchPad.
1.2.Sơ đồ chân:
Trang 141.3.Cấp nguồn cho kit:
Việc cấp nguồn cho mạch main có thể tiến hành bằng 3 cách:
*Cấp nguồn ngoài vào mạch Main
- Nguồn ngoài được cấp qua Domino J1 trong khối nguồn của mạch Nguồn vào có thể
là AC hay DC, dải điện áp từ 8V đến 30V Với phương án này, tổng dòng tiêu thụ của mạch giới hạn ở khoảng 1A (giới hạn của 7805) Cụ thể, chúng ta có thể lựa chọn biến
áp 220V/12-24V; các cục sạc (adapter) AC, DC 9V, 12V, 19V, …; Ac-quy 12-24V; Pin 9V, …
- Ngoài ra, nếu có nguồn DC 5V, 3V3 bên ngoài thì có thể cắm vào header nguồn J2 (5V) hay J14 (3V3) để sử dụng Khi làm cách làm này cần phải chắc chắn, đảm bảo điện áp cấp trong khoảng từ 3v3 đến 5v
Trang 15- Sau khi cấp nguồn, Led D1, D2 sẽ sáng Ta gạt công tắc để Led D4 sáng, cấp nguồnMSP430
*Tận dụng nguồn 3V3 trên launch pad:
- Nguồn 3V3 LaunchPad được cấp qua header J11, với dòng tối đa
khoảng 250mA.
- Nguồn trên Launch Pad có thể lấy từ nhiều điểm, được đánh dấu
là VCC và GND (chú ý trạng thái của jumper VCC khi lấy nguồn) Thông thường,
ta giữ jumperVCC và lấy nguồn tự cụm header GND-GND-VCC phía dưới kit.
- Sau khi cấp nguồn vào J11, Led D3 sẽ sáng Ta gạt công tắc để Led D4 sáng, cấp nguồn cho MSP430
- Chú ý là khi mạch chỉ được cấp nguồn 3V3, các module dùng nguồn
5V (LCD, )sẽ không hoạt động.
*Tận dụng nguồn 5V
- LaunchPad có thiết kế lỗ TP1 (5V), TP3 (GND) để người dùng lấy nguồn
USB-5V từ máy tính khi cần thiết Chúng ta có thể hàn thêm header để lấy nguồn tại đây
(chỉ cần hàn header vào TP1 là đủ, GND có thể lấy từ nhiều vị trí khác TP3)
Trang 16- Nguồn USB-5V có dòng tối đa khoảng 500mA, đủ cho việc chạy LCD trên mạch
Main Tuy nhiên, khi sử dụng nguồn này cần phải cẩn thận, tránh để chập nguồn, ảnh hưởng đến hoạt động của máy tính Đặc biệt chú ý phần vỏ ngoài của đầu cắm USBmini được bắt dính với GND, không để cho header ở TP1 dính vào đây
- Chúng ta cấp nguồn 5V-USB này vào mạch Main ở header nguồn J2 (5V) Sau khi cấp nguồn, Led D1, D2 sẽ sáng Ta gạt công tắc để Led D4 sáng, cấp nguồn cho MSP430
Phần 3: Thực hành trên kit:
Code giao tiếp spi giữa msp430g2553 và capacitive touch
#include <msp430g2553.h>
int count_default[5], count_edge[5], k;
char touch[4], touch_rem[4], touch_count[4], j, i, key, speed = 1, mode = 0,
proximity = 0, slider = 0;
const char sensivity = 30;//Threshold
void Init( void)
{
P1DIR |= 0xff;
P1SEL &= ~(BIT2 + BIT3 + BIT4 + BIT5); // Pin-Osc: PxSEL.x = 0; PxSEL2.x = 1;
Trang 17P1OUT &= ~(BIT2 + BIT3 + BIT4 + BIT5);
P2DIR = 0xff;
P2OUT &= ~BIT6;
= 0; PxSEL2.x = 1;
//Config timer A
TA0CTL = TASSEL_3+MC_2; // TACLK, cont mode
TA0CCTL1 = CM_3+CCIS_3+CAP; // Pos&Neg,GND,Cap
}
void Get_info( void)
{
P2SEL2 &= ~BIT6; //P2.6 -> Output
P2OUT &= ~BIT6; //P2.6 -> Ground
for (j = 0; j < 4; j++)
{
P1SEL2 &= ~(BIT2 + BIT3 + BIT4 + BIT5);
P1SEL2 |= 0x04 << j; // Pin-Osc: PxSEL.x = 0; PxSEL2.x = 1; TA0CTL |= TACLR; // Clear Timer_A TAR
_delay_cycles(300); // Delay to count TA0CCTL1 ^= CCIS0; // Create SW capture of CCR1 count_edge[j] = TACCR1; // Save result
}
// Set P2.6 : Pin-Osc (Proximity)
// Set P1.2 -> P1.5 are output, Turn off Pin-Osc
P1SEL2 &= ~(BIT2 + BIT3 + BIT4 + BIT5);
P1DIR |= BIT0 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6;
P1OUT &= ~(BIT2 + BIT3 + BIT4 + BIT5); // Set P1.2 -> P1.5 = 0;
P2SEL2 |= BIT6;
TA0CTL |= TACLR; // Clear Timer_A TAR
_delay_cycles(10000);
TA0CCTL1 ^= CCIS0; // Create SW capture of CCR1
count_edge[4] = TACCR1; // Save result
}
void main( void)
{
WDTCTL = WDTPW + WDTHOLD; //Stop Watchdog Timer
touch_count[0]=1;
for (i = 0; i < 10; i++)
{
Get_info();
for (j = 0; j < 5; j++)
count_default[j] = (count_default[j] + count_edge[j]) /2;
}
while (1)
{
Trang 18for (i = 0; i < 4; i++)
{
touch_rem[i] = touch[i];
if ((count_edge[i] + sensivity) < count_default[i]) // {
if (touch_count[i] > 0)
touch_count[i]++;
touch[i] = 1;
}
else
{
touch[i] = 0;
touch_count[i] = 1;
}
if (touch_count[0] > 100)
{
touch_count[0] = 0;
proximity = ++proximity % 2;
P1OUT ^= BIT0;
}
if ((touch[i] != touch_rem[i]) && (touch[i] == 1))
{
if (touch_rem[(i-1) % 4] == 1)
slider =1;
if (touch_rem[(i+1) % 4] == 1)
slider = 2;
switch (i) {
case 0:
break;
case 1:
speed++;
if (speed > 10)
speed = 10;
break;
case 2:
mode = ++mode % 3;
if (mode == 2) {
P1OUT &= ~0x41;
P1OUT |= BIT0;
}
break;
case 3:
speed ;
if (speed < 1)
speed = 1;
break; }
}
Trang 19if (slider == 1)
{
P1OUT &= ~0x41;
for (i = 0; i < 29; i++)
{
P1OUT ^= BIT0;
_delay_cycles(100000);
}
}
else if (slider == 2)
{
P1OUT &= ~0x41;
for (i = 0; i < 29; i++)
{
P1OUT ^= BIT6;
_delay_cycles(100000);
}
}
switch (proximity)
{
case 0:
{
switch (mode)
{
case 0:
P1OUT &= ~BIT6;
P1OUT |= BIT0;
break;
case 1:
P1OUT &= ~BIT0;
P1OUT |= BIT6;
break;
case 2:
k = ++k % (3 * speed);
if (k == 0)
P1OUT ^= 0x41;
break; }
_delay_cycles(2000);
}
break;
case 1:
if (count_edge[4] > count_default[4])
count_default[4] = (count_default[4] + count_edge[4])/2;
for (i = 0; i < 150; i++)
{
if (i < count_default[4] - count_edge[4] - 10)
P1OUT |= BIT0 + BIT6;
else
P1OUT &= ~(BIT0 + BIT6);
_delay_cycles(15);
}
break;
Trang 20} slider = 0; }
}