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

Giáo trình thí nghiệm VDK

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 (4 MB, 107 trang )

Giáo trình thí nghiệm vi điều khiển ứng dụng

1

MỤC LỤC

CHƢƠNG I : PHẦN CỨNG PIC16F 4
I.KIẾN TRÚC 4
1.Kiến trúc Von neumann 4
2.Kiến trúc harvard 4
II.INSTRUCTION PIPELINING 5
III.KÍCH THƢỚC TỪ LỆNH 9
IV.THIẾT KẾ PHẦN CỨNG CHO PIC 10
1.Mạch nguyên lý 10
2.Chuẩn ICSP(In-Circurt Serial Programming) 11
3.Các tính năng đặc biệt, các bit cấu hình của PIC16F887 11
CHƢƠNG II : XUẤT NHẬP I/O PORT 21
I.MỤC ĐÍCH THÍ NGHIỆM 21
II.DỤNG CỤ THÍ NGHIỆM 21
III.CƠ SỞ LÝ THUYẾT 21
1.Thanh ghi qui định tín hiệu xử lý 21
2.Chức năng của thanh ghi TRIS 22
3. Chức năng của thanh ghi PORT 22
4.Những thanh ghi đặc biệt chỉ có riêng ở PORTB 23
IV.BÀI TẬP THỰC HÀNH 26
V.BÀI TẬP TỰ GIẢI 32
CHƢƠNG III : ADC MODULE 33
I.MỤC ĐÍCH THÍ NGHIỆM 33
II.DỤNG CỤ THÍ NGHIỆM 33
III.CƠ SỞ LÝ THUYẾT 33
1.Tín hiệu tương tự và tín hiệu số 33


2.ADC của vi điều khiển PIC16F887 34
3.Làm việc với LCD 16x2 38
IV.BÀI TẬP THỰC HÀNH 40
V.BÀI TẬP TỰ GIẢI 43
Giáo trình thí nghiệm vi điều khiển ứng dụng

2

CHƢƠNG IV :TIMER 46
I.MỤC ĐÍCH THÍ NGHIỆM 46
II.DỤNG CỤ THÍ NGHIỆM 46
III.CƠ SỞ LÝ THUYẾT 46
1.Nguyên tắc hoạt động của timer : 47
2.Timer 0 47
3.Timer 1 50
4.Timer 2 53
IV.BÀI TẬP THỰC HÀNH 55
V.BÀI TẬP TỰ GIẢI 60
CHƢƠNG V: KHỐI CCP 61
(CAPTURE-COMPARE-PWM) 61
I.MỤC ĐÍCH THÍ NGHIỆM 61
II.DỤNG CỤ THÍ NGHIỆM 61
III.CƠ SỞ LÝ THUYẾT 61
1.Thanh ghi khởi tạo khối CCP1 Khối CCP1 còn tích hợp thêm 4 chân mang kí hiệu :
P1A, P1B, P1C, P1D hỗ trợ cho việc điều khiển cầu H. 62
2.Thanh ghi khởi tạo khối CCP2 63
3.Capture 64
4.Compare 64
5.PWM(Pulse-Width Modulated) 65
6.Các bước khởi tạo chức năng PWM 66

IV.BÀI TẬP THỰC HÀNH 67
V.BÀI TẬP TỰ GIẢI 70
CHƢƠNG VI :GIAO TIẾP NỐI TIẾP BẤT ĐỒNG BỘ 72
I.MỤC ĐÍCH THÍ NGHIỆM 72
II.DỤNG CỤ THÍ NGHIỆM 72
III.CƠ SỞ LÝ THUYẾT 72
1.Khái niệm về giao tiếp nối tiếp bất đồng bộ 72
2.Các thanh ghi điều khiển truyền UART 74
3.Các thanh ghi điều khiển nhận UART 76
Giáo trình thí nghiệm vi điều khiển ứng dụng

3

5.Công thức tính tốc độ baund rate 78
IV:BÀI TẬP THỰC HÀNH 78
V.BÀI TẬP TỰ GIẢI 81
TÀI LIỆU THAM KHẢO 83
PHỤ LỤC 84
I.CỬA SỔ CHƢƠNG TRÌNH 84
II.CÁC BƢỚC KHỞI TẠO MỘT PROJECT MỚI 84
II.HI TECH C CƠ BẢN 88
1.Khai báo biến 88
2.Kiểu con trỏ 89
3.Kiểu enum 89
4.Phép toán học 90
5.Phép toán gán 90
6.Phép toán tăng , giảm 90
7.Phép toán quan hệ 90
8.Tóan tử logic 91
9.Toán tử theo bit 91

10.Chèn một đoạn code Assembly 91
11.Các toán tử ưu tiên 92
12.Câu điều kiện 92
13.Toán tử lựa chọn 94
14.Vòng lặp 95
15.Mảng 1 chiều 96
16.Mảng hai chiều 97
17.Cấu trúc của một chương trình c cơ bản 97
IV.SƠ ĐỒ NGUYÊN LÝ KIT THÍ NGHIỆM 98
V.FILE LCD 101
1.lcd.c 101
2.lcd.h 106

Giáo trình thí nghiệm vi điều khiển ứng dụng

4

CHƢƠNG I : PHẦN CỨNG PIC16F

I.KIẾN TRÚC :
Microchip Pic được thiết kế dựa trên kiến trúc Harvard, một kiến trúc RISC (Reduced
Instruction Set Conputer – Máy tính với tập lệnh đơn giản hóa). Đây là một kiến trúc mới với
nhiều cải tiến nâng cao hiệu năng xử lý và giảm thiểu giá thành sản xuất. Vậy thì những đặc tính
nào của kiến trúc Havard mang lại hiệu quả cho PIC, chúng ta thử so sánh hai kiểu RISC khá
phổ biến là Von Neumann và Harvard.
1.Kiến trúc Von neumann:
Còn gọi là kiến trúc Princeton, cách tổ chức bộ nhớ của kiểu kiến trúc này là cả bộ nhớ
chương trình và bộ nhớ dữ liệu được xem như một vùng nhớ, dùng chung một Bus dữ liệu. Thời
kỳ đầu của kỷ nguyên máy tính, bộ nhớ không có độ tin cậy như hiện nay và hay tạo ra những lỗi
hệ thống. Chính vì vậy mà kiểu kiến trúc này được ưa chuộng, bởi vì nó được dễ dàng thiết kế,

