Tải bản đầy đủ (.pdf) (99 trang)

Bài giảng vi xử lý phần 2 đại học công nghiệp TP HCM

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.26 MB, 99 trang )

100

Bài giảng số 5: Truyền dữ liệu đồng bộ và không đồng bộ (USART)( Số tiết: 3)

III.1. Mục tiêu:
- Truyền nhận dữ liệu đồng bộ, không đồng bộ: Giới thiệu USART, Thanh ghi
TXSTA, RCSTA, bộ tạo tốc độ baud USART, chế độ bất đồng bộ, chế độ chủ đồng bộ,
chế độ tớ đồng bộ.
- Bộ thu và phát radio.
-truyền thong nối tiếp PIC tới PIC, mạch giao tiếp RS232C PIC tới PC.
III.2. Đồ dung và phương tiện dạy học:
-Phấn trắng, bảng, khăn, bút long, micro có dây(hay không dây), máy tính, và đèn
chiếu (hay máy chiếu).
III.3. Giáo trình và tài liệu tham khảo:
Giáo trình Vi xử lí của trường Đại học công nghiệp Tp. HCM.
D.W. Smith, PIC in practice: a project-based approach, Elsevier, 2nd edition, 2006.
Trương Trác, Chip đơn 16C84 và ứng dụng của chúng.
Hồ Trung Mỹ, Vi xử lí, NXB ĐHQG Tp. HCM, 2003.
Tài liệu về vi điều khiển PIC của bọ môn Điện tử công nghiệp.
Datasheet c ủa PIC 16F84 v à 16F877A.
Website: /> />Myke Predko, Programming and customizing the PIC microcontroller, 3rd edition,
Tab Electronics, McGrawHill, 2008(Ebook).
Douglass V.Hall, Microprocessors and interfacing: Programming and Hardware, 2nd
ed., Macmillan/McGraw-Hill, 1992.
III.4.Nội dung bài giảng:
Nội dung chi tiết : xem bài giảng chi tiết.
Phương pháp giảng dạy: thuyết trình, nêu vấn đề và đàm thoại trao đổi với sinh
viên.
Chương 5: Truyền dữ liệu đồng bộ và không đồng bộ
1. Giới thiệu USART:
USART viết tắt cho Universal Aynchronous Asynchronous Receiver Transmitter (Bộ


thu phát bất đồng bộ đồng bộ đa năng) và cho phép vi điều khiển PIC giao tiếp với một
tầm rộng các thiết bị khác từ chip nhớ riêng biệt và LCD hiển thị tinh thể lỏng, tới
máy tính! Điều này bao gồm gửi hay nhận gói dữ liệu 8 bit hay 9 bit (nghĩa là 1 byte
hay 1 byte cộng them bit chẵn lẻ). Bit chẵn lẻ là bit phụ gửi kèm với dữ liệu mà giúp
kiểm tra lỗi. Nếu có 1 số lẻ số 1 trong byte dữ liệu (thí dụ b’00110100’), bit parity sẽ là
1 và nếu có một số chẵn số 1 (thí dụ b’00110011’) thì bit parity sẽ là 0. Trong bài
giảng này, nếu có lỗi (ví dụ lật bit) diễn ra đâu đó trong giữa lúc gửi 1 byte và nhận
nó bit parity sẽ không còn khớp loại dữ liệu. Bên nhận sẽ biết rằng có gì đó sai sót
và nó yêu cầu gửi lại byte. Nếu có 2 bit lỗi xảy ra trong một việc truyền, bit parity sẽ


101
xuất hiện đúng, tuy nhiên có thể hai lỗi diễn ra là nhỏ hơn, và vì vậy điều này thường
bị bỏ qua.
Chế độ USART có 2 chế độ (mode) chính: hoạt động đồng bộ và bất đồng bộ.
Trong hoạt động bất đồng bộ, chân phát (TX-transmitter) từ 1 thiết bị được nối với
chân thu (RX-Receiver) của thiết bị kia và dữ liệu được hoán đổi (được gọi là song
công-full duplex). Trong chế độ đồng bộ, xung clock (CK) và đường dữ liệu (DT) là
chia xẻ giữa một số thiết bị (một là chủ (master) và một hay nhiều tớ (Slaves)). Chủ
chịu trác nhiệm tạo ra xung clock. Trong cả hai trường hợp, tốc độ tại đó dữ liệu được
gửi bởi bộ phát (và tại đó nó được mong đợi bởi bộ thu) được biết đến như là tốc độ
baud.
Có hai thanh ghi để kiểm soát việc nhận và phát dữ liệu: RCSTA và TXSTA.
Dữ liệu mà được đọc thành công được lưu vào thanh ghi RCREG, và dữ liệu mà được
gửi đi nên được đặt trong thanh ghi TXREG. Tốc độ baud được đặt sử dụng thanh
ghi SPBRG (có bảng them vào trong datasheet minh họa làm thế nào chọn tốc độ baud
cho trước tần số dao động).
Trong chế độ bất đồng bộ, USART lấy kí tự 8 bit hay 9 bit để gửi, và them 1
bit bắt đầu (start bit) (1 zero,0) ở đầu, và bit dừng (1 bit) vào cuối để tạo nên chuỗi 10
hay 11 bit. Điều này được chuyển vào thanh ghi dịch mà quay bit vào chân phát (TX)

như hình 5.1
Môđun nhận sẽ lien tục kiểm tra trạng thái của chân thu RX, mà sẽ bình thường là
mức cao. Nếu nó dò thấy chân RX xuống mức thấp (bit start), nó sẽ làm them 3 mẫu
trong giữa bit (cho phép lên và xuống chậm các lần) và lấy giá trị chính của ba . Nếu
giá trị chính là 0, nó khẳng định đây thực sự là bit bắt đầu và tiến hành lấy mẫu các bit
tuần tự với 3 mẫu ở giữa mỗi bit. Thời gian của mẫu này được chỉ ra bởi tốc độ baud.
Khi nó đạt đến cái là bit dừng, nó phải đọc một (1), ngược lại nó sẽ khẳng định kí tự
thu được đóng khung tồi và đăng kí một lỗi.
Nhớ rằng với thiết lập phù hợp trong TXSTA và RCSTA, tất cả điều này được thực
hiện cho bạn bởi môđun USART.
b’00101101’

Byte để gửi

Thanh ghi dịch

1001011010

TX pin

Điện áp trên TX

time
1
Start bit

0

1


1

0

1

0

0
Stop bit


102
Hình 5.1.
Bạn có thể dung chế độ bất đồng bộ để giao tiếp với port nối tiếp RS232 trên
máy tính PC. Cách đơn giản để gửi byte thong qua port nối tiếp của PC là thong qua
một chương trình đi kèm Microsoft Windows được gọi là Hyper Terminal (Start
MenuÆProgramsÆAccessoriesÆCommunications). Bạn có thể tạo ra một kết nối với
cổng nối tiếp (ví dụ COM 1), chọn tốc độ baud, số bit, thiết lập parity.. Khi Hyper
Terminal kết nối với port nối tiếp, bất kì kí tự mà bạn gõ sẽ được gửi (như là mã
ASCII) thong qua port nối tiếp. Kí tự mà được nhận được hiển thị lên màn hình.
Cả hai chế độ đồng bộ và bất đồng bộ hỗ trợ đặc tính được biết như là dò tìm địa chỉ
mà cho phép một số thiết bị được kết nối. Khi gửi dữ liệu, một byte địa chỉ phải được
gửi đi đầu tiên để nhận diện nơi nhận dự định.

