Tài liệu Vi điều khiển PIC - Pdf 10

Tác giả: falleaf Diễn dàn PICVIETNAM.COM
Su tầm và biên soạn: 1

Vi iu khin PIC - Hc nhanh i vo ng dng

Li khuyờn la chn b cụng c lm vic vi PICMch np: Falleaf PG2C - PIC Tutorial
Chng trỡnh np: IC - PROG
Bootloader: Tiny bootloader
Debugger: ICD2 Clone
Chng trỡnh dch: MPLAB IDE - CCS C

La chn PIC:

- Mi hc: PIC16F628A hoc PIC16F88
- Hc tng hp: PIC16F877A
- Lm ti: PIC16F876A
- Cn mnh hn: PIC18F458
Cỏc loi trờn u cú th dựng PG2C v IC-PROG 1.05D

- iu khin ng c: PIC18F4331, PIC18F4431 (ICD2)
- Lp trỡnh thut toỏn: dsPIC30Fxxxx (dựng ICD2)

trỏnh mt thi gian cỏc cõu hi thng c lp i lp li v PIC, cỏc bn mi hc v
PIC lu ý bi vit ny. Bi vit ny s c update liờn tc khi cú cỏc thụng tin mi.

0) Mt vi iu c bn v PIC

- PIC16F84 l dũng PIC ph bin nht c khuyn khớch cho nhng ngi mi hc. Tuy nhiờn,

Su tầm và biên soạn: 2
1) Mch np PIC, Bootloaders v cỏc chng trỡnh np tng ng
Mch np
/>
Trang web ny cung cp rt nhiu loi mch np ca PIC, cú s nguyờn lý y , v tt c
cỏc hng dn liờn quan n vic ci t v s dng mch np. Trong ti liu hng dn PIC
Tutorial, chỳng tụi chn s dng mch np PG2C hng dn.
/>
Hi khú coi mt chỳt vỡ nú l ting Tõy Ban Nha hay sao ú? Nhng khụng vn gỡ, cỏc bn
download v, t ng s hiu phi lm th no. Tụi vn ch trng, ngi cha bit gỡ dựng
PG2C.
In Circuit Debugger
/>
ICD2 Clone, np c hu ht cỏc loi PIC hin cú, h tr debug trong mch v quan trng nht
l np c cho dũng dsPIC30F
Bootloader
/>
õy l b tinybootloader, l b bootloader xn nht cho n bõy gi m tụi bit.
/>
/>012031
Microchip bootloader, ch h tr dũng 16F, nhng l bootloader chớnh thc ca hóng, cung cp
min phớ
Chng trỡnh np
/>
2) Cỏc chng trỡnh dch
Chng trỡnh MPLAB IDE : />
Chng trỡnh CCS C (phiờn bn 3.222 cú crack): download ti õy

Chng trỡnh HT PIC (phiờn bn 8.05PL2 ngy 27/9/2004, cú crack): download ti õy


- Forum hng dn ca Olimex v SparkFun:
/>
Trang web ny hng dn cỏc mch do Olimex cung cp, hay núi cỏch khỏc SparkFun l forum
T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n: 3
của Olimex.
7) />
Trang web chính của Microchip PIC, cung cấp:
- datasheet
- diễn đàn chính của Microchip PIC (nhưng không sôi nổi lắm)
- môi trường soạn thảo và trình dịch MPLAB (luôn có phiên bản mới nhất)
- bán các linh kiện (PIC, dsPIC, rfPIC, mạch nạp, chương trình dịch, linh kiện analog )
- bootloader chính thức của PIC dùng cho 16F877A và 16F876A
8) Một số trang web mua bán các công cụ hỗ trợ PIC, các sản phẩm từ PIC
/> (bán chương trình CCS C cho PIC)
/> (bán một số sản phẩm điện tử)
/> (bán một số sản phẩm điện tử)
/> (địa chỉ mua trình dịch và thư viện source
code)
/> (trong luồng Mua Bán Linh Kiện có một số người buôn bán lẻ các
sản phẩm PIC)
9) Các đề tài thực hiện với PIC
/>
Đồng hồ quay, dùng đèn led và hiện tượng lưu ảnh để hiển thị giờ, dùng tín hiệu xung trên các
mấu rotor để xác định thời gian hiển thị.
/>
10) Email hỗ trợ thực hành PIC
Các bạn có thể email cho tôi khi gặp vấn đề cần tư vấn về PIC qua địa chỉ:



Cơ bản về pic

Di õy l hỡnh mch chy ca PIC16F84A, PIC16F628A v PIC16F88. Tt c cỏc PIC ny u
cú v trớ chõn tng ng nhau, v thm chớ cú th núi PIC16F628A tng thớch PIC16F84A v
PIC16F88 tng thớch vi hai loi cũn li. Cú ngha l trong cỏc ng dng ca PIC16F84A, khi thay
i bng PIC16F88, hay PIC16F628A u c.