nâng cao độ tin cậy của hệ thống và dễ dàng thay thế những vùng nhớ bị lỗi kỹ thuật. Nhờ những
lợi thế đó mà trong một thời gian kiểu kiến trúc này đã được thương mại và sản xuất. Tuy nhiên
nó cũng có một số nhược điểm: hạn chế băng thông, thực hiện nhiều lần lấy dữ liệu chỉ cho một
lệnh, không thể thực hiện song song thao tác này. Chính vì sự phổ biến đầu tiên của kiến trúc
Von Neumann mà hầu hết các loại Vi Điều Khiến đều được xây dựng quanh cấu trúc này, mặc
dù giá thành bộ nhớ hiện nay đã rẻ hơn rất nhiều và độ tin cậy cũng tăng lên rất nhiều.


Hình 1: Kiến trúc bộ nhớ kiểu Von Neuman
2.Kiến trúc harvard :
Havard có không gian nhớ dành cho bộ nhớ dữ liệu và bộ nhớ chương trình riêng biệt. Lợi
thế và hiệu năng chính của kiểu dữ liệu này là nó có 2 Bus dữ liệu riêng biệt hoạt động đồng thời
phục vụ cho bộ nhớ dữ liệu và bộ nhớ chương trình: Trong khi CPU lấy dữ liệu từ bộ nhớ
chương trình, thì nó vẫn có thể đọc ghi dữ liệu ở vùng nhớ dữ liệu.

Von Neumann
Architecture
8-bit
Bus
CPU
Program
& Data
Memory
Giáo trình thí nghiệm vi điều khiển ứng dụng

5

Một lợi thế khác của kiến trúc Harvard là độ rộng Bus bộ nhớ chương trình và Bus dữ liệu
có thể khác nhau. Không phải tất tất cà các loại Vi Điều Khiển có kiến trúc Harvard điều có lợi
thế này, nhưng PIC thì có. Do bus có độ rộng khác nhau nên độ rộng Bus bộ nhớ chương trình có

thể rộng hơn bộ nhớ dữ liệu. Với PIC-8bit thì Bus dự liệu luôn là 8-bit, tuy nhiên Bus bộ nhớ
chương trình có thể rộng hơn, bao nhiêu tùy thuộc và mục đích của loại PIC đó. Với PIC 8-bit
thì có 3 loại được phân chia thành loại có độ rộng Bus bộ nhớ chương trình là 12-bit, 14-bit, và
16-bit. Bus bộ nhớ chương trình rộng hơn sẽ đưa dữ liệu từ bộ nhớ chương trình nhiều hơn cũng
trong một chu kỳ máy.


Hình 2: Kiến trúc bộ nhớ kiểu Von Neuman
II.INSTRUCTION PIPELINING:
Việc lấy lệnh/dữ liệu từ bộ nhớ chương trình cũng được thiết kế nâng cao hiệu suất.
Instruction pipelining là cách thức lấy và thực thi lệnh từ bộ nhớ chương trình một cách đồng
thời. Có thể xem hình:

Hình 3: Quy trình thực thi các lệnh

PIC có bus truy xuất bộ nhớ chương trình và bus truy xuất bộ nhớ dữ liệu riêng biệt có thể
hoạt động đồng thời. Nhưng trong quá trình ta lấy một lệnh, làm thế nào biết được dữ liệu cần
CPU
Harvard
Architecture
Data
Memory
Program
Memory
8-bit
Bus
14-bit
Bus
Giáo trình thí nghiệm vi điều khiển ứng dụng


6

thiết cho lệnh đó ở đâu để thực thi đồng thời hai thao tác này trong một chu kỳ lệnh, bởi vì thông
tin địa chỉ của dữ liệu cần thiết trong vùng nhớ dữ liệu nằm trong lệnh kia.Vấn đề được giải
quyết bằng Instruction Pipelining.
Trong chu kỳ lệnh đầu tiên khi CPU hoạt động, lệnh được lấy vào Pipeline. Bus bộ nhớ
chương trình được truy xuất, Bus dự liệu không hoạt động.

Hình 4: Thực hiện lệnh trong chu kỳ đầu tiên

Trong chu kỳ lệnh thứ 2, lệnh lấy trước đó được thực thi, có nghĩa là Bus dữ liệu hoạt động
trao đổi dữ liệu với CPU khi CPU thực thi lệnh. Đồng thời trong lúc này, cả 2 Bus đều hoạt động
đồng thời.

Hình 5: Thực hiện lệnh trong chu kỳ thứ hai

Trong chu kỳ lệnh thứ 3, lệnh thứ 2 lấy trước đó được thực thi, đồng thời lệnh tiếp theo
được lấy. Tới lúc này thì mọi thứ đã khá rõ ràng, ngoại trừ chu kỳ lệnh đầu tiên ra, mỗi chu kỳ
lệnh sẽ thực thi xong một lệnh, bao gồm 2 bước lấy lệnh và thực thi. Bởi vì lúc thực thi 1 lệnh thì
lệnh đó đã có sẵn, và thông tin về địa chỉ bộ nhớ dữ liệu cũng đã được lấy vào từ lúc lệnh trước
thực thi.
Giáo trình thí nghiệm vi điều khiển ứng dụng

7


Hình 6:Thực hiện lệnh trong chu kỳ thứ ba

Chu kỳ thứ 4,5:Với quy trình như vậy thì lệnh nằm sau luôn luôn thực thi khi lệnh trước nó
thực thi xong. Tuy nhiên khi bộ đếm chương trình bị thay đổi bằng một lệnh, thì có thể lệnh sau