2.Thanh ghi TXSTA: thanh ghi điều khiển và trạng thái phát, địa chỉ 98H.
R/W-0 R/W-0 R/W-0

R/W-0 U-0 R/W-0


R-1

CSRC TX9

SYNC

TRMT

TXEN

-

BRGH

R/W-0
TX9D

Bit 7
bit 0
Bit 7 CSRC: bit chọn nguồn xung clock.
chế độ bất đồng bộ: không quan tâm.
chế độ đồng bộ:
1= chế độ chủ (xung clock được tạo ra bên trong từ BRG).
0=chế độ tớ (xung clock từ nguồn bên ngoài).
Bit 6 TX9: bit cho phép truyền 9 bit.
1=chọn sự truyền 9 bit.
0= chọn sự truyền 8 bit.
Bit 5 TXEN: bit cho phép truyền (phát).
1= cho phép truyền (phát).
0= cấm phát.

Chú ý: SREN/CREN đè lên TXEN trong chế độ đồng bộ.
Bit 4 SYNC : bit chọn chế độ USART.
1= chế độ đồng bộ.
0= chế độ bất đồng bộ.
Bit 3 : không dung, đọc là 0.
Bit 2 BRGH: bit chọn tốc độ baud cao.
chế độ bất đồng bộ:
1=tốc độ cao.
0=tốc độ thấp.
chế độ đồng bộ:
không được dung trong chế độ này.
Bit 1 TRMT: bit trạng thái thanh ghi dịch phát.
1=TSR (thanh ghi dịch phát) trống.
0=TSR đầy.
Bit 0 TX9D: bit thứ 9 của dữ liệu phát, có thể là bit chẵn lẻ (parity bit).
Chú thích:
R=bit có thể đọc
W=bit có thể ghi
U=bit không dung , đọc là 0.
-n=giá trị tại POR ‘1’ =bit được bật ‘0’=bit bị xóa x= bit chưa biết.


103

3.Thanh ghi RCSTA: thanh ghi điều khiển và trạng thái nhận , địa chỉ 18H.
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
R-0
R-0
R-x
SPEN


Bit 7

RX9

SREN

CREN

ADDEN

FERR

OERR RX9D

bit 0

