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

Giáo trình Vi điều khiển, vi xử lý - GV. Trần Thái Anh Âu

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.6 MB, 131 trang )

GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

CHƯƠNG 1: GIỚI THIỆU VI ĐIỀU KHIỂN- VI XỬ LÝ
1. Giới thiệu về vi điều khiển PIC
1.1 Giới thiệu về vi điều khiển
Bộ vi điều khiển viết tắt là Micro-controller là mạch tích hợp trên một chip có thể
lập trình được, dùng để điều khiển hoạt động của hệ thống .Theo các tập lệnh của người
lập trình, bộ vi điêu khiển tiến hành đọc, lưu trữ thông tin, xử lý thông tin, đo thời gian và
tiến hành đóng mở một cơ cấu nào đó .
Trong các thiết bị điện và điện tử, các bộ vi điều khiển điều khiển hoạt động của ti
vi, máy giặt, đầu đọc lase, lò vi ba, điện thoại …Trong hệ thống sản xuất tự động, bộ vi
điều khiển sử dụng trong robot, các hệ thống đo lường giám sát .Các hệ thống càng thông
minh thì vai trò của vi điều khiển ngày càng quan trọng. Hiện nay trên thị trường có rất
nhiều họ vi điều khiển như: 6811 của Motorola, 8051 của Intel, Z8 của Zilog, PIC của
Microchip Technology .
1.2 Giới thiệu về vi điều khiển PIC
PIC bắt nguồn từ chữ viết tắt của “Programmable Intelligent Computer” ( Máy
tính khả trình thông minh) là sản phẩm của hãng General Instrument đặt cho dòng sản
phẩm đầu tiên của họ là PIC 1650. Lúc này Pic dùng để giao tiếp với các thiết bị ngoại vi
cho máy chủ 16 bit CP1600, vì vậy người ta gọi PIC với tên là “ Peripheral Interface
Controller” ( bộ điều khiển giao tiếp ngoại vi) .
Năm 1985 General Instrument bán bộ phận vi điện tử của họ, và chủ sở hữu mới
(Microchip Technology) huỷ bỏ hầu hết các dự án – lúc đó đã quá lỗi thời. Tuy nhiên PIC
được bổ sung EEPROM để tạo thành một bộ điều khiển vào ra khả trình. Ngày nay có rất
nhiều dòng PIC được sản xuất với hàng loạt các modul ngoại vi được tích hợp sẵn ( như
:USART, PWM, ADC…) với bộ nhớ chương trình từ 512 word đến 32k word.
PIC sử dụng tập lệnh RISC, với dòng PIC low-end (độ dài mã lệnh 12 Bit ví dụ
PIC12Cxxx) và mid-range (độ dài mã lệnh 14 bit , ví dụ PIC16Fxxx), tập lệnh bao gồm
khoảng 35 lệnh, và 70 lệnh đối với dòng PIC high-end( có độ dài mã lệnh 16bit



NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

PIC18Fxxxx). Tập lệnh bao gồm các lệnh tính toán trên các thanh ghi, và các hằng số,
hoặc các vị trí ô nhớ, cũng như có các lệnh điều kiện, nhảy/ gọi hàm, và các lệnh quay trở
về, nó cũng có các chức năng phần cứng khác như ngắt hoặc sleep( chế độ hoạt động tiết
kiệm điện ). Microchip cung cấp môi trường lập trình MPLAB0, nó bao gồm phần mềm
mô phỏng và trình dịch ASM
Hiện nay có khá nhiều dòng PIC và có rất nhiều khác biệt về phần cứng, nhưng
chúng ta có thể điểm qua một vài nét như sau :


8/16/24/32 bit CPU, xây dựng theo kiến trúc Harvard



Flash và Rom có thể tuỳ chọn 256 byte đến 256 kbybe



Bộ nhớ nội EEPROM - có thể ghi/ xoá lên tới hàng triệu lần



Các cổng xuất/nhập (mức lôgic thường từ 0v đến 5v, ứng với mức logic 0 và 1,

dòng khoảng vài chục mA)



8/16 bit timer



Modun giao tiếp ngoại vi nối tiếp không đồng bộ: USART



Modun giao tiếp ngoại vi song song (kiểu máy in)



Bộ chuyển đổi ADC 10 bit nội gồm 8 kênh đầu vào



Module ngoại vi MSSP dùng cho các giao tiếp I2C, SPI



Modul CCP có chức năng
o Comparator (so sánh)
o Capture
o PWM: dùng trong điều khiển động cơ

Một số dòng vi điều khiển PIC hỗ trợ thêm:



Hỗ trợ điều khiển động cơ 3 pha, 1 pha



Hỗ trợ giao tiếp USB



Hỗ trợ điều khiển Ethernet



