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

ỨNG DỤNG VI ĐIỀU KHIỂN PIC

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.09 MB, 75 trang )

Chương 3: Giới thiệu vi điều khiển PIC 16F84A

Chương 1:

GIỚI THIỆU VI ĐIỀU KHIỂN
PIC16F84A

1.1 Mở đầu
- Cùng với sự phát triển của khoa học và công nghệ, các họ vi điều khiển ngày
càng phát triển với các tính năng mới .Nhằm đáp ứng các yêu cầu ngày càng cao
trong các ứng dụng, đặc biệt là trong các hệ thống điều khiển tự động. Hiện nay
trên thị trường có rất nhiều các loại vi điều khiển mạnh để bạn lựa chọn như
Motorola 68HC , PIC, Atmel AVR, ARM, , SHARC. Tuy vậy em nêu ra đây
những tiêu chí mà dựa vào đó em chọn họ vi điều khiển PIC :
 Có bán trên thị trường
 Giá thành
 Dễ sử dụng (bao gồm thiết kế mạch nạp, mạch chạy, bộ nhớ flash, tập
lệnh, các chương trình hỗ trợ của nhà sản xuất)
 Số lượng và giá cả của các công cụ lập trình, các mạch thiết kế mở, số
lượng nhà phân phối…
 Số lượng người dùng, mà từ đó có thể có các tài liệu chú dẫn, các ghi chú
bổ ích, có sự trao đổi dễ dàng
 Tính năng của một vi điều khiển riêng lẻ
- Quay trở lại vấn đề so sánh. Motorola thường được dùng cho những thiết kế
phức tạp nhưng lại rất khó mua và giá cao. AVR cũng giống như PIC, nhưng nó

SVTH: Nguyễn Hữu Tiến

Trang 1



Chương 3: Giới thiệu vi điều khiển PIC 16F84A
còn mới và nhiều người cũng so sánh nó với PIC. Nhưng nếu xét về các ứng
dụng được thiết kế trên AVR còn rất hạn chế. Số lượng các dòng vi điều khiển
AVR cũng không nhiều, không có những vi điều khiển cho những ứng dụng cụ
thể. 8051 thì là sở trường của sinh viên, nhưng hạn chế về tính năng.
- Trong đồ án này em sẽ trình bày về PIC16F84A, đây là con vi điều khiển mà
những người mới học PIC thường lựa chọn.
1.2 PIC là gì?
- PIC là tên viết tắt của “bộ điều khiển thiết bị ngoại vi” (Peripheral Interface
Controller), do hãng General Instrument đặt tên con con vi điều khiển đầu tiên
của họ: PIC1650. Đây là con vi điều khiển đầu tiên, là mẹ đẻ của tất cả các vi
điều khiển họ PIC sau này. Đến ngày nay, PIC1650 được phát triển và được biết
dưới tên gọi PIC16C54. Nó được thiết kế để dùng cho các thiết bị ngoại vi của vi
xử lý CP1600
Tóm lược dòng PIC:
-Mã số bắt đầu là 12xxxx có nghĩa là opcode của nó 12 bit, bắt đầu với
16xxxx là các con PIC 14 bit và 18xxxx là PIC 16 bit..
- Mã số C là các PIC có bộ nhớ EPROM, duy chỉ có con 16C84 là EEPROM,
F là Flash, LF là PIC Flash hoạt động ở điện áp thấp, con cũ là LV. Ngoài ra, một
số con xxFxxx là EEPROM, để phân biệt với con Flash thì các bạn sẽ thấy chữ A
ở tận cùng. Vd: 16F877 và 16F877A,16F84 và 16F84A,v.v.
- Các SX PIC được dùng nhiều hơn vì nó cung cấp nhiều công cụ tính toán
hơn Microchip PIC, tuy vậy, ở VN vẫn phổ biến với các con PIC của Microchip.
Ngôn ngữ lập trình:
-Ngôn ngữ lập trình rất đa dạng MPASM, C, Basic, Pascal…. Mọi người sẽ
thích dùng các ngôn ngữ cấp cao vì nó đơn giản hơn, ở đây em sử dụng trình biên
dịch mikropascal. Ngoài ra còn có các trình biên dịch khác như: MPLAB, CCS
C, BASCOM, C17, C18, C30… C18 ..
1.3 Tóm tắt phần cứng PIC16F84A
1.3.1Cấu trúc bên trong và các đặc trưng cơ bản

♦Kiến trúc của PIC
SVTH: Nguyễn Hữu Tiến

