1. i h c Bách Khoa à N ngĐạ ọ Đ ẵ
Khoa i n T - Vi n ThôngĐ ệ ử ễ
Báo cáo ti u lu nể ậ
MSP430
Thành viên:
Võ Th M nị ẫ
Lê Bá Tu nấ
Bùi H u Triữ
Nguy n H u Anh Khoaễ ữ
GVHD:
Ph m Xuân Trungạ
2. Chương 1 : Lý thuyết
1.1 Tổng quan về MSP430 (Mixed Signal Controller).
1.1.1 Chip MSP430G2x31.
- Nguồn cung cấp: 1.8V – 3.6V
- Công suất tiêu tán cực thấp.
- 5 chế độ tiết kiệm năng lượng.
- Wake-up nhanh từ chế độ Standby
<1us
- Kiến trúc RISC 16 bits
- Có nhiều nguồn xung Clock để lựa
chọn.
- Timer_A 16 bit với 2 thanh ghi
Compare/Capture.
- USI hỗ trợ I2C, SPI
- 10 bit 200kbps ADC với nguồn
tham chiếu nội, Sample và Hold,
Autoscan.
1.1.2 Sơ đồ chân.
3. 1.2 Hệ thống Reset, Ngắt và các chế độ hoạt động.
1.2.1 Hệ thống Reset và khởi động:
Có 2 hệ thống POR (Power on Reset) và PUC (Power UP Clear).
- POR chỉ được sinh 3 sự kiện sau:
o Cấp nguồn cho thiết bị.
o Tín hiệu ở chân ~RST/NMI xuống mức thấp
o SVS ở mức thấp khi PORON = 1
- PUC được sinh ra khi POR được sinh, nhưng không xảy ra ngược lại. Các sự kiện sau
sẽ sinh ra PUC:
o POR được sinh ra.
o WDT hết hiệu lực
o Chốt an toàn của WDT và Flash memory bị vi phạm.
4. 1.2.2 Hệ thông ngắt
Có 3 loại ngắt trong msp430 là: Reset hệ thống, Non-maskable NMI, maskable.
1.3 Bộ nhớ và tổ chức bộ nhớ
1.3.1 Không gian địa chỉ.
Bộ nhớ MSP430 theo kiến trúc von-Neumann không
gian nhớ bao gồm các thanh ghi có chức năng đặc
biệt SFRs, ngoại vi, RAM, Flash/ROM như hình bên.
- Flash/ROM: độ lớn tùy thuộc vào từng dòng
chip. Bộ nhớ Flash có thể sử dụng cho cả
data và code. Word hoặc byte tables có thể
được lưu trữ và sử dụng ngay trên Flash mà
không cần sao chép vào RAM. Interrupt
vector được định ở 16bytes từ 0FFE0h –
0FFFFh
- RAM: bắt đầu từ 200h, độ lớn của RAM phụ
thuộc vào dòng chip và lượng RAM đang sử
dụng.
- Peripheral Module: 16 bit được định ở địa
chỉ từ 100h – 1FFh, được truy cập bằng word,
nếu truy cập bằng byte thì byte cao luôn luôn
bằng 0. Ngoại vi 8bit từ 10h đến FFh chỉ được truy cập bằng byte.
- SFRs: 16 byte từ 0h đến 16h.
5. 1.3.2 Tổ chức bộ nhớ
Bô nhớ được tổ chức theo các
byte. Các byte được đánh địa chỉ chẵn
và lẽ. Bộ nhớ MSP430 còn có thể thao
tác với word 16bit.
Một word gồm 2 byte kề nhau (High byte & Low
byte), địa
chỉ của
word là
địa chỉ
của byte
thấp, vì
vậy luôn là địa chỉ chẵn
1.4 CPU
Bao gồm ALU , 16 thanh ghi 16 bit và các mạch logic để
giải mã lệnh và thực hiện chương trình.
4 thanh ghi đầu: PC - là bộ đếm chương trình chứa địa chỉ
của lệnh kế tiếp , SP, SR - chứa tập hợp các cờ như C,N,Z,V
hoặc GIE hoặc CPUOFF OSC, Constant Generator - chứa các hằng số như 1 2 4…. . Và 12 thanh
ghi mục đích chung. Cả word và byte đề có thể được ghi vào trong thanh ghi của CPU. Khi dữ liệu ghi
vào là byte thi byte cao sẽ bị xóa byte thấp chứa giá trị của byte đưa vào.
1.5 Clock Generator
Sơ đồ phần cứng và các nguồn xung clock
6. - Để đồng bộ các hoạt động của Vi điều khiển
- MSP430 có nhiều nguồn xung clock để lựa chọn nhằm tối ưu hóa hiệu suất và công suất hoạt
động. Clock có thể được cấu hình để hoạt động mà không cần thành phần bên ngoài nào,hoặc với
1 điện trở, hoặc với 1 , 2 thạch anh ngoài.
o Low frequency Crystal Clock LFXT1CLK: Nguồn Clock này lấy từ thạch anh ngoài gắn
vào chân XIN, XOUT. Intended frequency là 32Khz là nguồn của ACLK. Có thể hoạt động ở
tần số cao hơn.
o Crystal to Clock XT2CLK : dùng thạch anh ngoài gắn vào 2 chân XT2IN XT2OUT, mục
đích là dùng với thạch anh tần sos cao 400KHz – 6Mhz
o Digitalally Controlled Oscillator Clock (DCOCLK): clock nội, mặc định khi không cấu hình
thì dùng cho tín hiệu MCLK ở 900Khz
o Very Low Frequency (VLOCLK) là ngồn nội có công suất thấp, tấn số thấp 12Khz.
- Các tín hiệu Clock:
o Master Clock: dùng cho CPU. nguồn được chọn bởi SELMx (Basic Clock System Control
Register BCSCTL 2) có thể là VLOCLK XT2CLK LFXT1CLK DCOCLK, chia tần số được lựa
chon bởi DIVMx
o Submaster Clock: dùng cho các ngoại vi, nguồn của nó là VLOCLK XT2CLK LFXT1CLK
DCOCLK được điều khiển bởi các bit SELS SCG (BCSCTL2), chia tần số DIVSx
o Auxillary Clock: dùng cho các module ngoại vi. Nguồn chủa nó LFXT1CLK hoặc VLOCLK,
có thể chia tần số 1 2 4 8 lần.
1.6 Ngõ ra/ vào
1.6.1 Cấu trúc xuất nhập:
o Gồm 8 port xuất nhập từ P0 -> P7.
o Mỗi port gồm 8 chân
o Mỗi chân có thể làm đầu vào hay đầu ra,có thể được đọc hay được ghi riêng lẻ.
o Port P1 và P2 có khả năng ngắt
7. o Mỗi ngắt được cấu hình theo cạnh lên,cạnh xuống của sườn xung hoặc theo tín hiệu vào
tương ứng với các vector ngắt
1.6.2 Đặc tính xuất nhâp:
o chức năng của chân không phụ thuộc vào việc lập trình
o có thể làm input hay output
o P1 và P2 được cấu hình riêng cho ngắt
o không phụ thuộc vào thanh ghi input hay output
o cấu hình có điện trở kéo
1.6.3 Hoạt động xuất nhập:
o Được lập trình bằng phần mềm
1.6.4 Thanh ghi input
o Bit=0:đầu vào ở mức thấp
o Bit =1:đầu vào ở mức cao
1.6.5 Thanh ghi output:
o Khi không sử dụng điện trở kéo,giá trị các thanh ghi tương ứng:
o Bit=0:đầu vào ở mức thấp
o Bit =1:đầu vào ở mức cao
o Khi không sử dụng điện trở kéo,giá trị tương ứng:
o Bit=0: điện trở kéo xuống
o Bit =1: điện trở kéo lên
1.6.6 Thanh ghi định hướng PxDIR:
o Các chân làm đầu vào hay đầu ra được định hướng bởi các bit của thanh ghi PxDIR
o Bit=0:chân được định hướng làm đầu vào(chú ý dễ nhầm lẫn với PIC)
o Bit =1:chân được định hướng làm đầu ra
1.6.7 Thanh ghi cho phép điện trở kéo PxREN:
o Mỗi bit của thanh ghi PxREN cho phép hay không cho phép điện trở kéo
o Bit=0: điện trở kéo xuống
o Bit =1: điện trở kéo lên
1.6.8 Thanh ghi lựa chọn chức năng PxSEL PxSEL2:
o Các bit của thanh ghi PxSEL và PxSEL2 được sử dụng để lựa chọn chức năng là Port xuất nhập
hay các chức năng đặc biệt khác
PxSEL2 PxSEL Chức năng của chân
0 0 Chức năng xuất nhập
0 1 Module đầu tiên được lựa chọn
1 0 Đăng kí trước
1 1 Module ngoại vi thứ 2 được lựa chọn
Lưu ý: khi PxSEL=1,các ngắt của P1 và P2 bị cấm.
1.6.9 Các ngắt P1 và P2:
o Mỗi chân của P1 và P2 đều có khả năng ngắt.
o Ngắt đươc cấu hình bởi thanh ghi PxIFG, PxIE và PxIES.
o Sử dụng thanh ghi PxIFG để xác định nguyên nhân ngắt của P1 và P2
a) Thanh ghi cờ ngắt P1IFG và P2IFG
o Mỗi bit của thanh ghi PxIFGx là 1 cờ ngắt tương ứng với chân xuất nhập và khi có cạnh xung tín
hiệu tại các chân.tất cả các cờ ngắt của thanh ghi PxIFGx đòi hỏi 1 ngắt tương ứng với các bit PxIE
và GIE đươc set.
o Mỗi cờ ngắt được reset bằng phần mềm.
o Phần mềm có thể set cờ ngắt
o Bit=0: không có cờ ngắt nào
o Bit =1: có 1 ngắt đang chờ
8. 1.6.10 Thanh ghi lựa chọn ngắt bằng sườn xung P1IES và P2IES.
o Bit=0: cờ ngắt được set lên khi có cạnh lên của xung
o Bit =1: cờ ngắt được set lên khi có cạnh xuống của xung
1.6.11 Thanh ghi cho phép ngắt P1IE và P2IE
o Bit=0: cấm ngắt
o Bit =1: cho phép ngắt
1.7 Timer_A
1.7.1 Giới thiệu về Timer_A:
9. Timer_A có:
o 16bit timer/counter với 4 chế độ hoạt động: Stop, Up, Continuous, Up/Down.
o Nguồn xung clock có thể lựa chọn và cấu hình từ nhiều nguồn khác nhau
o 3 thanh ghi Capture/Compare (TACCRx)
o PWM
o 2 vector ngắt : TACCR0 và TAIV
1.7.2 Sơ đồ phần cứng Timer_A
1.7.3 Các thanh ghi sử dụng trong Timer_A:
1.7.4 Lựa chọn nguồn xung clock cho Timer_A:
o Nguồn xung clock cho timerA có thể được lựa chọn từ nguồn xung clock : ACLK, SMCLK hay từ
nguồn bên ngoài TACLK, INCLK thông qua việc lựa chọn các bit TASSELx(TACTL). Cụ thể:
TASSELx Nguồn lựa chọn
00 TACLK
01 ACLK
10 SMCLK
11 INCLK
o Các nguồn xung clock được lựa chọn này có thể được sử dụng trực tiếp cho hoạt động của
Timer_A hay có thể được chia bởi 2, 4, 8 bằng cách sử dụng các bit IDx(TACTL). Cụ thể:
IDx Nguồn clock được chia
00 /1
01 /2
10 /4
11 /8
1.7.5 Các chế độ hoạt động của Timer_A:
TimerA có 4 chế độ hoạt động : Stop, Up, Continuous, Up/Down được lựa chọn bởi các bit
MCx(TACTL).Cụ thể:
MCx Mode Description
10. 00 Stop TimerA không hoạt động
01 Up Timer_A đếm lặp lại từ 0 đến giá trị thanh ghi TACCR0
10 Continuous Timer_A đếm lặp lại từ 0 đến giá trị FFFFh
11 Up/Down Timer_A đếm lặp lại từ 0TACCR00
Timer_A hoạt động ngay khi giá trị các bit MCx khác 00 và nguồn xung clock được chọn cho
Timer_A hoạt động.
Khi TimerA hoạt động ở chế độ Up hoặc Up/Down, timer sẽ dừng hoạt động khi ghi giá trị 0
vào thanh ghi TACCR0
1.7.5.1 Up Mode:
Thay đổi giá trị thanh ghi TACCR0 khi timer đang hoạt động:
+ Nếu giá trị mới bằng hay lớn hơn giá trị cũ hay lớn hơn giá trị hiện tại, Timer sẽ đếm đến giá trị
mới.
+ Nếu giá trị mới bé hơn giá trị hiện tại, timer sẽ đếm lại từ giá trị 0.
o Cấu hình Timer_A hoạt động ở chế độ Up:
Cho phép ngắt TACCR0 CCIFG:
CCIE =1 trong thanh ghi TACCTL0
Nạp giá trị vào thanh ghi TACCR0:
TACCR0 = xxxx
Lựa chọn nguồn xung clock dùng cho Timer_A
thiết lập giá trị các bits TASSELx trong thanh ghi TACTL
Thiết lập giá trị chia cho xung clock:
thiết lập bits IDx trong thanh ghi TACTL (mặc định IDx = 00 -- /1)
Lựa chọn timer_A hoạt động ở chế độ Up:
thiết lập MCx = 01 trong TACTL
Code cho chương trình ngắt…
1.7.5.2 Continuous Mode:
Cấu hình Timer_A hoạt động ở chế độ Continuous: Tương tự như trên
1.7.5.3 Up/Down Mode:
11. o Thay đổi giá trị thanh ghi TACCR0 khi timer đang hoạt động:
• Nếu timer đang trong chiều đếm xuống, timer sẽ tiếp tục đếm xuống đến 0.
• Nếu timer đang trong chiều đếm lên và giá trị mới lớn hơn hay bằng giá trị cũ hay lớn hơn giá trị
hiện tại, timer sẽ đếm đến giá trị mới trước khi đếm xuống.
• Nếu timer đang trong chiều đếm lên và giá trị mới bé hơn giá trị giá trị hiện tại, timer sẽ bắt đầu
đếm xuống
o Cấu hình Timer_A hoạt động ở chế độ Up:
Tương tự như trên
1.7.6 Compare Mode:
Compare mode được lựa chọn khi bit CAP()=0(mặc định).
Compare mode dùng để tạo ra khoảng thời gian hay điều chế độ rộng xung PWM
Compare mode hoạt động dựa trên nguyên tắc so sánh giá trị của thanh ghi timer_A(TAR) với giá
trị thanh ghi TACCRx
Khi giá trị của TAR bằng giá trị của TACCRx thì sẽ xuất hiện các sự kiện:
• Cờ ngắt CCIFG =1
• EQUx = 1
• EQUx ảnh hưởng đến lối ra PWM
• Tín hiệu CCI lật sang SCCI
1.7.7 Output Unit:
Mỗi khối capture/compare chứa một bộ OUTPUT UNIT dùng để điều chế độ rộng xung PWM.
Mỗi OUTPUT UNIT có 8 chế độ hoạt động tạo ra tín hiệu dựa trên tín hiệu EQU0 và EQUx.
OUTPUT UNIT được lựa chọn hoạt động dựa trên giá trị của các bit OUTMODx.
Cụ thể:
OUTMODx Mode Description
000 Output Tín hiệu ra OUTx được xác định bởi bit OUTx
001 Set Lối ra được set khi TAR = TACCRx.Nó sẽ giữ nguyên như vậy cho đến
khi timer được reset hay khi 1 output mode khác được lựa chọn và ảnh
hưởng đến lối ra.
010 Toggle/Reset Lối ra đảo trạng thái khi TAR = TACCRx và reset khi TAR = TACCR0
011 Set/Reset Lối ra set khi TAR = TACCRx và reset khi TAR = TACCR0
100 Toggle Lối ra đảo trạng thái khi TAR = TACCRx. Chu kì tín hiện ra gấp 2 lần
chu kì timer
101 Reset Lối ra reset khi TAR = TACCRx. Nó sẽ giữ nguyên như thế cho đến khi
1 output mode khác được lựa chọn và ảnh hưởng đến lối ra
110 Toggle/Set Lối ra đảo trạng thái khi TAR= TACCRx và set khi TAR = TACCR0
111 Reset/Set Lối ra reset khi TAR = TACCRx và set khi TAR = TACCR0
Cấu hình PWM:
Cấu hình chức năng I/O nhận chức năng ra OUTx của PWM:
Vì các chân P1.1 P1.2 và P1.3 là những chân ra của PWM nên cần cấu hình các bits tương ứng
trong thanh ghi P1DIR và P1SEL. Ví dụ: P1DIR = 0x0C, P1SEL= 0x0C chọn chân P1.2 và P1.3 là chân ra
PWM của CCR1 và CCR2
12. Nạp giá trị cho TACCR0, TACCRx
Lựa chọn thanh ghi capture/compare để tạo PWM :
Thiết lập các bit OUTMODx trong thanh ghi TACCTLx tương ứng.
Lựa chọn nguồn xung clock, hệ số chia và chế độ hoạt động cho Timer_A :
Thiết lập các bit TASSELx, IDx và MCx trong thanh ghi TACTL
1.7.8 Ngắt Timer_A:
Timer_A có 2 vector ngắt:
Vector ngắt TACCR0 cho TACCR0 CCIFG
Vector ngắt TAIV cho TAIFG và CCIFGs của CCR1 và CCR2
Cụ thể :
Cờ ngắt TACCR0 CCIFG có độ ưu tiên cao nhất trong ngắt Timer_A và tự động reset khi
chương trình ngắt được thực thi
Cờ ngắt TACCR1 CCIFG ,TACCR2 CCIFG và TAIFG có cùng vector ngắt TAIV và được
phân chia theo mức độ ưu tiên như sau:
Ngắt có mức độ ưu tiên cao hơn sẽ được thực hiện trước bằng cách nạp 1 giá trị vào
thanh ghi TAIV. Giá trị này sẽ được tính toán hay cộng vào thanh ghi PC để nhảy tới chương trình
con phục vụ ngắt.
Cờ ngắt CCIFG của TACCR1 và TACCR2 cũng được tự động reset khi thoát khỏi chương
trình ngắt.
Nếu có 1 ngắt khác xảy ra khi đang thực hiện ngắt, ngắt khác đó sẽ được thực hiện ngay
lập tức sau khi ngắt trước được thực thi xong.
1.8 ADC10:
- 10 bit ADC, 8 kênh ADC.
- Tốc độ 200kpbs.
- Có thể lựa chọn nguồn clock cho ADC:
ADC10OSC (5Mhz), ACLK, MCLK,
SMCLK.
- Vref nội và ngoại.
13. - Autoscan
- Có thể lấy nhiều kênh cùng lúc.
- Điều khiển chuyển đổi dữ liệu và tự động
lưu trữ mẫu đã lấy.
- Có ngắt
1.8.1 Phần cứng và hoạt động:
- ADC10 được cấu hình bởi 2 thanh ghi ADC10CTL0
và ADC10CTL1 và 2 thanh ghi này chỉ được thay
đổi khi ENC = 0; khi bắt đầu lấy mẫu thì phai đưa
ENC = 1;
- Nadc = 1023
- Lựa chọn kênh ADC: ADC10AEx bits
- Voltage Reference Generator: Nguồn nội 1.5V 2.5V
hoặc Vcc được lựa chọn dựa vào bit REFON
REF2_5 REFOUT
- Sample and Conversion Timing: SHTx lựa chọn chu
kì lấy mẫu 4 8 16 64xADC10CLK,
- Conversion Mode:
CÓNEQx MODE
00 Single chanel – Single Conversion
01 Sequence of channels
10 Repeat single channels
11 Repeat Sequence of channels
1.8.2 Mode Single Chanel – Single
Conversion.
- Sau khi bật chuyển đổi ADC10
(ADC10ON) và thiết lập kênh lấy ADC
(INCHx).
14. - Đợi ENC và ADC10SC được kích hoạt thì
bắt đàu chuyển đổi
- Lấu mẫu dữ liệu vào khi tín hiệu
SAMPCON ở mức cao với tốc độ là
4/8/16/64x ADC10CLK.
- Quá trình chuyển đổi dữ liệu sau đó sẽ
mất thêm 12xADC10CLK.
- Lưu kết quả vào ADC10MEM và set cờ
ADC10IFG mất thêm 1 ADC10CLK
- Trong quá trình thực hiện từng bược trên
nếu có thay đổi tín hiệu SHS, ENC
ADC10SC thì quá trình sẽ nhảy về trạng
thái đợi 1 hoặc tất cả các tín hiệu trên
được set trở lại.
1.8.3 Mode Single of Sequence
- Được phân tích giống mode trên nhưng
khác ở chỗ là quá trình tự kết thúc khi
các kênh lựa chọn đã được lấy mẫu hết
điều này được báo bằng tín hiệu EOS.x
nếu tín hiệu này bằng 1 quá trình chuyễn
đổi các kênh đã xong.
1.8.4 Các bit hay dùng trong
ADC
Trong thanh ghi
ADCCTL1
15. o INCHx (4bits) : lựa chọn kênh lấy ADC.
o ADC10DIVx (2bits) : ADC10
Clock Divider.
o ADC10SSELx (2bits): Clock
source select.
Trong thanh ghi ADCCTL0
o SREFx (3bits): Chọn nguồn
áp tham chiếu.
o ADC10SHTx (2bits): chọn
thời gian sample và hold.
o ADC10SR (1bits) : tốc độ
lấy mẫu 0 (200kbps)
1(150kbps).
o REFOUT (1bit): Có chọn
nguồn tham chiếu ngoài hay
không.
o REFON (1bit): bật nguồn
tham chiếu nội ->REF2_5V
(1bit) nguồn nội là 1.5V hay
2V
o ADC10ON: Bật ADC10.
o ADC10IE: cho phép ngắt ADC10
Trong thanh ghi ADC10AE0
o ADC10AE0x (Bit 7-0) cho phép chân ngõ vào là ngõ vào Analog
Cách cấu hình đơn giản cho ADC hoạt động.
1.8.5 ADC10 DATA TRANFER CONTROLLER
- Được kích hoạt nếu giá trị thanh ghi ADC10DTC1 khác không.
- Khi ADC10 chuyên đổi xong giá trị được đẩy vao ADC10MEM, bộ chuyển dữ liệu được kích
hoạt.Mỗi DTC tranfer cần 1 chu kỳ MCLK. Có 2 chế độ: One block và two block tranfer
1.8.6 ADC10 Interupt
- Một ngắt và một vector ngắt đi kèm với bộ ADC10.
- Khi DTC không được dùng thì ADC10IFG được set khi quá trình chuyển đổi ADC đã xong và dữ
liệu được load vào ADC10MEM. Khi dùng DTC thì ADC10IFG được set khi khi việc chuyển vào bộ
nhớ 1 block hoàn
thành.Nếu bit GIE và
ADC10IE được set thì khi
ADC10IFG được set thì
sẽ tạo ra ngắt.
16. 1.9 UART
1.9.1 Giới thiệu :
o Là bộ truyền nhận dữ liệu nối tiếp bất đồng bộ
o Khi kết hợp với mỗi thiết bị chuyển đổi điện áp khác nhau nó tạo ra 1 chuẩn giao tiếp khác
nhau ( vd: chuẩn RS232 thông qua MAX232,…)
o Dữ liệu được đóng gói thành các khung truyền trước khi truyền đi, một khung truyền bao
gồm :
o Start bit (=0): báo cho thiết bị nhận chuẩn bị có dữ liệu truyền đến
o Data : là phần dữ liệu gửi đi ngay sau start bit
o Parity bit : là bit được thêm vào để kiểm tra dữ liệu sau khi truyền
o Stop bit : thường là 1 bit hoặc 2 bit dùng để báo kết thúc một khung truyền
o Tốc độ baud ( số bit truyền trong 1s) ở cả 2 thiết bị truyền và nhận phải giống nhau
1.9.2 Hoạt động:
o USCI_UART được reset bởi PUC hoặc set bit UCSWRST
o USCI_UART hoạt động khi clear bit UCSWRST
o Hoạt động nhận dữ liệu của UART
o Sau khi clear bit UCSWRST, bộ nhận dữ liệu và bộ tốc độ baud sẵn sàng và ở trạng thái
chờ
o Khi phát hiện start bit thì quá trình nhận dữ liệu bắt đầu và ngược lại khi không phát hiện
start bit thì quay về trạng thái chờ
o Hoạt động truyền dữ liệu của UART
o Sau khi clear bit UCSWRST, bộ nhận truyền dữ liệu và bộ tốc độ baud sẵn sàng và ở trạng
thái chờ
o Khi có dữ liệu ghi vào thanh ghi UCAxTXBUF thì quá trình truyền dữ liệu bắt đầu
o Dữ liệu được truyền vào Transmit shift register khi thanh ghi này rỗng và tiếp tục được
truyền sang thiết bị nhận
o Cờ UCAxTXIFG được set khi mà UCAxTXBUF đã sẵn sàng cho dữ liệu tiếp theo
o Nếu dữ liệu không được ghi vào UCAxTXBUF thì bộ UART lại tiếp tục vào trạng thái chờ
1.9.3 Thiết lập tốc độ baud :
Có 2 chế độ thiết lập, được lựa chọn bằng bit UCOS16
o BITCLK = tốc độ baud
o Tốc độ baud này được tính từ xung BRCLK qua hệ số chia N = (fBRCLK / Baud rate), do
đó hệ số N thường không phải là số nguyên.Vì vậy để tăng độ chính xác, ngoài bộ chia
divider còn có bộ điều biến modulator
o Để thiết lập tốc độ baud với các độ chính xác khác nhau, ta sử dụng bảng
o “ Commonly used Baud Rates“ của msp430 để thiết lập các giá trị cho UCBRx, UCBRFx,
UCBRSx.
1.9.4 Ngắt UART :
+Transmit interrupt
o Cờ ngắt UCAxTXIFG được set khi thanh ghi UCAxTXBUF đã sẵn sàng nhận dữ liệu mới
cần truyền
17. o Để xảy ra ngắt thì cờ UCAxTXIE và GIE cần được set
o Cờ ngắt UCAxTXIFG tự động reset khi dữ liệu được ghi vào UCAxTXBUF
+ Receive interrupt
o Cờ ngắt UCAxRXIFG được set dữ liệu được nhận và chứa trong thanh ghi UCAxTXBUF đã
o Để xảy ra ngắt thì cờ UCAxTXIE và GIE cần được set
o Cờ ngắt UCAxRXIFG tự động reset khi dữ liệu được đọc ra khỏi UCAxRXBUF
Thanh ghi :
o UCAxCTL0 : thanh ghi điều khiển 0
o UCAxCTL1 : thanh ghi điều khiển 1
o IE2 : thanh ghi điều khiển ngắt
o UCAxBRO : thanh ghi tạo hệ số chia tần
o UCAxBR1 : thanh ghi tạo hệ số chia tần
o UCA0MCTL : điều khiển modulation
1.9.5 Kích hoạt UART :
o Việc thay đổi giá trị trên các thanh ghi kể trên sẽ kích hoạt UART với nhiều mode khác nhau,
chẳng hạn muốn UART cấu hình : Baud rate = 9600 , nhận dữ liệu nối tiếp truyền từ máy vi
tính
o Chọn nguồn cung cấp clock và thiết lập tốc độ baud theo bảng trong datasheet
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 104; // 1MHz/104 ~ 9600 , UCBRx = 104
UCA0BR1 = 0;
UCA0MCTL = UCBRS0; // UCBRSx = 1
o Bắt đầu kích hoạt UART
UCA0CTL1 &= ~UCSWRST; // Turn on UART
o Kích hoạt ngắt của bộ nhận
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
1.10SPI
1.10.1 Giới thiệu :
o Cung cấp một giao thức nối tiếp đồng bộ kép giữa MCU và thiết bị ngoại vi
o Giao tiếp SPI được thực hiện thông qua bus 4 dây MISO, MOSI, SCK, SS
MISO: Master Input Slave Output
MOSI: Master Output Slave Input.
SCK : Serial Clock
SS : Slave Select.
1.10.2 Hoạt động:
o Tín hiệu SCK được cung cấp bởi Master nhằm tạo xung đồng bộ cho phép dữ liệu được truyền
đi hoặc khi đọc dữ liệu nhận được.
o Tốc độ của dữ liệu truyền đi sẽ thay đổi theo sự thay đổi của SCK ( sự thay đổi tốc độ truyền
không ảnh hưởng đến dữ liệu ).
o Master và Slave đều có thanh ghi dịch nối tiếp ở bên trong.
o Master bắt đầu việc trao đổi dữ liệu bằng cách truyền đi một byte vào thanh ghi dịch của nó, sau
đó byte dữ liệu sẽ được đưa sang Slave theo đường tín hiệu MOSI
18. o Slave sẽ truyền dữ liệu nằm trong thanh ghi dịch của chính nó ngược trở về Master thông qua
đường tín hiệu MISO.
+ Như vậy dữ liệu của hai thanh ghi sẽ được trao đổi với nhau. Việc đọc và ghi dữ liệu vào Slave
diễn ra cùng một lúc nên tốc độ trao đổi dữ liệu diễn ra rất nhanh. Do đó, giao thức SPI là một giao thức rất
có hiệu quả.
+ Chỉ có thiết bị Master mới có thể cấp xung SCK, dữ liệu sẽ không được truyền đi nếu như Master
không cung cấp xung SCK.
+ Tất cả các thiết bị Slave đều được điều khiển bởi xung nhịp phát ra từ Master (Slave không có
khả năng phát xung).
+ Thường thì tín hiệu SS dùng để chọn Slave sẽ tác động mức thấp để chỉ ra Slave nào được truy
cập. Tín hiệu này phải được sử dụng khi có nhiều hơn 1 Slave trong cùng hệ thống và thường không sử
dụng đến khi trong mạch chỉ có 1 Slave.
1.10.3 Thanh ghi ảnh hưởng SPI
+ USICKCTL : USI clock control register
+ USICNT : USI bit counter register
+ USICTL0 : USI control register 0
+ USICTL1 : USI control register 1
1.10.4 Kích hoạt SPI
+ Việc thay đổi giá trị trên các thanh ghi kể trên sẽ kích hoạt SPI với nhiều mode khác nhau, chẳng hạn
muốn SPI cấu hình : SPI Master + xung clock ACLK / 4
+ USICTL0 |= USIPE6 + USIPE5 + USIMST + USIOE;
+ USICTL1 |= USICKPH + USIIE;
+ USICKCTL = USIDIV_2 + USISSEL_1; // chia 2, ACLK
+ USICTL0 &= ~USISWRST;
+ USICNT = 8;
1.10.5 Ngắt SPI :
+ USIIFG được set khi bit USICNTx = 0 (tự động giảm về 0 khi truyền hết dữ liệu hoặc tự nạp giá trị 0)
+ USIIFG bị xóa khi bit USICNTx > 0 và USIIFGCC = 0 ,hoặc xóa trực tiếp bằng code.
Chương 2: Thực hành
19. 2.1 PORT1 :
//******************************************************************************
// MSP430G2xx1 Demo - Software Poll P1.4, Set P1.0 if P1.4 = 1
//
// Description: Poll P1.4 in a loop, if hi P1.0 is set, if low, P1.0 reset.
// ACLK = n/a, MCLK = SMCLK = default DCO
//
// MSP430F2x32
// -----------------
// /|| XIN|-
// | | |
// --|RST XOUT|-
// /| | |
// --o--|P1.4 P1.0|-->LED
// |/
//
//******************************************************************************
#include <msp430F2232.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= 0x01; // Set P1.0 to output direction
while (1) // Test P1.4
{
if ((0x10 & P1IN)) P1OUT |= 0x01; // if P1.4 set, set P1.0
else P1OUT &= ~0x01; // else reset
}
}
2.2 PORT1 & INTERRUPT:
20. //******************************************************************************
// MSP430G2xx1 Demo - Software Port Interrupt Service on P1.4 from LPM4
//
// Description: A hi/low transition on P1.4 will trigger P1_ISR which,
// toggles P1.0. Normal mode is LPM4 ~ 0.1uA. LPM4 current can be measured
// with the LED removed, all unused P1.x/P2.x configured as output or inputs
// pulled high or low, and ensure the P1.4 interrupt input does not float.
// ACLK = n/a, MCLK = SMCLK = default DCO
//
// MSP430G2x32
// -----------------
// /|| XIN|-
// | | |
// --|RST XOUT|-
// /| | |
// --o--|P1.4 P1.0|-->LED
// |/
//******************************************************************************
#include <msp430g2232.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= 0x01; // Set P1.0 to output direction
P1IE |= 0x10; // P1.4 interrupt enabled
P1IES |= 0x10; // P1.4 Hi/lo edge
P1IFG &= ~0x10; // P1.4 IFG cleared
_BIS_SR(LPM4_bits + GIE); // Enter LPM4 w/interrupt
}
// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1OUT ^= 0x01; // P1.0 = toggle
P1IFG &= ~0x10; // P1.4 IFG cleared
}
2.3 Ví d ho t đ ng c a Timer_A :ụ ạ ộ ủ
#include <msp430g2231.h>
21. void FaultRoutine(void);
void ConfigWDT(void);
void ConfigClocks(void);
void ConfigLEDs(void);
void ConfigTimerA2(void);
void main(void)
{
ConfigWDT();
ConfigClocks();
ConfigPINs();
ConfigTimerA2();
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/
interrupt
}
void ConfigWDT(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop
watchdog timer
}
//Configure Clock
void ConfigClocks(void)
{
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
FaultRoutine(); // If calibration data is
erased
// run FaultRoutine()
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step +
modulation
BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO
IFG1 &= ~OFIFG; // Clear OSCFault flag
BCSCTL2 |= SELM_0 + DIVM_3 + DIVS_3; // MCLK =
DCO/8, SMCLK = DCO/8
}
void FaultRoutine(void)
{
P1OUT = BIT0; // P1.0 on (red LED)
while(1); // TRAP
}
void ConfigPINs(void)
{
P1DIR = BIT6 + BIT0; // P1.6 and P1.0
outputs
P1OUT = 0; // LEDs off
}
void ConfigTimerA2(void)
{
CCTL0 = CCIE; // CCR0 interrupt
enabled
CCR0 = 62500;
TACTL = TASSEL_2 + MC_2; // SMCLK,
contmode
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT ^= 0x01; // Toggle P1.0
CCR0 += 62500; // Add Offset to CCR0
}
Sơ đồ nguyên lý:
Trong ví dụ trên, Timer_A hoạt động ở chế độ
continuous, sẽ xảy ra ngắt khi giá trị thanh ghi
TAR đếm đến giá trị thanh ghi TACCR0, chương
trình con phục vụ ngắt sẽ lật trạng thái chân P1.0
làm đèn led sáng tắt theo.
Với các chế độ hoạt động khác của Timer_A, ta
chỉ cần thay đổi cấu hình trong chương trình con
ConfigTimerA2
2.4 PWM:
#include <msp430g2231.h>
void FaultRoutine(void);
void ConfigWDT(void);
void ConfigClocks(void);
void ConfigPINs(void);
void ConfigTimerA2(void);
void main(void)
{
ConfigWDT();
ConfigClocks();
ConfigPINs();
ConfigTimerA2();
_BIS_SR(LPM0_bits); // Enter LPM0 w/
interrupt
}
void ConfigWDT(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop
watchdog timer
22. }
//Configure Clock
void ConfigClocks(void)
{
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
FaultRoutine(); // If calibration data is
erased
// run FaultRoutine()
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step +
modulation
BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO
IFG1 &= ~OFIFG; // Clear OSCFault
flag
BCSCTL2 |= SELM_0 + DIVM_3 + DIVS_3; // MCLK =
DCO/8, SMCLK = DCO/8
}
void FaultRoutine(void)
{
P1OUT = BIT0; // P1.0 on (red LED)
while(1); // TRAP
}
void ConfigPINs(void)
{
P1DIR = BIT2 + BIT1; // P1.2 and P1.1 outputs
P1SEL = BIT2 + BIT1; // P1.2 <--> OUT1 and
P1.1 <--> OUT0
}
void ConfigTimerA2(void)
{
CCR0 = 1001; // PWM Period
CCTL1 = OUTMOD_7; // CCR1 reset/set
CCTL0 = OUTMOD_4; // CCR0 toggle
CCR1 = 501; // CCR1 PWM duty
cycle 50%
TACTL = TASSEL_2 + MC_1; // SMCLK, Up
mode, No divide
S đ nguyên lý:ơ ồ
Trong ví dụ trên, ta sẽ tạo ra 2 xung PWM trên 2
chân P1.1 và P1.2
Xung PWM ở chân P1.1 sẽ là lối ra OUT0 (thanh
ghi TACCR0) hoạt động ở mode 4(toggle).
Xung PWM ở chân P1.2 sẽ là lối ra OUT1 (thanh
ghi TACCR1) hoạt động ở mode 7 (reset/set), độ
rộng
2.5ADC10 & Interupt
//******************************************************************************
// MSP430G2x31 Demo - ADC10, Sample A1, AVcc Ref, Set P1.0 if > 0.5*AVcc
//
23. // Description: A single sample is made
on A1 with reference to AVcc.
// Software sets ADC10SC to start
sample and conversion - ADC10SC
// automatically cleared at EOC. ADC10
internal oscillator times sample (16x)
// and conversion. In Mainloop MSP430
waits in LPM0 to save power until ADC10
// conversion complete, ADC10_ISR will
force exit from LPM0 in Mainloop on
// reti. If A1 > 0.5*AVcc, P1.0 set, else
reset.
//
// MSP430F2x32
// -----------------
// /|| XIN |-
// | | |
// --|RST XOUT|-
// | |
// >---|P2.1/A1 P1.1|-->LED
//
//******************************************************************************
#include "msp430F2132.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled
ADC10CTL1 = INCH_1; // input A1
ADC10AE0 |= 0x02; // PA.1 ADC option select
P1DIR |= BIT1 + BIT2; // Set P1.1, 1.2 to output direction
for (;;)
{
P1OUT |= 0x04;
__delay_cycles(1000);
P1OUT &= ~0x04;
__delay_cycles(1000);
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit
if (ADC10MEM < 0x1FF)
P1OUT &= ~0x02; // Clear P1.1 LED off
else
P1OUT |= 0x02; // Set P1.1 LED on
}
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
2.6 Phần thực hành giao tiếp SPI :
// Giao tiếp msp430g2232 với 74hc595 qua chuẩn giao tiếp SPI
// Dữ liệu từ msp430 sẽ truyền qua 595 để tạo hiệu ứng sáng led trên led 7 đoạn
// Phần cứng sẽ thực hiện trên kit launch pad theo sơ đồ như hình bên
#include <msp430g2231.h>
int i=0;
U 1
7 4 H C 5 9 5G N D
8
SDO
9
CLR
10G
13
SDI
14
V C C
1 6
SRCLK
11
RCLK
12
QA
15QB
1QC
2QD
3QE
4QF
5QG
6QH
7
M S P 4 3 0 G 2 2 3 1
P 1 . 0
C h o t
P 1 . 5
C l k
P 1 . 6
D a t a
8.
U 4
7 S e g m e n t m i n i
a
5b
4c
3d
10e
9f
7g
8p
2
V c c 1
1
V c c 2
6
V C C
V C C
V C C
0
24. int b[10]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 is output
USICTL0 |= USIPE6 + USIPE5 + USIMST + USIOE; // Port, SPI Master
USICTL1 |= USICKPH + USIIE; // Counter interrupt, flag remains set
USICKCTL = USIDIV_2 + USISSEL_1; // /4 ACLK
USICTL0 &= ~USISWRST; // USI released for operation
USISRL = b[i];
USICNT = 8; // init-load counter 8 bits
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 + interrupt
}
#pragma vector=USI_VECTOR // USI interrupt service routine
__interrupt void USI_ISR(void)
{
// create positive edge clock on p1.0
P1OUT &= ~0x01;
__delay_cycles(100000);
P1OUT |= 0x01;
USISRL = b[i] ;
if(i==5)
{
i=0;
}
else{
i++;
}
USICNT = 8; // re-load counter
}
2.7 Phần thực hành giao tiếp UART
// Giao tiếp msp430g2553 với máy vi tính qua chuẩn giao tiếp UART
// Dữ liệu được truyền từ máy vi tính xuống msp430 bằng phần mềm Advanced Serial Port Terminal
// Nếu dữ liệu truyền là số, thì msp430 sẽ xử lý và bật tắt các led trên kit launch pad
// Nếu dữ liệu là chữ thì msp430 sẽ truyền ngược lại cho máy vi tính để hiển thị lên màn hình của Advanced Serial
Port Terminal
// Phần cứng sẽ thực hiện trên kit launch pad rev 1.4 , chú ý ghép nối các jump để thực hiện UART trên kit
#include "msp430g2553.h"
#define UART_TXD 0x02
#define UART_RXD 0x04
unsigned int t1;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2;
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 104; // 1MHz / 104 ~ 9600
UCA0BR1 = 0;
UCA0MCTL = UCBRS0; // Modulation = 1
UCA0CTL1 &= ~UCSWRST; // Turn on UART (USCI)
25. IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
P1DIR = 0xFF & ~UART_RXD; // Set all pins but RXD to output
P1OUT = 0x00 ;
__bis_SR_register(LPM0_bits+GIE); //Enable ngat ngoai vi
t1=0;
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
if(UCA0RXBUF > '/' && UCA0RXBUF < ':')
t1 = t1*10 + (UCA0RXBUF-'0') ;
else
{
if(UCA0RXBUF == ':')
{
switch(t1)
{
case 11:
P1OUT |= BIT0;
break; // bat led do p1.0
case 12:
P1OUT |= BIT6;
break; // bat led xanh p1.6
case 91:
P1OUT &=~ BIT0;
break; // tat led do p1.0
case 92:
P1OUT &=~ BIT6;
break; // tat led xanh p1.6
default:
break;
}
t1 = 0 ;
}
else
while (!(IFG2 & UCA0TXIFG)); // USCI_A0 TX buffer ready?
if(UCA0RXBUF != ':')
UCA0TXBUF = UCA0RXBUF;
}
}
2.8 WDT
//******************************************************************************
26. // MSP430G2xx1 Demo - WDT, Toggle P1.0, Interval Overflow ISR, DCO SMCLK
//
// Description: Toggle P1.0 using software timed by the WDT ISR. Toggle rate
// is approximately 30ms based on default DCO/SMCLK clock source
// used in this example for the WDT.
// ACLK = n/a, MCLK = SMCLK = default
//
// MSP430G2xx2
// -----------------
// /|| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P1.0|-->LED
//
//******************************************************************************
#include <msp430g2232.h>
void main(void)
{
WDTCTL = WDT_MDLY_32; // Set Watchdog Timer interval to ~30ms
IE1 |= WDTIE; // Enable WDT interrupt
P1DIR |= 0x01; // Set P1.0 to output direction
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
}