Hỗ trợ giao tiếp CAN



Hỗ trợ giao tiếp LIN



Hỗ trợ giao tiếp IRDA



DSP những tính năng xử lý tín hiệu số

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA



GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

1.3 Các thành phần cơ bản của một mạch ứng dụng vi điều khiển PIC:
1.4 Các khái niệm cơ bản:
Cổng xuất nhập I/O:
Trong vi điều khiển PIC16F877A có 5 cổng:


Cổng A gồm 6 chân: RA0, RA1.. RA5



Cổng B gồm 8 chân: RB0, RB1,..RB7



Cổng C gồm 8 chân: RC0, RC1, ..RC7



Cổng D gồm 8 chân: RD0, RD1,..RD7



Cổng E gồm 3 chân: RE0, RE1, RE2

Mỗi cổng thực chất được quản lý bởi các thanh ghi PORTA, PORTB, PORTC, PORTD,

PORTE nằm trong bộ nhớ RAM của vi điều khiển. Xem hình sau:

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

Bộ nhớ RAM của vi điều khiển PIC 16F877A gồm 4 bank nhớ. Nhìn vào các bank nhớ
ta có thể thấy các thanh ghi được đặt tên và các thanh ghi đa mục đích (General Purpose
Register).


Các thanh ghi được đặt tên là các thanh ghi đặc biệt dùng để điều khiển, quản lý
hoặc thể hiện trạng thái của các khối chức năng trong vi điều khiển ví dụ PORTA

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

là đại diện cho các chân cổng A, PORTB là đại diện cho các chân cổng B v.v. Các
thanh ghi này có địa chỉ xác định và không được dùng cho các mục đích khác


Các thanh ghi đa mục đích được dùng để đặt biến trong một chương trình ứng
dụng của vi điều khiển. Nhìn vào bản đồ bộ nhớ RAM, ta thấy biến có thể đặt từ

địa chỉ 20F đến 7Fh trong bank nhớ 0, A0h-EFh, 120h-16Fh, 1A0h-1EFh.

Trở lại vấn đề về các cổng, tới đây ta có thể đưa ra nhận xét:
Thanh ghi PORTA phản ánh trạng thái của các chân cổng A, nghĩa là muốn tín hiệu đầu
ra của các chân cổng A như thế nào ta chỉ việc đưa giá trị vào các bit tương ứng trên
thanh ghi PORTA. Cũng như khi đọc giá trị của thanh ghi PORTA ta sẽ biết được trạng
thái của các chân cổng A.
Ví dụ:
Muốn RA0 ở mức logic 1 (mức 5V), RA1 ở mức logic 0 (mức 0V), RA2 ở mức logic 1,
RA3 ở mức logic 0, RA4 ở mức logic 1, RA5 ở mức logic 1, ta chỉ việc gán giá trị
000110101 cho thanh ghi PORTA.
X

X

1

1
RA5

0
RA4

1
RA3

0
RA2

1

RA1

RA0
X: không quan tâm.
Tương tự như vậy với PORTB,PORT C,PORTD,PORTE.
Tính đa chức năng của một chân trên vi điều khiển:
Nhìn vào sơ đồ chân của vi điều khiển, ta có thể thấy một số chân của vi điều khiển có
tên gồm nhiều phần với dấu gạch chéo. Ví dụ: RA0/AN0, RC7/RX/DT, RC6/TX/CK
Đây chính là tính đa chức năng của một chân trên vi điều khiển hay còn gọi là sự dồn
kênh.
Ý nghĩa của nó là:
Bình thường nếu không được cài đặt thì tấc cả các chân trên 5 cổng A, B, C, D, E là các
chân vào ra số I/O.
Nếu trong chương trình ta có cài đặt một chức năng nào đó như RS232, ADC hoặc PWM
v.v thì các chân tương ứng với chức năng đó sẽ hoạt động theo chức năng đó. Khi đó
chân này sẽ không được dùng làm chân vào ra số như bình thường nữa.

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

Ví dụ: bình thường chân RA0/ANO là chân vào ra số RA0, nếu chức năng ADC với kênh
vào tín hiệu analog là kênh 0 được cài đặt khi đó chân RA0 /AN0 sẽ là chân vào của bộ
ADC, tức là hoạt động theo chức năng AN0.
Tương tự như vậy, khi cài đặt giao tiếp với thiết bị ngoại vi theo chuẩn RS232, chân vào
ra số RC7/RX/DT sẽ hoạt động như đầu vào dữ liệu RS232 tức là chức năng RX của
chân này.