Trang 2


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
-PIC được tổ chức phần cứng theo kiến trúc Harvard, và tập lệnh RISC. Sự
khác biệt giữa kiến trúc Harvard và kiến trúc Von Neumann ở chỗ bộ nhớ dữ liệu
và bộ nhớ chương trình nằm riêng biệt, hay nằm chung.
-Chúng ta sẽ thấy rằng, với kiến trúc von-Neumann, bộ nhớ dữ liệu và bộ nhớ
chương trình nằm chung, do vậy khi CPU tương tác với bộ nhớ, nó chỉ có thể
làm việc với hoặc bộ nhớ dữ liệu, hoặc bộ nhớ chương trình nên tốc độ xử lý
chậm đi. Trong khi đó, kiến trúc Harvard cho phép CPU tương tác với cả hai bộ
nhớ dữ liệu và bộ nhớ chương trình cùng một lúc, giúp tốc độ xử lý nhanh hơn.
Kiến trúc von-Neumann ngược lại, cho phép ta cân đối giữa bộ nhớ dữ liệu và bộ
nhớ chương trình một cách linh động. Tuy nhiên, điều này chỉ thực sự hữu ích
cho những CPU xử lý tốc độ cực cao, và dung lượng bộ nhớ cực lớn. Còn với các
CPU tốc độ chậm như vi điều khiển, và bộ nhớ hạn chế, kiến trúc von-Neumann
dường như không đem lại hiệu quả về tốc độ xử lý cũng như dung lượng quản lý
bộ nhớ như kiến trúc Harvard.

Hình 1.1: Kiến trúc Harvard và kiến trúc Von-Neumann

-Một điểm chú ý nữa, đó là với kiến trúc Harvard, bộ nhớ chương trình và bộ
nhớ dữ liệu được tách riêng, do đó, tập lệnh trong kiến trúc Harvard có thể được
tối ưu tùy theo yêu cầu kiến trúc của vi điều khiển. Bằng chứng, độ dài lệnh của
dòng PIC16 luôn luôn là 14 bit. Trong khi đó, độ dài lệnh của các vi điều khiển
kiến trúc von-Neumann là bội số của 1 byte (8 bit).
-Điều này dẫn đến hệ quả, nếu bộ nhớ chương trình của PIC là 4Kword, thì

mọi vị trí của bộ nhớ đều có thể sử dụng triệt để, và chúng ta viết được 4x1024
dòng lệnh trong chương trình. Trong khi đó, kiến trúc von-Neumann với bộ nhớ
SVTH: Nguyễn Hữu Tiến

Trang 3


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
4KB trung bình chỉ cho ta viết 2x1024 dòng lệnh, tức tương đương với 2K dòng
lệnh. Tỉ lệ này tùy thuộc vào mỗi ứng dụng, tuy nhiên, con số trung bình này
phản ánh rằng, kiến trúc Harvard phần nào thể hiện lợi điểm so với kiến trúc vonNeumann trong các vi điều khiển.
♦Sơ đồ khối của PIC16F84A

Hình 1.2: Sơ đồ khối của PIC16F84A
SVTH: Nguyễn Hữu Tiến

Trang 4


Chương 3: Giới thiệu vi điều khiển PIC 16F84A

1.4 Sơ đồ chân của PIC16F84A

Hình 1.3: Sơ đồ chân của PIC16F84A
OSC1/CLKIN : Chân nối với dao động thạch anh (Oscillator crystal input)
OSC2/CLKOUT :Chân nối với dao động thạch anh (Oscillator crystal input)
MCLR(inv) : Chân reset mức thấp (Master clear input)
Ngõ vào điện áp lập trình trong chế độ lập trình (Programming voltage input)
RA0 – RA3 : Cổng giao tiếp hai chiều (Bi-directional I/O port)
RA4/T0CKI : Cổng giao tiếp hai chiều (Bi-directional I/O port). Giữ vai trò như

một bộ định thời dựa vào xung ngoài ( Clock input to the TMR0 timer/counter)
RB0/INT : Cổng giao tiếp hai chiều (Bi-directional I/O port)
Chân ngắt ngoài (External interrupt pin)
RB1 – RB7 :Cổng giao tiếp hai chiều (Bi-directional I/O port)
VSS : Chân mass
VDD :Chân nguồn (+2.0V to +5.5V)

SVTH: Nguyễn Hữu Tiến

Trang 5


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
1.5 Tổ chức bộ nhớ

SVTH: Nguyễn Hữu Tiến

Trang 6


Chương 3: Giới thiệu vi điều khiển PIC 16F84A

SVTH: Nguyễn Hữu Tiến

Trang 7


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
Hinh 1.4: Tổ chức bộ nhớ của PIC16F84A
♦ Bộ nhớ chương trình(Flash Program Memory)