đó không được thực hiện. Ở đây, lệnh Call được thực thi khiến chương trình nhảy đến vùng nhớ
khác và lệnh đằng sau lệnh Call tất nhiên chỉ được thực thi sau khi chương trình trở về từ hàm
SUB1. Nhưng, khi lệnh Call được thực thi thì lệnh kế tiếp nó vẫn được lấy vào Pipeline.


Hình 7: Thực hiện lệnh trong chu kỳ thứ 4

Như vậy cần thiết phải loại bỏ lệnh sau Call ra khỏi Pipeline, đồng thời lấy một lệnh khác
vào Pipeline. Có thể thấy, với bất kỳ một lệnh nào làm thay đổi bộ đếm chương trình thì phải mất
2 chu kỳ máy.
Giáo trình thí nghiệm vi điều khiển ứng dụng

8







Giáo trình thí nghiệm vi điều khiển ứng dụng

9

III.KÍCH THƢỚC TỪ LỆNH
Bởi vì có kiến trúc Harvard nên vi điều khiển PIC có độ rộng của Bus bộ nhớ chương trình
không nhất thiết bằng với độ rộng của Bus bộ nhớ dữ liệu (vi điều khiển 8 bit thì bus có độ rộng
8 bit). Đối với một số vi điều khiển dùng kiến trúc Von neumann thì sẽ có cùng độ rộng bus. Do
đó rất nhiều lệnh đòi hỏi 2 byte mới có thể cung cấp đầy đủ thông tin để thực thi. Đơn giản, một
lệnh LDAA(Load Data to Accumulator A) chuyển một hằng số 8 bit vào thanh ghi A đòi hỏi ít

nhất 2 byte dữ liệu hằng 8 bit, và byte còn lại cho lệnh. Điều này có nghĩa là, khi thực hiện lệnh
này, bộ nhớ bị truy xuất 2 lần. Ngoài việc kém hiệu quả về tốc độ truy xuất ra, các tổ chức từ
lệnh 1, 2 hay 3 của kiểu kiến trúc này làm cho việc thiết kế một vi điều khiển với bộ nhớ vừa
phải hợp yêu cầu khó khăn hơn.

Hình 8: Quy trình thực thi lệnh LDAA

Đối với PIC16F mà chúng ta đang dùng, kiến trúc bộ nhớ được thiết kế là 14 bit có độ rộng
bus bộ nhớ chương trình, phù hợp với các ứng dụng vừa phải. Từ lệnh dài như vậy sẽ chứa được
nhiều thông tin hơn, đủ để thực thi một công việc chỉ với một từ lệnh, có nghĩa là chỉ cần truy
xuất bộ nhớ 1 lần cho 1 lệnh. Với thiết kế này thì kích thước bộ nhớ sẽ tối ưu hơn so với các kích
thước bộ nhớ kiểu khác.

Hình 9: Thực thi một công việc chỉ với một từ lệnh




Giáo trình thí nghiệm vi điều khiển ứng dụng

10

IV.THIẾT KẾ PHẦN CỨNG CHO PIC
1.Mạch nguyên lý:
Các chân nguồn Vdd phải được cấp nguồn đầy đủ, không được bỏ trống: Chip càng nhiều
tính năng thì lượng Transistor càng lớn, khi số lượng Transistor trong chip tăng lên, thì độ dài
đường cấp nguồn trong diesilicon cũng tăng lên, làm điện trở tăng gây ra mất cân đối điện áp
cung cấp trên các vùng của chip. Hơn nữa khi đường nối dài thì cảm kháng ký sinh cũng tăng
theo làm áp cung cấp cho các vùng trên cũng bị sụt tức thời khi chip hoạt động ở tần số cao.
Những hiệu ứng này làm chip hoạt động kém ổn định. Do đó chip đưa ra nhiều đầu cấp nguồn

để làm giảm các hiệu ứng trên.
Phải có các tụ decouling 0.1uF đặt gần các chân cấp nguồn (khi vẽ PCB phải đặt càng gần
càng tốt): Mặt dù dòng tiêu thụ trung bình có thể nhỏ nhưng khi hoạt động ở tần số cao, dòng
điện tức thời mà chip cần (để nạp các cổng của các MOSFET) là rất lớn. Do di/dt lớn nên ảnh
hưởng của điện cảm trên đường mạch cũng rất lớn.
Ngoài ra các ổn áp tuyến tính điều không thể cung cấp được dòng điện này cho chip. Vì
vậy bạn phải cần các tụ điện để tích điện tạm thời trong chu kỳ chip không hoạt động và xả dòng
để cung cấp cho chip trong chu kỳ hoạt động. Các tụ điện này phải: ESR thấp để có khả năng xả
dòng lớn. Tụ gốm (tụ bi) 0.1uF là phù hợp. Đôi khi có thể mắc song song thêm 1 tụ 0.01uF thật
gần 2 chân nguồn của chip để giảm điện cảm, điện trở của đường mạch. Khi lắp các tụ
decouling, trên các đường cấp nguồn sẽ có nhiễu tần số cao do nạp và xả các tụ này cộng thêm
nhiễu từ các nguồn khác và cần phải triệt tiêu. Nhưng đây là vấn để rất phức tạp: Sử dụng LDO
tốt , dòng tĩnh thấp, nếu phải xài 7805, với một loại chỉ cần có 1 con 0.1uF sát ngay chân output
để tránh bị dao động.
Tăng kích thướng đường nguồn để giảm điện cảm.
Đặt rải rác các tụ 10uF(low ESR) trên các đường cấp nguồn.
Nếu phải dùng các tải cảm như relay, motor, và dùng chung nguồn, nên đi 2 đường mạch
Vss – Vdd riêng.
Dủng diode schottky(1N5817, 1N5822…) thay vì các loại nắn dòng (1N4001, 1N4007…)
để dập dòng cảm ứng trong các tải cảm. Có một số linh kiện gọi là tranzorbs, sidactor để dập các
dòng cảm ứng.
Đặt thạch anh sát gần với PIC: Khi thiết kế PCB, nên đặt thạch anh gần với PIC, nhất là
khoảng cách từ chân OSCI đến chân thạch anh phải càng ngắn càng tốt, dao động đi vào chân
này, càng xa càng nhiễu gây mất ổn định cho PIC.