Cài đặt vào/ra cho các chân vào ra số trên các cổng:
Các chân vào/ra số trên vi điều khiển PIC phải được cài đặt là chân vào hoặc chân ra thì
mới hoạt động đúng chức năng. Việc một chân trên cổng X (X=A,B,..E) được qui định là
đầu ra hay đầu vào phụ thuộc vào bit tương ứng trên thanh ghi TRISX (X=A,B,..E) là 0
hay 1.
Ví dụ: Muốn 4 chân thấp (bit thấp) trên cổng B (RB0-RB3) là chân vào, 4 chân cao (bit
cao) trên cổng B (RB4-RB7) là chân ra thì giá trị các bit trên thanh ghi TRISB sẽ là:
0

0

0

0

1

1

Gợi ý dễ nhớ là:
Để chân RB.m (m=0-7) là đầu ra, tức Output thì giá trị TRISB.m là 0
Là đầu vào, tức Input thì giá trị TRISB.m là 1
Tương tự như vậy đối với các chân trên các cổng còn lại

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA

1

1



GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

CHƯƠNG 2: CẤU TRÚC VI ĐIỀU KHIỂN PIC 16F
2.1 Cấu trúc chung:

Hình 1: Cấu trúc chung của vi điều khiển
Cấu tạo của vi điều khiển có thể chia làm 2 phần cơ bản như sau:
-

Phần lõi: gồm bộ điều khiển trung tâm có chức năng chạy chương trình (gồm các
câu lệnh) đã được nạp vào trong bộ nhớ chương trình (program memory) trước
đó.

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

-

GV: TRẦN THÁI ANH ÂU

Phần ngoại vi: gồm có các timer, bộ biến đổi tương tự số ADC và các modun
khác

Phần lõi của vi điều khiển chịu trách nhiệm chạy chương trình trong vi điều khiển và

quản lý toàn bộ các hoạt động khác bao gồm hoạt động của ngoại vi.
Vi điều khiển chạy chương trình gồm các lệnh trong bộ nhớ chương trình, địa chỉ của
lệnh nằm trong thanh ghi bộ đếm chương trình PC, lúc khởi động PC=0, sau khi thực
hiện một lệnh PC=PC+1 do đó vi điều khiển chạy lệnh kế tiếp trong chương trình. Lệnh
vi điều khiển trong bộ nhớ thực ra đã được mã hóa mỗi lệnh thành 14 bit. Quá trình thực
hiện một lệnh gồm các bước:
- Lệnh trong bộ nhớ chương trình được đưa vào thanh ghi lệnh (địa chỉ của lệnh nằm
trong thanh ghi PC). Sau đó lệnh đưa vào bộ giải mã và điều khiển để giải mã lệnh. Trên
cơ sở đó, vi điều khiển biết lệnh đó là lệnh gì, thao tác với dữ liệu nào, phép thao tác
v.v.v Trên cơ sở đó, nếu lệnh thao tác với dữ liệu chứa trong các thanh ghi trong RAM,
bộ điều khiển điều khiển đọc dữ liệu trong RAM đưa vào bộ xử lý số học và logic ALU,
các phép toán sẽ được thực hiện qua trung gian là thanh ghi làm việc W, quá trình sẽ kết
thúc khi kết quả trả dữ liệu về cho chương trình, tiếp theo PC tăng lên 1 đơn vị, vi điều
khiển nhảy đến lệnh kế tiếp, tiếp tục 1 chu kì thực hiện lệnh

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

2.2 Bộ nhớ vi điều khiển pic 16f877A
Bộ nhớ vi điều khiển PIC chia làm 3 phần:
-

Bộ nhớ chương trình-FLASH: chứa nội dung của chương trình chạy trong vi điều
khiển. Bộ đếm chương trình PC (Program counter) sẽ thực hiện các lệnh chứa
trong bộ nhớ chương trình này theo thứ tự từ trên xuống.


-

Bộ nhớ dữ liệu tạm thời- RAM : Gồm 2 phần: các thanh ghi đặc biệt-SFR
(Special Function Register) - đây là các thanh ghi chức năng thể hiện hoặc trạng
thái, điều khiển của các khối bên trong vi điều khiển PIC (các thanh ghi trạng thái
các chân vi điều khiển như PORTA v.v, Các thanh ghi Status v.vv, TMR0 cho
timer v.v ). Các thanh ghi mục đích chung GPR (general purpose register) là nơi
lưu các giá trị tạm thời, nơi mà các biến chương trình nằm đây

-

Bộ nhớ dữ liệu không mất nội dung- EEPROM cho phép chứa các dữ liệu và dữ
liệu này không mất nội dung khi mất điện (phần này xem như thiết bị ngoại vi)