Bộ nhớ chương trình là loại bộ nhớ kiểu FLASH dùng để chứa chương trình
.Kích thước bộ nhớ chương trình là 1024 vị trí nhớ, mỗi vị trí nhớ có độ lớn là 14
bit (word).Mỗi khi nguồn mất thì nội dung của bộ nhớ sẽ không bị mất. Có khả
năng lập trình được nhiều lần,số lần ghi được giới hạn là 1000 lần .Vị trí 0000h
và vị trí 0004h được dành cho reset và vector ngắt.
♦ Reset Vector ( 0000h )
Khi xảy ra reset, hoặc bằng cách bật nguồn hoặc do các nguyên nhân khác thì
chương trình sẽ bắt đầu ở vị trí này .PIC16F84A có các cách reset sau :
-Reset khi bật nguồn, POR (Power-On Reset)
-Reset khi có mức logic 0 trên chân MCRL
-Reset khi ở chế độ ngủ (Sleep)
-Reset khi bộ watchdog bị tràn (WDT)
Trong đó cách reset do bật nguồn (POR) và do có mức logic 0 trên chân MCRL
là thường được sử dụng nhất
♦ Peripheral Interrupt Vector ( 0004h )
Khi cho phép ngắt, chương trình ngắt sẽ bắt đầu ở vị trí này
♦ Bộ nhớ dữ liệu(Data memory)
Bộ nhớ dữ liệu bao gồm bộ nhớ EEPROM và RAM. Bộ nhớ EEPROM gồm 64
vị trí 8 bit và nội dung của chúng không bị mất đi khi mất nguồn. Bộ nhớ
EEPROM không thể truy cập trực tiếp, chỉ có thể truy cập gián tiếp thông qua 2
thanh ghi là EEADR và EEDATA
♦ RAM(Random Access Memory) File Registers
Bộ nhớ RAM của dòng PIC được chia làm nhiều bank,để truy cập đến vùng
nhớ này ta phải làm công việc chọn bank. PIC16F84A bộ nhớ RAM được chia
làm 2 bank, mỗi bank có độ lớn là 80 byte chiếm vị trí từ 0x00h tới 0x4Fh, 12 vị
trí đầu tiên của mỗi bank là các thanh ghi chức năng đặc biệt SFR (Special
Function Registers). Các vị trí từ 0x0Ch tới 0x4Fh là vùng RAM đa mục đích,

SVTH: Nguyễn Hữu Tiến


Trang 8


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
các vị trí trong vùng RAM đa mục đích có thể truy cập bất chấp bank nào được
chọn.
♦ Bộ đếm chương trình (Program Counter)
Bộ đếm chương trình (PC) là một thanh ghi có độ dài 13 bit chứa địa chỉ của
lệnh được kích hoạt tiếp theo. Về mặt vật lí, nó là sự kết hợp 5 bit của thanh ghi
PCLATH và 8 bit của thanh ghi PCL
♦ Stack
Stack chứa địa chỉ trở về khi một lệnh nhảy được kích hoạt
PIC16F84 có một ngăn chứa 13 bit với 8 mức, nói cách khác đó là một nhóm 8 vị
trí nhớ, có độ rộng 13 bít.Vai trò cơ bản của nó là lưu giữ giá trị của bộ đếm
chương trình sau khi thực hiện một lệnh nhảy từ chương trình chính tới địa chỉ
của chương trình con, nhằm mục đích để cho chương trình chính biết chính xác
điểm trở về sau khi thực hiên chương trình con
Lệnh RETURN đánh dấu điểm kết thúc của chương trình con .Lệnh CALL là
lệnh nhảy tới chương trình con. Khi gặp một lệnh CALL, thì địa chỉ trở về (địa
chỉ của câu lệnh theo sau lệnh con) sẽ được chứa vào đỉnh của stack, khi lệnh
RETURN được bắt gặp thì địa chỉ ở đỉnh stack sẽ được đặt vào PC và chương
trình tiếp tục bình thường. Do PIC16F84 có 8 thanh ghi stack nên các chương
trình con có thể gọi lồng nhau liên tiếp 8 lần ,vì sau lần gọi thứ 8 thì một lệnh gọi
sẽ làm mất nội dung của ngăn stack thứ tám .Do đó khi gặp lệnh return thì PC sẽ
gửi tới chương trình địa chỉ trở về sai, điều đó làm cho chương trình hoạt động
sai.

SVTH: Nguyễn Hữu Tiến

Trang 9



Chương 3: Giới thiệu vi điều khiển PIC 16F84A

Hình 1.5: Hoạt động của stack
1.6 Các thanh ghi chức năng đặc biệt (SFR) và hoạt động của chúng
12 vị trí nhớ đầu tiên của mỗi bank được dành cho các thanh ghi chức năng đặc
biệt (FSR), các thanh ghi này rất quan trọng trong hoạt động của họ vi điều khiển
PIC.
♦ Thanh ghi STATUS (địa chỉ bộ nhớ 03h và 83h)

Hình 1.6: Thanh ghi STATUS
-Bit IRP, RP1, RP0: bit dung để chon bank ,ở PIC16F84A bit IRP không được sử
dụng,việc chọn bank phụ thuộc vào hai bit RP1 và RP0
00: chọn bank 0;
01: chọn bank1
-Bit TO ( time out bit) :cờ báo tràn bộ WDT
1: không xảy ra tràn
0: tràn xảy ra
-Bit PD (Power-down)
1: sau khi bật nguồn
0: khi kích hoạt lệnh SLEEP