Tt nhiờn, 3 loi vi dũng PIC trờn õy cú th tng thớch vi nhiu dũng PIC c hn, nhng vỡ
th trng PIC Vit Nam ph bin vi 3 loi PIC ny, cho nờn chỳng tụi ch cp n 3 loi PIC
ny m thụi.

Sau khi cỏc bn cú mch np, chng trỡnh np, MPLAB IDE, CCS C hoc HT PIC, cỏc bn lm
mch chy ny. K t õy khi thit k cỏch mch test, hoc cỏc thit b ngoi vi khỏc, cn th
nghim, cỏc bn ch vic thit k mch ngoi, sau ú cm vo cỏc chõn ra v chy th.
Khi mch chy tt, cỏc bn mun thit k c hon chnh, cỏc bn ch vic copy mch chy t
Orcad v dỏn vo mch nguyờn lý ca thit b ca bn. Xoỏ cỏc chõn header i, v ni dõy vo
trong mch chy PIC. Nh vy, chỳng ta khụng phi tn thi gian thit k cho PIC na.

Mt vi im lu ý v mch nh sau:

- Ngun ch dựng cho PIC, tuyt i khụng dựng b ngun ny cho thit b ngoi vi. Nu thit b
ngoi vi cn ngun, cỏc bn thit k b ngun riờng. Mt s thit b ngoi vi quỏ n gin, v tn
ớt dũng, cỏc bn cú th dựng ngun chung (khong 100mA)
- Tụi khụng khuyn khớch dựng dao ng ni ca PIC, bi vỡ dao ng ni ch chy c 4MHz,
v khụng n nh nh dựng thch anh ngoi. Mt s ti cụng nghip, h dựng thch anh chun
cụng nghip 4 chõn, nờn chỳng ta cng to thúi quen dựng thch anh ngoi, khụng cn quỏ tn
dng 2 chõn ca PIC.

- Mch reset ny l mch reset n gin nht ca PIC, v to ch reset power on. Mt s ng
T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM

socket để cho mạch gọn gàng hơn.

- Một điểm cuối cùng, chúng tôi không thiết kế phần nạp bằng ICSP, bởi vì chúng tôi không muốn
làm cho các bạn mới học PIC cảm thấy bối rối. Chúng ta sẽ thực hiện mạch chạy PIC với các chân
ICSP và bootloader sau.

Tác giả: falleaf Diễn dàn PICVIETNAM.COM
Su tầm và biên soạn: 6


u.
Chỳng ta quy nh mt s quy c sau:
;========== dựng phõn cỏch cỏc phn chớnh ca chng trỡnh
; dựng phõn cỏch cỏc chng trỡnh con ca chng trỡnh T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n: 7

Code: ;================================================= =======
; Ten chuong trinh : Mach test den LED_1
; Nguoi thuc hien : Falleaf
; Ngay thuc hien : 23/05/2005
; Phien ban : 1.0
; Mo ta phan cung : Dung PIC16F628A - thach anh 10MHz
; : LED giao tiep voi PORTB
; : Cuc am cua LED noi voi GND
; : RB0 - RB7 la cac chan output
;
; Ngay hoan thanh : 23/05/2005
; Ngay kiem tra : 23/05/2005
; Nguoi kiem tra : Doan Hiep
;
; Chu thich : Mo ta cac diem khac nhau cua cac phien ban khac nhau
; : hoac cac chu thich khac
; : vd, dung che do Power On Reset, PORTB = 00000000
; : hoac, chuong trinh viet cho PIC Tutorial

TITLE: dùng để các bạn ghi chú thích tên chương trình. TITLE là ten chương trình chính. Cú pháp
ghi TITLE như trên. Nhớ phải có dấu nháy kép khi viết tên chương trình.
PROCESSOR: dùng để khai báo dòng vi điều khiển mà các bạn sử dụng. Các bạn lưu ý, trong
MPLAB quy định, không viết đầy đủ tên PIC16F628A mà chỉ viết P16F628A, vì trong chương trình
dịch đã quy định như vậy.
INCLUDE: dùng để đưa thêm vào các file mà bạn viết trong chương trình. Mặc định, trong MPLAB
đường dẫn đến thư mục chứa file P16F628A.inc đã có sẵn. Nếu bạn đặt file ở nơi khác không phải
T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n: 8
trong thư mục bạn đang làm việc, hoặc các file include khong phải là file .inc có sẵn của MPLAB,
thì các bạn phải chỉ đường dẫn rõ ràng. Lưu ý rằng, để MPASM dịch được, các bạn phải đặt đường
dẫn từ thư mục gốc đến hết tên file (kể cả phần mở rộng của file) không được quá 60 ký tự.
__CONFIG: dùng để thiết lập các chế độ hoạt động của PIC. Các bạn có thể xem để hiểu thêm về
các chế độ hoạt động này trong tài liệu

PICmicro
Mid Range MCU Family
Reference Manual

Section 27. Device Configuration Bits
Table 27-1 page 27-7