2.2.1 Bộ nhớ chương trình:
Bộ nhớ chương trình là nơi chứa các lệnh đã được mã hóa. Quá trình mã hóa đã được
thực hiện trong khâu dịch chương trình trên máy tính ra file hex và nạp chương trình vào
bộ nhớ chương trình.
Mỗi một lệnh đã được mã hóa được chứa trong 1 thanh ghi 14 bit trong bộ nhớ chương
trình. Như vậy khi hình dung về bộ nhớ chương trình ta có hình ảnh sau:

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

Chương trình của vi điều khiển chạy theo thứ tự từ địa chỉ thấp đến địa chỉ cao, địa chỉ
lệnh là nội dung của thanh ghi bộ đếm chương trình PC (Program Counter). Đối với

pic16f877a, thanh ghi PC có độ dài 13 bit.
Nếu dùng 2 bit địa chỉ ta phân biệt được 4 địa chỉ: 00,01,10,11
Nếu dùng 3 bit địa chỉ ta phân biệt được 8 địa chỉ: 000,001,010,011,100,101,110,111
Suy ra, PC dùng 13 bit địa chỉ ta phân biệt được 2^13= 2^3 x 2^10=8K địa chỉ
Khi bật nguồn cho vi điều khiển (hay ấn nút reset chương trình), PC được xóa về 0
Sau khi thực hiện xong 1 lệnh nội dung của PC tăng lên 1 đơn vị: PC=PC+1 (trừ 1 số
lệnh đặc biệt như gọi chương trình con, goto v.v.v)
Do vi điều khiển sẽ thực hiện lệnh tại địa chỉ chứa trong thanh ghi PC nên theo phân tích
trên có thể nói, vi điều khiển thực hiện lệnh tuần tự từ địa chỉ thấp đến địa chỉ cao
2.2.2 Mã hóa và giải mã lệnh:

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

Như đã nói ở trên, khi chương trình đã nằm trong bộ nhớ (tức là đã được nạp vào), các
lệnh đã được mã hóa thành số nhị phân 14 bit chứa trong các thanh ghi của bộ nhớ
chương trình.
Việc mã hóa này phải tuân theo qui luật của từng loại vi điều khiển mà cụ thể đối với
PIC16F877a thì việc mã hóa phải tuân theo qui luật của nhà sản xuất microchip qui định
để trong quá trình thực hiện 1 lệnh, bộ điều khiển bên trong của vi điều khiển PIC có thể
giải mã (để hiểu) và thực thi lệnh đó được.
Để tiện cho việc theo dõi, ta đưa ra bảng tổng hợp các lệnh vi điều khiển 16f877a như
sau:

Bảng 1: Tập hợp tấc cả các lệnh


NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

Toàn bộ tập lệnh chia làm 3 dạng:
-

Lệnh thao tác theo từng byte (Byte-Oriented)

-

Lệnh thao tác theo từng bit (Bit-Oriented)

-

Lệnh thao tác với hằng số

Trong vi điều khiển pic16f877a không có lệnh thực hiện tương tác giữa 2 thanh ghi,
hay giữa thanh ghi và một số (chú ý ở đây, thanh ghi là thanh ghi nằm trong bộ nhớ
RAM, ví dụ như PORTA hoặc thanh ghi có địa chỉ 0x21 )
Để giải quyết vấn đề trên, trong vi điều khiển pic 16f877a có thanh ghi đặc biệt làm
chức năng trung gian cho các thao tác trên gọi là thanh ghi làm việc W (work
register)
Để dễ hiểu:
Giả sử ta có 2 biến a,b (tất nhiên là được khai báo và cấp phát trong bộ nhớ RAM)
Ta muốn thực hiện phép toán:
a=a+b

Trong PIC không có lệnh thực hiện giữa 2 thanh ghi a và b. Để thực hiện lệnh này ta
phải qua các bước:
W=0
W= w+b

(sau lệnh này w=b)

a=w+a (sau lện này a=w+a=b+a)
Các lệnh thực hiện chuỗi phép toán trên như sau:
CLRW
ADDWF b,0
ADDWF a,1
Phần cụ thể về lệnh sẽ được giới thiệu sau, ta trở lại vấn đề mã hóa lệnh
NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

Cấu trúc một lệnh:
Cấu trúc một lệnh phụ thuộc vào 3 dạng thao tác theo byte, theo bit , thao tác với
hằng số
-

Các lệnh thao tác theo byte
Cấu trúc lệnh:
o Mã lệnh

thanhghi,d


