Tải bản đầy đủ (.doc) (33 trang)

Bài tập lớn đo và hiển thị tốc độ động cơ qua cổng USB

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.32 MB, 33 trang )

Cộng hòa xã hội chủ nghĩa Việt Nam
Độc lập – Tự do – Hạnh phúc
*********

BÁO CÁO BÀI TẬP LỚN
Môn học: Đo lường và điều khiển máy tính

Đề tài : Đo và hiển thị tốc độ động cơ qua cổng USB

Lớp : LT CĐ-ĐH Điện tử 1-Khóa 3

Gi¸o viªn híng dÉn: Vũ Thị Thu Hương
Sinh viên thực hiện:

Nguyễn Tiến Dũng
Lý Long Hưng

Yêu cầu của đề tài:
1. Mạch được thiết kế bằng phần mềm chuyên dụng trên máy tính
2. Tốc độ động cơ được hiển thị bằng đồ thị trên máy tính
3. Mạch được ghép nối với máy tính qua cổng USB
4. Phần mềm hiển thị trên máy tính được viết bằng ngôn ngữ lập trình Windows
Thực hiện:
1. Mạch được vẽ bằng phần mềm Altium
2. Đo tốc độ sử dụng cảm biến hồng ngoại và vi điều khiển 89S52
3. Sử dụng IC giao tiếp cổng USB giả lập cổng com Atmega8
4. Phần mềm hiển thị tốc độ động cơ trên máy tính được viết bằng Visual Basic


Chng 1 - Giới thiệu về họ 8051( AT 89S52)
I-Tụng quan



Sơ đồ chân AT 89S52
Bộ vi điều khiển AT89S52 gồm các khối chức năng chính sau đây:
CPU( Central Processing Unit) bao gồm:
- Thanh ghi tích luỹ A
- Thanh ghi tích luỹ phụ B, dùng cho phép nhân và phép chia
- Đơn vị logic học( ALU: Arithmetic Logical Unit)
- Từ trạng thái chơng trình( PSW: Progam Status Word)
- Bốn băng thanh ghi
- Con trỏ ngăn xếp
Bộ nhớ chơng trình( Bộ nhớ ROM) gồm 8Kb Flash.
Bộ nhớ dữ liệu( Bôn nhớ RAM) gồm 256 bytes.
Bộ UART( Universal Ansynchronous Receiver and Tranmitter) làm chức năng
truyền nhận nối tiếp, nhờ khối này, AT89S52 có thể giao tiếp với máy tính qua cổng COM.
3 bộ Timer /Counter 16 bít thực hiện các chức năng định thời và đếm sự kiện.
WDM( Watch Dog Timer) đợc dùng để phục hồi lại hoạt động của CPU khi nó
bị treo bởi một nguyên nhân nào đó. WDM ở AT89S52 gồm một bộ Timer 14 bít, một bộ


Timer 7 bít, thanh ghi WDTPRG( WDT programable) điều khiển Timer 7 bit và một thanh ghi
chớc năng WDTRST( WDM register). Bình thờng WDT không hoạt động( bị cấm), để cho
phép WDT, các giá trị 1EH và E1H cần phải đợc ghi liên tiếp vào thanh ghi WDTRST. Timer
14 bit của WDT sẽ đếm tăng dần sau mỗi chu kỳ đồng hồ cho đến giá trị 16383 thì xảy ra
tràn. Khi xảy ra tràn, chân RTS sẽ đợc đặt ở mức cao trong thời gian 96.Tosc (Tossc=1/Fosc)
và AT89S52 sẽ đợc reset. Khi WDT hoạt động, ngoại trừ reset phần cứng và reset do WDT
tràn thì không có cách nào cấm đợc WDT, vì vậy khi sử dụng WDT thì các đoạn mã chơng
trình phải đợc đặt trong các khe thời gian từ khi giữa các lần WDT đợc khởi tạo lại

Hình: Sơ đồ khối của bộ vi điều khiển 89S52


II- Sơ đồ các chân và chức năng


1.Port 0(P0.0-P0.7 hay từ chân 32 đến chân 39): Gồm 8 chân, ngoài chức năng xuất
nhập ra, Port 0 còn là Bus đa hợp dữ liệu và địa chỉ( AD0-AD7), chức năng này sẽ đợc sử
dụng khi AT89S52 giao tiếp với thiết bị ngoài có kiến trúc Bus

2.Port 1( P1.0-P1,7 hay từ chân 1 đến chân 8) : Có chức năng xuất nhập theo bit và
byte. Ngoài ra, 3 chân P1.5, P1.6, P1.7 đợc dùng để nạp ROM theo chuẩn ISP, 2 chân P1.0 và
P1.1 đợc dùng cho bộ Timer 2

3.Port 2( P2.0- P2.7 hay từ chân 21 đến chân 28): Là một port có công dụng kép: là
đờng xuất nhập hoặc là byte cao của bus địa chỉ đối với các thiết kế dùng bộ nhớ mở rộng.


4.Port 3( P3.0- P3.7 hay từ chân 10 đến chân 17): Mỗi chân trên port 3 ngoài chức
năng xuất nhập ra còn có một chức năng riêng:
Bit
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7

Tên
RXD
TXD

INT0
INT1
T0
T1
WR
RD

Chức năng
Dữ liệu nhận cho port nối tiếp
Dữ liệu phát cho port nối tiếp
Ngắt 0 bên ngoài
Ngắt 1 bên ngoài
Ngõ vào của Timer/Counter 0
Ngõ vào của Timer/Counter 1
Xung ghi bộ nhớ dữ liệu bên ngoài
Xung đọc bộ nhớ dữ liệu bên ngoài