Tài liệu này có thể download trên trang web của microchip />, keyword:
MidRange Manual.
Mỗi directive để đặt chế độ, cách nhau một ký tự &.
Nếu ghi chế độ hoạt động vào đây, các chế độ hoạt động sẽ ở trạng thái mặc định khi khởi động.
Các bạn cũng có cách khác để đặt chế độ hoạt động bằng cách tác động trực tiếp vào các thanh
ghi khởi tạo. Tuy nhiên, việc này là việc làm không cần thiết, khi chúng ta đã có các directive để
viết tắt.
Như vậy, chúng ta đặt ở đây chế độ _CP_OFF, tức là khôngđặt chế độ bảo vệ source code khi

Bây giờ chúng ta dành chút thời gian cho lý thuyết, các bạn mở datasheet PIC16F628A trang 15,
Section 4. Memory Organization
Chúng ta sẽ thấy rằng tổ chức bộ nhớ chương trình của PIC được chia ra làm mấy phần như sau:
- Pointer
- Stack
- Interrupt vector
- Program memory

T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n: 9
Chúng ta tạm thời chưa bàn đến pointer và stack.
Interrupt vector được đặt ở địa chỉ 0x0004
Program memory được đặt ở địa chỉ 0x0005
Vậy từ địa chỉ 0x0000 đến địa chỉ 0x0003 chúng ta làm được gì?
Khi PIC được reset, nó lập tức nhảy về địa chỉ 0x0000. Rồi cứ sau một chu kỳ máy, nó
nhảy đến địa chỉ tiếp theo, xem xem trong địa chỉ đó yêu cầu nó làm gì, nó thực hiện việc đó,
xong rồi lại nhảy tiếp. Cứ làm như thế cho đến khi hết chương trình. Tất nhiên, khi chúng ta thực
hiện một số lệnh điều khiển vị trí nhảy, thì nó sẽ nhảy không theo thứ tự nữa, nhưng việc này
chưa bàn vội. Chúng ta trước mắt chỉ cần biết rằng nó cứ nhảy như vậy cho đến hết chương trình.
Như vậy, nếu không sử dụng ngắt, thì chúng ta viết chương trình từ địa chỉ 0x0000 luôn, vì
nó cứ thế là nhảy từ 0x0000 khi khởi động, cho đến hết chương trình. Tuy nhiên, nếu làm như
vậy, sau này chúng ta sử dụng chương trình ngắt, thì chúng ta sẽ gặp trục trặc vì thói quen viết
từ địa chỉ 0x0000.
Chính vì vậy, chúng ta nên đặt chương trình trong phần Program Memory như ý đồ thiết kế PIC.
Vậy, chương trình của chúng ta sẽ viết như sau:
Code:

;================================================= ===================
ORG 0x0000
GOTO MAIN


;================================================= ==============================
ORG 0x0000
GOTO MAIN ORG 0x0005

MAIN
Tác giả: falleaf Diễn dàn PICVIETNAM.COM
Su tầm và biên soạn: 10
BANKSEL TRISB ; bank select
CLRF TRISB ; trisb = 00000000
; portb = output
BANKSEL PORTB
BSF PORTB, 0 ; rb0 = 1
; RB0 = 5V
GOTO $ ; dung chuong trinh tai day
; vong lap tai cho^~
; khong bao gio ket thuc
END. ; lenh bat buoc de ket thuc
;================================================= ===============================

Ri, nh vy, chỳng ta ó thc hin xong mt chng trỡnh vit bng MPASM cho PIC16F628A.
Phõn tớch chng trỡnh, chỳng ta s thy, mi khi ng, chng trỡnh gp lnh goto main,
nú s nhy n nhón MAIN. nhón MAIN, nú gp lnh banksel, tc l lnh bank select. Cú ngha
l nú s chuyn sang hot ng bng cú cha thanh ghi TRISB. Vỡ sao? Bi vỡ ban u khi
ng, PIC luụn nm bng 0. Nhng thanh ghi TRISB li nm bng 1, vỡ th cn phi chuyn
sang bng 1 lm vic. Thc ra chỳng ta cng cú cỏch yờu cu PIC chuyn sang bng 1 mt
cỏch ớch danh, ch khụng phi l chuyn sang bng cú thanh ghi trisb nh chỳng ta va lm.