Đây là các tác động giữa thanh ghi trong RAM và thanh ghi làm việc W, d chỉ
hướng kết quả được lưu trữ. d=0 kết quả chứa trong w, d=1 kết quả chứa trong thanh ghi
Ví dụ: cộng thanh ghi a với w, kết quả chứa trong a
ADDWF a,1
cộng thanh ghi a với w, kết quả chứa trong w
ADDWF a,0
Câu hỏi đặt ra là khi vi điều khiển đọc mã lệnh trong bộ nhớ gồm các con số nhị phân
làm sao nó xác định được đâu là lệnh cộng (ADDWF) đâu là lệnh AND (ANDWF) ?
Câu trả lời là trong lúc mã hóa lệnh một số bit đầu tiên của chuỗi 14 bit lệnh dành để
phân biệt các lệnh với nhau hay còn gọi là mã toán tử hay theo tiếng anh là opcode
Đối với lệnh theo tác theo byte, vi điều khiển dùng 6 bit để mã hóa opcode
Để phân biệt khi nào kết quả chứa trong thanh ghi, khi nào thì chứa trong w, vi điều
khiển dành 1 bít hướng d: d=0 kết quả chứa trong thanh ghi w, d=1 kết quả chứa
trong thanh ghi.
7 bit còn lại trong để phân biệt lệnh tác động với thanh ghi nào trong bộ nhớ RAM
13

8
OPCODE

(toán

7

6
d(hướng)

tử)


NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA

0
FILE (địa chỉ thanh ghi)


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

Ví dụ:

GV: TRẦN THÁI ANH ÂU

ADDWF

a, 0

Giải sử a địa chỉ là 0x30= 0b00110000
Mã lệnh sẽ là:
FILE (địa chỉ thanh ghi)

d(hướng)

OPCODE (toán
tử)
00 0111

-

0


0110000

Các lệnh thao tác theo bit
Cấu trúc lệnh gồm 3 phần:
o Mã lệnh

thanh ghi, bit

Các lệnh bao gồm lệnh set 1 bit nào đó của một thanh ghi nào đó lên mức 1 hoặc xóa bít
đó về 0, hoặc kiểm tra 1 bit nào đó của một thanh ghi nào đó bằng 0 hoặc bằng 1 v.v
Từ đây, ta có thể thấy, cần một số bit trong 14 bit của 1 lệnh dành để phân biệt các lệnh
với nhau, cụ thể ở đây là 4 bit, cần 3 bít để xác định vị trí bít nào trong thanh ghi bị tác
động (vì vị trí bít là 0-7), còn lại 7 bít để xác định thanh ghi nào trong các thanh ghi bộ
nhớ RAM bị tác động
13

10 9
OPCODE

(toán

7

6

Vị trí bít

0
FILE (địa chỉ thanh ghi)


tử)

Ví dụ:

BCF

a,3

Xóa bít 3=011 của thanh ghi a (giả sử a được khai báo trước và có địa chỉ
0x24=0b0010 0100 trong bộ nhớ RAM)

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

13

GV: TRẦN THÁI ANH ÂU

10 9
OPCODE

7

6

Vị trí bít

(toán


0
FILE (địa chỉ thanh ghi)

tử)
01 00

-

011

010 0100

Các lệnh thao tác với hằng số và điều khiển rẽ nhánh chương trình:
Cấu trúc lệnh:
o Mã lệnh

hằng số k

Các lệnh thông thường:
13

8 7
OPCODE

0
Hằng số k

(toán


tử)

Trừ 2 lệnh Call k và goto k
13

11 10
OPCODE

0
Hằng số k

(toán

tử)

Ví dụ:

ADDLW

Miêu tả:

cộng 233 vào thanh ghi w

13

233

8 7
OPCODE


(toán

0
Hằng số k

tử)

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

11 111

GV: TRẦN THÁI ANH ÂU

1110 1001

Sau khi phân tích như trên, nhìn lại bảng 1: tập hợp tất cả các lệnh của vi điều khiển
pic16f877a ta đưa ra nhận xét sau:
-

2 bit đầu của 14 bit mã hóa lệnh xác định 3 dạng lệnh: thao tác theo byte (00),
thao tác theo bit (01), thao tác với hằng số (11 hoặc 10 hoặc 00)

-

Có tấc cả 18 lệnh thao tác byte, như đã nêu ở trên, để mã hóa mã lệnh (opcodetoán tử) dùng hết 6 bít: 2 bít phân biệt dạng thao tác theo byte (00) vậy còn 4 bit
để phân biệt 18 lệnh thao tác byte. Như ta biết với 4 bit chỉ phân biệt được 2^4
=16 lệnh, làm sao phân biệt được 18 lệnh.