5. RST( Reset- chân 9):
Mức tích cực của chân này là mức 1, để reset ta phải đa mức 1(5V) đến chân
này với thời gian tối thiểu 2 chu kỳ máy( tơng đơng 2uS đối với thạch anh 12MHz.
Trạng thái của các thanh ghi khi reset, khi reset thì trạng thái của các thanh ghi
không thay đổi


6.XTAL1, XTAL2:
AT89S52 có một bộ dao động trên chip, nó thờng đợc nồi với một bộ dao động
thạch anh có tần số lớn nhất là 33MHz, thông thờng là 12MHz.
7. EA( External Access):
EA thờng đợc mắc lên mức cao(+5V) hoặc mức thấp( GND). Nếu ở mức cao,
bộ vi điều khiển thi hành chơng trình từ ROM nội. Nếu ở mức thấp, chơng trinh chỉ đợc thi

hành từ bộ nhớ mở rộng.
8.ALE( Address Latch Enable):
ALE là tín hiệu để chốt địa chỉ vào một thanh ghi bên ngoài trong nửa đầu của
chu kỳ bộ nhớ. Sau đó các đờng port 0 dùng để xuất hoặc nhập dữ liệu trong nửa chu kỳ sau
của bộ nhớ.
9.PSEN( Program Store Enable):
PSEN là điều khiển để cho phép bộ nhớ chơng trình mở rộng và trờng đợc nối
đến chân /OE ( Output Enable) của một EPROM để cho phép đọc các bytes mã lệnh.
PSEN sẽ ở mức thấp trong thừi gian đọc lệnh. Các mã nhị phân của chơng trình
đợc đọc từ EPROM qua Bus và đợc chốt vào thanh ghi lệnh của bộ vi điều khiển để giải mã
lệnh. Khi thi hành chơng trình trong ROM nội, PSEN sẽ ở mức thụ động( mức cao)
10.Vcc, GND:
AT89S52 dùng nguồn một chiều có dải điện áp từ 4V-5.5V đợc cấp qua chân
40(+) và chân 20(-).

III-Tổ chức bộ nhớ của AT89S52
1.Bộ nhớ chơng trình

AT89S52 có 8Kb Flash Rom trên chip, khi chân EA( Chân 31) đợc đặt ở mức logic
cao(+5V), bộ vi điều khiển sẽ thực hiện chơng trình trong ROM nội bắt đầu từ địa chỉ 0000H.
Số lần ghi cho bộ nhớ này khoảng 1000 lần( trên lý thuyết).
Khi chân EA đợc đặt ở mức thấp, bộ vi điều khiển sẽ thực hiên chơng trình ở bộ nhớ
chơng trình ngoài (EPROM ngoài), tuy nhiên để có ợc điều này thì phải có một mạch phối
ghép AT89S52 với EPROM đợc lựa chọn.


Hình dới là một vi mach chốt (Latch) sẽ tách riêng bus đa hợp địa chỉ và dữ liệu AD0AD7; Tuỳ theo dung lợng của EPROM sẽ có số đờng địa chỉ tơng ứng đợc dung; EPROM đợc
đọc nhờ tín hiệu PSEN
`


89S52

Flash
EPRROM
A15:8

P2
ALE
P0

Latch

A7:0

D7:0
PSEN #

OE

2.Bộ nhớ dữ liệu

AT89S52 có 256 bytes RAM nội đợc phân chia nh sau:
Các bank thanh ghi có địa chỉ từ 00H đến 1FH:
32 byte thấp của bộ nhớ nội đợc dành cho các bank thanh ghi. Bộ lệnh AT89S52 hỗ trợ 8
thanh ghi có tên là R0-R7 và theo mặc định sau khi reset hệ thống, các thanh ghi này có
các địa chỉ từ 00H đến 07H.
Các lệnh dùng các thanh ghi R0-R7 sẽ ngắn hơn và nhanh hơn so với các lệnh có chức
năng tơng ứng dùng kiểu địa chỉ trực tiếp. Các dữ liệu đợc dung thờng xuyên nên dùng một
trong các thanh ghi này.
Do có 4 bank thanh ghi nên tại một thời điểm chỉ có một bank thanh ghi đợc truy xuất bởi

các thanh ghi R0-R7, để chuyển đổi việc truy xuất thanh ghi ta phải thay đổi các bit chọn
bank trong thanh ghi trạng thái.
RAM địa chỉ hoá từng bit có địe chỉ từ 20H đến 2FH:
AT89S52 có 128 bits có chứa các byte định địa chỉ theo bit từ 20H đến 2FH. ý tởng truy
xuất từng bit bằng phần mềm là các đặc tính mạnh của các bộ vi điều khiển nói chung.
Các bit có thể đợc đặt xoá, AND, OR..., với một lệnh đơn.
RAM đa dụng từ 30H đến FFH.




Các thanh ghi chức năng đặc biệt từ 80H đến FFH:

3. Bộ nhớ dữ liệu ngoài:

Port 0
EA
ALE
Port 2

89S52
RD

D0-D7
74HC373
O
D
G

WR


A0-A7
RAM
A8-A15
OE
WE

Sơ đồ ghép nối AT89S52 với RAM


Bộ nhớ dữ liệu ngoài là bộ nhớ RAM đợc đọc hoặc ghi bởi tín hiệu /RD và WR. Các
RAM có thể giao tiếp với AT89S52 tơng tự cách thức nh EPROM ngoại trừ chân /RD của
AT89S52 nối với chân /OE của RAM và chân /WR của AT89S52 nối với chân /WE của RAM.
Nếu có nhiều vi mạch RAM hoặc ROM sùng đợc ghép nối với AT89S52 thì có thể
dùng thêm vi mạch giải mã 74LS138.
4.Các thanh ghi chức năng
Từ trạng thái chơng trình( PSW: Program Status Word).
Thanh ghi B.
Con trỏ ngăn xếp SP( Stack pointer).
Con trỏ dữ liệu DPTR( Data poiner)
Các thanh ghi Port( Port register)
Các thanh ghi của các bộ Timer( Timer register)
Các thanh ghi Port nối tiếp(Serial Port register)
Các thanh ghi ngắt( Interrupt register)
Thanh ghi điều khiển nguồn( Power Control register)
5. Mạch tạo dao động và Reset
* Mạch tạo dao động:
AT89S52 có một bộ chia tần số trong chip, bộ này sẽ cấp xung clock cho các khối bên
trong chip từ nguồn dao động bên ngoài qua 2 chân XTAL1 và XTAL2


* Mạch Reset:
Có 4 cách để reset AT89S52 lần lợt là: Reset khi cấp nguồn, Reset bởi WDT, Reset
bằng phần mềm và Reset bằng mạch ngoài qua chân RST.
HI

Vcc

R 1
10K

1
2
3
4
5
6
7
8
19
18
31
9
40

P
P
P
P
P
P

P
P

0
0
0
0
0
0
0
0

.0
.1
.2
.3
.4
.5
.6
.7

/A
/A
/A
/A
/A
/A
/A
/A


P
P
P
P
P
P
P
P

1
1
1
1
1
1
1
1

.0
.1
.2
.3
.4
.5
.6
.7

/T 2
/T 2 E X
/S

/M
/M
/S

D
D
D
D
D
D
D
D

0
1
2
3
4
5
6
7

P
P
P2
P2
P2
P2
P2
P2


S
O SI
IS O
C K

XTA L1
XTA L2

2 .0 /A
2 .1 /A
.2 /A 1
.3 /A 1
.4 /A 1
.5 /A 1
.6 /A 1
.7 /A 1

8
9
0
1
2
3
4
5

P 3 .0 /R X D
P 3 .1 /T X D
P 3 .2 /IN T 0

P 3 .3 /IN T 1
P 3 .4 /T 0
P 3 .5 /T 1
P 3 .6 /W R
P 3 .7 /R D
PSEN
A L E /P R O G

E A /V P P
R ST
VC C

G N D

C

9
8
7
6
5
4
3
2

20

SW 2
C 2


Reset

A T89S 52
3
3
3
3
3
3
3
3

2
2
2
2
2
2
2
2

1
2
3
4
5
6
7
8


1
1
1
1
1
1
1
1

0
1
2
3
4
5
6
7

29
30


IV-Port nụi tiờp

AT89S52 có một port nối tiếp trong chip có thể hoạt động ở nhiều chế độ khác nhau,
nhiều tốc độ khác nhau. Chức năng chủ yếu của một port nói tiếp là thực hiện chuyển đổi
song song sang nối tiếp với dữ liệu xuất ra và chuyển đổi nói tiếp sang song song với dữ liệu
nhập để có thể giao tiếp với máy tinh qua cổng nối tiếp hoặc các thiết bị tơng tự

AT89S52


Máy
tính

Cổng
COM

Bộ chuyển
đổi mức

Mô tả hoạt động của Port nối tiếp
Port nối tiếp có thể hoạt động song công( full duplex: thu và phát đồng thời) và đệm
lúc thu( receiver buffering) cho phép một kí tự sẽ đợc thu và đợc giữ trong khi kí tự thứ 2 đợc
nhận. Nếu CPU đọc kí tự thứ nhất trớckhi kí tự thứ 2 đợc thu đầy đủ thì dữ liệu sẽ không mất.
1.Các thanh ghi của port nối tiếp
Có 2 thanh ghi chức năng đặc biệt cho phép phần mềm truy xuất đến Port nối
tiếp: SBUF và SCON.
Thanh ghi điều khiển Port nối tiếp( SCON- Serial Controller).
Thanh ghi điều khiển Port nối tiếp SCON ở địa chỉ 98H là thanh ghi có điịnh
địa chỉ bit, chứa các bit trạng thái và các bit để đièu khiển liên quan tới port nối tiếp. Các bit
điều khiển đặt chế độ hoạt động cho Port nối tiếp, các bit trạng thái báo cáo kết thúc việc phát
hoặc thu một ký tự. Các bit trạng thai có thể đợc kiểm tra bằng ophần mềm hoặc có thể đợc
lập trình để tạo ngắt.
Bit
Ký hiệu Địa chỉ
Mô tả
SCON.7
SM0
9FH
Mode 1-Bit 0 chọn chế độ cho Port nối tiếp

SCON.6
SM1
9EH
Mode 1-Bit 1 chọn chế độ hoạt động cho Port
nối tiếp
SM0SM1=00: Port nối tiếp hoạt động ở chế độ 0
SM0SM1=01: Port nối tiếp hoạt động ở chế độ1
SM0SM1=10: Port nối tiếp hoạt động ở chế độ2
SM0SM1=11: Port nối tiếp hoạt động ở chế độ3
SCON.5
SM2
9DH
Mode 2-Bit 2 chọn chế độ cho Port nối tiếp
Bit này cho phép truyền thông đa xử lý
SCON.4
REN
9CH
Receiver Enable-Bit cho phép thu, REN phải
đợc đặt bằng 1 để cho phép nhận các ký tự
SCON.3 TB8
9BH Transmitted bit 8-Bit truyền thứ 9 sử dụng trong
chế độ UART 9 bit
SCON.2
RB8
9AH Receiver bit 8- Bit nhận thứ 9 trong sử dụng
trong chế độ UART 9 bit
SCON.1 TI
99H Transmitted Interupt- Cờ ngắt truyền, TI đợc
đặt bằng 1 khi kết thúc việc truyền 1 ký tự, TI
đợc xoá bằng phần mềm



SCON.0

RI

98H Receiver Interupt-Cờ ngắt nhận, RI đợc dặt
bằng 1 khi kết thúc việc nhận 1 ký tự,RI đợc
xoá bằng phần mềm
Trớc khi sử dụng cổng nối tiếp, phải khởi động thanh ghi SCON để chọn chế độ
2.Trao đổi dữ liệu qua Port nối tiếp
Thao tác trao đổi dữ liệu qua port nối tiếp không đơn thuần chỉ là việc ghi/đọc dữ liệu nh trao
đổi dữ liệu trực tiếp qua các port(chẳng hạn P1, P2,4...) mà nó bao gồm 3 thao tác cính nh
sau:
- Khởi tạo cổng nối tiếp: Thao tác này bao gồm các việc nh sau:
+ truy xuất SCON để đặt các thông số nh chế độ hoạt động, cho phép thu...
+Thiết lập hoặc xoá bit SMOD của thanh ghi PCON để đặt hệ số chia của tốc
độ baud
+Truy xuất các thanh ghi của các bộ Timer 1 và Timer 2 để đặt tốc độ baud
cho port nối tiếp( Chỉ với chế độ 1 và 3).
- Kiểm tra cờ TI( Khi truyền) và RI( Khi nhận).
-Ghi/ đọc byte dữ liệu ở SBUF

Chng 2: Gii thiờu vờ ATMega8
I. Tụng quan.
Nhng tinh nng chinh cua Atmega8:
ROM : 8kbytes.
SRAM: 1Kbytes.
EPPROM: 512bytes. Co thờ ghi/c c 10.000 lõn.
Hai bụ Timer/counter 8 bit (T/C0 va T/C2).

Mụt bụ Timer/counter 16 bit (T/C 1).
Ba kờnh PWM.
Tam kờnh ADC 10 bit.
Tich hp sn 1 bụ USART lõp trinh c.
Khụi truyờn nhõn nụi tiờp SPI Master/Slave.
23 ng I/O.
iờn ap hoat ụng:

2.7v - 5.5v vi Atmega8L.
4.5v - 5.5v vi Atmega8.

Bụ tao dao ụng nụi RC cho phep tao c 1MHz, 2MHz, 4MHz, 8MHz.
(dao ng ngoi: 16MHz vi Atmega8 v 8MHz vi Atmega8L).
Dong vi iờu khiờn AVR do hang Atmel (Hoa K) san xut c gii thiờu lõn õu
vao nm 1996. AVR co rt nhiờu dong khac nhau bao gụm dong Tiny AVR (nh AT tiny 13,
AT tiny 22) co kich thc bụ nh nh, it bụ phõn ngoai vi rụi ờn dong AVR (chng han
AT90S8535, AT90S8515,) co kich thc bụ nh vao loai trung binh va manh hn la
dong Mega (nh Atmega32, Atmega128,) vi bụ nh co kich thc vai Kbyte ờn vai
trm Kbyte cựng vi cac bụ ngoai vi a dang c tich hp trờn chip, cung co dong tich
hp ca bụ LCD trờn chip (dong LCD AVR).


Sơ đồ chân, kiểu đóng vỏ (tham khảo datasheet).

Hình 2.2. Sơ đồ chân Atmega8.

Hình 2.3. Cấu trúc Atmega8.
II. Cấu trúc bộ nhớ.
Bộ nhớ AVR được chia thành 2 thành phần chính là bộ nhớ chương trình và
bộ nhớ dữ liệu:

Bộ Nhớ Chương Trình: Bộ nhớ chương trình của AVR là bộ nhớ Flash có dung
lượng 8 Kbyte. Bộ nhớ chương trình có độ rộng bus là 16 bit.
Bộ nhớ dữ liệu: Bộ nhớ dữ liệu của AVR chia làm 2 phần chính là bộ nhớ SRAM và bộ
nhớ EEPROM.


III. Cổng vào ra.
1. Giới thiệu.
Cổng vào ra là một trong số các phương tiện để vi điều khiển giao tiếp với
các thiết bị ngoại vi. Atmega8 có 2 cổng (PORT) vào ra 8 bit là: PORTB, PORTD, và
một PORT 6 bit là PORTC. Các cổng vào ra của AVR là cổng vào ra hai chiều có thể định
hướng, tức có thể chọn hướng của cổng là hướng vào (input) hay hướng ra (output). Tất
các các cổng vào ra của AVR điều có tính năng đọc - chỉnh sửa - ghi khi sử dụng chúng
như là các cổng vào ra số thông thường. Điều này có nghĩa là khi ta thay đổi hướng của một
chân nào đó thì nó không làm ảnh hưởng tới hướng của các chân khác. Tất cả các chân của
các cổng điều có điện trở (1k đến 5k) kéo lên riêng (pull up), ta có thể cho phép hay không
cho phép điện trở kéo lên này hoạt động.
Việc định chiều vào/ra cho các PORT được quyết định bằng thanh ghi DDRx
(x có thể là B, C, D).
Ngoài chức năng vào/ra, các PORT này còn có thêm các chức năng thứ hai
nữa (như đầu ra bộ so sánh, giao tiếp UART, ADC, ngắt…)

Hình 2.4. Sơ đồ một cổng vào/ra.
2. Các thanh ghi.
Thanh ghi DDRx: Đây là thanh ghi 8 bit (có thể đọc ghi) có chức năng
điều khiển hướng của cổng (là lối ra hay lối vào). Khi một bit của thanh ghi này được set
lên 1 thì chân tương ứng với nó được cấu hình thành ngõ ra. Ngược lại, nếu bit của thanh ghi
DDRx là 0 thì chân tương ứng với nó được thiết lập thành ngõ vào. Lấy ví dụ: khi ta set tất
cả 8 bit của thanh ghi DDRB đều là 1, thì 8 chân tương ứng của PORTA là PB1, PB2, …
PB7 được thiết lập thành ngõ ra..

Thanh ghi PORTx: Là thanh ghi 8 bit có thể đọc ghi. Đây là thanh ghi dữ
liệu của PORTx. Nếu thanh ghi DDRx thiết lập cổng là lối ra, khi đó giá trị của thanh ghi
PORTx cũng là giá trị của các chân tương ứng của PORTx, nói cách khác, khi ta ghi một giá
trị logic lên 1 bit của thanh ghi này thì chân tương ứng với bit đó cũng có cùng mức logic.


Khi thanh ghi DDRx thiết lập cổng thành lối vào thì thanh ghi PORTx đóng vai trò như một
thanh ghi điều khiển cổng. Cụ thể, nếu một bit của thanh ghi này được ghi thành 1 thì điện
trở treo (pull - up resistor) ở chân tương ứng với nó sẽ được kích hoạt, ngược lại nếu bit
được ghi thành 0 thì điện trở treo ở chân tương ứng sẽ không được kích hoạt, cổng ở trạng
thái cao trở (Hi - Z).
Thanh ghi PINx: PINx không phải là một thanh ghi thực sự, đây là địa chỉ
trong bộ nhớ I/O kết nối trực tiếp tới các chân của cổng. Khi ta đọc PORTx tức ta đọc dữ
liệu được chốt trong PORTx, còn khi đọc PINx thì giá trị logic hiện thời ở chân của cổng
tương ứng được đọc. Vì thế đối với thanh ghi PINx ta chỉ có thể đọc mà không thể ghi.
3. Bộ định thời/đếm sự kiện - Timer/counter (T/C).
Một số khái niệm:
BOTTOM
: Là giá trị thấp nhất một T/C có thể đạt được, giá trị này luôn là 0.
MAX
: Là giá trị lớn nhất mà một T/C có thể đạt được, giá trị này được quy
định bởi bởi giá trị lớn nhất mà thanh ghi đếm của T/C có thể chứa được. Ví dụ với một bộ
T/C 8 bit thì giá trị MAX luôn là 0xFF (tức 255 trong hệ thập phân).
TOP
: Là giá trị mà khi T/C đạt đến nó sẽ thay đổi trạng thái, giá trị này
không nhất thiết là số lớn nhất 8 bit hay 16 bit như MAX.
3.1. Timer/counter 0 (T/C0).

Hình 2.5. Timer/counter 0.
T/C0 là một bộ định thời, đếm đơn giản với 8 bit. Gọi là đơn giản vì bộ này

chỉ có 1 chế độ hoạt động (mode) so với 5 chế độ của bộ T/C1. Chế độ hoạt động của T/C0
thực chất có thể coi như 2 chế độ nhỏ (và cũng là 2 chức năng cơ bản) đó là tạo ra một
khoảng thời gian và đếm sự kiện.
Các thanh ghi T/C0:
Thanh ghi TCCR0: Là thanh ghi lựa chọn hệ số chia cho xung clock.

Ta để ý rằng trong thanh ghi TCCR0 chỉ có 3bit cần quan tâm là CS02; CS01; CS00.
Đây chính là các bit lựa chọn xung nhịp CLK. Cụ thể theo bảng sau:
Bảng 2.3. Lựa chọn hệ số chia cho xung nhịp CLK.


Như bảng trên, khi ta đặt 3 bit CS02 - CS01 - CS00 bằng 000 thì T/C0 sẽ không hoạt
động; bằng 001 thì T/C0 sẽ hoạt động với tần số bằng tần số CLK, bằng 010 thì T/C0 sẽ hoạt
động với tần số bằng tần số CLK/8, tương tự với các trường hợp 3bit này bằng 011; 100;
101. Riêng 2 trường hợp 3bit này bằng 110; 111 thì ta T/C0 hoạt động ở chể độ đếm sự kiện
bằng sườn xuống, sườn lên tương ứng tại chân T0.
Thanh ghi TCNT0: Là 1 thanh ghi 8 bit chứa giá trị vận hành của T/C0.
Thanh ghi này cho phép ta đọc và ghi giá trị một cách trực tiếp. Giá trị của thanh ghi này có
thể thiết lập từ 0255.
Thanh ghi TIMSK: là thanh ghi mặt nạ cho ngắt của tất cả các T/C trong
Atmega8, trong đó chỉ có bit TOIE0 tức bit số 0 (bit đầu tiên) trong thanh ghi này là liên
quan đến T/C0, bit này có tên là bit cho phép ngắt khi có tràn ở T/C0.

Thanh ghi TIFR: Là thanh ghi cờ nhớ cho tất cả các bộ T/C. Trong thanh ghi
này bit số 0, TOV0 là cờ chỉ thị ngắt tràn của T/C0. Khi có ngắt tràn xảy ra, bit này tự động
được set lên 1. Thông thường trong điều khiển các T/C vai trò của thanh ghi TIFR không quá
quan trọng.

3.2. Timer/counter 1 (T/C1).
T/C1 là bộ định thời, đếm đa năng 16 bit. Bộ T/C này có 5 chế độ hoạt động

chính. Ngoài các chức năng thông thường, T/C1 còn được dùng để tạo ra xung điều rộng
PWM dùng cho các mục đích điều khiển. Có thể tạo 2 tín hiệu PWM độc lập trên các chân
OC1A (chân 15) và OC1B (chân 16) bằng T/C1. Các bộ T/C kiểu này được tích hợp thêm
khá nhiều trong các chip AVR sau này, ví dụ Atmega128 có 2 bộ, Atmega2561 có 4 bộ…


T/C1 là bộ T/C 16 bit, đa chức năng. Đây là bộ T/C rất lý tưởng cho lập trình
đo lường và điều khiển vì có độ phân giải cao (16 bit) và có khả năng tạo xung điều rộng
PWM (Pulse Width Modulation - thường dùng để điều khiển động cơ).
Các thanh ghi T/C1: Có khá nhiều thanh ghi liên quan đến T/C1. Vì là T/C 16 bit
trong khi độ rộng bộ nhớ dữ liệu của AVR là 8 bit nên đôi khi cần dùng những cặp thanh ghi
8 bit tạo thành 1 thanh ghi 16 bit, 2 thanh ghi 8 bit sẽ có tên kết thúc bằng các ký tự L và H
trong đó L là thanh ghi chứa 8 bit thấp (Low) và H là thanh ghi chứa 8 bit cao (High) của giá
trị 16 bit mà chúng tạo thành.
Thanh ghi TCCR1A và TCCR1B: Là 2 thanh ghi điều khiển hoạt động của T/C1.
Tất cả các mode hoạt động của T/C1 đều được xác định thông qua các bit trong 2 thanh ghi
này. Tuy nhiên, đây không phải là 2 byte cao và thấp của một thanh ghi mà là 2 thanh ghi
hoàn toàn độc lập. Các bit trong 2 thanh ghi này bao gồm các bit chọn mode hay chọn dạng
sóng (Waveform Generating Mode - WGM), các bit quy định dạng ngõ ra (Compare Output
Match - COM), các bit chọn giá trị chia prescaler cho xung nhịp (Clock Select - CS)…Cấu
trúc của 2 thanh ghi được trình bày như bên dưới :

Thanh ghi TCCR1A:
Bit 7-6: COM1A1 - COM1A0, định chế độ so sánh đầu ra cho kênh A.
Bit 5-4: COM1B1 - COM1B0, định chế độ so sánh đầu ra cho kênh B.
Các bit 7 - 4 dùng để điều khiển ngõ ra so sánh (compare output) trên các chân
OC1A, OC1B. Nếu một hay cả hai bit COM1A1 - 0/COM1B1 - 0 được đặt là 1 thì đầu ra tại
chân OC1A/OC1B tương ứng sẽ được ưu tiên hoạt động ở chế độ so sánh mà nó được kết nối
tới. Điều này có nghĩa là mỗi một chân của vi điều khiển có thể thực hiện nhiều chức năng
khác nhau, bình thường các chân OC1A, OC1B hoạt động như các chân vào ra thông thường,

nhưng khi bộ định thời đang hoạt động ở các chế độ có sử dụng tới chức năng so sánh khớp
(compare match) như các chế độ CTC, PWM,…của bộ định thời thì hành vi của chân
ngõ ra OC1A, OC1B sẽ do bộ định thời điều khiển. Tuy nhiên, chú ý là bit của thanh ghi
DDR tương ứng với các chân OC1A, OC1B phải được set để cho phép ngõ ra. Khi OC1A,
OC1B được kết nối tới chân thì tác dụng của các bit COMnX1:0 còn phụ thuộc vào
lựa chọn của các bit WGM13:10 để chọn chế độ hoạt động cho T/C1, nghĩa là khi ta set một
hay cả hai Bit COMn1:0 lên 1 thì chức năng ngõ ra so sánh được ưu tiên, tuy nhiên, cách
hoạt động ở ngõ ra OC1X như thế nào thì còn phụ thuộc vào việc lựa chọn của các bit
WGM13 - 10. Điều này được thể hiện rõ trong các bảng sau:


Bảng 2.4. Các chế độ hoạt động so sánh Compare Match.

Khi T/C1 không hoạt động ở chế độ PWM (bình thường hoặc CTC).

Khi T/C1 hoạt động ở chế độ Fast PWM.

Khi T/C1 ở chế độ Phase correct PWM và Phase and frequency correct PWM.
Bit 3-2: Foc1A và Foc1B, đây là 2 bit tạo sự kiện Copare Match cưỡng chế. Khi bit
Foc1A/Foc1B được đặt bằng 1 thì ngay lập tức sẽ có 1 sự kiện Compare Match xảy ra trên
chân OC1A/OC1B tương ứng theo cách thiết lập các chân COM như ở bảng 2.4 trên. Tức là
bình thường sự kiện Compare Match chỉ xảy ra khi giá trị TCN1 bằng giá trị TOP được ghi
bởi thanh ghi OCR1A/OCR1B, nhưng khi ta đặt Foc1A/Foc1B lên 1 thì sẽ có luôn sự kiện
Compare Match này.
Bit 1-0: WGM11 - WGM10, chọn chế độ hoạt động cho T/C1. T/C1 có các chế độ
hoạt động: bình thường (như T/C0), CTC, Fast PWM, Phase correct PWM và Phase and
frequency correct PWM. Việc lựa chọn các chế độ này phụ thuộc vào cách thiết lập các bit
WGM11 - WGM10 (trong TCCR1A) và WGM13 - WGM12 (trong TCCR1B). Cụ thể như
hình sau:
Bảng 2.5. Các chế độ hoạt động T/C1.



Thanh ghi TCCR1B:
Bit 7: INC1, việc set bit này tới 1 sẽ kích hoạt chức năng chống nhiễu của bộ
chống nhiễu lối vào (ICNC). Khi chức năng ICNC được kích hoạt thì ngõ vào từ chân
ICPn sẽ được lọc. Chức năng lọc đòi hỏi 4 mẫu có giá trị bằng nhau liên tiếp ở chân ICPn
cho sự thay đổi ngõ ra của nó.
Bit 6

: ICES1, lựa chọn cạnh trigger cho chân ICP.

Bit 5

: Bỏ trống.

Bit 4-3 : WGM13 - WGM12, lựa chọn chế độ cho T/C1.
Bit 2-1-0

: CS12 - CS11 - CS10, chọn xung CLK (như của T/C0).

Thanh ghi TCNT1: 16 bit, được tách thành TCN1H và TCN1L, là thanh ghi chứa giá
trị vận hành của T/C1. Cả 2 thanh ghi này cho phép ta đọc và ghi giá trị một cách trực tiếp.
Hai thanh ghi được kết hợp như sau:

Thanh ghi OCR1A: 16 bit, được tách thành OCR1AH và OCR1AL, ghi giá trị so
sánh TOP của bộ so sánh kênh A.

Thanh ghi OCR1B: 16 bit được tách thành OCR1BH và OCR1BL, ghi giá trị so



sánh TOP của bộ so sánh kênh B.

Thanh Ghi ICR1: 16 bit, được tách thành ICR1H và ICR1L. Thanh ghi Input capture
(ICR1n) sẽ cập nhật giá trị của bộ đếm TCNT1 mỗi khi xảy ra sự kiện ở chân ICP1. Ngoài ra
thanh ghi này còn được sử dụng để định nghĩa giá trị TOP của bộ đếm.
Thanh ghi TIMSK: Các bộ T/C trên AVR dùng chung thanh ghi mặt nạ ngắt, vì thế
TIMSK cũng được dùng để quy định ngắt cho T/C1. Có điều lúc này chúng ta chỉ quan tâm
đến các bit từ 2 đến 5 của TIMSK. Có tất cả 4 loại ngắt trên T/C1 (nhớ lại T/C0 chỉ có 1 loại
ngắt tràn).

Bit 2: TOIE1, bit quy định ngắt tràn cho thanh T/C1 (tương tự trường hợp của T/C0).
Bit 3: OCIE1B là bit cho phép ngắt khi có 1 “Match” xảy ra trong việc so sánh
TCNT1 với OCR1B.
Bit 4: OCIE1A là bit cho phép ngắt khi có 1 “Match” xảy ra trong việc so sánh
TCNT1 với OCR1A.
Bit 5: TICIE1 là bit cho phép ngắt trong trường hợp Input Capture được dùng.
Ta luôn phải nhớ rằng muốn sử dụng ngắt thì phải đặt bit i trong thanh SREG
bằng 1 để cho phép ngắt toàn cục (trong Codevison dùng câu lệnh #asm (“sei”).
Thanh ghi TIFR: Là thanh ghi cờ nhớ cho tất cả các bộ T/C. Các bit từ 2 đến 5 trong
thanh ghi này là các cờ trạng thái của T/C1.

3.3. Timer/counter 2 (T/C2).
Tuy T/C2 là một T/C 8 bit, nhưng nó có đầy đủ các chế độ hoạt động như
T/C1 gồm: bình thường, Fast PWM, Phase Corect PWM, Phase and Frequency Corect PWM.
4. Ngắt với AVR Atmega8.
4.1. Giới thiệu.
Interrupts, thường được gọi là ngắt, là một tín hiệu khẩn cấp gởi đến bộ xử lí,
yêu cầu bộ xử lí tạm ngừng tức khắc các hoạt động hiện tại để “nhảy” đến một nơi khác thực
hiện một nhiệm vụ khẩn cấp nào đó, nhiệm vụ này gọi là trình phục vụ ngắt – isr (interrupt
service routine). Sau khi kết thúc nhiệm vụ trong isr, bộ đếm chương trình sẽ được trả về giá



trị trước đó để bộ xử lí quay về thực hiện tiếp các nhiệm vụ còn dang dở. Như vậy, ngắt có
mức độ ưu tiên xử lí cao nhất, ngắt thường được dùng để xử lí các sự kiện bất ngờ nhưng
không tốn quá nhiều thời gian. Các tín hiệu dẫn đến ngắt có thể xuất phát từ các thiết bị bên
trong chip (ngắt báo bộ đếm T/C tràn, ngắt báo quá trình gởi dữ liệu bằng RS232 kết thúc…)
hay do các tác nhân bên ngoài (ngắt báo có 1 nút nhấn được nhấn, ngắt báo có 1 gói dữ liệu
đã được nhận…).
Số lượng ngắt trên mỗi dòng chip là khác nhau, ứng với mỗi ngắt sẽ có vector
ngắt, vector ngắt là các thanh ghi có địa chỉ cố định được định nghĩa trước nằm trong
phần đầu của bộ nhớ chương trình.
Bảng 2.6. Bảng vector ngắt Atmega8.

Thứ tự ưu tiên ngắt: Với AVR, thứ tự ưu tiên ngắt là cố định, không thay đổi
được như 8051. Một vector ngắt có địa chỉ thấp hơn thì sẽ có mức ưu tiên ngắt cao hơn. Theo
quy tắc này ta thấy, ngắt ngoài INT0 sẽ được ưu tiên hơn INT1.
Để sử dụng được ngắt, ta phải cho phép ngắt toàn cục bằng cách set bit i trong
thanh ghi SREG. Với Codevison, việc này được thực hiện bằng câu lệnh: #asm (“sei”).
4.2. Ngắt ngoài.
Ngắt ngoài là cách rất hiệu quả để thực hiện giao tiếp giữa người dùng và chip.
Trên chip Atmega8 có 2 ngắt ngoài có tên là INT0 và INT1 tương ứng 2 chân số 4 (PD2) và
số 5 (PD3).
Với ngắt ngoài, có 3 thanh ghi liên quan đến ngắt ngoài đó là MCUCR, GICR
và GIFR. Cụ thể các thanh ghi được trình bày bên dưới.


Hình 2.6. Kết nối ngắt ngoài với Atmega8.
Thanh ghi MCUCR: Là thanh ghi lựa chọn kiểu ngắt ngoài INT.

Ở đây, ta chỉ cần quan tâm đến 4 bit ISC11, ISC10, ISC01, ISC00. Việc tùy

chọn kiểu ngắt được thể hiện ở bảng sau:
Bảng 2.7. Kiểu ngắt ngoài cho Atmega8.
ISCn1

ISCn0

Kiểu bắt mẫu

0

0

Mức thấp sẽ tạo yêu cầu ngắt.

0

1

Dự trữ.

Thanh
1
0
Cạnh xuống ( Falling ) sẽ tạo yêu cầu ngắt.
ghi
GICR:
Là 1
thanh
1
1

Cạnh lên ( Rising ) sẽ tạo yêu cầu ngắt.
ghi 8
bit
nhưng chỉ có 2 bit cao (bit 6 và bit 7) là được sử dụng cho điều khiển ngắt, cấu trúc thanh ghi
như bên dưới.

Khi ta đặt bit INTx=1 tức là ta đã cho phép ngắt tương ứng hoạt động.
Thanh ghi cờ ngắt chung - GIFR (General Interrupt Flag Register) có 2 bit
INTF1 và INTF0 là các bit trạng thái (hay bit cờ - Flag) của 2 ngắt INT1 và INT0. Nếu có 1
sự kiện ngắt phù hợp xảy ra trên chân INT1, bit INTF1 được tự động set bằng 1 (tương tự cho
trường hợp của INTF0), chúng ta có thể sử dụng các bit này để nhận ra các ngắt, tuy nhiên
điều này là không cần thiết nếu chúng ta cho phép ngắt tự động, vì vậy thanh ghi này thường


không được quan tâm khi lập trình ngắt ngoài. Cấu trúc thanh ghi GIFR được trình bày trong
hình ngay bên dưới.

Trên đây là một số thanh ghi liên quan đến qua trình ngắt ngoài. Như vậy, thứ
tự để xây dựng ngắt ngoài được tiến hành như sau: Cài đặt MCUCR Cho phép ngắt nào
bằng GICR set bit i trong thanh ghi SREG.
5. Truyền thông nối tiếp USART.
5.1. Giới thiệu.
Thuật ngữ USART trong tiếng anh là viết tắt của cụm từ: Universal
Synchronous & Asynchronous serial Reveiver and Transmitter, nghĩa là bộ truyền nhận nối
tiếp đồng bộ và không đồng bộ. Cần chú ý rằng khái niệm USART (hay UART nếu chỉ nói
đến bộ truyền nhận không đồng bộ) thường để chỉ thiết bị phần cứng (device, hardware),
không phải chỉ một chuẩn giao tiếp. USART hay UART cần phải kết hợp với một thiết bị
chuyển đổi mức điện áp để tạo ra một chuẩn giao tiếp nào đó. Ví dụ, chuẩn RS232 (hay
COM) trên các máy tính cá nhân là sự kết hợp của chip UART và chip chuyển đổi mức điện
áp. Tín hiệu từ chip UART thường theo mức TTL: Mức logic cao là 5v, mức thấp là 0v.

Trong khi đó, tín hiệu theo chuẩn RS232 trên máy tính cá nhân thường là -12v cho mức logic
cao và +12v cho mức thấp (tham khảo hình 2.7). Chú ý là các giải thích trong tài liệu này
theo mức logic TTL của USART, không theo RS232.

Hình 2.7. Tín hiệu tương đương của UART và RS232.
Truyền thông nối tiếp: Trong tuyền thông nối tiếp dữ liệu được truyền từng
bit trên 1 (hoặc một ít) đường truyền. Vì lý do này, cho dù dữ liệu của ta có lớn đến đâu ta
cũng chỉ dùng rất ít đường truyền. Hình 2.8 mô tả sự so sánh giữa 2 cách truyền song song và
nối tiếp trong việc truyền con số 187 thập phân (tức 10111011 nhị phân).


Hình 2.8. Truyền 8 bit theo phương pháp song song và nối tiếp.
Một hạn chế rất dễ nhận thấy khi truyền nối tiếp so với song song là tốc độ
truyền và độ chính xác của dữ liệu khi truyền và nhận. Vì dữ liệu cần được “chia nhỏ” thành
từng bit khi truyền/nhận, tốc độ truyền sẽ bị giảm. Mặt khác, để đảm bảo tính chính xác của
dữ liệu, bộ truyền và bộ nhận cần có những “thỏa hiệp” hay những tiêu chuẩn nhất định. Phần
tiếp theo trong chương này giới thiệu các tiêu chuẩn trong truyền thông nối tiếp không đồng
bộ.
Truyền đồng bộ: Khái niệm “đồng bộ” để chỉ sự “báo trước” trong quá trình
truyền. Lấy ví dụ thiết bị 1 (tb1) kết với với thiết bị 2 (tb2) bởi 2 đường, một đường dữ liệu
và 1 đường xung nhịp. Cứ mỗi lần tb1 muốn gửi 1 bit dữ liệu, tb1 điều khiển đường xung
nhịp chuyển từ mức thấp lên mức cao báo cho tb2 sẵn sàng nhận một bit. Bằng cách “báo
trước” này tất cả các bit dữ liệu có thể truyền/nhận dễ dàng với ít “rủi ro” trong quá trình
truyền. Tuy nhiên, cách truyền này đòi hỏi ít nhất 2 đường truyền cho 1 quá trình (send or
receive). Giao tiếp giữa máy tính và các bàn phím (trừ bàn phím kết nối theo chuẩn USB) là
một ví dụ của cách truyền thông nối tiếp đồng bộ.
Truyền không đồng bộ: Khác với cách truyền đồng bộ, truyền thông “không
đồng bộ” chỉ cần một đường truyền cho một quá trình. “Khung dữ liệu” đã được chuẩn hóa
bởi các thiết bị nên không cần đường xung nhịp báo trước dữ liệu đến. Ví dụ 2 thiết bị đang
giao tiếp với nhau theo phương pháp này, chúng đã được thỏa thuận với nhau rằng cứ 1ms thì

sẽ có 1 bit dữ liệu truyền đến, như thế thiết bị nhận chỉ cần kiểm tra và đọc đường truyền mỗi
mili - giây để đọc các bit dữ liệu và sau đó kết hợp chúng lại thành dữ liệu có ý nghĩa. Truyền
thông nối tiếp không đồng bộ vì thế hiệu quả hơn truyền thông đồng bộ (không cần nhiều
lines truyền). Tuy nhiên, để quá trình truyền thành công thì việc tuân thủ các tiêu chuẩn
truyền là hết sức quan trọng. Chúng ta sẽ bắt đầu tìm hiểu các khái niệm quan trọng trong
phương pháp truyền thông này.
Baud rate (tốc độ Baud): Như trong ví dụ trên về việc truyền 1 bit trong 1ms,
ta thấy rằng để việc truyền và nhận không đồng bộ xảy ra thành công thì các thiết bị tham gia
phải “thống nhất” nhau về khoảng thời dành cho 1 bit truyền, hay nói cách khác tốc độ truyền
phải được cài đặt như nhau trước, tốc độ này gọi là tốc độ Baud. Theo định nghĩa, tốc độ
Baud là số bit truyền trong 1 giây. Ví dụ nếu tốc độ Baud được đặt là 19200 thì thời gian
dành cho 1 bit truyền là 1/19200 ~ 52.083us.


Frame (khung truyền): Do truyền thông nối tiếp mà nhất là nối tiếp không
đồng bộ rất dễ mất hoặc sai lệch dữ liệu, quá trình truyền thông theo kiểu này phải tuân theo
một số quy cách nhất định. Bên cạnh tốc độ Baud, khung truyền là một yếu tốc quan trọng
tạo nên sự thành công khi truyền và nhận. Khung truyền bao gồm các quy định về số bit trong
mỗi lần truyền, các bit “báo” như bit Start và bit Stop, các bit kiểm tra như Parity, ngoài ra số
lượng các bit trong một data cũng được quy định bởi khung truyền. Hình 2.7 trên là một ví
dụ của một khung truyền theo UART, khung truyền này được bắt đầu bằng một Start bit, tiếp
theo là 8 bit data, sau đó là 1 bit Parity dùng kiểm tra dữ liệu và cuối cùng là 2 bit Stop:
Start bit: Start là bit đầu tiên được truyền trong một khung truyền, bit này có chức năng báo
cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền tới. Ở modul USART trong
AVR, đường truyền luôn ở trạng thái cao khi nghỉ (Idle), nếu một chip AVR muốn thực hiện
việc truyền dữ liệu nó sẽ gởi một bit start bằng cách “kéo” đường truyền xuống mức 0. Như
vậy, với AVR bit Start là mang giá trị 0 và có giá trị điện áp 0V (với chuẩn RS232 giá trị điện
áp của bit Start là ngược lại). Start là bit bắt buộc phải có trong khung truyền.
Data: Data hay dữ liệu cần truyền là thông tin chính mà chúng ta cần gởi và nhận. Data
không nhất thiết phải là gói 8 bit, với AVR ta có thể quy định số lượng bit của data là 5, 6, 7,

8 hoặc 9 (tương tự cho hầu hết các thiết bị hỗ trợ UART khác). Trong truyền thông nối tiếp
UART, bit có ảnh hưởng nhỏ nhất (LSB – Least Significant Bit, bit bên phải) của data sẽ
được truyền trước và cuối cùng là bit có ảnh hưởng lớn nhất (MSB – Most Significant Bit, bit
bên trái).
Parity bit: Parity là bit dùng kiểm tra dữ liệu truyền đúng không (một cách tương đối).
Có 2 loại Parity là Parity chẵn (even parity) và Parity lẻ (odd parity). Parity chẵn nghĩa là số
lượng số 1 trong dữ liệu bao gồm bit parity luôn là số chẵn. Ngược lại tổng số lượng các số 1
trong Parity lẻ luôn là số lẻ. Ví dụ, nếu dữ liệu của ta là 10111011 nhị phân, có tất cả 6 số 1
trong dữ liệu này, nếu Parity chẵn được dùng, bit Parity sẽ mang giá trị 0 để đảm bảo tổng
các số 1 là số chẵn (6 số 1). Nếu Parity lẻ được yêu cầu thì giá trị của Parity bit là 1.
Stop bit: Stop bit là một hoặc các bit báo cho thiết bị nhận rằng một gói dữ liệu đã
được gởi xong. Sau khi nhận được Stop bit, thiết bị nhận sẽ tiến hành kiểm tra khung truyền
để đảm bảo tính chính xác của dữ liệu. Stop bit là các bit bắt buộc xuất hiện trong khung
truyền, trong AVR USART có thể là 1 hoặc 2 bit.
5.2. Truyền thông nối tiếp không đồng bộ với AVR (UART).
Vi điều khiển Atmega8 có 1 modul truyền thông nối tiếp USART. Có 3 chân
chính liên quan đến modul này đó là chân xung nhịp - XCK (chân số 1), chân truyền dữ liệu TXD (Transmitted Data) và chân nhận dữ liệu - RXD (Reveived Data). Trong đó chân XCK
chỉ được sử dụng như là chân phát hoặc nhận xung giữ nhịp trong chế độ truyền động bộ.
Tuy nhiên, chúng ta không khảo sát chế độ truyền thông đồng bộ, vì thế ta chỉ cần quan tâm
đến 2 chân TXD và RXD. Vì các chân truyền/nhận dữ liệu chỉ đảm nhiệm 1 chức năng độc
lập (hoặc là truyền, hoặc là nhận), để kết nối các chip AVR với nhau (hoặc kết nối AVR với
thiết bị hỗ trợ UART khác) ta phải đấu “chéo” 2 chân này. TXD của thiết bị thứ nhất kết nối
với RXD của thiết bị 2 và ngược lại. Modul USART trên chip Atmega8 hoạt động “song


công” (Full Duplex Operation), nghĩa là quá trình truyền và nhận dữ liệu có thể xảy ra đồng
thời.
Các thanh ghi liên quan UART:
Thanh ghi UDR: Hay thanh ghi dữ liệu, là 1 thanh ghi 8 bit chứa giá trị nhận
được và phát đi của USART. Thực chất thanh ghi này có thể coi như 2 thanh ghi TXB

(Transmit data Buffer) và RXB (Reveive data Buffer) có chung địa chỉ. Đọc UDR thu được
giá trị thanh ghi đệm dữ liệu nhận, viết giá trị vào UDR tương đương đặt giá trị vào thanh ghi
đệm phát, chuẩn bị để gởi đi. Chú ý trong các khung truyền sử dụng 5, 6 hoặc 7 bit dữ liệu,
các bit cao của thanh ghi UDR sẽ không được sử dụng.

Thanh ghi UCSRA: Là 1 trong 3 thanh ghi điều khiển hoạt động của modul
USART. Thanh ghi UCSRA chủ yếu chứa các bit trạng thái như bit báo quá trình nhận kết
thúc (RXC), truyền kết thúc (TXC), báo thanh ghi dữ liệu trống (UDRE), khung truyền có lỗi
(FE), dữ liệu tràn (DOR), kiểm tra Parity có lỗi (PE)…

UDRE (USART Data Register Empty): Khi bit bày bằng 1 nghĩa là thanh ghi dữ liệu
UDR đang trống và sẵn sàng cho một nhiệm vụ truyền hay nhận tiếp theo. Vì thế nếu ta muốn
truyền dữ liệu đầu tiên ta phải kiểm tra xem bit UDRE có bằng 1 hay không, sau khi chắc
chắn rằng UDRE = 1 hãy viết dữ liệu vào thanh ghi UDR để truyền đi.
U2X: Là bit chỉ định gấp đôi tốc độ truyền, khi bit này được set lên 1, tốc độ truyền
so cao gấp 2 lần so với khi bit này mang giá trị 0.
MPCM: Là bit chọn chế độ hoạt động đa xử lí (multi-processor).
Thanh ghi UCSRB (USART Control and Status Register B): Đây là thanh
ghi quan trọng điều khiển USART. Vì thế chúng ta sẽ khảo sát chi tiết từng bit của thanh ghi
này.

RXCIE (Receive Complete Interrupt Enable): Là bit cho phép ngắt khi quá trình nhận
kết thúc. Việc nhận dữ liệu truyền bằng phương pháp nối tiếp không đồng bộ thường được
thực hiện thông qua ngắt, vì thế bit này thường được set bằng 1 khi USART được dung nhận
dữ liệu.
TXCIE (Transmit Complete Interrupt Enable): Bit cho phép ngắt khi quá trình truyền
kết thúc.



×