3) Bn thay lnh CLRF TRISB bng on lnh
CLRF TRISB
BSF TRISB, 0
v gi nguyờn lnh
BSF PORTB, 0
Cỏc bn s thy rng ốn LED trong trng hp ny s khụng sỏng na.
Bi vỡ cỏc bn ó lm cho TRISB = 00000001. Nh vy, RB0 tr thnh chõn Input. Khi RB0 tr
thnh chõn Input, thỡ lnh BSF PORTB, 0 s khụng cũn tỏc dng na. RB0 lỳc ny khụng th thay
i giỏ tr bng chng trỡnh, nú ch cú th nhn giỏ tr in ỏp t bờn ngoi vo.
Tác giả: falleaf Diễn dàn PICVIETNAM.COM
Su tầm và biên soạn: 11
4) Trong trng hp mch ny, cỏc bn s lm th no? Kt lun: Qua bi hc ny, cỏc bn ó hc c cỏc ni dung sau:
- Lm mt mch chy PIC
- Cu trỳc mt chng trỡnh PIC
- Lp trỡnh t mỏy tớnh, np vo PIC, v cho PIC hot ng
- Hiu c hot ng xut nhp ca PIC, chc nng ca thanh ghi TRISA, TRISB, PORTA, PORTB,
hiu c cỏc lnh CLRF (xoỏ thanh ghi bt k), MOVLW (ghi mt giỏ tr bt k vo thanh ghi W),
MOVWF (ghi giỏ tr ca thanh ghi W vo mt thanh ghi khỏc), BSF (bt mt bit trong mt thanh
ghi bt k), GOTO (nhy n mt nhón bt k), GOTO $ (nhy ti ch), BANKSEL (chon bng
trong b nh chng trỡnh, cha mt thanh ghi bt k), ORG nh a ch trong b nh chng
trỡnh. Hin nay cỏc bn cha hc n lm th no Input, nhng cú th cỏc bn s thc hin d
dng bng vic thay LED bng mt nỳt bm. Hoc gi, cỏc bn mun ốn LED nhp nhỏy, v
nguyờn tc cỏc bn cú th thc hin bt tt liờn tc ốn LED bng lnh BSF v BCF. Nhng lm
nh th nú nhỏy quỏ nhanh, khụng th thy c.
Bi hc sau, chỳng ta s hc cỏch vit hm Delay, v cỏc bn cú th thc hin vic lm cho ốn
LED nhp nhỏy, lm cho dóy ốn t RB0 n RB7 chy qua chy li
Chỳc cỏc bn may mn trong bi hc u tiờn, v chỳc cỏc bn thnh cụng vi PIC!

b nh chng trỡnh ca PIC midrange ch cú 14 bit. Vi c im ny, chỳng ta s phõn tớch vỡ sao cn phi cú thanh ghi W, v sau ú chỳng
ta s phõn tớch tt c cỏc hot ng ca thanh ghi W trong mt chng trỡnh vit bng PIC, nu
cú th. Nhng gỡ cũn li, chỳng ta s xem trong bi tp lnh ca PIC midrange.
Vỡ sao cn phi cú thanh ghi W?
Bn s lm th no tớnh phộp toỏn sau: ly giỏ tr a ca thanh ghi A cng vi giỏ tr b
ca thanh ghi B v t vo thanh ghi A? Mt gii hn ca tp lnh PIC l khụng cho phộp cng hai
thanh ghi v t vo mt thanh ghi khỏc. Do ú, cỏc bn s phi thc hin thao tỏc sau:
Chuyn giỏ tr b t thanh ghi B vo thanh ghi W, sau ú ly giỏ tr ca thanh ghi W (lỳc ny l
b) cng vi giỏ tr a thanh ghi A, sau ú gỏn li vo thanh ghi A. on code c thc hin nh
sau:
Code:

MOVF B, W ; chuyn giỏ tr ca thanh ghi B vo thanh ghi W
ADDWF A, F ; cng giỏ tr ca thanh ghi A vi giỏ tr b ca
thanh ghi W v gỏn li vo A

Khi cỏc thanh ghi A v B khụng nm trong cựng mt bng, khi thao tỏc vi tng thanh ghi, cỏc
bn ch vic i v bng cha cỏc thanh ghi ú l xong. Mt on lnh hon chnh cú th thc
hin cho bt k 2 thanh ghi no c vit nh sau:
Code:

BANKSEL B
MOVF B, W
BANKSEL A
ADDWF A, F

on chng trỡnh ny cng minh ho luụn cho vic thanh ghi W l mt thanh ghi ton cc,


õy chớnh l im khỏc bit gia tp lnh RISC v tp lnh CISC. Tp lnh CISC cú th thc hin
lnh phc, vỡ nú cú th to ra mt lnh di 8 bit, 16 bit, 24 bit v l b s ca 8 bit. Do ú, nu
cn cng 2 thanh ghi 8 bit, nú hon ton cú th to ra mt lnh di 24 bit, trong ú 8 bit dựng
mó hoỏ, 8 bit dnh cho a ch ca thanh ghi th nht, 8 bit dnh cho a ch cua thanh ghi th 2.
Trong khi ú, tp lnh RISC l tp lnh rỳt gn, cho dự nú l lnh gỡ, nú cng luụn luụn ch cú 14
bit (i vi PIC midrange).
Thanh ghi W ging nh mt thanh ghi mc nh duy nht, vỡ vy, khi thc hin, b x lý trung
tõm cú th gii mó c nu lnh ú cú cn thao tỏc vi thanh ghi W hay khụng, m khụng cn
lu a ch ca thanh ghi W bờn trong on mó lnh.
Chỳng ta xem hỡnh di õy bit c b x lý logic hot ng nh th no vi thanh ghi W. Vy chỳng ta ó thy rừ s cn thit ca thanh ghi W, bi vỡ chỳng ta cn cú mt thanh ghi tm
cho cỏc cụng vic tớnh toỏn, v chỳng ta cn mó hoỏ thanh ghi m khụng cn tn quỏ nhiu bit,
vy thỡ thanh ghi W va l thanh ghi cú tớnh ton cc, va l thanh ghi tm, va l thanh ghi
khụng cn thit nhiu bit biu din a ch.