Giáo trình thí nghiệm vi điều khiển ứng dụng

11

2.Chuẩn ICSP(In-Circurt Serial Programming)
Đây là chuẩn nạp trực tiếp cho vi điều khiển PIC kể cả khi PIC được hàn trên Board, gồm
có 6 chân như theo thứ tự :

Hình 10: Vị trí các chân trong chuẩn ICSP

Chỉ cần 5 chân từ 1 đến 5 là có thể nạp được PIC, tuy nhiên có thêm chân số 6 để đề phòng
trường hợp nếu như cắm ngược, lúc đó chân MCLR/Vpp sẽ đưa vào chân NC, khi thiết bị nạp
chân Chip, nó sẽ nâng điện áp chân MCLR/Vpp lên từ 8-13V, nếu chân MCLR/Vpp nối vào một
I/O bất kỳ, có thể gây hỏng.
Bus nạp cho chuẩn ICSP này ta có thể chọn loại Bus có quy định chiều cắm thì càng tốt.

3.Các tính năng đặc biệt, các bit cấu hình của PIC16F887:
PIC16F887 có một loại các tính năng nhằm tối đa hóa độ tin cậy của hệ thống, giảm thiểu
chi phí qua việc loại bỏ các linh kiện bên ngoài, các tính năng bảo vệ mã, tiết kiệm năng lượng.
Những tính năng đó là:
 Reset
 Power-on Reset (POR)
 Power-up timer (PWRT)
 Oscillator Start-up Timer (OST)
 Brown-out Reset (BOR)
 Interrupts
 Watchdog timer (WDT)
 Oscillator selection

 Sleep
 Code protection
 ID Locations
 In-Circurt Serial Programming
 Low-voltage In-Circurt Serial Progrmamming

Giáo trình thí nghiệm vi điều khiển ứng dụng

12

Một vài tính năng trên sẽ luôn luôn sẵn có, nhưng một vài tính năng khác thì cần phải cấu
hình trong lúc nạp chương trình cho PIC. Cấu hình là việc bật/tắt các bit trong thanh ghi cấu
hình CONFIG1 và CONFIG2 của PIC, thanh ghi này nằm trong bộ nhớ chương trình nên có độ
rộng bằng độ rộng của từ lệnh (14-bits) và được ghi bằng bộ nạp (hay self-write). Các tính năng
đó cũng là tính năng cần thiết để PIC có thể chạy được , do đó trước khi lập trình cần xác định
PIC cần những tính năng gì để tiến hành cấu hình cho nó trước khi chạy. Có 2 cách để thực hiện
công việc cấu hình này, sử dụng từ khóa chỉ dẫn của Hi-tech C để đưa các bit này vào trong
code (file*.hex) và dùng MPLAB để cấu hình. Phần tiếp theo sẽ trình bày về các tính năng của
PIC và cách thức cấu hình bằng Hi-Tech C, phần dùng MPLAB sẽ trình bày sau cùng.
Trước khi thực hiện cấu hình các bit cấu hình cho PIC, cần tham khảo datasheetsPIC
16F887, mục 14.0 special features of the CPU và file pic16f887.h trong thư mục include của
trình biên dịch Hi-Tech C (ví dụ ở phiên bản 9.65 Pro, thư mục mặc định này nằm ở c:\program
Files\Hi-Tech\Software\PICC\PRO\9.65\include\pic16f887.h).
Khi muốn đặt trước các bit cấu hình vào trong chương trình viết bằng Hi-Tech C, từ khóa
để trình dịch biết được để đặt những tùy chọn vào mã là __CONFIG (nhớ là có hai dấu gạch
dưới).
__CONFIG (OPTION & OPTION2 & OPTION3 &…);
__CONFIG (OPTION & OPTION2 & OPTION3 &…);
….
Trong đó các OPTION1,OPTION2 … là những định nghĩa nằm trong file pic16f887.h của

Hi-tech C, được cách nhau bằng dấu „&‟. Từ __CONFIG đầu tiên cấu hình cho thanh ghi
CONFIG1,__CONFIG thứ 2 cấu hình cho thanh ghi CONFIG2
Một chương trình mẫu khi sử dụng các bit cấu hình đặt trong chương trình:
/////////////////////Cấu hình thanh ghi CONFIG1
XT: Dao động thạch anh bên ngoài, 4Mhz
WDTDIS: Tắt chức năng watch-dog
PWRTEN: Mở tính năng Power-up Timer
MCLREN: Mở tính năng master clear từ chân MCLR
UNPROTECH : không bảo vệ mã
DUNPROTECH: Không bảo vệ dữ liệu trong EEPROM
BORDIS: Không sử dụng Brown-out reset
IESODIS: Không sử dụng tính năng Internal External Switchoer
FCMDIS: Không sử dụng tính năng Fail-Safe Clock Monitor
LVPDIS:Không sử dụng tính năng LVP.
/////////////////////Cấu hình thanh ghi CONFIG2
BORV40: Nếu Brown-out Reset được cho phép, thì điện áp Vbor = 4V
Cho phép PIC được ghi lên Flash ( không xuất hiện WP0,WP1, WP2 nghĩa là cho
phép tất cả ).


Giáo trình thí nghiệm vi điều khiển ứng dụng

13

Thanh ghi cấu hình CONFIG1:
DEBUG: tích cực mức thấp, khi bit này bị xóa(0), chip sẽ hoạt động ở chế độ gỡ rối, chạy
từng bước, truyền thông tin bộ nhớ về thiết bị gỡ rối. Chân RB6/CLK và RB7/DAT hoạt động
với chức năng gỡ rối. Ngược lại, khi bit này bật lên bằng (1), chip không thực hiện tính năng
Debug, thay vào đó RB6/CLK và RB7/DAT hoạt động như một I/O thông thường. Chú ý là bit
này có thể xóa hay bật bởi MPLAB khi chọn chế độ nạp hay gỡ rối trên MPLAB, do vậy trong