Thực ra vi điều khiển dùng 14 mã lệnh cho 14 lệnh, 2 mã lệnh còn lại, cụ thể là 00
0001 cùng cho 2 lệnh CLRF (xóa nội dung thanh ghi) CLRW (xóa nội dung thanh
ghi W) và mã 00 0000 cùng cho 2 lệnh MOVWF (chuyển nội dung của thanh ghi
w sang thanh ghi F (có địa chỉ cụ thể trong ram) ) và lệnh NOP (lệnh không thực
hiện nhiệm vụ gì). Thế làm sao phân biệt được CLRF và CLRW? Đơn giản là khi
gặp mã lệnh 00 0001 vi điều khiển kiểm tra tiếp bit hướng d: rõ ràng nếu d=0 (kết
quả chứa trong w) thì đây là lệnh CLRW, nếu d=1 (kết quả chứa trong thanh ghi
f) thì đây là lệnh CLRF
Khi gặp mã 00 0000, vi điều khiển kiểm tra tiếp bit hướng d, d =1 thì đây là lệnh
MOVWF, d=0 là lệnh NOP

-

Có 4 lệnh thao tác theo bit. 2 bit mã thao tác theo bit là 01, 2 bit còn lại trong
OPCODE (xem bên trên) để mã hóa 4 lệnh

-

Có 13 lệnh thao tác với hằng số và điều khiển: một số lệnh có 2 bit mã thao tác là
11 hoặc 10 hoặc 00. Kiểm tra các bit còn lại ta thấy đều có cách để vi điều khiển
thực hiện phân biệt được các lệnh với nhau

2.2.3 Cấu trúc bộ nhớ và stack:

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU


2.2.3.1 Thanh ghi bộ đếm chương trình:
Tại mỗi thời điểm, vi điều khiển thực hiện 1 lệnh trong bộ nhớ chương trình có địa chỉ
cho bởi thanh ghi bộ đếm chương trình PC (Program Counter) gồm 13 bit. Nhắc lại là với
độ dài 13 bit, thanh ghi PC có thể phân biệt được tối đa 2^13=8K địa chỉ.
Cấu trúc thanh ghi PC gồm 2 phần: phần thấp PCL (Program Counter Low) 8 bit 0-7,
phần cao PCH (Program Counter High) 5 bit 8-12

PCH

PCL

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

Trong đó các bit trong PCL là các bit có thể đọc ghi được
Các bit trong PCH<12-8> không thể đọc ghi và được cập nhật thông qua thanh ghi
PCLATCH<4-0>. Nghĩa là mỗi một lần tác động thay đổi 4 bit PCLATCH sẽ dẫn đến
thay đổi nội dung PCH.
Nhìn vào tổ chức bộ nhớ chương trình của vi điều khiển ta thấy rằng bộ nhớ chương trình
gồm 8 K chia thành 4 bank nhớ, mỗi bank có dung lượng 2 K từ nhớ:
-

Bank 0: 0000h-07FFh

-


Bank 1: 0800h-0FFFh

-

Bank 2: 1000h-17FFh

-

Bank 3: 1800h-1FFFh

2 bit cao PCLATCH<4-3> sẽ qui định vi điều khiển đang truy cập bank nhớ nào trong 4
bank nêu trên.
Khi bàn đến các lệnh CALL, GOTO, các lệnh trở về từ chương trình con, chương trình
ngắt ta sẽ quay lại vấn đề này
2.2.3.2 Reset vector:
Mỗi khi chương trình vi điều khiển bị reset lại (tắt nguồn, ấn nút reset), thanh ghi PC bị
xóa về 0, vậy vi điều khiển bắt đầu thực hiện lệnh chứa tại địa chỉ 0000h. Do đó địa chỉ
này gọi là địa chỉ vector reset
2.2.3.3 Stack:
Trong khi thực hiện chương trình, sẽ có những đoạn chương trình được thực hiện nhiều
lần, người lập trình để đơn giản chương trình sẽ đưa đoạn chương trình đó thành chương
trình con, mỗi lần cần thực hiện đoạn chương trình thì đơn giản là gọi chương trình con
đó.
Ví dụ chương trình con hay dùng nhất là chương trình delay ví dụ như các chương trình
con delay 100ms dưới đây

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA



GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

;************* 1msec Timer Subroutine *****************
t1m movlw d'2'
;(1)
Set loop cnt1
movwf cnt1m
;(1)
Save loop cnt1
tm1lp1 movlw d'249'
;(1)*2 Set loop cnt2
movwf cnt500u
;(1)*2 Save loop cnt2
tm1lp2 nop
;(1)*249*2 Time adjust
nop
;(1)*249*2 Time adjust
decfsz cnt500u,f
;(1)*249*2 cnt500u-1=0 ?
goto tm1lp2
;(2)*248*2 No, continue
decfsz cnt1m,f
;(1)*2 cnt1m-1=0 ?
goto tm1lp1
;(2)
No. Continue
return
;(2)