Cỏc bn ó bit vỡ sao chỳng ta phi cn thanh ghi W, bõy gi chỳng ta cn bit thanh ghi W hot
ng nh th no trong cỏc chng trỡnh ca PIC.

T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n: 14

Bµi 2 - DELAY FUNCTION
Qua bài học thứ nhất, chúng ta đã học về cách bật tắt một đèn LED. Bây giờ nếu muốn làm
cho đèn LED nhấp nháy, có nghĩa là chúng ta bật đèn LED, sau đó chờ một khoảng thời gian, và
tắt đèn led đó đi, sau đó lại chờ một khoảng thời gian nữa và lại bật đèn led lên. Muốn thực hiện
việc này, chúng ta phải tìm cách làm một hàm delay (delay - tiếng Anh có nghĩa là trễ, chậm lại)
Hàm DELAY là một hàm rất thông dụng khi lập trình thời gian thực. Nguyên lý của hàm delay là

Quay trở lại với việc nếu chúng ta cần thực hiện một việc gì đó giống như nhấp nháy đèn
LED, thì chúng ta cần PIC phải dừng lại, không làm gì cả để chờ chúng ta. Nếu như lệnh NOP (lệnh
không làm gì) sẽ giúp chúng ta chờ 0.4 us, mà chúng ta cần chờ 1 giây, thì chúng ta viết bao
nhiêu lệnh NOP cho đủ? Thay vì như vậy, chúng ta viết một vòng lặp để cho vi điều khiển làm một
việc vô thưởng vô phạt nào đó N lần, và mỗi lần như vậy nó tốn T chu kỳ máy. Như vậy, sau khi
kết thúc việc làm vô thưởng vô phạt đó, vi điều khiển đã chờ chúng ta N * T chu kỳ máy.
Để viết một vòng lặp như vậy, trước tiên chúng ta học cách đặt biến.
Một biến được đặt trong PIC, thực chất là một tên gọi chung cho một hoặc nhiều thanh ghi các giá
trị. Trong phần này, chúng ta chỉ đơn giản làm đặt biến có nghĩa là đặt tên cho một thanh ghi.
Thực ra, chúng ta hoàn toàn không cần đặt tên, mà có thể gọi trực tiếp địa chỉ của thanh ghi,
nhưng nếu làm như vậy, sau này, khi chương trình phức tạp dần lên, chúng ta sẽ dễ bị lẫn lộn các
biến.
Khi đặt biến, thanh ghi này nằm ở đâu? Nó sẽ nằm trong bộ nhớ chương trình và cụ thể,
T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n: 15
nó sẽ nằm trong vùng nhớ dùng chung mà chúng ta đã đề cập trong bài học trước.
Vậy làm thế nào để đặt biến? Có rất nhiều cách đặt biến, và trong phần này, tôi sẽ hướng dẫn các
bạn cách đặt biến mà tôi cho rằng rõ ràng nhất.
Code:

;================================================= =================

ORG 0x020
COUNT_L RES 1
COUNT_H RES 1
COUNT_N RES 3

;================================================= =================

Các bạn vừa làm gì?

ghi) F, và vị trí của hằng số k (trong cấu trúc một câu lệnh MPASM, tôi sẽ post lại bài này từ
dddt). có sự phân biệt rõ ràng.
Vậy tùy theo vị trí bạn đặt nó ở đâu, nó sẽ là biến, hoặc là hằng. Nếu là biến, nó chỉ mang
giá trị của dịa chỉ của thanh ghi nằm trong bộ nhớ dữ liệu, nếu là hằng, nó nằm đâu cũng được kể
cả ở bộ nhớ dữ liệu và bộ nhớ chương trình.
Vậy muốn đặt biến ở các băng khác thì làm thế nào? Các bạn cứ lấy địa chỉ đầu của vùng nhớ dữ
liệu dùng chung của băng đó và viết như sau:
Code:

;=================================================
ORG 0x0A0h

COUNT_X RES 10
T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n: 16
;=================================================
Tóm lại, để chuẩn hoá một chương trình, các bạn chép đoạn code này vào, và sau đó không bao
giờ còn phải viết lại nữa:
Code:

;================================================= ======================

;
; Bien nam o Bank0
;
ORG 0x020

COUNT_L RES 1
COUNT_H RES 1



;
; Biến ở băng 0
;
ORG 0x020
;
; Biến ở băng 1
;
ORG 0x0A0
;
; Biến ở băng 2
;
ORG 0x120
T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n: 17

;================================================= ========================
; Phần chương trình chính
ORG 0x0000
GOTO MAIN ORG 0x0005
MAIN
; những dòng lệnh được viết ở đây
END
;================================================= ========================= Như vậy, chúng ta đã biết cách viết một chương trình đầy đủ dành cho vi điều khiển PIC