quá trình làm việc không nhất thiết quan tâm đến bit này.
Trong Hi-tech C định nghĩa Debug:
// In-Circuit Debugger Mode
#define DEBUGEN 0x1FFF // Enable ICD2 debugging
#define DEBUGDIS 0x3FFF // Disable ICD2 debugging

LVP (Low Voltage Programming): tính năng lập trình điện áp thấp, nghĩa là nạp chip với
điện áp làm việc của nó(5V), khi tính năng này được cho phép (bit được bật(1)) , có thể nạp chip
thông qua ICSP với điện áp nguồn của nó.Khi thực hiện tính năng này, chân RB3/PGM phải
được nối lên Vdd, điều này có nghĩa là không thể sữ dụng RB3 như một I/O, nó phục vụ cho tính
năng LVP và chân MCPR/Vpp phải cấp điện áp VDD. Chú ý : tính năng lập trình điện áp cao
luôn có, với tính năng này , PIC luôn được có thể nạp thông qua cổng ICSP khi điện áp chân
MCLR/Vpp nâng lên khoảng 13V (tùy loại PIC, có loại chỉ có 8V).Thông thường tính năng này
ít sử dụng và được tắt để tận dụng chân RB3 như I/O.
Trong Hi-Tech C định nghĩa như sau:
// Low Voltage Programming
#define LVPDIS 0x2FFF // Disabled
#define LVPEN 0x3FFF // Enabled
FCMEN (Fali safe Clock Monitor Enable ): Tính năng này cho phép PIC tiếp tục hoạt
động nếu nguồn dao động bên ngoài bị hỏng. FSCM có thể dùng với các nguồn dao động ngoài
như: LP , XT, HS, EC, RC và RCIO (tham khảo phần dao động). Nguyên tắc hoạt động, xem
mạch mô tả.

Hình 11: Sơ đồ khối FSCM trong PIC16F887
Giáo trình thí nghiệm vi điều khiển ứng dụng

14

FSCM phát hiện sự sai khác dao động bằng cách so sánh dao động bên ngoài với dao động
mẫu từ nguồn dao động nội tần số thấp (LFINTOSC) được chia 64. Như hình trên, bên trong

FSCM là một SR Latch, cứ mỗi xung clock bên ngoài đưa vào sẽ bậc ngõ ra Q=1 và cứ khoảng
2ms, dao động mẫu sẽ xóa ngõ ra Q=0; Dao động bên ngoài hỏng sẽ được phát hiện ngay nếu
trong hơn một nữa chu kỳ của dao động mẫu, Q luôn bằng 0.

Hình 12: Quy trình hoạt động khối FSCM

Khi dao động bên ngoài bị hỏng, FSCM sẽ chuyển dao động dùng cho PIC từ nguồn dao
động bên ngoài sang nguồn dao động nội, đồng thời bật cờ OSFIF trong thanh ghi PIR2, sẽ gây
ngắt nếu OSFIF trong thanh ghi PIE2 được cho phép. Dao động nội được dùng cho tới khi nào
nguồn dao động bên ngoài được phục hồi và phần mềm trong PIC chuyển sang dao động ngoài.
Dao động nội được FSCM chọn phục thuộc vào 3 bit IRCF<2:0> trong thanh ghi OSCCON,
nghĩa là FSCM cho phép cấu hình dao động nội trước khi FSCM nhận biết sự hỏng hóc của dao
động bên ngoài.
Khi phần mềm PIC thay đổi nguồn dao động (dao động nội và dao động ngoại), tức là bật,
tắt bit SCS, thì coi như FSCM khởi động lại từ đầu, lúc này bit OSFIF mới được phép xóa.Ngoài
ra, sau khi PIC khởi động từ RESET hay SLEEP, FSCM cũng khởi động.
Định nghĩa trong Hi-Tech C:
// Monitor Clock Fail-safe
#define FCMEN 0x3FFF // Enabled
#define FCMDIS 0x37FF // Disabled

IESO (Internal External Switch Over ): Bit này dùng để cấu hình cho chế độ khởi động 2
tốc độ (Two-speech Start up). Đây là tính năng giúp giảm thiểu năng lượng tiêu hao trên PIC do
quá trình khởi động gây ra bằng cách giảm thiểu độ trễ dao động bên ngoài và quá trình thực thi
mã.Với những ứng dụng thường sử sụng như SLEEP để tiết kiện năng lượng, TSS thực sự hiệu
quả khi mà PIC đi vào SLEEP và thức dậy tử SLEEP một cách nhanh chóng.TSS sẽ sử dụng dao
động nội trong quá trỉnh khởi động, ngay sau khi dao động bên ngoài ổn định, PIC sẽ tự chuyển
sử dụng dao động bên ngoài.
Giáo trình thí nghiệm vi điều khiển ứng dụng


15

Các bước thực hiện khi sữ dụng TSS:
Cấu hỉnh IESO=1, trong thanh ghi CONFIG1, cấu hình này thực hiện trong quá trình nạp.
SCS=0 (trong thanh ghi OSCCON), chọn nguồn dao động sử dụng lả dao động nội.
FOSC<2:0> phải chọn dao động chính là dao động bên ngoài (LP,XT hat HS).
Định nghĩa IESO trong Hi-Tech C:
// Internal External Switch Over Mode
#define IESOEN 0x3FFF // Enabled
#define IESODIS 0x3BFF // Disabled

BOREN<1:0> (Brown – Out Reset Enable): Đây là tính năng Reset của PIC khi điệp áp nhỏ hơn
một mức nào đó đã được định nghĩa (V
BOR
). Brown –Out Reset hoạt động như sau:

Hình 13: Sơ đồ tín hiệu điện áp Brown out