SVTH: Nguyễn Hữu Tiến

Trang 10


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
-Bit Z : cờ zero

1: kết quả bằng 0
0: kết quả bằng 1
-Bit DC (Digit Carry):
-Bit C(Carry)
♦ Thanh ghi OPTION_REG (địa chỉ bộ nhớ 81h)

Hình 1.7: Thanh ghi OPTION_REG
-Bit RBPU (Portb pull-up Enable bit)
1 : cho phép điện trở kéo lên ở portb;
0: không cho phép điện trở kéo lên
-Bit INTEDG (Interrupt Edge Select Bit): Nếu ngắt ngoài được cho phép, thì bit
này xác định ngắt sẽ xảy ra khi tín hiệu ở chân RB0/INT là ở sườn lên hay sườn
xuống
1 : sườn lên
0 : sườn xuống
-Bit TOCS (TMR0 Clock Source Select bit ) : bit này cho cho phép bộ định thời
tăng giá trị hoặc là từ dao động nội, hoặc là từ dao động ngoài trên chân
RA4/TOCKI
1: dao động ngoài
0: dao động nội
-Bit TOSE (TMR0 Source Edge Select bit) : bít này cho phép tín hiệu trên chân
RA4/TOCKI tác động vào bộ định thời ở sườn lên hay sườn xuống
1: sườn xuống
0: sườn lên
-Bit PSA (Prescaler Assigment bit): bit này qui định bộ chia tần được gán cho bộ
định thời(TMR0) hay bộ watch dog (WDT)
1: gán cho bộ WDT
0: gán cho bộ TMR0
SVTH: Nguyễn Hữu Tiến


Trang 11


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
-Bit PS0, PS1, PS2 (Prescaler Rate Select bit)
ba bit này xác định hệ số của bộ chia tần,các tỉ số này như sau:

Bảng 1.8: Tỉ lệ thời gian (s) cho TMR0 và WDT
♦ Thanh ghi INDF(địa chỉ bộ nhớ 00h)
Thanh ghi này được sử dụng trong định địa chỉ gián tiếp
♦ Thanh ghi EECON1 (địa chỉ bộ nhớ 88h)

Hình 1.9: Thanh ghi EECON1
-Bit EEIF (EEPROM Write Operation Interrupt Flag bit) : Bit này được sử dụng
để báo việc ghi vào EEPROM đã kết thúc
1: quá trình ghi đã kết thúc
0: quá trình ghi chưa kết thúc, hoặc chưa được thực hiện
-Bit WRERR (Write EEPROM Error Flag bit) : cờ báo lỗi trong quá trình ghi
EEPROM
1: có lỗi xảy ra
0: không có lỗi xảy ra
-Bit WREN (EEPROM Write Enable bit): bit cho phép ghi vào EEPROM
1: cho phép ghi
0: không cho phép
-Bit WR (Write Control bit) : thiết lập bit này để bắt đầu ghi dữ liệu trong thanh
ghi EEDATA tới địa chỉ được chỉ định trong thanh ghi EEADR
-Bit RD (Read control bit) : thiết lập bít này để bắt đầu truyền dữ liệu ở địa chỉ
trong thanh ghi EEADR tới thanh ghi EEDATA

SVTH: Nguyễn Hữu Tiến


Trang 12


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
1.7 PORT I/O
-Port I/O được sử dụng để PIC giao tiếp với các thiết bị ngoài. PIC16F84A có 13
chân vào ra. Chúng được phân thành hai port, PORTA và PORTB. PORTA có 5
chân và PORTB có 8 chân, PORTA tương ứng với thanh ghi PORTA và PORTB
tương ứng với thanh ghi PORTB. Mỗi thanh ghi gồm 8 bit và mỗi chân của port
tương ứng với mỗi bit, mỗi chân có thể được quy định là ngõ vào hay ngõ ra.
Việc qui định chân là ngõ vào hay ngõ ra phụ thuộc vào việc thiết lập bit tương
ứng trong thanh ghi TRIS tương ứng là 0 hay 1. Nếu ghi vào thanh ghi TRIS mức
logic ”0” thì port tương ứng là ngõ ra, ngược lại là ngõ vào. Cấu trúc bên trong
của mỗi port.
1.7.1 PortA
Nó gồm có 5 chân :từ RA0 đến RA4

Hình 1.10: PortA
♦ Cấu trúc bên trong của portA (RA0-RA3):

Hình 1.11: Cấu trúc bên trong của PortA
Hình trên là sơ đồ mạch bên trong của porta từ RA0 tới RA3. Nó bao gồm bộ
chốt dữ liệu ngõ ra và mạch điều khiển CMOS. Mỗi chân xem như ngõ vào hay
ra phụ thuộc vào việc thiết lập thanh ghi TRISA. Giá trị thiết lập ở thanh ghi
TRISA được ghi vào bộ chốt TRIS Latch.