CALL DELAY
BCF PORTB, 0
CALL DELAY
GOTO LOOP

;================================================= ============================
; Các chương trình con
;================================================= ============================
DELAY DECFSZ COUNT_L, F
GOTO DELAY
RETURN

;================================================= ============================
GOTO $
T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n: 18
END
;================================================= ============================

Các bạn vừa làm gì với đoạn chương trình trên?
Điểm thứ nhất các bạn nên chú ý, đó là việc tôi thêm phần các chương trình con vào trong
phần chương trình chính. Phần cuối chương trình tôi vẫn luôn để là GOTO $ và kết thúc với lệnh
END. Tạm thời các bạn cứ viết như vậy để khoá chương trình ở dòng GOTO $, khi chương trình
nhảy đến đó, nó sẽ thực hiện vòng lặp vô cùng tại chỗ, còn lệnh END là lệnh bắt buộc.
Việc này giúp chúng ta phần tách rạch ròi phần chương trình con và chương trình chính để
tránh nhầm lẫn. Bởi vì ở đây chúng ta mới bắt đầu các bài học cơ bản, cho nên tôi cho rằng các
chương trình của các bạn viết là ngắn, nên chúng ta chưa đi xa hơn về việc phân bổ vị trí này. Các
bạn chỉ đơn giản hiểu là chúng ta cần phải bỏ đoạn chương trình con ở đâu đó, và chúng ta nên
tách thêm một phần nữa để dành riêng cho việc viết chương trình con. Việc làm này về sau sẽ rất
có lợi, nhưng tạm thời chúng ta khoan bàn tới, và chúng ta cứ viết như vậy đã.

0, thì nó sẽ nhảy cách ra một ô nhớ trong bộ nhớ chương trình, và thực hiện lệnh tiếp theo đó.
Nếu giá trị sau khi giảm một đơn vị chưa bằng 0, thì nó sẽ thực hiện lệnh liền kề với nó.
Như vậy, vòng lặp được thực hiện như sau:
Code:

COUNT_L = 255 (ở trên đã đặt)

DELAY COUNT_L = COUNT_L - 1
if COUNT_L <> 0
GOTO DELAY
if COUNT_L = 0
RETURN
Tác giả: falleaf Diễn dàn PICVIETNAM.COM
Su tầm và biên soạn: 19
Code:

Lnh DECFSZ [File], F/W

Nu phớa sau du phy, chỳng ta W, thỡ kt qu s lu vo thanh ghi W, v [File] khụng
thay i giỏ tr gỡ ht. Nhng õy, chỳng ta mun thc hin nh on mó gi trờn, nờn chỳng
ta phi l F. COUNT_L s gim dn t 255 n 1, trong quỏ trỡnh ú nú c chy lờn DELAY, ri
gim COUNT_L mt n v, xong li nhy v DELAY, li thc hin vic gim 1 n v ca COUNT_L
Khi COUNT_L = 1 nú li gim 1 n v, lỳc ny COUNT_L = 0. V nú khụng thc hin lnh GOTO
na, m thay bng lnh NOP, sau ú nú thc hin lnh RETURN, cú ngha l quay v li lnh CALL
trờn. Nh vy, cỏc bn ó hiu rừ hm DELAY ri. Nhng quan trng nht l lm sao tớnh toỏn
c thi gian hao tn ca on vũng lp ny k t khi bt u thc hin lnh CALL, vỡ thc ra
chỳng ta mun l mun bit chớnh xỏc thi gian thc hin lnh ca nú.

Thi gian thc hin ca lnh CALL DELAY l bao lõu?