Bit 7 SPEN: bit cho phép port nối tiếp.
1= cho [phép port nối tiếp (cấu hình RC7/RX/DT và RC6/TX/CK như là các
chân cổng nối tiếp).
0=port nối tiếp bị cấm.
Bit 6 RX9: bit cho phép nhận 9 bit.
1=chọn sự nhận 9 bit.
0= chọn sự nhận 8 bit.
Bit 5 SREN: bit cho phép nhận đơn.
chế độ bất đồng bộ:
không quan tâm.
chế độ đồng bộ-chủ:
1=cho phép nhận đơn lẻ.
0= cấm nhận đơn lẻ.

bit này bị xóa sau khi việc nhận hoàn thành.
chế độ đồng bộ-tớ:
không quan tâm
Bit 4 CREN: bit cho phép nhận lien tục.
chế độ bất đồng bộ:
1= cho phép nhận lien tục.
0= cấm nhận lien tục.
chế độ đồng bộ:
1=cho phép nhận lien tục cho tới khi bit CREN bị xóa (CREN đè SREN).
0= cấm nhận liên tục.
Bit 3 ADDEN: bit cho phép dò địa chỉ.
chế độ bất đồng bộ 9 bit (RX9=1):
1=cho phép dò tìm địa chỉ, cho phép ngắt và nạp bộ đệm nhận khi RSR<8>
được bật (=1).
0= xóa dò tìm địa chỉ, tất cả các byte được nhận và bit thứ 9 có thể đượ dung
như bit parity (chẵn lẻ).
Bit 2 FERR: bit lỗi khung .
1= lỗi khung (có thể được cập nhật bằng cách đọc thanh ghi RCREG và nhận
byte hợp lệ kế tiếp).
0= không có lỗi khung
Bit 1 OERR: bit lỗi overrun (chạy quá).
1= lỗi overrun (có thể được xóa bằng cách xóa bit CREN).
0=không có lỗi overrun.
Bit 0 RX9D: bit thứ 9 của nhận dữ liệu (có thể là bit parity nhưng phải được tính bởi
phần dẻo(firmware) của người sử dụng).
4.Bộ tạo tốc độ baud USART:
Bộ tạo tốc độ baud hỗ trợ cả chế độ bất đồng bộ và đồng bộ của USART. Nó là bộ tạo
tốc độ baud 8 bit. Thanh ghi SPBRG (địa chỉ 99H) điều khiển chu kì của bộ định thì 8



104
bit chạy tự do. Trong chế độ bất đồng bộ bit BRGH (TXSTA<2>) cũng kiểm soát tốc
độ baud. Trong chế độ đồng bộ, bit BRGH bị bỏ qua.
Công thức tốc độ baud:
SYNC
BRGH=0 (low speed)
BRGH=1(high speed)
0
tốc độ baud (bất đồng Tốc
độ
bộ)=Fosc/(64(X+1))
baud=Fosc/(16(X+1))
1
tốc
độ
baud(đồng N/A
bộ)=Fosc/(4(X+1))
X: giá trị trong SPBRG (0 đến 255).
5.Chế độ bất đồng bộ USART:
a.Bộ phát bất đồng bộ USART:
Sơ đồ khối bộ phát bất đồng bộ được minh họa ở hình:

Hình 5.2: Sơ đồ khối phát bất đồng bộ USART.
Trong mode này, USART sử dung dạng NRZ (Non-Return –to-Zero)chuẩn (một bit
bắt đầu(start), 8 hay 9 bit dữ liệu, và một bit dừng(stop)). Dạng dữ liệu thong dụng
nhất là 8 bit. Một bộ tạo tốc độ baud 8 bit có sẵn trên chip có thể được dung để tạo tần
số tốc độ baud chuẩn từ tần số thạch anh của hệ thống. USART phát và nhận bit LSB
trước tiên. Bộ phát và thu là độc lập chức năng nhưng sử dụng chung dạng dữ liệu và
tốc độ baud. Bộ tạo tốc độ baud tạo ra xung clock , hoặc là x16 hay x64 của tốc độ
dịch bit phụ thuộc vào bit BRGH (TXSTA<2>). Chẵn lẻ (parity) không được hỗ trợ bởi

phần cứng nhưng có thể hiện thực bằng phần mềm (và được lưu như là bit dữ liệu thứ
9). Mode bất đồng bộ bị dừng trong khi Sleep.
Mode bất đồng bộ được chọn bằng cách xóa bit SYNC (TXSTA<4>).
Môđun bất đồng bộ USART gồm có các phần tử quan trọng sau đây:
.Bộ tạo tốc độ baud.
.Mạch lấy mẫu.
.Bộ phát bất đồng bộ .
. Bộ thu bất đồng bộ.
Khi thiết lập sự phát bất đồng bộ, bạn theo các bước sau:
. Khởi động thanh ghi SPBRG cho tốc độ baud phù hợp. Nếu tốc độ baud tốc độ cao là
mong muốn thì ta bật (lên 1) bit BRGH.
. Cho phép port nối tiếp bất đồng bộ bằng cách xóa bit SYNC và bật bit SPEN.
. Nếu ngắt là mong muốn, thì ta bật bit cho phép TXIE.
. Nếu sự truyền 9 bit là mong muốn , thì ta bật bit truyền TX9.
. Cho phép truyền bằng cách bật bit TXEN mà sẽ bật bit TXIF.
. Nếu sự truyền 9 bit được chọn, bit thứ 9 sẽ được nạp bào bit TX9D.
. Nạp dữ liệu vào thanh ghi TXREG (bắt đầu truyền).


105
.Nếu dùng ngắt, đảm bảo rằng GIE và PEIE (bit 7 và 6) của thanh ghi INTCON được
bật.
Các thanh ghi được dung trong phát bất đồng bộ USART:

Hình: Thanh ghi 16F87x được dung trong phát bất đồng bộ.
b. Bộ thu bất đồng bộ USART:
Sơ đồ khối bộ thu được minh họa ở hình:

Hình 5.3: Sơ đồ khối thu USART.
Dữ liệu được nhận trên chân RC7/RX/DT và lái khối phục hồi dữ liệu. Khối khôi phục

dữ liệu thực chất là bộ dịch tốc độ cao, hoạt động ở 16x tốc độ baud, trong khi bộ
dịch nối tiếp thu chính hoạt động ở tốc độ bit hay Fosc.
Khi thiết lập sự thu bất đồng bộ , bạn theo các bước sau:
. Khởi động thanh ghi SPBRG cho tốc độ baud phù hợp. Nếu tốc độ baud tốc độ cao
được chọn, thì ta bật bit BRGH..
. Cho phép port nối tiếp bất đồng bộ bằng cách xóa bit SYNC và bật bit SPEN.
.Nếu ngắt là mong muốn, thì ta bật bit cho phép RCIE.
. Nếu sự nhận 9 bit là mong muốn, thì ta bật bit RX9.


106
. Cho phép nhận bằng cách bật bit CREN.
.Bit cờ RCIF được bật (=1) khi sự nhận hoàn thành và ngắt sẽ tạo ra nếu bit cho phép
RCIE được bật.
. Đọc thanh ghi RCSTA để nhận bit thứ 9 (nếu cho phép) và xác định xem có lỗi nào
xảy ra trong quá trình nhận (thu).
. Đọc dữ liệu nhận 8 bit bằng cách đọc thanh ghi CRREG.
.Nếu có lỗi xảy ra, xoá lỗi bằng cách xóa bit cho phép CREN.
. Nếu dung ngắt, đảm bảo rằng GIE và PEIE (bit 7 và 6) của thanh ghi INTCON được
bật.
c. Thiết lập mode 9 bit với dò tìm địa chỉ.
Khi thiết lập một sự thu bất đồng bộ với dò tìm địa chỉ cho phép:
. . Khởi động thanh ghi SPBRG cho tốc độ baud phù hợp. Nếu tốc độ baud tốc độ cao
được chọn, thì ta bật bit BRGH..
. Cho phép port nối tiếp bất đồng bộ bằng cách xóa bit SYNC và bật bit SPEN.
.Nếu ngắt là mong muốn, thì ta bật bit cho phép RCIE.
. Bật bit RX9 để cho phép sự nhận 9 bit .
.Bật ADDEN để cho phép dò tìm địa chỉ.
. Cho phép nhận bằng cách bật bit CREN.
.Bit cờ RCIF được bật (=1) khi sự nhận hoàn thành và ngắt sẽ tạo ra nếu bit cho phép

RCIE được bật.
. Đọc thanh ghi RCSTA để nhận bit thứ 9 (nếu cho phép) và xác định xem có lỗi nào
xảy ra trong quá trình nhận (thu).
. Đọc dữ liệu nhận 8 bit bằng cách đọc thanh ghi CRREG để xác định xem nếu thiết
bị đang được định địa chỉ.
.Nếu có lỗi xảy ra, xoá lỗi bằng cách xóa bit cho phép CREN.
. Nếu thiết bị được định địa chì, xóa bit ADDEN để cho phép byte dữ liệu và byte địa
chỉ được đọcvào bộ đệm thu và ngắt CPU.
Các thanh ghi được dung trong thu bất đồng bộ USART:

Hình: Thanh ghi được dung trong thu bất đồng bộ.
6. Chế độ chủ đồng bộ.
Trong mode chủ đồng bộ, dữ liệu được truyền theo cách bán song công (halfduplex)(nghĩa là phát và thu không diễn ra cùng một thời điểm).Khi phát dữ liệu, sự
nhận (thu) bị cấm và ngược lại. Mode đồng bộ đưa vào bằng cách bật bit,
SYNC(TXSTA<4>). Hơn nữa, bit cho phép SPEN (RCSTA<7>) được bật (=1) để cấu


107
hình chân RC6/TX/CK và RC7/RX/DT tới đường CK (clock) và DT (dữ liệu-data)
tương ứng. Mode chủ chỉ ra rằng bộ xử lí phát clock chủ trên đường CK. Mode chủ
được đưa vào bằng cách bật bit CSRC (TXSTA<7>).
a.Phát chủ đồng bộ USART
Sơ đồ khối bộ phát USART được minh họa ở hình:

Hình 5.4: Sơ đồ khối thu USART.
b.Thu chủ đồng bộ USART
7. Chế độ tớ đồng bộ USART
a.Phát tớ đồng bộ USART
b.Thu tớ đồng bộ USART.
8. Bộ thu phát radio:

Hệ thống truyền dữ liệu radio:
+5V
B0
10K
A0

B0

16F877A

TX

RX

470
A0
16F877A


108
Hình 5.4: Hệ thống truyền dữ liệu radio.
Phần này mô tả chi tiết việ sử dụng mođun thu và phát radio 418 Mhz (RT1-418 và
RR3-418). Chúng không cần bản quyền để hoạt động và có nhiều thay đổi cho phép.
Bộ phát chỉ có 3 kết nối, 2 nguồn cung cấp và 1 ngõ vào dữ liệu, anten phát được tích
hợp vào đơn vị. Bộ thu có 4 kết nối, 2 nguồn cung cấp, 1 anten vào và 1 ngõ ra. Anten
thu chỉ cần là mẫu dây dài 25 cm.
Sơ đồ mạch cơ bản của hệ thống radio được minh họa ở hình 5.4.
Vi điều khiển tạo ra dữ liệu và sau đó chuyển xung dữ liệu tới bộ phát. Bộ thu nhận
xung dữ liệu và vi điều khiển giải mã thong tin và xử lí nó.
Hệ thống radio-vi điều khiển có thể đo nhiệt độ bên ngoài và gửi nhiệt độ này để hiển

thị trên đơn vị bên trong.
Phần sau được trích dẫn từ sách Microcontroller programming the microchip PIC của
tác giả Julio Sanchez, Maria P. Canton.
Mạch truyền thong nối tiếp PIC tới PIC:
Thực tế, hệ thống được yêu cầu cho một PIC đọc dữ liệu và gửi nối tiếp kết quả tới một
PIC khác mà xuất dữ liệu có thể xem như hai mạch độc lập. Một mạch được dung để
đọc trạng thái 8 công tắc DIP và gửi dữ liệu nối tiếp tới một mạch PIC khác mà hiển
thị kết quả. Hình sau minh họa 2 mạch dựa trên PIC.


109
Hình 5.5: Mạch truyền thong nối tiếp PIC tới PIC.
Thanh ghi dịch : 74HC165 là thanh ghi dịch song song ra nối tiếp và 74HC164 là thanh
ghi dịch nối tiếp ra song song.
IC thu phát RS-232C: dung IC Max 232 và phiên bản nâng cấp Max202. IC Max 233
và Max 203 không yêu cầu tụ ngoài.
Mạch giao tiếp RS-232C PIC tới PC:
Để minh họa truyền nối tiếp với giao thức RS232C, chúng ta phát triển mạch
gồm bàn phím 4x4 và LCD hiển thị 20 ký tự trên 2 dòng. Ký tự được ấn trên bàn phím
và được chuyển thành mã ASCII cho tập hợp số hexa, nghĩa là các số 0-9 và chữ A đến
F. Khi một phím được nhấn, mã ASCII tương ứng được hiển thị trên LCD và truyền
thong qua port nối tiếp tới ứng dụng PC. Ký tự được nhận thong qua đường truyền nối
tiếp là được hiển thị trên LCD.

Hình 5.6: Mạch truyền thong USART với PIC 16F877.
Chương trình khởi tạo PIC 16F877:


110
Đoạn chương trình sau minh họa sự khởi tạo môđun UART trong PIC 16F877 cho tốc

độ truyền 2400 baud, 8 bit dữ liệu, không có bit chẵn lẻ và 1 bit dừng. Không có ngắt
được dung trong thí dụ này.
Tốc độ baud được tính như sau:
ABR=Fosc/(S*(x+1))
Trong đó x là giá trị trong thanh ghi SPBRG, S là 64 nếu bit BRGH trong thanh ghi
điều khiển TXSTA bị xóa, và S=16 nếu bit BRGH=1. Để thiết lập tốc độ 9600 baud sử
dụng thạch anh 4 Mhz ở tốc độ baud tốc độ cao (BRGH=1), công thức là:
4000000 4000000
=
= 9615 baud (sai số 0,16 %).
16(25 + 1)
416
Ở tốc độ thấp (BRGH=0):
4000000 4000000
=
= 2403,85 (sai số 0,16%).
64(25 + 1)
1664
;Thủ tục khởi động USART
Initserial BCF STATUS, RP1
BSF STATUS, RP0 ; chọn bank 1
Movlw b’11000000’; bit cho Tx và RX
Iorwf TRISC,f; OR vào thanh ghi TRISC
Movlw spbrgVal; giá trị trong spbrgVal=25
Movwf SPBRG ; đặt vào bộ tạo tốc độ baud
Movlw 0x20; giá trị thiết lập b’00100000’ cho TXSTA
Movwf TXSTA;cho phép truyền và tốc độ baud cao
BCF STATUS, RP0; bank 0
Movlw 0x90; giá trị thiết lập b’10010000’ cho RXSTA
Movwf RCSTA; cho phép port nối tiếp và nhận lien tục.

Clrf errorflags; xóa thanh ghi cờ lỗi cục bộ
Return

;Thủ tục phát và nhận USART
Chương trình phát khá đơn giản. Chương trình kiểm tra bit TXIF trong thanh ghi PIR1.
Nếu bit này là 1, dữ liệu được phát bằng cách lưu byte dữ liệu trong thanh ghi TXREG.
Thủ tục sau thực hiện tác vụ được yêu cầu.
;Phát dữ liệu
;Kiểm tra thanh ghi phát trống và phát dữ liệu trong W.
SerialSend BCF STATUS, RP1
BCF STATUS,RP0; bank 0
Wait
BTFSS PIR1,TXIF; kiểm tra xem bộ phát có bận không
Goto Wait ; đợi cho tới khi bộ phát không bận
Movwf TXREG; và phát dữ liệu
Return
Thu dữ liệu thì phức tạp hơn phát dữ liệu. Một lí do là mã phải được kiểm tra và quản lí
nhiều lỗi mà có thể xảy ra trong quá trình nhận (thu). Đoạn chương trình sau minh họa
biến cục bộ và xử lí được yêu cầu cho nhận dữ liệu đơn giản.
;biến cục bộ trong bộ nhớ RAM (dữ liệu) của PIC
cblock 0x20; bắt đầu khối
;biến truyền thong


111
newData ; không là 0 nếu dữ liệu mới được nhận
ascVal
errorFlags
endc
;thủ tục nhận dữ liệu USART

;thủ tục kiểm tra đường truyền cho nhận dữ liệu và trả giá trị trong W. Lỗi khung và
;Overrun được dò tìm và nhớ trong biến errorFlags.
SerialRcv
CLRF newData;xóa thanh ghi nhận dữ liệu mới
BCF STATUS,RP1
BCF STATUS,RP0; bank 0
BTFSS PIR1,RCIF;kiểm tra cho dữ liệu nhận. Bit RCIF=0 nếu bộ đệm thu
; trống. Nếu vậy, dữ liệu không được nhận
Return; và thoát nếu không có dữ liệu
;tại thời điểm này, dữ liệu đã được nhận, đầu tiên phải loại bỏ lỗi: lỗi khung và Overun.
BTFSC RCSTA,OERR;kiểm tra lỗi Overrun
Goro OverErr; bộ kiểm soát lỗi
BTFSC RCSTA,FERR; kiểm tra lỗi khung
Goto FrameErr; bộ kiểm soát lỗi
;tại thời điểm này không còn lỗi, nhận dữ liệu trong thanh ghi RCREG
movf RCREG,W; nhận dữ liệu
BSF newData,7; bật bit 7 để chỉ ra dữ liệu mới
Clrf erroeFlags; xóa cờ lỗi
Return
;bộ kiểm soát lỗi
;lỗi Overrun được tìm thấy
OverErr BSF errorFlags,0; bit 0 là lỗi Overrun
errExit
BCF RCSTA,CREN; xóa bit nhận lien tục
BSF RCSTA,CREN;bật bit (1) tới sự nhận cho phép lại
Return
;Lỗi khung. Bit lỗi khung FERR được bật
FrameErr
BSF errorFlags,1; bit 1 là lỗi khung
Movf RCREG,W; đọc và bỏ dữ liệu xấu

Goto errExit
IV.Tổng kết bài:
-Tóm tắt các ý chính trong bài.
-Chuẩn bị bài mới.
V. Câu hỏi và bài tập về nhà:
Chương 5: Truyền nối tiếp bất đồng bộ và đồng bộ
1.USART là gì?
2.Giao tiếp RS-232.
3. Thanh ghi điều khiển nhận và phát dữ liệu: RCSTA và TXSTA.
4. Thanh ghi RCREG (lưu dữ liệu được đọc vào) và TXREG (lưu dữ liệu được phát đi),
và SPBRG (thiết lập tốc độ baud).
5. Thu và phát radio dung PIC 16F84 hay 16F877A.


112


113

Bài giảng số 6: Ngắt ( Số tiết: 3)
III.1. Mục tiêu:
- Nguồn ngắt.
- Thanh ghi điều khiển ngắt.
- Chương trình sử dụng ngắt.
III.2. Đồ dung và phương tiện dạy học:
-Phấn trắng, bảng, khăn, bút long, micro có dây(hay không dây), máy tính, và đèn
chiếu (hay máy chiếu).
III.3. Giáo trình và tài liệu tham khảo:
Giáo trình Vi xử lí của trường Đại học công nghiệp Tp. HCM.
D.W. Smith, PIC in practice: a project-based approach, Elsevier, 2nd edition, 2006.

Trương Trác, Chip đơn 16C84 và ứng dụng của chúng.
Hồ Trung Mỹ, Vi xử lí, NXB ĐHQG Tp. HCM, 2003.
Tài liệu về vi điều khiển PIC của bọ môn Điện tử công nghiệp.
Datasheet c ủa PIC 16F84 v à 16F877A.
Website: /> />Myke Predko, Programming and customizing the PIC microcontroller, 3rd edition,
Tab Electronics, McGrawHill, 2008(Ebook).
Douglass V.Hall, Microprocessors and interfacing: Programming and Hardware, 2nd
ed., Macmillan/McGraw-Hill, 1992.
III.4.Nội dung bài giảng:
Nội dung chi tiết : xem bài giảng chi tiết.
Phương pháp giảng dạy: thuyết trình, nêu vấn đề và đàm thoại trao đổi với sinh
viên.
Chương 6: Ngắt
Chúng ta đều biết ngắt là gì và chúng ta không thích bị ngắt. Chúng ta bận rộn
làm điều gì đó và điện thoại reng hay ai đó bước vào cửa.
Nếu chúng t among đợi ai, chúng ta có thể nhìn ra ngoài cửa sổ để xem có ai
tới hay không hay là chúng ta tiến hành với những gì chúng ta đang làm cho tới khi
chuông cửa reo lên. Có 2 cách nhận ngắt. Thứ nhất khi chúng ta tiếp tục kiểm tra bằng
phần mềm gọi là hỏi vòng (polling), thứ hai khi chuông reo là tương đương ngắt phần
cứng.
Khi xảy ra ngắt chúng ta cần nhớ nội dung của file là gì, nghĩa là thanh ghi
trạng thái STATUS, thanh tích lũy W, TMR0 và thiết lập PORT để mà khi trở về từ
ngắt, các thiết lập được lưu trở lại (restored). Nếu chúng ta không nhớ các thiết lập,
chúng ta không thể tiếp tục ở đâu chúng ta rời bỏ, bởi vì ngắt sẽ tắt tất cả ngõ ra và
thanh ghi W bị ảnh hưởng tại lần gần nhất.
6.1. Nguồn ngắt


114
16F84 có 4 nguồn ngắt:

. Thay đổi cạnh lên hay cạnh xuống của PORTB,0.
.TMR0 tràn từ FFh về 00h.
. PORTB bit 4-7 thay đổi.
.Ghi dữ liệu EEPROM hoàn thành.
16F877A có 15 nguồn ngắt. Ngoài 4 nguồn ngắt nêu trên, các ngắt them vào là:
. Chuyển đổi A/D hoàn thành.
. Ngắt port nối tiếp đồng bộ.
. TMR1 tràn.
.TMR2 tràn.
.Ngắt điều chế độ rộng xung, bắt giữ và so sánh.
Những ngắt này có thể được cho phép (enable) hay cấm theo yêu cầu bởi bit cho
phép/cấm ngắt. Các bit này có thể được tìm thấy trong thanh ghi điều khiển ngắt
INTCON cho 16F84/16F877A.
6.2. Thanh ghi điều khiển ngắt INTCON:
Thanh ghi điều khiển ngắt INTCON, file 0Bh được minh họa ở hình 6.1.
Bit 7

6

5

4

GIE

EEIE

T0IE

INTE


3
RBIE

2
T0IF

1

bit 0

INTF

RBIF

Hình 6.1: Thanh ghi điều khiển ngắt INTCON cho 16F84/16F877A.
Thanh ghi điều khiển ngắt ghi yêu cầu ngắt riêng rẽ vào bit cờ. Nó cũng có bit cho phép
ngắt toàn cục và riêng rẽ.
Chú ý: bit cờ ngắt riêng rẽ được bật (=1) bất chấp trạng thái của bit mặt nạ tương ứng
hay bit GIE.
Bit cho phép ngắt toàn cục GIR (INTCON<7>), cho phép (nếu bật bit lên 1) tất cả các
ngắt không che (unmasked interrupt) hay cấm (nếu bị xóa 0) tất cả các ngắt.
Bit 6 trong thanh ghi này được gán như là bit cho phép ngắt ngoại vi PEIE(peripheral
interrupt enable bit) cho 16f818/819.
Trước khi bit cho phép ngắt riêng rẽ có thể chuyển qua ON (bật) thì bit cho phép bgắt
toàn cục GIE, bit 7, phải được bật , nghĩa là ‘1’, cho phép tất cả các ngắt không che
được và GIE=’0’ sẽ xoá tất cả các ngắt.
Bit 6 EEIE (16F84/16F877A) là bit cho phép ngắt việc ghi dữ liệu eeprom hoàn thành.
1=cho phép ngắt.
0= cấm ngắt.

Bit 6 PEIE (16F818/19): là bit cho phép khả năng của bit ngoại vi ngoài.
Bit 5: T0IE là bit cho phép ngắt TMR0 tràn.
1=cho phép ngắt này.
0=cấm ngắt.
Bit 4 INTE là bit cho phép ngắt RB0/INT (bit 0 của PORTB)
1=cho phép n gắt.
0=cấm ngắt
Bit 3 RBIE là bit cho phép ngắt thay đổi ở portB (B4-B7).
1=cho phép ngắt.
0=cấm ngắt.
Bit 2 T0IF là cờ , mà chỉ ra TMR0 bị tràn để tạo ra một ngắt.
1=chỉ ra TMR0 bị tràn.


115
0=TMR0 không tràn.
Bit này phải được xoá bằng phần mềm.
Bit 1 INTF là bit cờ ngắt RB0/INT mà chỉ ra sự thay đổi trên PORTB,0
1=chỉ ra một sự thay đổi diễn ra.
0=chỉ ra không có sự thay đổi.
Bit 0 RBIF là bit cờ ngắt thay đổi ở PORTB (B4-B7).
1=chỉ ra rằng một trong bốn chân ngõ vào PORTB, 4-7 có sự thay đổi trạng thái. Bit
này phải được xóa bằng phần mềm.
0=chỉ ra không có bit nào ở PORTB,4-7 có thay đổi.
Lệnh RETFIE (return from interrupt), trở về từ ngắt, thoát khỏi chương trình phục vụ
ngắt, cũng như thiết lập GIE bit, mà cho phép lại ngắt.
Cờ ngắt ngoại vi được chứa trong thanh ghi chức năng đặc biệt PIR1 và PIR2. Bit cho
phép ngắt tương ứng được chứa trong thanh ghi chức năng đặc biệt , PIE1 và PIE2, và
bit cho phép ngắt ngoại vi chứa trong thanh ghi INTCON.
Cờ ngắt chân RB0/INT, cờ ngắt thay đổi portB (B4-B7) và cờ ngắt tràn TMR0 được

chứa trong thanh ghi INTCON.
Khi một ngắt được đáp ứng, bit GIE bị xóa để cấm các ngắt khác, địa chỉ trở về được
cất vào ngăn xếp và thanh ghi bộ đếm chương trình PC được nạp giá trị 0004h. Một khi
trong chương trình phục vụ ngắt, nguồn của ngắt có thể được xác định bằng cách bit cờ
ngắt. Bit cờ ngắt phải được xóa bằng phần mềm trước khi cho phép lại ngắt để tránh
ngắt đệ qui.
Trong phần này, chúng ta xem xét ngắt gây ra bởi cạnh lên hay cạnh xuống của chân
PORTB,0. Cho phép ngắt RB0/INT bằng lệnh
BSF INTCON,GIE; bit cho phép ngắt toàn cục
BSF INTCON,INTE;cho phép ngắt do RB0
6.3. Chương trình sử dụng ngắt:
Như là một ví dụ làm thế nào ngắt hoạt động, chúng ta hãy xem xét thí dụ sau:
Giả sử chúng ta có 4 led sang tuần tự mỗi 5 giây. Một nút nhấn được nối với B0 hoạt
động như một ngắt để mà khi B0 ở logic 0, một chương trình ngắt được gọi. Chương
trình ngắt này chớp tất cả 4 led sang (on) và tắt (off) 2 lần trong một giây và trở về
chương trình chính giả sử nút nhấn B0 là ở logic 1.
Chúng ta dung 16F877A trong ví dụ này.
Sơ đồ mạch cho ứng dụng này ở hình 6.2


116
Xem xét mạch điện sau:

B1
B0 16F877A
B2

33
SW


B3
B4

34 680
35

680

36

680

37

680
+5V

Vcc
22 pF

13

MCLR

11
1

32Khz
22pF


14

0.1 µF
12

Hình 6.2: Mạch điện chớp tắt 4 led.
Một điều cần chú ý từ mạch là chip 16F877A có điện trở kéo lên bên trong ở PORTB
nên B0 không cần điện trở kéo lên ở công tắc SW.
Ngắt chúng ta sử dụng là thay đổi trên B0, vì vậy chúng ta quan tâm đến các
bit sau trong INTCON: bit 4 INTE, bit cho phép ngắt do RB0/INT và bit 1 INTF, bit cờ
minh họa B0 có thay đổi, và dĩ nhiên bit 7 GIE, bit cho phép ngắt toàn cục.
Hoạt động của chương trình:
Khi B0 tạo ra một ngắt, chương trình rẽ nhánh tới chương trình phục vụ ngắt .ở
đâu? vị trí 4 ở bộ nhớ chương trình báo cho vi điều khiển nhảy tới nơi tìm chương trình
phục vụ ngắt.
Vị trí ô nhớ số 4 của bộ nhớ chương trình thì được lập trình sử dụng lệnh sau:
ORG 4; ghi lệnh kế tiếp vào ô nhớ 4 ở bộ nhớ chương trình.
GOTO ISR;nhảy tới chương trình phục vụ ngắt.
Chương trình phục vụ ngắt:
Chương trình phục vụ ngắt được viết giống như chương trình con và được minh
họa dưới đây:
;chương trình phục vụ ngắt:
ISR MOVWF W_TEMP; lưu W
SWAPF
STATUS,W
MOVWF STATUS_T;lưu STATUS
MOVF TMR0,W
MOVWF
TMR0_T; lưu TMR0
MOVF PORTB,W

MOVWF PORTB_T; lưu PORTB


117
MOVLW 0FFh
MOVWF PORTB; bật tất cả ngõ ra
CALL DELAY1; trì hoãn 1 giây
MOVLW 0
MOVWF PORTB; tắt tất cả ngõ ra
CALL DELAY1 ; trì hoãn 1 giây
MOVLW 0FFh
MOVWF PORTB;bật tất cả ngõ ra
CALL DELAY1; trì hoãn 1 giây
MOVLW 0
MOVWF PORTB;tắt tất cả ngõ ra
CALL DELAY1; trì hoãn 1 giây
SW_HI BTFSS PORTB,0
GOTO SW_HI; đợi cho nút nhấn ở mức ‘1’
SWAPF STATUS_T,W
MOVWF STATUS;phục hồi STATUS
MOVF TMR0_T,W
MOVWF TMR0;phục hồi TMR0
MOVF PORTB_T,W
MOVWF PORTB;phục hồi PORTB
MOVF W_TEMP,W;phục hồi W
BCF INTCON,INTF;reset cờ ngắt
RETFIE ; trở về từ ngắt
Hoạt động của chương trình phục vụ ngắt:
Chương trình phục vụ ngắt hoạt động theo cách sau:
. Khi một ngắt được thự hiện thì cho phép ngắt toàn cục bị xóa tự động (=’0’, cấm) để

tắt tất cả các ngắt khác. Chúng ta không muốn bị ngắt khi chúng ta đang bị ngắt.
. Thanh ghi W, STATUS, TMR0 và PORTB được lưu trong vị trí tạm W_TEMP,
STATUS_T, TMR0_T, và PORTB_T.
. Chương trình ngắt được thực thi , led chớp sang và tắt 2 lần. Đây là chuỗi tách biệt
hơn trước đây để minh họa ngắt đã ngắt dòng chương trình thong thường. Chú ý là
chương trình đã không nhìn vào công tắc mà đã tạo ra ngắt.
. Chúng ta đợi cho tới khi công tắc trở về vit trí Hi (mức cao).
. Ô nhớ tạm W_TEMP, STATUS_T, TMR0_T, và PORTB_T được phục hồi vào W,
STATUS, TMR0 và PORTB.
. Cờ ngắt PORTB,0 ở thanh ghi INTCON là INTF bị xoá, sẵn sang chỉ ra ngắt khác
nữa.
. Chúng ta trở về từ ngắt, bit cho phép ngắt toàn cục tự động được bật lên 1 để cho phép
ngắt khác nữa.
Chương trình minh họa ngắt:
Đoạn mã đầy đủ cho chương trình này được minh họa dưới đây với tên
INTFLASH.ASM
;INTFLASH.ASM chớp tắt led dung ngắt bằng nút nhấn trên B0 dùng 16F877A
; Header877.asm điều này thiết lập portA là ngõ vào (1 là vào), portB,0 là ngõ vào, còn
B1-B7 là ngõ ra ( 0 là ra), ;portC là ngõ vào, portE ngõ vào, portD ngõ ra.
;thanh ghi OPTION được thiết lập để chia 256 cho ra xung định thì 1/32 của 1 giây.
;trì hoãn 1 giây và 0,5 giây được đưa vào chương trình con
;***************************************
;phần tương đương
TMR0 EQU 1; nghĩa là TMR0 là file 1 (ô nhớ 1)


118
OPTION_R EQU 81h; thanh ghi OPTION là ô nhớ 81h.
PORTA EQU 5;nghĩa là portA là ô nhớ 5.
PORTB EQU 6;nghĩa là portB là ô nhớ 6.

PORTC EQU 7
PORTD EQU 8
PORTE EQU 9
TRISA EQU 85H; TRISA (chọn I/O portA) là ô nhớ 85H
TRISB EQU 86H; TRISB (chọn I/O portB) là ô nhớ 86H
TRISC EQU 87H
TRISD EQU 88H
TRISE EQU 89H
STATUS EQU 3; nghĩa là STATUS là ô nhớ 3.
ZEROBIT EQU 2; nghĩa là zerobit là bit 2.
CARRY EQU 0
INTCON EQU 0BH; thanh ghi điều khiển ngắt
GIE EQU 7; bit ngắt toàn cục
INTE EQU 4;bit cho phép ngắt B0
INTF EQU 1; cờ ngắt B0
ADCON0 EQU 1Fh;thanh ghi cấu hình A/D 0.
ADCON1 EQU
9FH;thanh ghi cấu hình A/D 1.
ADRESH EQU 1EH
ADRESL EQU 9EH
COUNT EQU 20H ;COUNT là ô nhớ 20H, thanh ghi để đếm sự kiện.
TMR0_T EQU 21H; ô nhớ tạm TMR0
W_TEMP EQU 22H; ô nhớ tạm W
STATUS_T EQU 23H; ô nhớ tạm STATUS
PORTB_T EQU 24H; ô nhớ tạm PORTB
COUNTA EQU 25H;COUNTA là thanh ghi đếm sự kiện
;***************************************
LIST P=16F87A ; chúng ta đang dùng 16F877A
ORG 0
; địa chỉ bắt đầu là 0

GOTO START; nhảy đến START
ORG 4;ghi tới ô nhớ 4
GOTO ISR;vị trí 4 nhảy tới ISR
;***************************************
;Bit cấu hình
__CONFIG H’3FF0’ ; chọn dao động LP, WDT off, PUT on, bảo vệ mã bị cấm.
;Phần chương trình con
;trì hoãn 0,1 giây, thực sự 0,099968s
DELAYP1
CLRF TMR0; bắt đầu TMR0
LOOPB MOVF TMR0,W; đọc TMR0 vào W
SUBLW .3; TIME-3
BTFSS STATUS, ZEROBIT; kiểm tra TIME-3=0 (3-W=0)
GOTO LOOPB; time không bằng 3
NOP
;them trì hoãn
NOP
RETLW 0; trở về sau khi time là 3
;trì hoãn 5 giây.
DELAY5
MOVLW .50
MOVWF COUNTA


119
LOOPC

CALL DELAYP1
DECFSZ COUNTA
GOTO LOOPC

RETLW 0
;trì hoãn 1 giây
DELAY1
MOVLW .10
MOVWF COUNT
LOOPA
CALL DELAYP1
DECFSZ COUNT
GOTO LOOPA
RETLW 0
;chương trình phục vụ ngắt:
ISR MOVWF W_TEMP; lưu W
SWAPF
STATUS,W
MOVWF STATUS_T;lưu STATUS
MOVF TMR0,W
MOVWF
TMR0_T; lưu TMR0
MOVF PORTB,W
MOVWF PORTB_T; lưu PORTB
MOVLW 0FFh
MOVWF PORTB; bật tất cả ngõ ra
CALL DELAY1; trì hoãn 1 giây
MOVLW 0
MOVWF PORTB; tắt tất cả ngõ ra
CALL DELAY1 ; trì hoãn 1 giây
MOVLW 0FFh
MOVWF PORTB;bật tất cả ngõ ra
CALL DELAY1; trì hoãn 1 giây
MOVLW 0

MOVWF PORTB;tắt tất cả ngõ ra
CALL DELAY1; trì hoãn 1 giây
SW_HI BTFSS PORTB,0
GOTO SW_HI; đợi cho nút nhấn ở mức ‘1’
SWAPF STATUS_T,W
MOVWF STATUS;phục hồi STATUS
MOVF TMR0_T,W
MOVWF TMR0;phục hồi TMR0
MOVF PORTB_T,W
MOVWF PORTB;phục hồi PORTB
MOVF W_TEMP,W;phục hồi W
BCF INTCON,INTF;reset cờ ngắt
RETFIE ; trở về từ ngắt
;Phần cấu hình.
START BCF STATUS,6
BSF STATUS,5; trở lại bank 1
MOVLW B’11111111’; 6 bit của port A là I/P (ngõ vào)
MOVWF TRISA
MOVLW B’00000110’
MOVWF ADCON1; portA là số (digital)


120
MOVLW B’00000001’
MOVWF TRISB ; PortB,0 là I/P (ngõ vào)
MOVLW B’11111111’
MOVWF TRISC; portC l à ngõ vào
MOVLW B’00000000’
MOVWF TRISD; PortD là output (ngõ ra)
MOVLW B’11111111’; 3 bit của port E là I/P (ngõ vào)

MOVWF TRISE
MOVLW B’00000111’;bộ chia tỉ lệ trước là /256
MOVWF OPTION_R; timer là 1/32sec, có thể dùng lệnh OPTION
BCF STATUS,5 ;trở lại bank 0
BCF STATUS,6
CLRF PORTA ; xóa PORTA
CLRF PORTB ;xóa PORTB
CLRF PORTC ;xóa PORTC
CLRF PORTD ;xóa PORTD
CLRF PORTE ;xóa PORTE
BSF INTCON,GIE; cho phép ngắt toàn cục
BSF INTCON, INTE;cho phép ngắt B0
;chương trình chính bắt đầu
BEGIN MOVLW B’00000010’; bật B1 led 1 sáng
MOVWF PORTB
CALL DELAY5; đợi 5 giây
MOVLW B’00000100’
MOVWF PORTB;bật B2, led 2 sáng
CALL DELAY5; trì hoãn 5 giây
MOVLW B’00001000’
MOVWF PORTB;bật B3 , led 3 sáng
CALL DELAY5; trì hoãn 5 giây
MOVLW B’00010000’
MOVWF PORTB;bật B4, led 4 sáng
CALL DELAY5;trì hoãn 5 giây
GOTO BEGIN
END; dòng này luôn luôn đặt ở cuối chương trình.
4 led chớp sáng và tắt đủ chậm (khoảng 5 giây) để mà bạn có thể ngắt cách quảng
thông qua B0 mức thấp dùng nút nhấn. Khi trở về từ ngắt, B0 ở mức cao trở lại,
chương trình gĩư từ lúc nó bỏ đi.

IV.Tổng kết bài:
-Tóm tắt các ý chính trong bài.
-Chuẩn bị bài mới.
V. Câu hỏi và bài tập về nhà:
Chương 6: Ngắt
1.Ngắt là gì? Các nguồn ngắt của 16F84 và của 16F877A.
2. Thanh ghi INTCON.
3. Giả sử chúng ta có 4 led chớp(sang và tắt) tuần tự. Một nút nhấn nối với B0 làm
việc như 1 ngắt để mà khi B0 là ở logic 0 một chương trình ngắt được gọi. Chương
trình ngắt này chớp tất cả 4 led sang(ON) và tắt (OFF) hai lần ở khoảng thời gian 1
giây và trở về chương trình cung cấp nhút nhấn ở B0 là ở logic 1. Hãy viết chương
trình trên.


121


122

Bài giảng số 7: Bộ chuyển đổi tương tự-số ( Số tiết: 3)
III.1. Mục tiêu:
- Thực hiện việc đọc A/D.
- Cấu hình thiết bị A/D.
-Tiêu đề tương tự cho PIC 16F877A.
- Thí dụ chuyển đổi A/D: chuyển mạch (switch) cảm biến nhiệt độ.
-. Mã chương trình
III.2. Đồ dung và phương tiện dạy học:
-Phấn trắng, bảng, khăn, bút long, micro có dây(hay không dây), máy tính, và đèn
chiếu (hay máy chiếu).
III.3. Giáo trình và tài liệu tham khảo:

Giáo trình Vi xử lí của trường Đại học công nghiệp Tp. HCM.
D.W. Smith, PIC in practice: a project-based approach, Elsevier, 2nd edition, 2006.
Trương Trác, Chip đơn 16C84 và ứng dụng của chúng.
Hồ Trung Mỹ, Vi xử lí, NXB ĐHQG Tp. HCM, 2003.
Tài liệu về vi điều khiển PIC của bọ môn Điện tử công nghiệp.
Datasheet c ủa PIC 16F84 v à 16F877A.
Website: /> />Myke Predko, Programming and customizing the PIC microcontroller, 3rd edition,
Tab Electronics, McGrawHill, 2008(Ebook).
Douglass V.Hall, Microprocessors and interfacing: Programming and Hardware, 2nd
ed., Macmillan/McGraw-Hill, 1992.
III.4.Nội dung bài giảng:
Nội dung chi tiết : xem bài giảng chi tiết.
Phương pháp giảng dạy: thuyết trình, nêu vấn đề và đàm thoại trao đổi với sinh
viên.
Chương 7: Bộ chuyển đổi tương tự-số (ADC)
Cho tới nay chúng ta xét ngõ vào như là số ở hoạt động nghĩa là ngõ vào là 0 hay 1.
Nhưng giả sử chúng ta đo nhiệt độ, chứ không chỉ là nóng hay lạnh (1 hay 0). Chúng ta
có thể yêu cầu:
(a)Phát ra buzzer (còi hụ) nếu nhiệt độ xuống dưới freezing (đông).
(b) Bật lò lên nếu nhiệt độ dưới 18 độ C.
(c) Bật quạt lên nếu nhiệt độ trên 25 độ C.
(d)Báo động nếu nhiệt độ trên 35 độ C.
Giải pháp tốt là sử dụng một ngõ vào nối với bộ chuyển đổi tương tự sang số (ADC)
và đo nhiệt độ với A/D.
Hình 7.1 minh họa sử mạch cơ bản để đo nhiệt độ. Nó gồm có điện trở cố định nối tiếp
với thermistor (điện trở nhiệt bán dẫn).


123
Điện trở của thermistor (tec-mix-to) thay đổi theo nhiệt độ gây ra 1 điện áp tại điểm X

ở hình 8.1
+5V

Tec-mix-to

0C
X

22k

0V
Hình 7.1: Mạch đo nhiệt độ.
Khi nhiệt độ tăng điện áp tại X tăng.
Khi nhiệt độ giảm , điện áp tại X giảm.
Chúng ta cần biết quan hệ giữa nhiệt độ của tec-mix-to với điện áp tại X. Cách đơn
giản làm điều này là đặt tec-mix-to trong ly nước sôi (100 độ C) và đo điện áp tại X.
Khi nước nguội tương ứng việc đọc nhiệt độ và điện áp có thể đo được. Nếu cần thiết,
đồ thị của nhiệt độ và việc đọc điện áp được vẽ ra.
7.1. Thực hiện việc đọc A/D.
Trong thí dụ trên chúng ta hãy giả sử:
. 0 độ C cho đọc điện áp là 0,6V.
. 18 độ C cho đọc điện áp là 1,4V.
. 25 độ C cho đọc điện áp là 2,4V.
. 30 độ C cho đọc điện áp là 3,6V.
Vi điều khiển sẽ đọc các điện áp này và chuyển đổi chúng thành số 8 bit trong
đó 0V là 0 và 5V là 255, nghĩa là việc đọc 51/volt hay độ phân giải là 1/51, nghĩa là 1
bit là 19,6 mV.
Như vậy 0độ C=0,6V=đọc là 31 (0,6vx51=30,6)
18 độ C=1,4V=71 (1,4v x 51=71,4)
25 độ C=2,4v= 122 (2,4v x 51=122,4)

30 độ C= 3,6 v= 184(3,6V x 51=183,6)
PIC 16C773 và PIC 16C773 có ADC 12 bit và có 4096 điểm nhiệt độ khác
nhau.
ADC được giới thiệu ở PIC với họ gọi là 16C7X như là 16C71, 16C73 và
16C74. Họ này hiện nay được thay bằng 16F87X như là 16F870,
16F871/872/873/874/876/16F877. Ngoài ra còn có 16F818/819.


124
PIC 16F877A có 8 ngõ vào analog AN0, AN1, AN2, AN3, AN4, AN5, AN6,
AN7 và AN8 với bộ chuyển đổi tương tự-số (A/D) 10 bit có 8 kênh vào. (PIC 16F877
có ADC 10 bit với 5 kênh vào).
7.2. Cấu hình thiết bị A/D:
Để thực hiện đo lường analog thì ta phải cấu hình thiết bị . HEADER877A.ASM phải
có phần cấu hình thay đổi để làm cho một số ngõ vào port A là ngõ vào analog, portB
được thiết lập ngõ ra.
Để cấu hình 16F877A cho đo lường A/D, 3 thanh ghi cần được thiết lập:
. ADCON0.
.ADCON1.
.ADRESH và ADRESL
Thanh ghi điều khiển A/D 0: ADCON0, đ ịa ch ỉ 1FH
Đầu tiên là thanh ghi A/D, ADCON0 là thanh ghi điều khiển tương tự sang số thứ 0.
ADCON0 được dung:
. Bật lên chuy ển đ ổi A/D v ới ADCON0, bit 0. Bit này bật chuyển đổi A/D khi nó
được bật lên 1 và tắt A/D khi nó bị xóa về 0. Khi A/D được bật, nó có thể được để ON
(bật) suốt thời gian nhưng nó lái dòng 90μA, so sánh với phần còn lại của vi điều khiển
mà lái dòng 15μA.
. Ra lệnh vi điều khiển thực thi chuyển đổi bằng cách bật bit GO/DONE, bit 2. Khi bit
GO/DONE=’1’ thì vi điều khiển thực hiện chuyển đổi A/D. Khi chuyển đổi hoàn
thành, phần cứng xóa bit GO/DONE. Bit này có thể được đọc khi kết quả là sẵn sang.

. Thiết lập kênh cụ thể (ngõ vào) để thực hiện đo lường. Điều này được thực hiện với 3
bit chọn kênh CHS0, CHS1 và CHS2, bit 3,4, và 5.
Bit 7

6

5

ADCS1 ADSC0 CHS2

4
CHS1

3

2

1

0

CHS0 GO/DONE - ADON

Hình 7.2: Thanh ghi ADCON0.
.Bit 7 và 6, ADCS1 và ADCS0: bit chọn clock chuyển đổi A/D.
ADCS2
ADCS1 ADCS0
Tốc độ chuyển đổi
(ADCON1)
0

0
0
Fosc/2
0
0
1
Fosc/8
0
1
0
Fosc/32
0
1
1
FRC (clock lấy từ mạch RC A/D bên trong)
1
0
0
Fosc/4
1
0
1
Fosc/16
1
1
0
Fosc/64
1
1
1

FRC


×