SVTH: Nguyễn Hữu Tiến

Trang 13



Chương 3: Giới thiệu vi điều khiển PIC 16F84A
♦ Quá trình hoạt động của portA ở chế độ là ngõ ra

Hình 1.12: Hoạt động của portA ở chế độ là ngõ ra
Để thiết lập chân của portA là ngõ ra thì ta ghi vào thanh ghi TRISA ở bit
tương ứng giá trị là ‘0’ .Do bộ chốt của thanh ghi TRISA là một DFF nên ngõ ra
Q là ở mức thấp, và ngõ ra Q bù ở mức cao. Trường hợp dữ liệu ra là mức 1 thì
do bộ chốt dữ liệu cũng là một DFF nên ngõ ra Q bù sẽ có mức 0, khi đó cổng
OR sẽ mở và PFET dẫn, cổng AND sẽ đóng dẫn tới N-FET ngắt, lúc đó dữ liệu
ra chân sẽ có mức 1, ngược lại khi dữ liệu cần xuất là mức 0.
♦ Quá trình hoạt động của portA ở chế độ là ngõ vào
Để thiết lập chân của portA ở chế độ ngõ vào thì ta ghi vào thanh ghi TRISA ở
bit tương ứng giá trị là “1”. Như hình vẽ ta thấy PFET và NFET sẽ không thông,
lúc đó dữ liệu vào sẽ được ghi vào bộ chốt ngõ vào và được đọc ra theo giản đồ
xung như sau:

SVTH: Nguyễn Hữu Tiến

Trang 14


Chương 3: Giới thiệu vi điều khiển PIC 16F84A

Hình 1.13: Hoạt động của portA ở chế độ là ngõ vào
♦ Cấu trúc bên trong của portA(RA4)
Ở portA chân RA4 ngoài chức năng vào ra cơ bản, nó còn có một chức năng
đặc biệt khác là ngõ vào của xung ngoài. Nó khác với các chân còn lại của porta
là FET cho điều khiển ngõ ra chỉ có NFET và một mạch Schmittch Trigger được

dùng làm bộ đệm ngõ vào . Như hình vẽ sau:
SVTH: Nguyễn Hữu Tiến

Trang 15


Chương 3: Giới thiệu vi điều khiển PIC 16F84A

Hình 1.14: Cấu trúc bên trong của RA4
Chân này còn được sử dụng làm ngõ vào của xung ngoài định thời cho bộ định
thời TMR0, bởi vì nó sử dụng bộ đệm ngõ vào là một mạch Schmittch Trigger,
do đó nó nó rất nhạy với nhiễu, đồng thời do ở ngõ ra không có P-FET đóng vai
trò như là một điện trở kéo lên, vì vậy cần phải mắc điện trở kéo lên bên ngoài.
1.7.2 Port B
Nó gồm có 8 chân :từ RB0 đến RB7
♦ Cấu trúc bên trong của portB(RB0-RB3)

Hình 1.15: Cấu trúc bên trong của portB
Cấu tạo của portB khác với portA. Ở portB không sử dụng FET trong mạch
ngõ ra mà sử dụng một cổng logic(NAND) để qui định chế độ vào ra. Đặc trưng
của portB là có điện trở kéo lên khi ở chế độ là ngõ vào. Chức năng điện trở kéo
lên này có thể lập trình bằng phần mềm.

SVTH: Nguyễn Hữu Tiến

Trang 16


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
Khi ghi vào bộ đệm thanh ghi TRIS giá trị “0” , ngõ ra Q của DFF(TRIS Latch)

có giá trị 0 ,lúc đó cổng điều khiển ngõ ra được mở, đồng thời ngõ ra cổng
NAND luôn ở mức 1, lúc đó P-MOS tắt dẫn tới chức năng điện trở kéo lên bị vô
hiệu hóa
Khi ghi vào bộ đệm thanh ghi TRIS giá trị “1” , ngõ ra Q của DFF(TRIS
Latch) có giá trị là “1”. PORT ở chế độ ngõ vào lúc đó cổng điều khiển ngõ ra bị
cấm, đồng thời ngõ ra của cổng NAND ở mức “1” hay mức “0” tùy thuộc vào
chân RBPU ,tức là cho phép hay không cho phép chức năng điện trở kéo lên.
RBPU là bit 7 của thanh ghi OPTION. Nếu bít RPBU bằng “0” cho phép có điện
trở kéo lên, nếu bằng “1” thì ngược lại.
♦ Cấu trúc bên trong của portB (RB4-RB7)