thch anh nhõn vi 4, hay tn s PIC s bng tn s thch anh chia 4.
- Cỏc bn ó hc c cỏch t bin trong mt chng trỡnh vit bng MPASM, cỏc bn ó cú th
t bin bt k bng no cỏc bn mun
- Sau ú, cỏc bn b sung phn t bin ny vo trong sn chng trỡnh ln trc ó hc, cỏc
bn hon thin hn sn mt chng trỡnh vit bng MPASM
- Cỏc bn li thờm vo sn chng trỡnh ú phn cỏc chng trỡnh con, vy tụi thụng bỏo vi cỏc
bn rng cỏc bn ch cũn thiu 2 phn na l ngt (Interrupt) v bng (Table) na, l cỏc bn ó
cú th cú mt sn chng trỡnh vit bng MPASM hon chnh. Cỏc bn s khụng phi i lõu
hon tt sn chng trỡnh ny.
- Cỏc bn hc c cỏch dựng hm CALL v RETURN, nú luụn luụn i kốm tng cp vi nhau.
- Cỏc bn hc thờm cỏc lnh: BCF, CALL, RETURN, DECFSZ
Ti liu tham kho:
T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n: 20
Các bạn tham khảo datasheet PIC16F84A, PIC16F628A và PIC16F88 để biết thêm chi tiết
về cấu trúc bộ nhớ dữ liệu, vì có cái thì có băng 2, có cái không có, có cái lại có băng 3, băng 4
Nhớ chú ý phần tập lệnh để đọc hiểu thêm về các lệnh vừa học (Instruction Set). Các bạn có thể
dùng keyword: DELAY để tìm trong trang /> những đoạn chương trình con
viết về hàm DELAY, làm thế nào để viết hàm DELAY dài hơn?
Lưu ý cuối cùng, đó là các bạn đang chuẩn bị trở thành một người viết PIC chuyên nghiệp,
do đó, các bạn cần phải nhớ các chân nào của PIC để thiết kế mạch và điều khiển, các bạn nên in
hình sơ đồ chân của PIC ra để dán lên trước bàn làm việc. Các bạn có thể download bản in tại đây
(có trong datasheet, nhưng tôi muốn gửi trực tiếp cho các bạn để các bạn đỡ mất công).
Bài tập làm thêm:
1) Các bạn thấy rằng, nếu thời gian DELAY quá ngắn, trên thực tế các bạn sẽ khó thấy đèn LED
nhấp nháy. Vì vậy, thay vì viết một hàm CALL DELAY, các bạn viết một dọc 20 dòng CALL DELAY
liên tiếp nhau, các bạn sẽ thấy sự khác biệt
2) Nhưng nếu viết 20 dòng CALL DELAY thì cũng như viết 20 dòng lệnh NOP, vậy có nghĩa là các
bạn vẫn có thể thực hiện một vòng lặp, trong đó lặp lại 20 lần, và trong vòng lặp các bạn thực
hiện hàm DELAY. Như vậy, các bạn phải viết một hàm DELAY_NGOAI để bên trong thực hiện hàm

không thể liệt kê hết ra đây tất cả các dòng PIC và tất cả các loại ngắt trong từng dòng được.
Chúng ta chỉ đưa ra đây sơ đồ tổng quát của các nguồn ngắt, và đi sâu vào một số loại ngắt phổ
biến.
T¸c gi¶: falleaf – DiÔn dµn PICVIETNAM.COM
S−u tÇm vµ biªn so¹n: 21Hình 1: Các nguồn ngắt của dòng PIC Midrange
Chúng ta chú ý đến một số điểm sau:
1) Trong hình có các ký hiệu cổng logic AND và OR

Đây là cổng AND, có nghĩa là chỉ khi đầu vào của hai cổng này đều có giá trị là 1, thì đầu ra mới
có giá trị là 1. Chúng ta quan sát một góc hình bên trái phía dưới TXIF và TXIE, chúng đi qua cổng
AND, chỉ khi nào bit TXIE bật lên, và bit TXIF cũng được bật lên, thì lúc đó ngõ ra nối vào cổng OR
phía trên mới có giá trị.

Đây là cổng OR, có nghĩa là chỉ cần một trong các tín hiệu ngõ vào có giá trị là 1, thì ngõ ra sẽ có
giá trị là 1. Như vậy, nếu cả TXIE và TXIF đều có giá trị 1, thì ngõ ra sau cổng AND của chúng sẽ
có giá trị 1 và ngõ ra sau cổng OR cũng có giá trị 1, bởi vì ít nhất cổng OR ở đây cũng có 1 ngõ
vào có giá trị 1. Chúng ta cứ tiếp tục như vậy mà suy ra.
2) Điểm thứ hai, là các chữ đuôi IE và IF:
IE ở đây là viết tắt của chữ Interrupt Enable, và IF ở đây viết tắt của Interrupt Flag.
IE có nghĩa là chúng ta cho phép kích hoạt một loại ngắt nào đó xảy ra hay không. Đây là tín hiệu
mà chúng ta có thể quy định ngay từ ban đầu. Mặc định, tất cả chúng đều có giá trị 0, chỉ khi nào
chúng ta cho phép một ngắt nào đó xảy ra, thì về sau nó mới xảy ra ngắt đó thôi.
Cũng giống như, ban đầu trên bờ ruộng có dãy rào chắn, thì con bò không thể nào húc bạn té
được, nếu bạn bỏ hàng rào ra, thì nếu có con bò húc bạn, bạn sẽ té. Nguyên lý này đơn giản như
vậy thôi.
IF ở đây là các cờ ngắt. Tức là khi bạn bị bò húc, thì có một người cầm cờ giơ lên báo là
Tác giả: falleaf Diễn dàn PICVIETNAM.COM

INTCON (ngt ph thụng), cỏc bit quy nh ngt ngoi vi nm trong cỏc thanh ghi PIR v PIE.

Vect ngt ca PIC:
Nh ln trc ó gii thiu, vect ngt ca PIC nm v trớ 0x0004 cỏc bn xem li hỡnh
sau. Khỏc vi khi bn b tộ rung, bn tộ xung ngay ti ch bn b hỳc, i vi vi iu khin, khi
xy ra interrupt, nú s nhy v mt a ch c nh, v thc hin cụng vic ti ú. Sau khi thc
hin xong, nú s quay tr v v trớ m t ú nú ó thoỏt ra. V trớ c nh m nú s nhy v khi
xy ra ngt l v trớ 0x0004.