Khi điện áp trên chân cấp nguồn (Vdd) nhỏ hơn điện áp V
BOR
, PIC sẽ bị Reset, quá trình
này giữ khoảng 64ms kể từ lần cuối cùng bị Brown – Out. Cấu hình Brown – out trong thanh ghi
CONFIG1 chia ra làm 4 chế độ:
 BOREN<1:0> = 11:Brown – out Reset được cho phép, hoạt động cả khi PIC Sleep, điện
áp V
BOR
phụ thuộc vào BOR4V ở thanh ghi CONFIG2.
 BOREN<1:0> = 10:Brown – out Reset Chỉ hoạt động khi PIC hoạt động, và tắt khi PIC
sleep .
 BOREN<1:0> = 01:Brown – out Reset phụ thuộc vào bit SBOREN trong thanh ghi

PCON, bit này có thể bật/tắt bằng phần mềm trong PIC .
 BOREN<1:0> = 0:Brown – out Reset không hoạt động.


Giáo trình thí nghiệm vi điều khiển ứng dụng

16

Định nghĩa Brown – Out Reset trong Hi – tech C:
// Brown Out Detect
#define BORDIS 0x3CFF // BOD and SBOREN disabled
#define SWBOREN 0x3DFF // SBOREN controls BOR function
(Software control)
#define BORXSLP 0x3EFF // BOD enabled in run, disabled in
sleep, SBOREN disabled
#define BOREN 0x3FFF // BOD Enabled, SBOREN Disabled

CPD (Code Protect Data): Bit này tích cực mức thấp, khi cấu hình bằng 0, cho phép bảo vệ
dữ liệu trong EEPROM, sẽ không thể đọc lại dữ liệu EEPROM từ PIC bằng bất cứ chương trình
với sự hỗ trợ của thiết bị nạp nào.
Định nghĩa tring Hi – tech C:
// Data EE Read Protect
#define DUNPROTECT 0x3FFF // Do not read protect EEPROM data
#define CPD 0x3F7F // Read protect EEPROM data

CP(Code Protect): Bảo vệ toàn bộ bộ nhớ chương trình, tích cực mức thấp, khi được xóa
bằng 0, không thể đọc lại nội dung từ bộ nhớ chương trình của PIC.Chú ý: trong quá trình gỡ rối
(Debug), CP không cho phép, MPLAB sẽ cảnh báo và yêu cầu nếu cố tình cho phép CP (CP=0)
trong quá trình gỡ rối.
// Code Protect

#define UNPROTECT 0x3FFF // Code is not protected
#define CP 0x3FBF // Code is protected
#define PROTECT CP //alternate

MCLRE(Master Clear Enable): Đây là tính năng cho phép PIC có thể bị reset bằng chân
MCLR. Khi bit MCLRE(tích cực mức thấp) được cho phép (bị xóa bằng 0), thì chân Master
Clear có thể reset PIC khi được cấp mức 0, và khi PIC hoạt động, phải cấp mức logic1. Mạch
điện trên chân MCLR nên dùng như hình :

Hình 14: Kết nối phần cứng khi sử dụng chế độ Master clear
Giáo trình thí nghiệm vi điều khiển ứng dụng

17

Khi bit MCLRE không được cho phép (bằng 1), thì chân MCLR không có tính năng reset
PIC, lúc này chân MCLR/RA3 chỉ hoạt động như một ngõ vào.
Định nghĩa trong Hi-Tech C:
// Master Clear Enable
#define MCLREN 0x3FFF // MCLR function is enabled
#define MCLRDIS 0x3FDF // MCLR functions as IO

PWRTEN(Power – up Timer Enable): Tính năng này cho phép giữ PIC reset trong khoảng
64ms từ khi cấp nguồn, hay bị reset bởi Brown – out. Bit này tích cực mức thấp.
// Power Up Timer
#define PWRTDIS 0x3FFF // Off
#define PWRTEN 0x3FEF // On

WDTE (Watchdog Timer Enable): Tích cực mức cao khi được cho phép, Timer Watchdog
sẽ chạy, và sẽ gây reset chip mỗi khi tràn. Nếu không được cho phép thì WDT sẽ bị tắt, đồng
thời được điều khiển bằng phần mềm trong PIC thông qua thanh ghi WDTCON



Hình 15: Khối Watch dog timer trong Vi điều khiển

Sơ lược về tính năng Watchdog: Watchdog timer là một timer có nguồn dao động RC
31Khz độc lập với dao động của PIC, có thể coi đây là mộ timer có thể cấu hình được giá trị nó
đếm, (đếm 32xung tràn (5 bit) hay đếm 65536 xung tràn(16 bit) … ), khi WDT Timer tràn sẽ
Reset PIC. Nếu sử dụng WDT, trong một khoảng thời gian nhất định, nhỏ hơn thời gian tràn của
WDT Timer thì phải xóa bộ đếm của WDT về 0, đều này hữu ích khi PIC bị treo và không thể
xóa bộ đếm của WDT Timer.


Giáo trình thí nghiệm vi điều khiển ứng dụng

18

Chú ý: Khi dùng Watchdog Timer, thì cần cấu hình thời gian cần thiết để WDT tràn, việc
cấu hình bằng phần mềm trong PIC, tác động lên các bit WDTPS<3:0> trong thanh ghi
WDTCON.
Định nghĩa trong Hi – Tech C:
// Watchdog Timer
#define WDTEN 0x3FFF // On
#define WDTDIS 0x3FF7 // Disabled / SWDTEN control

FOSC<2:0> (Oscliiator Selection): Chọn chế độ dao động chính của PIC, 3 bit FOSC<2:0>
có thể lựa chọn được 8 chế độ. Khi lựa chọn chế độ dao động, cần phải tìm hiểu các chế độ dao
động của: PIC hoạt động như thế nào.


Hình 16: Sơ đồ khối dao động bên trong vi điều khiển


 FOSC<2:0>=000:chế độ dao động dùng thạch anh LP(Low power), 2 chân OSC1 và