Hình 1.16: Cấu trúc bên trong của portB
Các chân của portB từ (RB4-RB7) ngoài chức năng I/O, còn có thêm chức
năng dò tìm sự thay đổi trạng thái trên các chân. Chức năng này chỉ hoạt động
khi port ở chế độ là ngõ vào. Một ngắt sẽ xảy ra khi có sự thay đổi trạng thái trên
các chân này. Hoạt động của việc dò tìm sự thay đổi trạng thái trên các chân như
sau :

SVTH: Nguyễn Hữu Tiến

Trang 17


Chương 3: Giới thiệu vi điều khiển PIC 16F84A

Hình 1.17: Đọc dữ liệu vào ở portB
Như hình trên ta thấy, dữ liệu ngõ vào được đọc vào bộ chốt dữ liệu thông qua
một cổng đảo, khi tín hiệu RD chuyển từ mức thấp lên mức cao. Ở thời điểm
đó,việc đọc dữ liệu cũ trong OLD data latch không thực hiện được. Việc đọc dữ
liệu từ OLD data latch chỉ được thực hiện khi tín hiệu RD chuyển từ mức cao

xuống mức thấp. Do đó khi có sự thay đổi ở ngõ vào thì ngõ ra của cổng XOR sẽ
ở mức “1” và bit RBIF(bit cho phép ngắt do sự thay đổi trạng thái ở portb ) sẽ
được set lên “1”, ngược lại ngõ ra của cổng XOR sẽ ở mức “0” và bit RBIF sẽ
được xóa.
1.8 Hoạt động định thời

Hình 1.18: Hoạt động định thời

SVTH: Nguyễn Hữu Tiến

Trang 18


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
Bộ định thời thường là phần phức tạp nhất của vi điều khiển. Hầu hết các ứng
dụng của nó là tạo ra mối quan hệ cần thiết giữa không gian thực và vi điều
khiển. Về mặt vật lí, bộ định thời là một thanh ghi mà giá trị của nó liên tục tăng
tới 255 và sau đó nó bắt đầu lại từ đầu :0,1,2,3,…,255…0,1,2,3,…255..
Hình trên là sơ đồ khối của bộ định thời (TMR0) và bộ watchdog (WDT) .Các
thanh ghi INTCON, OPTION_REG, TRISA là các thanh ghi tác động trực tiếp
tới bộ định thời.
Bộ chia tần số (Prescaler) có thể được sử dụng cho bộ định thời TMR0 hoặc bộ
WDT phụ thuộc vào bit PSA của thanh ghi OPTION_REG. Bộ chia tần là một bộ
đếm có thể lập trình được, tỉ số đếm của nó phụ thuộc vào 3 bít PS0, PS1, PS2
của thanh ghi OPTION_REG. Bộ định thời TMR0 là bộ định thời 8 bit do đó nó
chỉ có thể đếm lên tới giá trị là 256. Khi giá trị của bộ định thời tràn từ 255 về 0
nó sẽ sinh ra một ngắt. Nhận thấy rằng giá trị cực đại của bộ định thời là 256, do
đó thời gian định thời sẽ rất ngắn. Ví dụ ,ở tần số hoạt động là 20Mhz, thì tần số
ngõ vào bộ đếm là 5Mhz. Chu kì của xung đồng hồ này là 200ns (1/5Mhz
=0.2µsec). Vì vậy sẽ làm cho bộ định thời tràn sau 51.1µsec (0.2 * 256) . Do đó

để tăng thời gian định thời ta sử dụng bộ chia tần Prescaler :

Bảng 1.19: Tỉ lệ thời gian (s) cho TMR0 và WDT
Ví dụ ,khi bộ chia tần được thiết lập là 1:256, thì có nghĩa là sau 256 xung ngõ
vào bộ định thời mới tăng lên 1. Do đó bộ định thời tràn sau 51.1µsec * 256 = 13
ms .
Bộ watch dog timer (WDT) là một bộ dao động chạy độc lập với hệ thống.
Chức năng của nó là tự động RESET hoạt động của vi điều khiển khi xảy ra sự
cố. Bởi vì thông thường, khi xảy ra lỗi vi điều khiển thường ở trong trạng thái
dừng làm việc cho đến khi được RESET trở lại. Bộ WDT hoạt động dựa trên một
nguyên lí dơn giản là:

SVTH: Nguyễn Hữu Tiến

Trang 19


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
Nếu xảy ra tràn ở bộ WDT (mặc định là 18ms) thì vi điều khiển sẽ được
RESET . Do đó RESET sẽ xảy ra trong cả hai trường hợp hoạt động đúng và hoạt
động sai.Để tránh trường hợp vi điều khiển bị RESET khi hoạt động đúng thì ta
thực hiện ghi vào thanh ghi WDT giá trị “0” mỗi khi nó gần tràn.
Thực tế, bộ WDT thường không được sử dụng bởi vì nếu có lỗi xảy ra ở phần
mềm thì thông thường bạn sẽ nhận ra lỗi thông qua cách hoạt động của nó. Nếu
sử dụng bộ WDT thì bạn có thể sẽ không nhận ra tại sao chương trình hoạt động
sai.
1.9 Hoạt động ngắt