Chng trỡnh ngt:
Li quay v thớ d tộ rung, cú l tụi thớch cỏi thớ d ny vỡ nú cú th giỳp bn hỡnh dung
mi th. Bõy gi cỏc bn hóy chia giai on t khi b bũ hỳc, tộ xung rung, ri bn chi ng
lờn, ri bn lm cm bũ lờn. Vy cho dự bn b bũ hỳc, hay b vp g, thỡ ch cú giai on bn
chi ng lờn l khỏc nhau, cũn li, giai on bn tộ xung rung l tộ xung rung, v sau ú thỡ
bn cng bũ lờn. Vy ngt cng ging th, khi nhy vo ngt, bn s cú mt giai on cn phi
nhy vo ngt, v mt giai on nhy ra khi ngt, cũn bờn trong ngt ú cỏc bn lm cỏi gỡ l
ni dung cn thc hin ca tng ngun ngt. Tụi cung cp ra õy on chng trỡnh ngt chun,
t nay v sau, cỏc bn ch cn copy on chng trỡnh ny v s dng:
Code:

;================================================= ==================
ORG 0x0000
GOTO MAIN
ORG 0x0004
GOTO INTERRUPT
ORG 0x0005
MAIN
; õy l phn chng trỡnh chớnh ca cỏc bn

;================================================= ==================

;Doan ma bat buoc de vao ngat
;

MOVWF W_SAVE ;W_SAVE(bank unknown!) = W
SWAPF STATUS, W
CLRF STATUS ; force bank 0
for remainder of handler
MOVWF STAT_SV ; STAT_SV = swap_nibbles(
STATUS )
; STATUS = 0
MOVF PCLATH, W
MOVWF PCH_SV ; PCH_SV = PCLATH
CLRF PCLATH ; PCLATH = 0
MOVF FSR, W
MOVWF FSR_SV ; FSR_SV = FSR
; 10 cycles from interrupt to
here!

;
;Doan chuong trinh ngat
;

; cac ban se viet chuong trinh ngat o day

;
;Doan ma bat buoc de ket thuc ngat
;

MOVF FSR_SV, W
MOVWF FSR ; FSR = FSR_SV

Phần thứ tư của bài viết chương trình ngắt, sẽ đi chi tiết vào các ngắt và giải thích rõ nghĩa từng
ngắt. Nhưng thiết nghĩ, tôi nên kết hợp bài học này ở đây, và kết hợp phần thứ tư vào bài học
sau: Nút bấm và các ngõ vào của PIC.
Tài liệu tham khảo:
/>011006

Bài 4. Nút bấmCác bạn vừa biết khái niệm ngắt, và đã biết chương trình ngắt được viết như thế nào. Vậy
bây giờ chúng ta chuyển đến bài tiếp theo về nút bấm.
Công dụng của nút bấm
Nút bấm là một hình thức ra lệnh phổ biến nhất trên thế giới. Bạn gọi một cái thang máy, bạn
bấm nút, bạn kêu cửa thì bấm chuông, bạn bật đèn thì bấm nút công tắc, và tôi đang ngồi viết
cho bạn bằng cách bấm nút bàn phím
Như vậy, bạn đã biết công dụng của cái nút bấm. Bây giờ các bạn sẽ học cách làm một cái
nút bấm!!! Điều này có vẻ buồn cười, nhưng với vi điều khiển, và máy tính, khả năng xử lý các
lệnh rất đa đạng. Bạn có thể bấm cùng một nút, nhưng lệnh sẽ khác nhau ở mỗi thời điểm, và mỗi
trạng thái. Ví dụ, như bạn nhấp chuột máy tính, thực ra cũng là bạn nhấp nút bấm, nhưng bạn
thấy rõ ràng rằng, ở những vị trí di chuyển chuột khác nhau, nút bấm của chuột sẽ đưa ra các
mệnh lệnh khác nhau cho máy tính thực hiện.
Một số trạng thái nút bấm thông dụng
Trạng thái nút bấm ra lệnh tức thời, đó là khi bạn bấm nút, lập tức mọi trạng thái phải
được kiểm tra và chương trình dừng lại để thực hiện lệnh từ nút bấm của bạn. Có nghĩa là bạn ra
lệnh tại thời điểm bấm nút, và máy hiểu rằng bạn đã bấm nút. Còn việc xử lý thế nào thì hồi sau
phân giải. Trạng thái chờ nút bấm, đó là chương trình bạn đang chạy, đến một giai đoạn nào đó,
nó cần phải có sự ra lệnh của bạn bằng nút bấm, và chương trình chờ bạn bấm nút để chạy tiếp,
hoặc bắt đầu một công việc nào đó sau khi chờ. Nhắc lại thao tác bấm nút một chút, cái nút của
bạn đang ở trên cao, bạn bấm nó xuống thì nó sẽ có một giai đoạn nút bấm đi xuống, khi chạm
vào mạch điện, hiển nhiên bạn muốn hay không muốn thì cũng phải có một khoảng thời gian bạn


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status