ĐẠI HỌC ĐÀ NẴNG
TRUỜNG ĐẠI HỌC BÁCH KHOA
TÀI LIỆU THỰC TẬP
CHUYÊN ĐỀ 1
(LƯU HÀNH NỘI BỘ, KHÓA 09CVL TRƯỜNG ĐH SƯ PHẠM)
Biên soạn: Phạm Xuân Trung
Bộ môn Kỹ thuật Máy tính
Khoa Điện tử Viễn thông
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
Mục tiêu: Sinh viên sau khi đọc xong tài liệu này có thể:
- Lập trình được một chương trình đơn giản cho Vi điều khiển PIC16F877A
- Sử dụng phần mềm mô phỏng PIC Simulator IDE để lập trình và mô phỏng
một chương trình đơn giản.
- Sử dụng bộ công cụ MPLAB để lập trình và nạp chương trình cho KIT
PICDEM2 PLUS.
- Đọc được các thông số hiển thị trên chương trình mô phỏng.
- Sử dụng được KIT PICDEM2 PLUS để thực hiện các bài thực hành đơn
giản.
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 1
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
1.1.
Lý thuyết Vi điều khiển PIC16F877A
PIC là chữ viết tắt của "Peripheral Interface Controller" (Bộ điều khiển giao tiếp
ngoại vi).
Vi điều khiển PIC16F877A (có kèm chữ “A” ở cuối đồng nghĩa với việc Vi điều
khiển này sử dụng bộ nhớ chương trình Flash) thuộc họ vi điều khiển PIC16F, sở hữu hầu
hết các chức năng phổ biến thường gặp ở các vi điều khiển trong họ.
Một số đặc điểm của Vi điều khiển PIC16F877A:
CPU kiểu RISC hiệu suất cao:
- Tập lệnh gồm 35 lệnh
- Các lệnh chỉ thực hiện trong 1 chu kỳ máy ngoại trừ các lệnh rẽ nhánh lúc thực
hiện hoạt động rẽ nhánh.
- Bộ nhớ chương trình flash dung lượng 8Kx14 words
- Bộ nhớ dữ liệu RAM tĩnh dung lượng 368x8 bytes
- Bộ nhớ dự liệu EEPROM dung lượng 256x8 bytes
- Số lượng chân là 40
Các đặc trưng ngoại vi:
- Timer0: bộ đếm 8 bit với bộ chia tần số 8 bit.
- Timer1: bộ đếm 16 bit với bộ chia tần số, có thể thực hiện chức năng đếm dựa vào
xung clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độ sleep.
- Timer2: bộ đếm 8 bit với bộ chia tần số, bộ postcaler.
- Hai bộ Capture(bắt xung/phát hiện xung) /so sánh/điều chế độ rông xung (PWM)
o Bộ Capture 16-bit, độ phân giải tối đa là 12.5 ns
o Bộ so sánh 16-bit, độ phân giải tối đa là 200 ns
o Bộ PWM độ phân giải tối đa là 10-bit
- Các chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port), SPI và I2C.
- Chuẩn giao tiếp nối tiếp USART với 9 bit địa chỉ.
- Cổng giao tiếp song song PSP (Parallel Slave Port) với các chân điều khiển RD,
WR, CS ở bên ngoài.
Các đặc tính Analog:
- 8 kênh chuyển đổi ADC 10 bit.
- Hai bộ so sánh.
Bên cạnh đó là một vài đặc tính khác của vi điều khiển như:
- Bộ nhớ flash với khả năng ghi xóa được 100.000 lần.
- Bộ nhớ EEPROM với khả năng ghi xóa được 1.000.000 lần.
- Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm.
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 2
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
-
Khả năng tự nạp chương trình với sự điều khiển của phần mềm.
Nạp được chương trình ngay trên mạch điện ICSP (In Circuit Serial Programming)
thông qua 2 chân.
Watchdog Timer với bộ dao động trong. Chức năng bảo mật mã chương trình. Chế
độ Sleep.
Có thể hoạt động với nhiều dạng Oscillator khác nhau.
1.1.1. Sơ đồ chân, một số chức năng các chân cần quan tâm
1.1.1.1. Sơ đồ chân và 3 kiểu đóng gói
Hiện nay, Microchip đưa ra thị trường 3 kiểu đóng gói khác nhau cho vi điều khiển
PIC16F877A: 40 chân kiểu PDIP, 44 chân kiểu PLCC và TQFP. Kiểu 40 chân PDIP được
sử dụng khá nhiều trong các ứng dụng thực tế không yêu cầu cao về độ phức tạp bởi nó
dễ thiết kế mạch, dễ thay thế chip nếu có xảy ra hỏng hóc. Vì vậy, trong tất cả những nội
dung được trình bày đều sử dụng cho PIC16F877A có kiểu đóng gói 40 chân PDIP.
PDIP: Plastic Dual In-line Package
PLCC: Plastic Leaded Chip Carrier
TQFP: Thin Quad Flat Pack
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 3
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
1.1.1.2. Một số chức năng các chân cần quan tâm
Chân
1
2
3
4
5
6
7
Tên
Chức năng
: Hoạt động Reset ở mức thấp
- VPP : ngõ vào áp lập trình
- RA0 : xuất/nhập số
RA0/AN0
- AN0 : ngõ vào tương tự
- RA1 : xuất/nhập số
RA1/AN1
- AN1 : ngõ vào tương tự
- RA2 : xuất/nhập số
RA2/AN2/VREF-/CVREF - AN2 : ngõ vào tương tự
- VREF -: ngõ vào điện áp chuẩn (thấp) của bộ A/D
- RA3 : xuất/nhập số
RA3/AN3/VREF+
- AN3 : ngõ vào tương tự
- VREF+ : ngõ vào điện áp chuẩn (cao) của bộ A/D
- RA4 : xuất/nhập số
RA4/TOCKI/C1OUT - TOCKI : ngõ vào xung clock bên ngoài cho timer0
- C1 OUT : Ngõ ra bộ so sánh 1
- RA5 : xuất/nhập số
RA5/AN4/ /C2OUT
- AN4 : ngõ vào tương tự 4
/VPP
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 4
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
8
RE0/
/AN5
RE1/
/AN6
RE2/
/AN7
9
10
11
12
13
VDD
VSS
OSC1/CLKI
14
OSC2/CLKO
15
RC0/T1 OCO/T1CKI
16
RC1/T1OSI/CCP2
17
RC2/CCP1
18
RC3/SCK/SCL
- SS : ngõ vào chọn lựa SPI phụ
- C2 OUT : ngõ ra bộ so sánh 2
- RE0 : xuất nhập số
- RD : điều khiển việc đọc ở port nhánh song song
- AN5 : ngõ vào tương tự
- RE1 : xuất/nhập số
- WR : điều khiển việc ghi ở port nhánh song song
- AN6 : ngõ vào tương tự
- RE2 : xuất/nhập số
- CS : Chip lựa chọn sự điều khiển ở port nhánh song
song
- AN7 : ngõ vào tương tự
Chân nguồn của PIC.
Chân nối đất
Ngõ vào dao động thạch anh hoặc xung clock bên
ngoài.
- OSC1 : ngõ vào dao động thạch anh hoặc xung clock
bên ngoài. Ngõ vào Schmit trigger khi được cấu tạo ở
chế độ RC ; một cách khác của CMOS.
- CLKI : ngõ vào nguồn xung bên ngoài. Luôn được kết
hợp với chức năng OSC1.
Ngõ vào dao động thạch anh hoặc xung clock
- OSC2 : Ngõ ra dao động thạch anh. Kết nối đến thạch
anh hoặc bộ cộng hưởng.
- CLKO : ở chế độ RC, ngõ ra của OSC2, bằng tần số
của OSC1 và chỉ ra tốc độ của chu kỳ lệnh.
- RC0 : xuất/nhập số
- T1OCO : ngõ vào bộ dao động Timer 1
- T1CKI : ngõ vào xung clock bên ngoài Timer 1
- RC1 : xuất/nhập số
- T1OSI : ngõ vào bộ dao động Timer 1
- CCP2 : ngõ vào Capture 2, ngõ ra compare 2, ngõ ra
PWM2
- RC2 : xuất/nhập số
- CCP1 : ngõ vào Capture 1, ngõ ra compare 1, ngõ ra
PWM1
- RC3 : xuất/nhập số
- SCK : ngõ vào xung clock nối tiếp đồng bộ/ngõ ra của
chế độ SPI
- SCL : ngõ vào xung clock nối tiếp đồng bộ/ ngõ ra của
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 5
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
19
20
21
22
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
23
RC4/SDI/SDA
24
RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT
27
28
29
30
31
32
33
34
35
36
37
38
RD4/PSP
RD5/PSP5
RD6/PSP6
RD7/PSP7
VSS
VDD
RB0/INT
RB1
RB2
RB3
RB4
RB5
chế độ I2C
- RD0 : xuất/nhập số
- PSP0 : dữ liệu port nhánh song song
- RD1 : xuất/nhập số
- PSP1 : dữ liệu port nhánh song song
- RD2 : xuất/nhập số
- PSP2 : dữ liệu port nhánh song song
- RD3: xuất/nhập số
- PSP3 : dữ liệu port nhánh song song
- RC4 : xuất/nhập số
- SDI : dữ liệu vào SPI
- SDA : xuất/nhập dữ liệu vào I2C
- RC5 : xuất/nhập số
- SDO : dữ liệu ra SPI
- RC6 : xuất/nhập số
- TX : truyền bất đồng bộ USART
- CK : xung đồng bộ USART
- RC7 : xuất/nhập số
- RX : nhận bất đồng USART
- DT : dữ liệu đồng bộ USART
- RD4: xuất/nhập số
- PSP4 : dữ liệu port nhánh song song
- RD5: xuất/nhập số
- PSP5 : dữ liệu port nhánh song song
- RD6: xuất/nhập số
- PSP6 : dữ liệu port nhánh song song
- RD7: xuất/nhập số
- PSP7 : dữ liệu port nhánh song song
Chân nối đất
Chân nguồn của PIC.
- RB0 : xuất/nhập số
- INT : ngắt ngoài
xuất/nhập số
xuất/nhập số
- RB3 : xuất/nhập số
- Chân cho phép lập trình điện áp thấp ICPS
- xuất/nhập số
- Ngắt PortB
- xuất/nhập số
- Ngắt PortB
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 6
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
39
RB6/PGC
40
RB7/PGD
- RB6 : xuất/nhập số
- PGC : mạch vi sai và xung clock lập trình ICSP
- Ngắt PortB
- RB7 : xuất/nhập số
- PGD : mạch vi sai và dữ liệu lập trình ICSP
- Ngắt PortB
1.1.2. Tổ chức bộ nhớ chuơng trình
Mô tả thanh ghi bộ đếm chương trình PC, 8 cấp ngăn xếp (stack), bộ nhớ chương
trình Flash được phân thành 4 trang, sự liên quan giữa các 3 thành phần, và cách sử dụng
các thành phần này.
1.1.2.1. Bản đồ bộ nhớ chương trình và ngăn xếp
Bộ nhớ chương trình của vi xử lý PIC16F877A là tập hợp các vị trí nhớ được gọi là
các “word”. Kích thước của bộ nhớ chương trình là 8Kword, có dải địa chỉ nằm trong
đoạn [0000h, 1FFFh]. Độ rộng của mỗi “word” là 14 bit.
Ngăn xếp (stack) của vi xử lý PIC16F877A có tất cả 8 vị trí nhớ hay còn gọi là 8
cấp stack. Các cấp stack này về bản chất liên quan trực tiếp đến thanh ghi bộ đếm chương
trình (thanh ghi PC) và thông qua đó là địa chỉ của các word thuộc bộ nhớ chương trình.
Thanh ghi bộ đếm chương trình (thanh ghi PC) liên quan trực tiếp đến địa chỉ của
các word thuộc bộ nhớ chương trình, đồng thời cũng liên quan trực tiếp đến 8 cấp stack.
Cả ba thành phần trên sử dụng chung một bus địa chỉ có độ rộng là 13 bit.
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 7
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
1.1.2.2. Bộ nhớ chương trình:
Bộ nhớ chương trình là thành phần lưu trữ chương trình dưới dạng mã máy (các
chuỗi bit nhị phân). Ban đầu, người lập trình sử dụng một ngôn ngữ bất kỳ (khác mã máy)
để viết chương trình, sau đó sử dụng trình biên dịch để biên dịch chương trình sang mã
máy, và nạp vào vi xử lý.
Bộ nhớ chương trình của vi xử lý PIC16F877A được tổ chức thành 4 trang (page).
Kích thước mỗi trang là 2Kword, vì vậy dải địa chỉ tương đối(độ dời) của mỗi trang thuộc
đoạn [0000h, 07FFh]. Các trang cũng được đánh địa chỉ trang để dễ dàng quản lý, lần lượt
là 0h cho trang 0, 1h cho trang 1, 2h cho trang 2, 3h cho trang 3.
Tuy nhiên, trang 0 có sự khác biệt với các trang còn lại. Địa chỉ 0000h không sử
dụng để lưu trữ chương trình mà sử dụng cho véc tơ Reset. Địa chỉ 0004h cũng không sử
dụng để lưu trữ chương trình mà sử dụng cho véc tơ ngắt. Như vậy, dải địa chỉ tương đối
của trang 0 phải bắt đầu từ 0005h.
Cách biểu diễn địa chỉ logic: địa chỉ logic = địa chỉ trang bộ nhớ: địa chỉ tương đối.
Ví dụ, word 00AAh của trang 1 có địa chỉ logic là “1h:00AAh”
Cách tính địa chỉ tuyệt đối cho các loại bộ nhớ phân trang: địa chỉ tuyệt đối = địa
chỉ trang bộ nhớ x kích thước của trang bộ nhớ + địa chỉ tương đối. Ví dụ, word 00AAh
của trang 1 (kích thước của trang là 2Kword) có địa chỉ tuyệt đối = 1h x 800h + 00AAh =
08AAh.
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 8
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
1.1.2.3. Thanh ghi bộ đếm chương trình (Thanh ghi PC)
Thanh ghi PC được sử dụng để trỏ đến lệnh cần thực hiện. Độ rộng của thanh ghi
PC là 13 bit. Trong đó, 11 bit thấp <10,0> được sử dụng để lưu trữ giá trị địa chỉ tương
đối thuộc trang bộ nhớ đang chứa lệnh được trỏ đến, 2 bit cao còn lại <12,11> được sử
dụng để lưu trữ địa chỉ trang bộ nhớ. Ngoại trừ trường hợp đặc biệt, sau khi lệnh được
nạp vào thanh ghi lệnh Instruction Register, ngay lập tức giá trị được lưu trữ trong thanh
ghi PC sẽ tự động tăng lên 1 để trỏ đến lệnh kế tiếp cần thực hiện.
1.1.2.4. Ngăn xếp (stack)
Stack có 8 cấp với chức năng lưu trữ địa chỉ trở về từ chương trình con hoặc
chương trình con phục vụ ngắt. Vì được sử dụng để lưu trữ địa chỉ các word thuộc bộ nhớ
chương trình nên độ rộng của mỗi cấp stack sẽ là 13 bit giống với thanh ghi PC. Stack
hoạt động theo nguyên lý LIFO (vào sau ra trước). Đối với vi xử lý PIC16F877A, không
có con trỏ stack nên không thể kiểm soát được hoạt động tràn, vì vậy khuyến cáo không
nên có quá 8 chương trình con lồng vào nhau.
1.1.3. Tổ chức bộ nhớ dữ liệu RAM
Mô tả cách phân chia bộ nhớ dữ liệu RAM thành 2 nhóm thanh ghi, cách thức sử
dụng một vài thanh ghi cần thiết cho các bài thí nghiệm.
1.1.3.1. Sơ đồ tổ chức bộ nhớ dữ liệu RAM (Bản đồ tệp thanh ghi)
Bộ nhớ dữ liệu RAM của vi xử lý PIC16F877A có dung lượng là 512 byte, có dải
địa chỉ thuộc đoạn [000h, 1FFh]. Tuy nhiên, chỉ có 368byte là có thể sử dụng. Bộ nhớ dữ
liệu RAM này được chia thành 4 bank thanh ghi. Mỗi bank thanh ghi có kích thước là
128byte, trong đó các bank thanh ghi chỉ có khoảng trên dưới 80byte được định nghĩa hay
nói cách khác chỉ có khoảng trên dưới 80 thanh ghi cho mỗi bank ngoại trừ bank 0. Dải
địa chỉ tương đối của mỗi bank thanh ghi thuộc đoạn [00h, 7Fh].
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 9
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
Mỗi thanh ghi thuộc bộ nhớ dữ liệu RAM có độ rộng là 8 bit. Để có thể truy cập
một thanh ghi thuộc bất kỳ một bank thanh ghi nào, người lập trình phải thực hiện việc
chọn đúng bank thanh ghi mới có thể làm việc chính xác với thanh ghi đó. Cách biểu
diễn địa chỉ logic và cách tính địa chỉ tuyệt đối giống với bộ nhớ chương trình.
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 10
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
Bộ nhớ dữ liệu RAM (Tệp thanh ghi) được chia làm 2 nhóm: nhóm tệp thanh ghi
chức năng đặc biệt SFR và nhóm tệp thanh ghi mục đích chung GPR. Nhóm SFR có thể
truy cập các thanh ghi bằng cách sử dụng tên riêng hoặc địa chỉ tương đối của thanh ghi
trong bank. Nhóm GPR chỉ có thể truy cập các thanh ghi thông qua địa chỉ tương đối của
thanh ghi trong bank.
1.1.3.2. Thanh ghi STATUS
Thanh ghi STATUS là một thanh ghi 8 bit, có thể tác động đến từng bit. Thanh ghi
này có mặt ở cả 4 bank bộ nhớ với địa chỉ tương đối là 03h. Đặc điểm của vi xử lý
PIC16F877A là phải chọn bank thanh ghi trước khi sử dụng các thanh ghi thuộc một bank
bất kỳ, mà thanh ghi STATUS có 3 bit sử dụng trong việc chọn bank thanh ghi cho cả chế
độ định địa chỉ gián tiếp và trực tiếp, nên thanh ghi này có mặt trong cả 4 bank thanh ghi
tạo sự tiện lợi khi lập trình.
Thanh ghi trạng thái chứa các trạng thái số học của bộ ALU, trạng thái Reset và
các bit chọn Bank của bộ nhớ dữ liệu.
Bit 7 IRP: Bit lựa chọn bank thanh ghi (Sử dụng cho định địa chỉ gián tiếp).
1 = Bank 2, 3 (100h – 1FFh )
0 = Bank 0, 1 (00h – FFh)
Bit 6 – 5: RP1 – RP0: Bit lựa chọn bank thanh ghi (Dùng trong định điạ chỉ trực
tiếp).
11 = Bank 3 ( 180h – 1FFh)
10 = Bank 2 (100h – 17Fh)
01 = Bank 1 (80h – FFh)
00 = Bank 0 (00h – 7Fh)
Each bank is 128 bytes
Bit 4 TO: Bit báo hiệu hoạt động của WDT.
1: Lệnh xóa WDT hoặc Sleep xảy ra.
0: WDT hoạt động.
Bit 3 PD: Bit báo công suất thấp ( Power down bit).
1: Sau khi nguồn tăng hoặc có lệnh xóa WDT.
0: Thực thi lệnh Sleep.
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 11
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
Bit 2 Z: bit Zero
1: Khi kết quả của một phép toán bằng 0.
0: Khi kết quả của một phép toán khác 0.
Bit 1 DC: Digit Carry
1: Có một số nhớ sinh ra bởi phép cộng hoặc phép trừ 4 bit thấp.
0: Không có số nhớ sinh ra.
Bit 0 C: cờ nhớ (Carry Flag)/ borrow
1: Có một số nhớ sinh ra bởi phép cộng hoặc phép trừ 4 bit cao.
0: Không có số nhớ sinh ra.
1.1.3.3. Các thanh ghi FSR và INDF
Thanh ghi FSR và thanh ghi INDF là cặp thanh ghi luôn được sử dụng cùng nhau
trong chế độ định địa chỉ gián tiếp. Tuy nhiên, để có thể chọn được bank thanh ghi có
chứa thanh ghi cần truy cập, cần kết hợp giữa thanh ghi FSR và thanh ghi STATUS (như
hình dưới).
Thanh ghi FSR chứa dữ liệu là địa chỉ của thanh ghi cần truy cập hay nói cách
khác thanh ghi FSR “trỏ” đến thanh ghi cần cần truy cập. Thanh ghi INDF chứa nội dung
của thanh ghi có địa chỉ nằm trong thanh ghi FSR.
Ví dụ: Thanh ghi 55h có giá trị là 255. Nếu FSR = 55h thì INDF =255.
Tóm lại, thanh ghi INDF không phải là một thanh ghi vật lí. Nó chứa giá trị của
thanh ghi có địa chỉ được lưu trữ ở thanh ghi FSR.
1.1.3.4. Các thanh ghi TRISA, TRISB, TRISC, TRISD, TRISE
Để có thể thực hiện được các bài thí nghiệm, cần phải nắm chức năng và cách sử
dụng của các thanh ghi TRIS (với = A,B,C,D,E).
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 12
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
Nhóm các thanh ghi TRIS được sử dụng để cấu hình cho các cổng xuất/nhập
(I/O) của vi xử lý PIC16F877A sẽ trở thành ngõ vào hay ngõ ra. Các chân của các cổng
I/O sẽ tương ứng với các bit của các thanh ghi TRIS về mặt tên gọi. Ví dụ: với cổng A
(PORT A), các chân của cổng này là RA0/RA1/RA2/RA3/RA4/RA5 sẽ tương ứng với các
bit của thanh ghi TRISA là TRISA<0>/ TRISA<1>/ TRISA<2>/ TRISA<3>/ TRISA<4>/
TRISA<5>.
Để các chân của PORT I/O trở thành ngõ vào thì các giá trị của các bit tương ứng
trong thanh ghi TRIS tương ứng phải nhận giá trị là “1”, và ngược lại là “0” để trở
thành ngõ ra. Ví dụ, để chân RA1 của PORT A trở thành ngõ vào thì bit TRISA<0> = 1,
để chân RA5 của PORTA trở thành ngõ ra thì TRISA<5> = 0.
1.1.3.5. Các thanh ghi PORTA, PORTB, PORTC, PORTD, PORTE
Để có thể thực hiện được các bài thí nghiệm, cần phải nắm chức năng và cách sử
dụng của các thanh ghi PORT (với = A,B,C,D,E).
Các thanh ghi PORT là thanh ghi lưu trữ dữ liệu hoặc nhận được từ ngoại vi
thông qua các chân thuộc PORT I/O tương ứng hoặc sẽ xuất ra trên các chân thuộc PORT
I/O tương ứng. Vì vậy, việc nhận dữ liệu hay xuất dữ liệu của các thanh ghi PORT sẽ
phụ thuộc vào việc các thanh ghi TRIS tương ứng được cấu hình là ngõ vào hay ngõ
ra.
Ví dụ, PORT A có chân RA0 được cấu hình là ngõ vào khi TRISA<0> = 1, nên khi
có tín hiệu hoặc 0 hoặc 1 gửi đến chân RA0 thì bit PORTA<0> tương ứng cũng sẽ nhận
hoặc 0 hoặc 1.
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 13
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
1.1.4. Cổng xuất/nhập song song.
Vi xử lý PIC16F877A sử dụng 5 PORT I/O để làm nhiệm vụ truy xuất dữ liệu. Các
cổng đó là A, B, C, D, E, F. Để làm việc với các cổng này, việc đầu tiên cần làm là cấu
hình hoặc cả PORT I/O hoặc cho từng chân cần dùng của PORT bất kỳ sẽ là ngõ vào hoặc
là ngõ ra. Như vậy, 2 thanh ghi TRIS và PORT sẽ là 2 thanh ghi phục vụ cho chức
năng xuất/nhập song song của vi xử lý PIC16F877A.
PORT A chỉ có 6 chân từ RA0 đến RA5 nên thanh ghi TRISA và PORTA cũng chỉ
có 6 bit được định nghĩa để sử dụng, 2 thanh ghi này có thể tác động từng bit.
PORT B có đủ 8 chân từ RB0 đến RB7 nên thanh ghi TRISB và PORTB tương
ứng cũng có đủ 8 bit để sử dụng, 2 thanh ghi này có thể tác động từng bit.
PORT C có đủ 8 chân từ RC0 đến RC7 nên thanh ghi TRISC và PORTC tương
ứng cũng có đủ 8 bit để sử dụng, 2 thanh ghi này có thể tác động từng bit.
PORT D có đủ 8 chân từ RD0 đến RD7 nên thanh ghi TRISD và PORTD tương
ứng cũng có đủ 8 bit để sử dụng, 2 thanh ghi này có thể tác động từng bit.
PORT E chỉ có 3 chân từ RE0 đến RE2 nên thanh ghi TRISE và PORTE cũng chỉ
có 3 bit được định nghĩa để sử dụng đúng với chức năng là PORT I/O , ngoài ra thanh ghi
TRISE còn có 4 bit khác cũng được định nghĩa cho một vài chức năng khác, 2 thanh ghi
này có thể tác động từng bit.
1.1.5. Tập lệnh vi xử lý PIC16F877A
1.1.5.1. Nhóm lệnh dịch chuyển
a. Lệnh MOVLW
Cú pháp: MOVLW k (0≤ k ≤255)
Tác dụng: Nạp giá trị k vào thanh ghi W
Ví dụ: Để gán cho thanh ghi W một giá trị cụ thể là 20h ta làm như sau:
MOVLW 20h
MOVLW 0010 0000b
MOVLW 32
b. Lệnh MOVWF
Cú pháp: MOVWF f (0≤ f ≤255)
Tác dụng: dịch chuyển dữ liệu của thanh ghi W vào thanh ghi f
Để nạp cho thanh ghi một giá trị cụ thể, đầu tiên lưu trữ giá trị cần nạp cho thanh
ghi W, sau đó ta thực hiên lệnh MOVWF để dịch chuyển giá trị trong thanh ghi W sang
thanh ghi cần gán.
Ví dụ:
MOVLW 15; W=15
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 14
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
MOVWF PORTB; PORTB =15
Tuy nhiên, còn có cách khác thông qua thanh ghi “con trỏ” FSR, khi thanh ghi
“con trỏ” FSR trỏ đến byte có địa chỉ nào thì nội dung của thanh ghi đó được dịch chuyển
vào thanh ghi INDF.
Để hiểu một cách đơn giản ta hiểu thanh ghi FSR chứa địa chỉ còn thanh ghi INDF
chứa nội dung.
Ví dụ:
MOVLW 30h
MOVWF FSR
MOVLW 20
MOVWF INDF
Ở lệnh đầu tiên W=30h, sau đó gán giá trị 30h vào thanh ghi FSR tức là “con trỏ”
chỉ đến byte có địa chỉ 30h. Khi đó giá trị của thanh ghi có địa chỉ 30h được chứa trong
thanh ghi INDF. Như vậy sau khi gián giá trị 20 vào thanh ghi INDF tức là dán giá trị đó
vào thanh ghi có địa chỉ 30h.
Vậy sau khi thực hiên đoạn chương trình trên (30h) = 20, tức là byte có địa chỉ 30h
có giá trị là 20.
Để cụ thể hơn chúng ta xét ví dụ sau:
MOVLW 5
MOVWF PORTB
Thông qua 2 lệnh trên PORTB = 5, nhưng ta có thể viết lại:
MOVLW 06h
MOVWF FSR
MOVLW 5
MOVWF INDF
Vậy sau khi thực hiện đoạn chương trình trên (06h) = 5, tức là byte có địa chỉ 06h
(PORTB) có giá trị là 5.
c. Lệnh MOVF
Cú pháp: MOVF f,W f (0≤ f ≤255)
Tác dụng: Dịch chuyển dữ liệu của thanh ghi f vào thanh ghi W
Để dịch chuyển giá trị ở thanh ghi COUNT1 sang thanh ghi COUNT2 bắt buộc
phải qua thanh ghi “trung gian” W thông qua lệnh MOVF.
Vidụ:
MOVF COUNT1,W
MOVWF COUNT2
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 15
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
Đầu tiên dịch chuyển giá trị có được ở thanh ghi COUNT1 vào W, sau đó thông
qua lệnh MOVWF dịch chuyển giá trị có được ở thanh ghi W vào COUNT2.
d. Lệnh CLRW
Cú pháp CLRW
Tác dụng: Xóa thanh ghi W và bit Z được set ( = 1).
Bit trạng thái: Z
e. Lệnh CLRF
Cú pháp CLRF
f
Tác dụng: Xóa thanh ghi f và bit Z được set.
Bit trạng thái: Z
1.1.5.2. Nhóm lệnh số học
a. Lệnh ADDLW
Cú pháp: ADDLW
k
Tác dụng: Cộng giá trị k vào thanh ghi W,kết quả được chứa trong thanh ghi W.
Bit trạng thái: C, DC, Z
Ví dụ:
MOVLW D’200’; W=200
ADDLW D’55’
MOVWF PORTB; PORTB = 255
b. Lệnh ADDWF
Cú pháp: ADDWF
f,d
(d ∈[0,1]).
Tác dụng: Cộng dữ liệu được lưu trữ trong hai thanh ghi W và thanh ghi f. Kết quả
được chứa trong thanh ghi W nếu d = 0 hoặc thanh ghi f nếu d =1.
Bit trạng thái: C, DC, Z
c. Lệnh SUBLW
Cú pháp: SUBLW k
Tác dụng: Lấy giá trị k trừ giá trị trong thanh ghi W. Kết quả được lưu trữ trong
thanh ghi W.
Bit trạng thái: C, DC, Z
Ví dụ:
MOVLW 100; W=100
SUBLW 155
MOVWF PORTB; PORTB =55
d. Lệnh SUBWF
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 16
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
Cú pháp: SUBWF f,d
( d ∈ [0,1])
Tác dụng: Lấy giá trị trong thanh ghi f đem trừ cho thanh ghi W. Kết quả được lưu
trong thanh ghi W nếu d=0 hoặc thanh ghi f nếu d=1.
Bit trạng thái: C, DC, Z
e. Lệnh INCF
Cú pháp: INCF
f,d
(d ∈ [0,1])
Tác dụng: Tăng giá trị thanh ghi f lên 1 đơn vị. Kết quả được lưu vào thanh ghi W
nếu d = 0 hoặc thanh ghi f nếu d = 1.
Bit trạng thái: Z
Ví dụ:
MOVLW 10
MOVWF COUNT; COUNT =10
INCF COUNT,1;
COUNT =11
f. Lệnh DECF
Cú pháp: DECF f,d
(d ∈[0,1]).
Tác dụng: Dữ liệu trong thanh ghi f giảm đi 1 đơn vị. Kết quả được lưu vào thanh
ghi W nếu d = 0 hoặc thanh ghi f nếu d = 1.
Bit trạng thái: Z
Ví dụ:
MOVLW 10
MOVWF COUNT; COUNT =10
DECF COUNT,1;
COUNT =9
1.1.5.3. Nhóm lệnh logic
a. Lệnh ANDLW
Cú pháp: ANDLW k
Tác dụng: Thực hiện phép toán AND giữa dữ liệu lưu trữ trong thanh ghi W và giá
trị k, kết quả được lưu trong thanh ghi W.
Bit trạng thái: Z
Chú ý: And các bit tương ứng
Ví dụ:
MOVLW
1111 0000b
ANDLW
0011 1111b; W = 0011 0000b
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 17
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
b. Lệnh ANDWF
Cú pháp: ANDWF f,d
(d ∈[0,1]).
Tác dụng: Thực hiện phép toán AND giữa dữ liệu chứa trong hai thanh ghi W và f.
Kết quả được lưu vào thanh ghi W nếu d=0 hoặc thanh ghi f nếu d = 1.
Bit trạng thái: Z
c. Lệnh IORLW
Cú pháp: IORLW k
Tác dụng: Thực hiện phép toán OR giữa dữ liệu lưu trong thanh ghi W và giá trị k.
Kết quả được lưu trong thanh ghi W.
Bit trạng thái: Z
d. Lệnh IORWF
Cú pháp: IORWF f,d
(d∈[0,1])
Tác dụng: Thực hiện phép toán OR giữa dữ liệu lưu trữ trong hai thanh ghi W và f.
Kết quả được lưu vào thanh ghi W nếu d = 0 hoặc thanh ghi f nếu d=1.
Bit trạng thái: Z
e. Lệnh XORLW
Cú pháp: XORLW k
Tác dụng: Thực hiện phép toán XOR giữa giá trị k và dữ liệu trong thanh ghi W.
Kết quả được lưu trong thanh ghi W.
Bit trạng thái: Z
f. Lệnh XORWF
Cú pháp: XORWF f,d
Tác dụng: Thực hiện phép toán XOR giữa dữ liệu lưu trữ trong thanh ghi W và
thanh ghi f. Kết quả được lưu vào trong thanh ghi W nếu d=0 hoặc thanh ghi f nếu d=1.
Bit trạng thái: Z
g. Lệnh SWAPF
Cú pháp: SWAPF f,d
(d∈[0,1])
Tác dụng: Đảo 4 bit thấp với 4 bit cao trong thanh ghi f. Kết quả được lưu trong
thanh ghi W nếu d = 0 hoặc thanh ghi f nếu d = 1.
Bit trạng thái: không có
h. Lệnh RLF
Cú pháp: RLF
f,d
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 18
TAI LIẸ U THỰC TẠ P CHUYEN ĐE 1 2012
(DUNG CHO SINH VIEN CƯ NHAN VẠ T LY)
(d∈[0,1])
Tác dụng: Dịch trái các bit dữ liệu trong thanh ghi f qua cờ carry. Kết quả được lưu
trong thanh ghi W nếu d=0 hoặc thanh ghi f nếu d=1.
Bit trạng thái: C
i. Lệnh RRF
Cú pháp: RRF f,d
(d∈[0,1])
Tác dụng: Dịch phải các bit dữ liệu trong thanh ghi f qua cờ carry. Kết quả được
lưu trong thanh ghi W nếu d = 0 hoặc thanh ghi f nếu d = 1.
Bit trạng thái: C
j. Lệnh COMF
Cú pháp: COMF f,d
(d∈[0,1]).
Tác dụng: Đảo các bit dữ liệu trong thanh ghi f. Kết quả được lưu vào thanh ghi W
nếu d =0 hoặc thanh ghi f nếu d=1.
Bit trạng thái: Z
1.1.5.4. Nhóm lệnh rẽ nhánh
a. Lệnh BTFSS
Cú pháp: BTFSS f,b
(0≤b≤7)
Tác dụng: Kiểm tra bit b trong thanh ghi f. Nếu bit b bằng 0, lệnh tiếp theo được
thực thi. Nếu bit b bằng 1, lệnh tiếp theo được bỏ qua và thay vào đó là lệnh NOP.
Bit trạng thái: không có
Ví dụ:
BTFSS PORTB,1
LỆNH 1
LỆNH 2
“1” ở đây là vị trí bit được kiểm tra của portB. Nếu bít này ở mức cao thì sẽ bỏ qua
lệnh 1 để thực thi lệnh 2. Ngược lại, mức thấp sẽ thực thi lệnh 1.
b. Lệnh BTFSC
Cú pháp: BTFSC f,b
(0≤b≤7)
Tác dụng: kiểm tra bit b trong thanh ghi f. Nếu bit b bằng 1, lệnh tiếp theo được
thực thi. Nếu bit b bằng 0, lệnh tiếp theo được bỏ qua và thay vào đó là lệnh NOP.
Bit trạng thái: không có
Biê n soạ n: Phạ m Xuâ n Trung, Trường Đạ i họ c Bá ch khoa Đà Nang
Page 19
- Xem thêm -