Hình 1.20: Hoạt động ngắt
Ngắt là một cơ chế của vi điều khiển cho phép đáp ứng lại một vài sự kiện lúc

nó xảy ra,bất chấp những gì vi điều khiển đang thực hiện ở thời điểm đó. Đây là
một cơ chế rất quan trọng, nó làm tăng tính mềm dẻo của các ứng dụng sử dụng
vi điều khiển. Thanh ghi điều khiển ngắt của PIC16F84 gọi là thanh ghi
INTCON và có thể truy cập bất chấp bank nào được chọn.
♦ Thanh ghi INTCON

SVTH: Nguyễn Hữu Tiến

Trang 20


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
Hình 1.21: Thanh ghi INTCON
-Bit GIE (global interrupt enable bit): Bit cho phép hay không cho phép ngắt toàn
cục
1 : cho phép tất cả các ngắt
0 : cấm tất cả các ngắt
-Bit EEIE (EEPROM Write Complete Interrupt Enable ) : bit này cho phép ngắt
ở thời điểm kết thúc việc ghi vào EEPROM
1 : cho phép ngắt
0 : cấm ngắt
-Bit TOIE (TMR0 Overflow Interrupt Enable): bit này cho phép ngắt khi tràn bộ
định thời
1 : cho phép ngắt
0 : cấm ngắt
-Bit INTE (INT External Interrupt Enable): bit cho phép ngắt ngoài trên chân
RB0/INT
1 : cho phép ngắt
0 : cấm ngắt
-Bit RBIE (RB Port Change Interrupt Enable): bít cho phép ngắt khi có sự thay

đổi trên portb
1 : cho phép ngắt
0 : cấm ngắt
-Bit TOIF (TMR0 Overflow Interrupt Flag): cờ tràn bộ định thời
1 : tràn bộ định thời
0 : chưa xảy ra tràn
-Bit INTF (INT External Interrupt Flag): cờ báo hiệu có khi có ngắt ngoài
1 : có ngắt ngoài xảy ra
0 : không có ngắt ngoài
-Bit RBIF (RB Port Change Interrupt Flag): cờ báo hiệu có sự thay đổi trạng thái
trên portb
1 : có thay đổi
0 : không có sự thay đổi

SVTH: Nguyễn Hữu Tiến

Trang 21


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
-Khi có một ngắt xảy ra thì chương trình ngắt sẽ bắt đầu ở địa chỉ 0004h. Như
trên ta thấy một nguồn ngắt sinh ra phải có đồng thời hai bit. Một bit cho phép
ngắt, bit còn lại xác định khi nào ngắt xảy ra. Bit GIE được sử dụng để cho phép
hay không cho phép các ngắt xảy ra đồng thời. Khi có một ngắt xảy ra, bit GIE sẽ
được xóa để cấm các ngắt khác xảy ra. Sau khi ngắt được xử lí cờ ngắt nên được
xóa trước khi trở về chương trình chính. Đồng thời do PIC không hỗ trợ lệnh
POP và lệnh PUSH, hai lệnh này thường được dùng để lưu giữ giá trị của các
thanh ghi quan trọng trước khi vào chương trình ngắt (PUSH) và lấy lại nội dung
của các thanh ghi đó trước khi ra khỏi chương trình ngắt (POP), do đó hai lệnh
này thường được lập trình bằng phần mềm. Đây là một điểm bất lợi của họ PIC.

PIC16F84A có 4 nguồn sinh ra ngắt là
♦ Kết thúc việc ghi dữ liệu vào EEPROM
Việc ghi vào một vị trí của EEPROM chiếm mất 10ms, đây là một khoảng thời
gian khá lớn đối với vi điều khiển. Vi điều khiển sẽ đợi cho việc ghi EEPROM
hoàn thành và không làm việc gì cả trong khoảng thời gian đó. Vì vậy cơ chế
ngắt này được thêm vào nhằm cho phép vi điều khiển tiếp tục kích hoạt chương
trình chính trong khi việc ghi EEPROM đang được tiến hành. Khi việc ghi kết
thúc, ngắt sẽ báo cho vi điều khiển biết rằng việc ghi vào EEPROM đã kết thúc
bằng cách set bit EEIF trong thanh ghi EECON1. Ta có thể cấm ngắt này bằng
cách reset bit EEIE trong thanh ghi INTCON.
♦ Do tràn bộ định thời
Khi xảy ra tràn bộ định thời (từ FFh xuống 00h) thì bit TOIF trong thanh ghi
INTCON sẽ được set lên 1. Đây là một ngắt rất quan trọng, vì nhiều vấn đề thực
tế có thể được giải quyết bằng ngắt này. Ngắt này có thể được cho phép hay
không phụ thuộc vào bit TOIE của thanh ghi INTCON.
♦ Do sự thay đổi trạng thái trên các chân từ RB4 tới RB7 của PORTB
Khi xảy ra sự thay đổi trạng thái trên các chân từ RB4 tới RB7 thì bit RBIF
trong thanh ghi INTCON sẽ được set. Để sử dụng ngắt này thì các chân đó phải
được thiết lập là ngõ vào. Nếu một trong chúng được thiết lập là ngõ ra thì ngắt
sẽ không xảy ra