Yes. Cnt end
;Total 2501*0.4usec=1msec
;************* 100msec Timer Subroutine ***************
t100m movlw d'100'
;Set loop counter
movwf cnt100m
;Save loop counter
tm2lp call t1m
;1msec subroutine
decfsz cnt100m,f
;cnt100m - 1 = 0 ?
goto tm2lp
;No. Continue
return
;Yes. Count end

;************* 500msec Timer Subroutine ***************
t500m movlw d'5'
;Set loop counter
movwf cnt500m
;Save loop counter
tm3lp call t100m
;100msec subroutine
decfsz cnt500m,f
;cnt500m - 1 = 0 ?
goto tm3lp
;No. Continue
return
;Yes. Count end


chương trình chính:
--------bcf a,3
call t1m
bsf a,3

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

Như vậy sau khi thực hiện lệnh bcf a,3, gặp lệnh call t1m, thanh ghi PC được load địa chỉ
bắt đầu của chương trình t1m, sau khi gặp lệnh return vi điều khiển trở về chương trình
chính thực hiện lệnh bsf a,3. Câu hỏi đặt ra là làm sao vi điều khiển nhớ được địa chỉ trở
về? thực ra khi gặp lệnh CALL t1m, nội dung thanh ghi PC tăng lên 1 đơn vị và giá trị
này được lưu vào stack, sau đó PC được load địa chỉ của lệnh đầu tiên trong chương trình
con t1m và do đó vi điều khiển sẽ thực hiện lệnh của chương trình con t100m, cho đến
khi gặp lệnh return, PC load được chỉ đã lưu trước đó ở stack ra, và do đó thực hiện tiếp
lệnh bsf a,3
Qua ví dụ nói trên ta đã hình dung được nhiệm vụ của stack là lưu địa chỉ trở về từ
chương trình con, chương trình ngắt (sẽ đề cập sau)
Stack của vi điều khiển pic16f877a có thể quản lý đến 8 mức stack. Nếu sử dụng đến
mức stack thì 9 thì mức stack 9 này sẽ viết đè lên mức 1.

2.2.2.4 Vector ngắt:
Chưa bàn đến ngắt, nhưng chúng ta hình dung như thế này: mặc định vi điều khiển thực
hiện chương trình chính, khi có sự kiện ngắt xảy ra, nếu ngắt đó được cài đặt trước trong
chương trình thì vi điều khiển sẽ dừng thực hiện chạy chương trình chính và nhảy vào địa
chỉ 0004h, tại đó phần xử lý ngắt này do người lập trình viết chương trình thực hiện

Và địa chỉ 0004h trong bộ nhớ chương trình được gọi là vector ngắt.
2.3 Tập lệnh vi điều khiển PIC:
2.3.1 Thời gian thực hiện 1 lệnh:

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

Chu kì thực hiện 1 lệnh gồm 4 bước, kí hiệu là Qi, i=1-4:
-

Q1: thời gian giải mã lệnh

-

Q2: thời gian đọc lệnh

-

Q3: thời gian thực thi dữ liệu

-

Q4: thời gian viết lệnh

Mỗi bước tương ứng với 1 chu kì xung của vi điều khiển.
Nếu dùng bộ dao động xung thạch anh có tần số f=4MHZ

Chu kì xung =1/tần số xung=1/4MHz
Chu kì lệnh = 4 * chu kì xung= 4/4MHZ= 1us (micro giây)
Hầu như tất cả các lệnh trong 35 lệnh của vi điều khiển PIC16F thực hiện trong 1 chu kì
lệnh trừ 1 số lệnh đặc biệt như lệnh CALL, GOTO, RETURN, RETFI,RETLW mất 2 chu
kì lệnh
2.3.2 Tập lệnh:
Xem theo datasheet
2.4 Bộ nhớ dữ liệu tạm thời:
2.4.1 Tổ chức bộ nhớ:

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

Bộ nhớ dữ liệu tạm thời (RAM) của vi điều khiển gồm 2 phần chính, chia thành 4 bank
nhớ:
-

Các thanh ghi chức năng đặc biệt SFR (Special Function Register) điều khiển quá
trình hoạt động của các bộ phận chức năng trong vi điều khiển cũng như các thiết
bị ngoại vi được tích hợp trong vi điều khiển. Nhìn vào hình vẽ tổ chức bộ nhớ
như trên ta thấy, các thanh ghi SFR phân bố từ địa chỉ 00h - 1Fh trong bank 0,
phân bố rải rác từ 80F- 9Fh trong bank 1, từ 100h đến 11Fh trong bank 2, từ
180h-19Fh trong bank 3

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA



GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

-

GV: TRẦN THÁI ANH ÂU

Các thanh ghi mục đích chung GPR (General Purpose Register) dùng để chứa dữ
liệu (dùng để đặt biến) từ 20h-7Fh trong bank 0, từ A0h-EFh trong bank 1, từ
120h-16Fh trong bank 2, từ 1A0h-1F0h trong bank 3