OSC2 được nối với thạch anh tần số thấp (32Khz).
 FOSC<2:0>=001:chế độ dao động dùng thạch anh với độ lợi trung bình XT, sử dụng hai
chân OSC1 và OSC2 nối với thạch anh có tần số nhỏ hơn 10Mhz.
 FOSC<2:0>=010:chế độ dao động dùng thạch anh với độ lợi cao HS, sử dụng 2 chân
OSC1 và OSC2 nối với thạch anh có tần số lớn hơn 10 Mhz.
Giáo trình thí nghiệm vi điều khiển ứng dụng

19


Hình 17: Sơ đồ sử dụng thạch anh ngoài, tần số cao

 FOSC<2:0>=011:chế độ dao động từ nguồn xung clock bên ngoài EC(External
Clock).Chân RA6/OSC2/CLKOUT hoạt động như một I/O thông thường, clock đưa vào chân
RA7/OSC1.CLKIN.


Hình 18: Chế độ sử dụng clock ngoài với một chân clock

 FOSC<2:0>=100: Chế độ dao động nội INTOSCIO, lúc này dao động được lấy từ nguồn
dao động bên trong PIC, tần số dao động phụ thuộc vào các bit IRCF<2:0> trong thanh ghi
OSCCON, mặc định các bit IRCF<2:0> cấu hình dao động nội là 4Mhz khi Reset.Chân
RA6/OSC2/CLKOUT và RA7/OSCI/CLKIN hoạt động như I/O thông thường.
 FOSC<2:0>=101:Chế độ dao động nội INTOSC, tương tự như INTOSCIO, nhưng chân
RA6/OSC2/CLKOUT xuất xung clock ta ngoài với tần số bằng tần số đã chọn chia 4.
 FOSC<2:0>=110:Chế độ dao động dùng tụ điện trở bên ngoài RCIO, dao động sẽ được
đưa vào chân RA7/OAC1/CLKI, và chân RA6/OSC2/CLKOUT hoạt động như một I/O thông
thường.


Hình 18: Dao động dùng tụ và điện trở
Giáo trình thí nghiệm vi điều khiển ứng dụng

20

 FOSC<2:0>=111:Chế độ RC, giống như RCIO, tuy nhiên RA6/OSC2/CLKOUT xuất
xung clock bằng xung đưa vào chia 4.
Đối với phần dao động, chú ý đến bit SCS trong thanh ghi OSCCON, bit này có thể thay
đổi bằng phần mềm trong PIC, mặc định SCS = 0. Khi SCS bằng 0, PIC sẽ chạy bằng dao động
định nghĩa bởi FOSC<2:0> trong thanh ghi CONFIG1 như đã bàn ở trên, khi SCS bằng 1, dao
động được sử dụng là dao động nội, và tần số được quyết định bởi IRCF<2:0> trong thanh ghi
OSCCON. Ngoài ra việc cân chỉnh cho dao động nội chính xác thì sử dụng thanh ghi
OSCTUNE.
Định nghĩa trong Hi – TechC:
// Oscillator
#define EXTCLK 0x3FFF // External RC Clockout
#define EXTIO 0x3FFE // External RC No Clock
#define INTCLK 0x3FFD // Internal RC Clockout
#define INTIO 0x3FFC // Internal RC No Clock
#define EC 0x3FFB // EC
#define HS 0x3FFA // HS
#define XT 0x3FF9 // XT
#define LP 0x3FF8 // LP























Giáo trình thí nghiệm vi điều khiển ứng dụng

21


CHƢƠNG II : XUẤT NHẬP I/O PORT

I.MỤC ĐÍCH THÍ NGHIỆM :
Kiến thức sinh viên cần đạt được sau khi thực tập:
 Liệt kê các thanh ghi liên quan đến việc xử lý tín hiệu số ở các chân vi điều khiển .
 Khởi tạo các chân của vi điều khiển là ngõ ra , vào số .
 Giải thích được công dụng của hàm _delay(n) , cách dùng hàm delay để chống dội cho
nút nhấn.
 Lập trình điều khiển led theo yêu cầu .

 Giải thích ưu khuyết điểm của ngắt .

II.DỤNG CỤ THÍ NGHIỆM :
 Kít thí nghiệm + cáp USB.
 Máy tính .
 Nguồn 12V/1A.

III.CƠ SỞ LÝ THUYẾT :
1.Thanh ghi qui định tín hiệu xử lý ở chân vi điều khiển là tín hiệu số hay tín hiệu tƣơng
tự:



Hình 19: Các chân có thể xử lý tín hiệu số Hình 20: Các chân có thể xử lý tín hiệu tương tự

Những chân có kí hiệu ANX là những chân vừa có thể xử lý tín hiệu số vừa có thể xử lý tín
hiệu tương tự . Do đó khi làm việc với những chân này ta cần chú ý đến hai thanh ghi :


Giáo trình thí nghiệm vi điều khiển ứng dụng

22




Hai thanh ghi này có tổng cộng 14bit từ ANS0 đến ANS13 , sẽ quy định tín hiệu làm việc
của các chân từ AN0 đến AN13 là tín hiệu số hay tín hiệu analog .
 ANSX=0 : Cho phép chân ANX xử lý tín hiệu số .
 ANSX=1 : Cho phép chân ANX xử lý tín hiệu tương tự .

 Trong đó : X= 0 – 13

2.Chức năng của thanh ghi TRIS :
Trong các chân xử lý tín hiệu số , hoạt động của chân có thể là ngõ ra (làm cho led chớp tắt,
kích transistor , điều khiển hoạt động IC ) , hay có thể là ngõ vào (đọc trạng thái nút nhấn , đọc
encoder , đọc tín hiệu từ cảm biến số ). Như vậy , để khởi tạo cho các chân là ngõ ra hay ngõ
vào tín hiệu số , chúng ta cần chú ý đến thanh ghi TRISX (X=A,B,C,D,E):



 TRISXY=0:Quy định bit thứ Y của PORTX là ngõ ra (0 = Output)
 TRISXY=1:Quy định bit thứ Y của PORTX là ngõ vào (1=Input)