SVTH: Nguyễn Hữu Tiến

Trang 22


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
.
♦ Ngắt ngoài trên chân RB0/INT
Ngắt ngoài trên chân RB0/INT được kích khởi bởi sườn lên (nếu bít INTEDG

trong thanh ghi OPTION bằng 1), hoặc sườn xuống (nếu bit INTEDG bằng 0).
Khi có tín hiệu xuất hiện trên chân INT, bit INTF trong thanh ghi INTCON sẽ
được set. Ngắt này có thể cấm bằng cách reset bit INTE trong thanh ghi
INTCON.
1.10 Tập lệnh của họ PIC16FXX

Mnemonic

Instruction code
Operation explanation

Flag

Operands
Byte-oriented file register operations
ADDWF

f, d

Add W and f

C, DC, Z

ANDWF

f, d

AND W with f

Z


CLRF

f

Clear f

Z

CLRW

-

Clear W

Z

COMF

f, d

Complement f

Z

DECF

f, d

Decrement f


Z

DECFSZ

f, d

Decrement f, Skip if 0

INCF

f, d

Increment f

INCFSZ

f, d

Increment f, Skip if 0

IORWF

f, d

Inclusive OR W with f

Z

MOVF


f, d

Move f

Z

MOVWF

f

Move W to f

NOP

-

No Operation

Z

RLF

f, d Rotate Left f through Carry

C

RRF

f, d Rotate Right f through Carry


C

SUBWF

f, d

Subtract W from f

SWAPF

f, d

Swap nibbles in f

SVTH: Nguyễn Hữu Tiến

C, DC, Z

Trang 23


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
XORWF

f, d

Exclusive OR W with f

Z


Bit-oriented file register operations

BCF

f, b

Bit Clear f

BSF

f, b

Bit Set f

BTFSC

f, b

Bit Test f, Skip if Clear

BTFSS

f, b

Bit Test f, Skip if Set
Literal and control operations

ADDLW


k

Add literal and W

C, DC, Z

ANDLW

k

AND literal with W

Z

CALL

k

Call subroutine

CLRWDT

-

Clear Watchdog Timer

GOTO

k


Go to address

IORLW

k

Inclusive OR literal with W

MOVLW

k

Move literal to W

RETFIE

-

Return from interrupt

RETLW

k

Return with literal in W

RETURN

-


Return from Subroutine

SLEEP

-

Go into stanby mode

SUBLW

k

Subtract W from literal

C, DC, Z

XORLW

k

Exclusive OR literal with W

Z

Z

Bảng 1.22: Tóm tắt tập lệnh của PIC16F84A
Trong đó:
d (Destination Select): Việc chọn nơi chứa kết quả sau khi kích hoạt lệnh phụ
thuộc vào d. Nếu d =0 thì kết quả sẽ được chứa vào thanh ghi W, nếu d =1 thì kết

quả được chứa vào thanh ghi đa mục đích. Ví dụ :
ADDWF COUNT,W ( d=0 kết quả được chứa vào W )
ADDWF COUNT,F ( d=1 kết quả được chứa vào F )

SVTH: Nguyễn Hữu Tiến

Trang 24


Chương 3: Giới thiệu vi điều khiển PIC 16F84A
f (Register File): chỉ tới một vị trí trong vùng RAM đa chức năng, thông
thường khi viết chương trình bằng ASM thì vị trí đó thường được đánh nhãn. Ví
dụ: ADDWF COUNT,F ( COUNT là một nhãn được gán cho một vị trí RAM)
Sau khi thực hiện lệnh này kết quả được chứa vào vị trí RAM được gán nhãn là
COUNT
b (Bit address) :chỉ ra vị trí bit trong một byte thanh ghi
k (Literal field): Là một hằng số được sử dụng cho tính toán,nó có thể là số
hoặc có thể là một nhãn.

Trong phần trước, em đã giới thiệu về PIC16F84A, tuy nhiên do số chân I/O của
PIC16F84A không đủ để thực hiện việc thiết kế mạch. Vì vậy, em đã sử dụng
PIC16F877A (có 40 chân) trong quá trình thiết kế. Sau đây em giới thiệu một số
chức năng chính của vi điều khiển PIC16F877A phục vụ cho việc thiết kế.
1.11. SƠ ĐỒ CHÂN PIC 16F877A

SVTH: Nguyễn Hữu Tiến

Trang 25



×