Một số điểm chú ý khác là:
Khi truy cập các địa chỉ từ F0h-FFh trong bank 1, 170h-17Fh trong bank 2 và 1F0h1FFh trong bank 3 tức là truy cập đến 70h-7Fh trong bank 0
Các vị trí màu xám không sử dụng.
Tại mỗi thời điểm, vi điều khiển làm việc trên một bank nhớ , việc lựa chọn làm việc
bank nhớ phụ thuộc 2 bit RP1, RP0 của thanh ghi STATUS<6-5>

Chú ý:
Trong chương trình viết cho vi điều khiển PIC, nếu sau ki thực hiện lệnh đối với 1
thanh ghi (thanh ghi SFR hoặc GPR) ở bank i, muốn thực hiện l lệnh đối với 1 thanh
ghi khác ở bank j (j#i) ta phải chọn lại bank nhớ, tức là phải có lệnh can thiệp đến 2
bit RP1 và RP0, nếu không lệnh sau sẽ không tác dụng:
Ví dụ: ta có chương trình như sau:
BCF TRISA,2
ADDWF PORTA,1
Lệnh thứ 2 sẽ không có tác dụng, vì lệnh đầu tiên thao tác với thanh ghi TRISA nằm
trên bank 1, trong khi lệnh thứ 2 tác động đến PORTA nằm trên bank 0
Chương trình đúng là
BSF STATUS,5 ; ĐƯA GIÁ TRỊ RP0 LÊN MỨC 1 CHỌN BANK 1


NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

BCF TRISA,2
BCF STATUS,5 ; ĐƯA GIÁ TRỊ RP0 XUỐNG MỨC 0 CHỌN BANK 0
ADDWF PORTA,1
Lí do của việc phải chọn bank nhớ giải thích như sau:
Chúng ta xem lại bảng tổng hợp tất cả các lệnh của vi điều khiển PIC và để ý rằng trong
các lệnh thao tác với các thanh ghi (các thanh ghi nằm trong bộ nhớ RAM), mỗi thanh
ghi được mã hóa bằng 7 bit (tức là đánh số từ 00-7Fh)
Ví dụ:
Lệnh ADDWF f,d mã hóa lệnh như sau:
00 111 d fffffff
Như vậy:

ADDWF PORTA,0 có mã lệnh: 00 111 0 000 0100 (do địa chỉ của

PORTA=0x05=000 0100)
ADDWF TRISA, 0 không thể viết bằng được vì địa chỉ TRISA=0x85=1000 0100 gồm 8
bit không thể mã hóa được bằng 7 bit như trong luật mã hóa lệnh
Để giải quyết vấn đề này, để mã hóa lệnh ADDWF TRISA,0 vi điều khiển mã hóa thanh
ghi TRISA bằng 7 bit như PORTA, việc phân biệt PORTA và TRISA phụ thuộc vào các
bit chọn bank nhớ RP1 và RP0.
Giải thích này cũng tương tự cho các lệnh thao tác trên thanh ghi của bank 1, bank 2 và
bank 3.
Do đó, nếu khi thực hiện lệnh tiếp theo có thao tác với thanh ghi thuộc bank nhớ khác với

bank nhớ đang được tác động hiện tại cần phải có lệnh chọn lại bank nhớ
2.4.2 Địa chỉ gián tiếp:
Để hiểu về địa chỉ gián tiếp ta xem địa chỉ trực tiếp như thế nào
Để dễ hiểu ta cho ví dụ:

NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ

GV: TRẦN THÁI ANH ÂU

CLRF 0x30
Câu lệnh này thực hiện việc xóa thanh ghi có địa chỉ 30h trong bộ nhớ Ram. Rõ ràng là
địa chỉ ở đây là lấy trực tiếp trong RAM, địa chỉ được ghi trực tiếp trong lệnh
Trong một số trường hợp ta dùng đến địa chỉ gián tiếp, cụ thể là: thanh ghi FSR (File
Select Register) chứa địa chỉ của thanh ghi trong RAM và thanh ghi INDF sẽ ánh xạ vào
thanh ghi RAM có địa chỉ là nội dung của FSR, mọi thao tác trên INDF xem như là thao
tác trên thanh ghi của RAM nêu trên
Ví dụ:
MOVLW
MOVWF

0x30
FSR ; sau lệnh này FSR chứa 0x30 tức là chỉ đến thanh ghi có địa
chỉ 0x30 trong RAM

CLRF

INDF; xóa INDF tức là xóa nội dụng của thanh ghi địa chỉ 0x30


Hình vẽ trên cho ta cách mà vi điều khiển xác định thanh ghi nào trong Ram được thực
hiện.
NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA


×