(Trong đó :X=A,B,C,D,E ; Y=0-7)

 Chú ý : PORTE chỉ có 4 bit thấp : TRISE0, TRISE1, TRISE2 ,TRISE3.

3. Chức năng của thanh ghi PORT :
Trong trường hợp xử lý tín hiệu số và là ngõ ra , thì có thể là ngõ ra mức cao (điện áp ở chân
đó là V
H
) , hay ngõ ra là mức thấp (điện áp là V
L
) sẽ do bit RXY của thanh ghi PORTX quy
định .



 RXY=0 : Quy định chân thứ Y của PORTX là mức thấp(V
L
).

 RXY=1: Quy định chân thứ Y của PORTX là mức cao(V
H
).
(Trong đó : X=A,B,C,D,E ; Y=0-7)


Giáo trình thí nghiệm vi điều khiển ứng dụng

23

 Tóm lại ta có bảng tóm tắt sau :

ANSX
TRISXY
RXY
Kết quả
0
0
0
Ngõ ra mức thấp(0V)
0
0
1
Ngõ ra mức cao(+5V)
0
1
0
Tổng trở cao (R=)
0
1

1
Ngõ vào , tác động mức thấp
1
1
x
Xử lý tín hiệu tương tự .




Hình 21: Ứng dụng xử lý tín hiệu số

4.Những thanh ghi đặc biệt chỉ có riêng ở PORTB:
4.1.Thanh ghi hỗ trợ điện trở treo bên trong:
Để tránh trạng thái thả nổi (tín hiệu điện áp ở chân đó không rõ ràng) khi khởi tạo PORTB là
ngõ vào số , PIC16f887 tích hợp thêm vào cho PORTB các điện trở kéo lên (pull-up), để sử dụng
các điện trở này ta chú ý đến thanh ghi :



 WPUBy=0: Không cho phép điện trở kéo lên ở chân thứ y của PORTB.
 WPUBy=1: Cho phép điện trở kéo lên ở chân thứ y của PORTB.
 Khi sử dụng điện trở kéo lên ngoài việc sử dụng thanh ghi WPUB còn phải khởi tạo bit:
RBPU










 Điện trở kéo lên nên khởi tạo khi PORTB là ngõ vào số , các PORT khác không có hỗ
trợ điện trở treo trong , do đó nếu có nhu cầu sử dụng ta có thể mắc thêm điện trở bên
ngoài.


Giáo trình thí nghiệm vi điều khiển ứng dụng

24

4.2.Ngắt ngoài ở chân RB0:
Để xử lý được các tín hiệu tác động tức thời (cạnh lên hay cạnh xuống), chân RB0 có hỗ trợ
xử lý ngắt (interrupt ) kí hiệu ở chân là INT, khởi tạo ngắt ngoài ở chân RB0 ta cần chú ý đến
các bit sau :

 INTE(Interrupt enable ) : bit cho phép ngắt ở PORTB
 INTF(Interrupt flag): cờ ngắt , bit này tự động bằng 1 khi có sự kiện ngắt (cạnh lên hay
cạnh xuống) xảy ra ở chân RB0, ta phải xóa bít này trong khi lập trình .
 GIE(Global interrupt ) : bit cho phép ngắt toàn cục.
 INTEDG (interrupt edge select bit ) : Bit chọn cạnh tác động để sinh ra sự kiện ngắt ở
RB0.
INTEDG=1: Xảy ra ngắt khi có tín hiệu cạnh lên ở RB0
INTEDG=0: Xảy ra ngắt khi có tín hiệu cạnh xuống ở RB0


Hình 22: Sơ đồ ngắt INT ở chân RB0

 Các bƣớc khởi tạo ngắt INT:

 Bước 1 : Khởi tạo chân RB0 là ngõ vào số , điện trở treo.
 Bước 2 : Khởi tạo ngắt INT
INTE=1; //Cho phép ngắt hoạt động
INTF=0; //Xóa cờ ngắt thì ngắt lần tiếp theo mới có thể xảy ra.
INTEDG= ; //Chọn cạnh tác động ngắt.
GIE=1; //Cho phép ngắt toàn cục .

4.3.Ngắt on-change ở PORTB:
Ngoài ngắt INT chỉ có duy nhất ở chân RB0 , thì cả PORTB (từ RB0 đến RB7) còn hỗ trợ
ngắt on-change , ngắt on-change xảy ra khi tín hiệu logic ở chân của PORTB thay đổi trạng thái
logic.






Giáo trình thí nghiệm vi điều khiển ứng dụng

25

Sơ đồ ngắt on-change:



Hình 23: Sơ đồ ngắt on-change ở PORTB

 Các thanh ghi và các bit điều khiển ngắt on-change :



 IOCBX=0 : Không cho phép ngắt on-change ở chân thứ X của PORTB.
 IOCBX=1 : Cho phép ngắt on-change ở chân thứ X của PORTB.

 Các bit khởi tạo khác :
 RBIF : Cờ ngắt on-change ở PORTB, cần phải xóa bít này trong lập trình.
 RBIE : Bit cho phép ngắt on-change của PORTB.
 GIE : Bit cho phép ngắt toàn cục.

 Các bƣớc khởi tạo ngắt on-change :
 Bước 1 : Khởi tạo PORTB là ngõ vào số , có điện trở treo.
 Bước 2 : Khởi tạo ngắt on-change ở PORTB
IOCB=0xFF; //khởi tạo toàn bộ PORTB ngắt on-change(có thể khởi tạo
một hay cả PORTB).
RBIE=1; //Cho phép ngắt xảy ra .
RBIF=0; //Xóa cờ ngắt
GIE=1; //Cho phép ngắt toàn cục
 Chú ý : Đối với ngắt on-change , việc xóa cờ ngắt (RBIF=0) không đủ để cho lần ngắt
tiếp theo được thực hiện , mà còn phải thêm điều kiện đọc hoặc viết vào thanh ghi PORTB.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×