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

Tai lieu PIC-Bài 2: CHƯƠNG TRÌNH DELAY  - vuson.tk pptx

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 (413.25 KB, 17 trang )

Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
1/17

Tutorial02.03

Gửiđến:
ĐoànHiệp,DoãnMinhĐăng,
Nộidung:
Bài2:CHƯƠNGTRÌNHDELAY
 MICROSOFTWORD

Tómtắt:
Tutorialpostlênpicvietnam,topic“PIC16F877ATỪDỄTỚIKHÓ”thuộcluồng“CƠBẢNVỀ
VIĐIỀUKHIỂN VÀPIC”vớinộidung:
‐ Vàinétsơlượcvềmụcđíchvàtácdụngcủach
ươngtrìnhdelay.
- Phântíchsourcecodemộtsốchươngtrìnhdelay.
- Tậptrungphântích,khaithácchươngtrìnhdelaycủaNigelnhưmộtdạngchươngtrìnhdelay
đượcchuẩnhóa.
Tutorialnàysửdụngkhánhi
ềucáckiếnthứctrongtutorialcủaNigel.

1. Vàinétsơlượcvềchươngtrìnhdelay.
1.1. Chukìxungclockvàchukìlệnh
Trongphầnnàytasẽbànđếnmộtvàikiếnthứccơsởphụcvụchoviệcviếtchương


trìnhdelay.CụthểlàtìmhiểuvềchukìxungclockvàchukìlệnhtrongviđiềukhiểnPIC.
Tađãbiếtđểviđiềukhiểnhoạtđộngđượccầnphảicungcấpmộtnguồnxungclocktừ
bênngoài.ĐốivớiviđiềukhiểnPIC,nguồnxungclockcóthểlàmộtmạch
daođộngRC
đơngiản,mộtthạchanh, Tấtnhiên,yêuc ầucủanguồnxungclockphảilàcàngổnđịnh
càngtốt.
Thôngthường,nguồnxungsửdụngchoviđiềukhiểnnóichungvàPIC
nóiriênglà
thạchanhvớicácưuđiểmgiáthànhkhôngcao,kháổnđịnhvàrấtthuậntiệntrongvi ệc
tínhtoán,thiếtkếmạchứngdụngvàchươngtrìnhchoviđiềukhiển.Trongbài
này,ta
cũngsửdụngthạchanhlàmnguồnxungchoviđiềukhiển.
Mỗithạchanhcómộttầnsốdaođộngcốđịnh,tagọitầnsốđólàf0,thôngthườngf0có
các
tầnsố4MHz,10MHz,20MHz, Tùytheomỗiloạiviđiềukhiểnmàyêucầu đốivới
f0cóthểkhácnhau.ĐốivớiviđiềukhiểnPIC16F877A,tầnsốdaođộngf
0 phảinhỏhơn
hoặcbằng20MHz,đâycũnglàtầnsốhoạtđộngtốiđamàđasốcácviđiềukhiểnPIC
thuộcdòngmid‐rangecókhảnăngđápứngđược.Chukìdaođộngcủathạchanhtagọilà
t
0vàđượctínhtheocôngthức:
t
0=1/f0(1)
Rấtcơbản!Khôngcógìcầnchúthíchthêmchocôngthứcnày.
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006

Trang:
2/17


Tacũngđãbiếtrằngcóhailốikiếntrúcdùngđểtổchứcmộtviđiềukhiển,đólàkiến
trúcVon‐NeumanvàkiếntrúcHavard.ViđiềukhiểnPICđượctổchứctheol
ốikiếntrúc
Havard.Takhôngđisâuvàocáclốikiếntrúcnày,màchỉcầnbiếtrằngvớilốikiếntrúc
Havard,mỗi  lệnh sẽđược thựcthixong trongmộtkhoảngthời
gianlàmộtchukìlệnh.
Khoảngthờigiannàyluôncốđịnhvàphụthuộcvàochukìcủaxungclock.
Tacómột“địnhnghĩa”mangtính đạikháinhưsau:chukìlệnhcủaviđi
ềukhiển
PIClàkhoảngthờigianmàviđiềukhiểnPICthựcthixongmộtlệnh.Tagọithờigiancủa
mộtchukìlệnhlàt
i.
Đểthựcthixongmộtlệnh,viđiềukhiểnPICcầnđến4chukìxungclock.Nhưvậythời
gianthựcthixongmộtlệnhsẽđượctính:
t
i=4t0  (2)
Thaycôngthức(1)vàocôngthức(2)tacóđượccôngthứctínhthờigiancủamộtlệnh
(mộtchukìlệnh)nhưsau:
t
i=4/f0(3)
Vídụ:nếutasửdụngthạchanhloại4MHzthìthờigianthựcthimộtlệnhcủaviđiều
khiểnlà:
t
i=4/(4
×
10

6
)=1
µ
s
Đểthuậntiệnchoviệctínhtoánvàthiếtkếchươngtr ìnhdelay,tasẽsửdụngloạithạch
anh4MHzchomạchứngdụng,vìnhưcácbạnđãthấy,thờigianthựcthi
mộtlệnhcủavi
điềukhiểnlúcdólà1µs.Quáchẵn!
1.2. Mụcđíchvàtácdụngcủachươngtrìnhdelay
Nhưtađãthấyởmục1.1,thờigianthựcthilệnhcủamộtviđiềukhiểnlàrấtnhanhso
vớitốcđộcảmnhậnsựvậthiệntượngcủaconngười.Đi
ềunàygâynhi ềukhókhăncho
việc“giaotiếp”giữaconngườivớimộtviđiềukhiểncũngnhưkhókhăntrongviệccảm
nhậnbằnggiácquankếtquảcácthaotáccủam ộtviđiềukhiển.
Vídu,tadùngviđiềukhiểnđểđiềukhiểnmộtLEDchớptắtliêntục.Vớithaotácnày
viđiềukhiểnchỉcầnhaichukìlệnh
làhoàntấtmộtchukìchớptắt,vàthờigiancủamỗi
chukìsẽlà2µs(khisửdụngthạchanh4MHz),vàtrongmộtgiây,LEDsẽchớptắt500000
lần.Trong
khimắtngườichỉcóthểnhậnbiếtđược24hìnhảnhtrongmộtgiây.Điềunày
cónghĩalà,mộtngườingoàihànhtinh,vớiconmắtcótốcđộxửlíhìnhảnhnhanhhơn,
khi
chứngkiếnhiệntươngtrênsẽnóirằng:“Eh,ngườitráiđất,tôithấycócáigìđóđang
chớptắt”.Cònngườitráiđất,vớitốcđộxửlíhìnhảnhcủamắtlà24hình
trong1giây,khi
chứngkiếnhiệntượngtrênsẽnóirằng:“Không,ngườingoàihànhtinh,tôithấynósáng
liêntụcđóchứ!”.
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:

TUT02.03
Ngày:
2/9/2006
Trang:
3/17

Nhưvậy,làmsaođểmắtng ườicảmnhậnđượcLEDđangchớptắt,cáchduynhấtlà
phảigiảmsốlầnchớptắttrong1giâynhỏhơn24,cácthaotácđểviđiềukhiể
nhiểnthịcho
conngườithấyđượchiệntượngtrênlầnlượtsẽlà:
- BậtLEDsánglên
- ChờmộtchútchotớikhimắtnhậnđượchìnhảnhLEDsáng.
- TắtLED
-
ChờmộtchútchotớikhimắtnhậnđượchìnhảnhLEDtắt.
- Lặplạicácthaotáctrên.
Nhưtađãbiết,doviđiềukhiểnkhôngcócáilệnhgọilà“chờmộtchủ
t”,chonênkhái
niệmchươngtrìnhdelaymớiđượcphátsinhđểthựchiệnquátrìnhchờđó.
Cóthểnóichươngtrìnhdelayđóngmộtvaitròquantrọngtrongcácthaotáchiểnthị.
Bêncạnhđó,ch
ươngtrìnhdelaycòncóvaitròquantrọngtrongviệcgiaotiếpvớicácthiết
bịkhác,khimàtốcđộxửlícủaviđiềukhiểnvàcácthiếtbịkhôngđồngnhất.Ngoàira, ta
cònsử
dụngchương trình delay trong nhiềutìnhhuống thực tế cần ra lệnh cho viđiều
khiểnphảichờ.

2. Xâydựngchươngtrìnhdelay
2.1. Cáclệnhsửdụngchochươngtrìnhdelay
Ngoàicáclệnhđãđượcđềcậpđếntrongbài1,tacầnsửdụngthêmcáclệnhsaucho

chươngtrìnhdelay:
LệnhDECFSZ
Cúpháp: DECFSZ thanh_ghi,noi_den
Lệnh1
Lệnh2
Tácdụng:Giảmgiátrịch
ứatrongthamsố“thanh_ghi”vàsosánhvới0.
- Nếugiátrịsaukhigiảmkhác0,lệnh1đượcthựcthi.
- Nếugiátrịsaukhigiảmbằng0,lệnh1khôngđượcthựcthivàđượ
cthaybằng
lệnhNOP(khônglàmgìc ả).
Thamsố“noi_den”dùngđểxácđịnhnơilưugiátrịthanhghi“thanh_ghi”saukhi
giảm.Khikhôngsửdụngthamsố“noi_den”,trìnhbiêndịchsẽmặcđịnhlàkếtqu
ả
đượcchứatrongthanhghiW.
- Nếuthamsố“noi_den”bằng1,kếtquảđượcchứatrongthanhghi“thanh_ghi”.
- Nếuthamsố“noi_den”bằng0,kếtquảđượcchứatrongthanhghiW.
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
4/17

LệnhRETURN
Cúpháp: RETURN
Tácdụng: trởvềchươngtrìnhchínhtừchươngtrìnhcon.
 LệnhRETLW

 Cúpháp: RETLW tham_so (0≤tham_so≤255)
 Tácdụng: trởvềchươngtrìnhchínhtừch ươngtrìnhconvớigiátrịtham_so
đượcchứatrongthanhghiW.

2.2. Thuậttoánchochươngtrìnhdelay
Tađãbiếtởphần1,chươngtrìnhdelaylàchươngtrìnhdùngđểralệnhchoviđiều
khiển “chờmộtchút”(tạmthờiđịnhnghĩamộtcách đạikháinhưvậy).Điềunày

ngđồngnghĩavớiviệcralệnhchoviđiềukhiểnlàmmộtcôngviệcvônghĩanàođó
trongmộtkhoảngthờigiandotaquyếtđịnh.
Trongtậplệnhcủaviđiều
khiểnPIC,tacólệnhNOP.Lệnhnàycótácdungralệnh
choviđiềukhiển khônglàmgìcả,vàthờigianthựcthilệnhnàycũnglà1chukì
lệnh.Nhuvậy,tacócầnthiếtphảixâydựngthuậttoánchochươngtrìnhdelay,vìchỉ
cần “NOP”liêntụclàxong?Hoàntoànkhôngđơngiảnnhưv ậy,vìkhiđótasẽgặp
phảicácvấn
đềsau:
- Thứnhất,cáithuậttoáncóvẻ khôngbìnhthường.
- Thứhai,viết chươngtrìnhnhư vậythìrấtmỏitay(muốnralệnhchoviđiều
khiểnchờ1ms,bạnphải
viếtđiviếtlạicáilệnhNOP 1000lầnnếusửdụng
loạithạchanh4MHz).
- Thứba,dunglượngbộnhớchươngtrìnhbịphíphạmmộtcách quáđáng.
Rõràng
làtakhôngthểviếtchươngtrìnhdelaytheocáchđó.Vàviệckhắcphụctất
cảcácnhượcđiểmnêutrêncũnglàcáctiêuchíđặtrachomộtchươngtrìnhdelay,đó
là:ngắngonvàthuậ
ntiệnchoviệcsửdụng.
Mộtphươngphápthườngsửdụngđểviếtcácchươngtrìnhdelaylàchoviđiềukhiển
nhảytớinhảyluimấycáilabel.Tuynhiênđểkiểmsoátđượcthờigiandelaydo

chươngtrìnhtạora,tacầntínhtoáncácgiátrịtrongchươngtrìnhmộtcáchphùhợp.
Sauđâytasẽdisâuvàocácthuậttoándùngđểviếtchươngtrìnhdelaynày.

2.2.1 Thuậttoán1
TrongthuậttoánnàytasửdụnglệnhDECFSZđểxâydựngchươngtrìnhdelay.
Đoạnchươngtrình1:xétmộtđoạncodenhưsau

Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
5/17

MOVLW d’20’ ;đưagiátrị20vàothanhghiW
MOVWF delay‐reg ;delay‐reg<‐20
loop
 DECFSZ delay‐reg,1 ;giảmgiátrịtrongthanhghidelay‐regvàsosánh
;với0,kếtquảchứatrongthanhghi“delay
‐reg”
 GOTOloop ;nếugiátrithanhghi“delay_reg”khác0
;thìnhảytớilabel“loop”
 ………………… ;cáclệnhtiếptheosauđoạnchươngtrìnhdelaysau
;khigiátrịtrongthanhghi“delay‐reg”đãgiảmvề
0.
Đoạn chương trình delay được thể hiện trong vòng lặp “loop”. Ta thấy lệnh
“DECFSZ ”cầnmộtchukìlệnhđểthựcthi,lệnh“GOTO ” cần 2 chu kì
lệnh,khiđógiá

trịtrongthanhghi“delay‐reg”sẽbịgiảmđimộtđơnvị.Nhưvậyđể
giátrịtrongthanhghi“delay‐reg”giảmmộtđơnvị,tacần(1+2)=3chukìlệnhvà
quãngthời
giancầnthiếtđểgiátrịtrongthanhghi“delay‐reg”giảmmộtđơnvịsẽlà3ti
(t
inhưđãđềcậpđếntrongphầntrênlàthờigiancủamộtchukìlệnh).
Trongvídụtrên,dotađưavàothanhghidelay‐reggiátrị20chonênsốlầngiảm
giátrịthanhghi”delay‐reg”sẽ
là(20+1)=21.TacóthểtínhđượcthờigiandelayTdo
đoạnchươngtrìnhtrêntạorasẽlà:
T=3×(20+1)×t
i
Ví dụ, nếuta sửdụng loại thạchanh 4 MHzthì mộtchu kìlệnh sẽcóthời gian
ti=1µs,dođóđoạnchươngtrìnhtrênsẽtạorakhoảngthờigiandelay:
T=3×
(20+1)×1µs=63µs
Mộtcáchtổngquát,tacóthểsuyrađượccôngthứctínhthờigiandelaychođoạn
chươngtrìnhtrênnhưsau:
T=3
×
(N+1)ti  (4)
TrongđóNlàgiátrịđưavàothanhghi“delay‐reg”.
Đếnđâytađãcóthểhìnhdungđượcmộtcáchsơlượccáchtínhtoánthờigiandelay
Tcủamộtchươngtrìnhdelay.Thờigian Tnàysẽ
phụthuộcvàocấu trúcgiảithuật
chươngtrìnhdelayvàthờigianmộtchukìlệnht
i.
Mộtđiểmcầnchúýthôngthườngcácthanhghitasửdụnglàthanhghi8bit,cho
nêngiátrịtốiđacóthểđưavàomộtthanhghilà255.Vậythờigiandelaylớnnhất
mà

đoạnchươngtrìnhdelaytrêncóthểtạoralà:
T
max=3x(255+1)ti
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
6/17

Muốn tạo thời gian delaylâu hơn,ta phải tăng số lượng cácvòng lặp lên.Đoạn
chươngtrìnhsauminhhọacáchtăngsốlượngvònglặpchochươngtrìnhdelay:
Đoạnchươngtrình2:
MOVLW d’255’
MOVWF delay‐reg1 ;đưagiátrị255vàothanhghi“delay‐reg1”
loop
DECFSZ delay‐reg1,1 ;giảmgiátrịthanhghi“delay‐reg1”vàsosánhvới0
;giátrịsaukhigiảmlưuvàothanhghi“delay‐reg1”
 GOTO
loop1 ;nếuchưabằng0nhảytớilabel“loop1”
 GOTO next ;nếuđãbăng0chươngtrìnhdelayhoàntất
loop1
MOVLW d’255’ 
 MOVWF delay‐reg2 ;đưavàothanhghi“delay‐reg2”giátrị255
loop2
 DECFSZ
delay‐reg2,1 ;giảmgiátrịthanhghi“delay‐reg2”vàsosánhvới0
;giátrịsaukhigiảmlưuvàothanhghi“delay‐reg2”

GOTO loop2  ;nếuchưabằng0thìnhảyđếnlabel“loop2”
 GOTO loop
 ;nếubằng0thìnhảyđếnlabel“loop”
next
………………… ; cáclệnhtiếptheosauchươngtrìnhdelay
Taxétđoạnchươngtrìnhtừlabel“loop1”trước.Đoạnchươngtrìnhnàytươngtự
nhưđoạnchương
trình1,chonêncáchtínhthờigiandelaytrongđoạnchươngtrình
nàykhôngcógìthayđổi.GiátrịNtrongcôngthức4sẽtươngứngvớigiátrịN
2đưa
vàothanhghi“delay‐reg2”(255).TagọiT
2làthờigiandelaydođoạnchươngtrìnhnày
tạorathìT
2sẽđựơctínhnhưsau:
T
2=3×(N2+1)ti (5)

Khigiátrịtrongthanhghi“delay‐reg2”giảmvề0thìcáclệnhtừlabel“loop”được
thựcthi.Ởthờiđiểmnàygiátrịtrongthanhghi“delay‐reg1”sẽgiảmđim ộtđơnvịvà
tiếptụcthựcthivònglặp“loop1”.NhưvậysaumộtkhoảngthờigianT
2,giátritrong
thanhghi“delay‐reg1”sẽgiảmđimộtđơnvị,vànếutagọiN
1làgiátrịđưavàothanh
ghi“delay‐reg1”thìsốlầngiảmgiátrịtrongthanhghi“delay‐reg1”sẽlà(N
1+1).Như
vậythờigiandelayTdođoạnchươngtrình2tạoralà:
T=(N
1+1)T2=3×(N1+1)×(N2+1)×ti (6)
Dựatheocácgiátrịđưavàotrongđoạnchươngtrình2tacóthểtínhđượcthờigian
delaydođoạnchươngtrìnhtrêntạoranhưsau:

T=3×(255+1)×(255+1)t
i=196608ti
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
7/17

Nếusửdụngloạithạchanh4MHzthìthờigiandelaydođoạnchươngtrìnhtrên
tạoralà196608μs.
Nhưvậy,tùyvàothờigiandelaycầnthiếtvàtùyvàoloạithạch
anhsửdụngtrong
mạchmàtacóthểđưacácgiátrịN
1vàN2vàocácthanhghi“delay‐reg1”và“delay‐
reg2”mộtcáchthíchhợpdựavàocôngthức(6).
Vídụ:tínhtoáncácgiátrịđưavàothanhghi“delay‐reg1”và“delay‐reg2”đểthờigian
delaydođoạnchươngtrình2t
ạoralà90ms.Giảsửtađangsửdụngloạithạchanh4MHz.
Tagiảibàitoánnhưsau:doloạithạchanhtasửdụngcótầnsố4MHznênt
i=1μs.
Dođótacó
(N
1+1)×(N2+1)=T/3ti=90×10
‐3
/(3×1×10
‐6
)=30×10

3
Nếuchọngiátrịđưavàothanh ghi“delay‐reg2”làN2=199thìgiátrịN1đưavào
thanhghi“delay‐reg1”sẽlà:
N
1=30×10
3
/(199+1)‐1=149
Mộtđiểmcầnchúýlàbêncạnhviệcthỏamãncôngthức(6),cácgiátrịN
1vàN2
phảithỏamãnđiềukiện:
0<N
1<256và0<N2<256 (7)
Thuậttoántrênchophéptagiảiquyếtkhátriệtđểcácvấnđềdànhchomộtchương
trìnhdelay.Tuynhiên,nhượcđiểmcủathuậttoántrênlà:trongtrườnghợpcầnnhiều
thờigiandelaykhácnhau,taphảiviếtnhiềuchươngtrìnhdelaykhácnhautươngứng.
Thuậttoán2chochươngtrìnhdelayđượcpháttriểndựatrênthuậttoán1chophép
khắcphụcnhượcđi
ểmtrênvàsẽđượctrìnhbàycụthểởphầntiếptheo.
2.2.2 Thuậttoán2
Cácbạncóthểdễdàngnhậnrađâylàthuậttoánchochươngtrìnhdelayđượcsử
dụngtrongtutorialcủaNigel.Phầnnàysẽphântíchcụthểgiảithuậtvàsourcecode
củađoạnchươngtrình
delaynày.Vàđểthểhiệntháiđộtôntrọngtácgiả,tutorialnày
vẫngiữnguyênmãlệnhnhưtrongtutorialcủaNigel.
Giảsửtađangsửdụngloạithạchanh4MHz.Taxétđoạncodesau:
Đoạnchươngtrình3:
MOVLW d’90’
MOVWF count1 ;đưagiátrị90vàothanhghicount1
d1
 MOVLW d’199’

 MOVWF counta ;đưagiátrị199vàothanhghicounta
 MOVLW d’1’
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
8/17

 MOVWF countb ;đưagiátrị1vàothanhghicountb
delay_0 
 DECFSZ counta,1 ;giảmgiátrịtrongthanghicountavàsosánhvới0
 GOTO $+2 ;nếuchưabằng0,nhảytớilệnh“GOTOdelay_0”
 DECFSZ
countb,1 ;nếubằng0,giảmgiátrịtrongthanhghicountb
 GOTO delay_0 ;countbsaukhigiảmcógiátrịbằng0nênlệnhnày
;khôngđượcthựcthi
 DECFSZ count1,1 ;giảmgiátrịtrongthanhghicount1

 GOTO d1 ;nhảyvềlabeld1
 ‐‐‐‐‐‐‐‐‐‐‐‐‐   ;cáclệnhtiếptheocủachươngtrìnhchínhsauđoạn
;chươngtrìnhdelay
Trướctiêntalưuýđếnlệnh“GOTO$+2”.Lệnhnàycótácdụng
nhảytớilệnhthứ
haikểtừdònglệnh“GOTO$+2”,tứclànhảyđếnlệnh“GOTOdelay_0”.Hoàntoàn
tươngtựtacóthểdùnglệnhcócấutrúctươngtựđểnhảyđếnbấtcứdòngl
ệnhnào
trongchươngtrìnhthôngquaviệcthaythếhằngsốsaudấu“$”.

Taxétđoạncodebắtđầutừlabel“delay_0”trước.LệnhDECFSZcounta,1”mất
mộtchukìlệnhđểthựcthi.Nếugiá
trịchứatrongthanhghicountachưabằng0thì
lệnh“GOTO$+2”đượcthựcthi.Lệnhnàymấthaichukìlệnh.Tiếptheo,lệnh“GOTO
delay_0”đượcthựcthi.Lệnhnàycũngmấthaichu
kìlệnh.Sauđó,giátrịtrongthanh
ghicountatiếptụcđượcgiảm.Đếnđâytanhậnthấyrằng,đểgiảmmộtgiátrịtrong
thanhghicounta,tamấthết5chukìlệnh(1chukì
lệnhcholệnhDECFSZcounta,1”,2
chukìlệnhcholệnh“GOTO$+2”và2chukìlệnhcholệnh“GOTOdelay_0”),vàdo
giátrịđưavàothanhghicountalà199nênthờigiancầnthiếtđểthanhghicountagiảm
hếtgiátrịvề0là:
T
a=5×(199+1)×ti
Dotađangsửdụnglaọithạchanh4MHznênTasẽmanggiátrị1000μshay1ms.
Khigiátrịtrongthanhghicountab ằng0,lệnh“GOTO$+2”sẽkhôngđượcthựcthi
màthayvàođólàlệnhNOP,tiếptheolệnh“DECFSZcountb,1”sẽđượcthựcthi.Ta
thấygiátrịđưavàothanhghicountblà1nênsaukhigiảmcountbsẽbằng0nênlệnh
“GOTOdelay_0”sẽđượcthaybằnglệnhNOPvàtiếptheo,lệnh“DECFSZcount1,1”sẽ
đượcthực thi.Sauđóchương
trìnhquaytrởvềlabel“d1”đểthựchiệnviệcnạplạicác
giátrịchothanhghicounta,countbvàtiếptụcthựcthiđoạncoedetưlabel“delay_0”.
Nhưvậyviệcđưagiátrị1vàothanhghi
countbthựcchấtchỉlàđểthực hiệnquá
trìnhchuyểntiếpmỗikhithanhghicounta giảmvề0.Vàđoạncodetừlabel“delay_0”
thựcchấtlàđểtạorathờigiandelaygầnđúng1ms
dotađãbỏquamộtsốchukìlệnh
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:

TUT02.03
Ngày:
2/9/2006
Trang:
9/17

trongbướcchuyểntiếp(lưuýmộtlầnnữalàtađangsửdụngloạithạch anh4MHz),
sauđógiátrịtrongthanhghicount1đượcgiảm 1đơnvị.Vònglặpcứtiếp
tụcchođến
khigiátrịtrongthanhghicount1đượcgiảmvề0. Khiđólệnh“GOTOd1”không
đượcthực thinữavàquátrìnhtạothờigiandelaykếtthúc,cáclệnhtiếptheotrong
chươngtrình
chínhsẽtiếptụcđượcthựcthi.
Đếnđâytacóthểnhậnthấyrằngcứmỗi1msthìgiátrịtrongthanhghicount1sẽ
giảmđi1đơnvị.Dođó,muốntạorabất
cứmộtthờigiandelaynàolàbộisốcủa1ms,
tachỉviệcđưagiátrịtươngứngvàothanhghicount1.Trongvídụởđoạnchươngtrình
3,dotađưavàothanhghicount1giátrị90nên
thờigiandelaysẽlà90ms.Hoàntoàn
tươngtựchoviệctạorathờigiandelay10ms,50ms,100ms,150ms,200ms,…tacũng
dễdàngnhậnthấylàthờigiandelaytốiđa
dođoạnchươngtrìnhtrêntạoralà255ms.
Vớicácthaotácthôngthườngdànhchoviđiềukhiển,cóthểnóiđâylàthờigiandelay
đủlớnđểtacóthểsửdụng.
Thuậttoán2tuy
dàihơnvàsửdụngnhiềuthanhghihơnsovớithuậttoán1nhưng
nócónhiềuưuđiểmhơnthuậttoán1dotínhlinhđộngvàdễsửdụngcủanó.Tacóthể
s
ửdụngđoạnchươngtrìnhdelaynàynhưmộtchươngtrìnhdelaymẫuchoviệcxây
dựngcácứngdụngchoviđiềukhiểnPIC.

Trongtrườnghợpsửdụnglọaithạchanhcótần
sốcaohơn,tacóthểkếthợphai
thuậttoán1và2đểtạorathờigiandelaymongmuốn.
3. Ứngdụng
Trongcácphầntrên,tađãcóthểhìnhdungđượcmụcđích,tácdụngvàmộtsốgiải
thuậtchoviệcxâydựngmộtchươngtrìnhdelay.Bâygiờlàlúcsửdụngcáckiếnthứcđó

chocácứngdụngcụthể.

Ứngdụng1:
Ta sẽ phát triểnứng dụngđầu tiên cho chương trình delay từ mạch nguyên lí và
chươngtrìnhđãđược xâydựngtrongbài1.Trongbài1,tađãthựchiệnviệtxuấtcácgiá
trịra PORTB
vàkiểmchứngbằng các LED gắnvàoPORTB.Bâygiờtasẽviếtchương
trìnhchotấtcảcácLEDgắnvàoPORTBchớptắtsaumỗikhoảngthờigian100ms.
Giảithuậtchochươngtrìnhchắccũngkhôngcógìphảiđángbàn,cácbướcthựchiện
lầnlượtsẽlà:
- BậttấtcảcácLEDởPORTB
- Delay100ms
- TắttấtcảcácLEDởPORTB
-
Delay100ms
- Lặplạicácthaotáctrên
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:

10/17

Chươngtrìnhsẽđượcviếtnhưsau:

Chươngtrình2.1:
;=============================================================================
;WWW.PICVIETNAM.COM
;Laptrinh:  NGUYENTRUNGCHINH
;Ngaybatdau: 23thang01nam2006
;Ngayhoanthanh: 23thang01nam2006
;Kiemtrachuongtrinh:DoanHiep,DoanMinhDang,
;
;Ngaykiemtra: 
;SudungvidieukhienMicrochip:
 PIC16F877A
 title “chuongtrinh2‐1.asm”
processor 16f877a
 include <p16f877a.inc>
 __CONFIG _CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON&
_XT_OSC&_WRT_OFF&_LVP_OFF&_CPD_OFF

;Capnhatvabosung:
;Motachuongtrinh: ChuongtrinhdungdedieukhientatcacacLEDganvao
;
PORTBchoptatlientucsaumoikhoangthoigian100ms.
;Khongsudungchuongtrinhcon
;Motaphancung: 8LEDduocganvaoPORTBthongquacacdientro,cac
;thanhphandikembaogomthachanh,machresetvanguon
;=============================================================================
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐

;Khoitaocacbien
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
count1EQU 0x20 ;cacbiendungchodoanchuongtrinhdelay
countaEQU 0x21
countbEQU 0x22
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
11/17

;=============================================================================
;CHUONGTRINHCHINH
;=============================================================================
 ORG 0x000
 GOTO start
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;KhoitaoPORTB
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
 BCF STATUS,RP1
 BSF STATUS,RP0 ;chonBANK1

 CLRF TRISB  ;PORTB<‐output

 BCF STATUS,RP0 ;chonBANK0
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐

;Vonglapchinh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
loop

 MOVLW 0XFF
 MOVWF PORTB ;battatcacacLEDoPORTB

 MOVLW dʹ100ʹ   ;doanchuongtirnhtaothoigiandelay100ms
 MOVWF count1

d1_1
 MOVLW dʹ199ʹ
 MOVWF counta
 MOVLW dʹ1ʹ
 MOVWF countb
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
12/17


delay_01
 DECFSZ counta,1
 GOTO $+2
 DECFSZ countb,1
 GOTO delay_01

 DECFSZ count1,1
 GOTO d1_1  ;hetdoanchuongtrinhdelay

 CLRF PORTB ;tatcacLEDoPORTB

 MOVLW dʹ100ʹ   ;doanchuongtrinhdelay100ms
 MOVWF count1

d1_2
 MOVLW dʹ199ʹ
 MOVWF
 counta
 MOVLW dʹ1ʹ
 MOVWF countb

delay_02
 DECFSZ counta,1
 GOTO $+2
 DECFSZ countb,1
 GOTO delay_02
 DECFSZ count1,1
 GOTO d1_2  ;hetdoanchuongtrinhdelay1ms

 GOTO loop  ;trovevonglapchinhcuachuongtrinh
 END
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:

2/9/2006
Trang:
13/17



Với chương trình trên, ta có thể quan sát các hiện tượng do viđiều khiển tạo raở
PORTBthôngquacácLED.Dothờigiandelaylà100mschonên trong1giâytrạngthái
củaLED
sẽthayđổi10lần.Điềunàychophéptaquansátđượcbằngm ắtthường.bâygiờ,
các bạn hãy thử giảm thời gian delay xuống nhỏ dần (giảm giá trị đưa vào thanh ghi
count1),đểxemhi
ệntượnggìsẽxảyra.Khithờigiandelaygiảmđếnmộtgiátrịnàođó,ta
sẽcócảmgiácrằngcácLEDkhôngcònchớptắtnữa,màsẽsángmộtcáchliêntục.
Ta
dễdàngnhậnthấymộtnhượcđiểmtrongchươngtrìnhtrênlàphảiviếtđiviếtlại
chươngtrìnhdelayđếnhailần, và mộtlần nữa, vấnđềvề dung lượng bộnhớ ch
ương
trìnhđượcđặtra.Mộtgiảiphápđểkhắcphụcnhượcđiểmtrên,đólàchươngtrìnhcon.
Mộtchươngtrìnhconcóthểtạmhiểulàmộtđoạncodenàođóđượclặpđil
ặplạinhiều
lầntrongchươngtrìnhchính,vàthayviphảiviếtđiviếtlạiđoạncodeđónhiềulần,tatổ
chứcđoạncodeđóthànhmộtchươngtrìnhconvàgọiđ
oạncodeđótừchươngtrìnhchính
thôngqualệnh“CALL”.Mộtchươngtrìnhconsẽbắtđầubằng1labelvàkếtthúcbằng
lệnhRETURNhoặclệnhRETLW.
Cóthểnóichươngtrìnhcongiúpta
cónhiềuphươngánhơntrongviệctổchứcmột
chươngtrìnhviếtchoviđiềukhiển.
Bâygiờ,tasẽtổchứclạichươngtrình2.1thànhmộtchươngtrìnhmớibằng

cáchsử
dụngchươngtrìnhconchođoạncodetạothờigiandelay100ms.Chươngtrìnhmớis ẽ
đượcviếtnhưsau:
Chươngtrình2.2:
;=============================================================================
;WWW.PICVIETNAM.COM
;Laptrinh:  NGUYENTRUNGCHINH
;Ngaybatdau: 23thang01nam2006
;Ngayhoanthanh: 23thang01nam2006
;Kiemtrachuongtrinh:DoanHiep,DoanMinhDang,
;
;Ngaykiemtra: 
;SudungvidieukhienMicrochip:
PIC16F877A
 title “chuongtrinh2‐2.asm”
processor 16f877a
 include <p16f877a.inc>
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
14/17

 __CONFIG _CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON&
_XT_OSC&_WRT_OFF&_LVP_OFF&_CPD_OFF
;Capnhatvabosung:
;Motachuongtrinh: ChuongtrinhdungdedieukhientatcacacLEDganvao

;PORTBchoptatlientucsaumoikhoangthoi
gian100ms.
;Cosudungchuongtrinhcon
;Motaphancung: 8LEDduocganvaoPORTBthongquacacdientro,cac
;thanhphandikembaogomthachanh,machresetvanguon
;=============================================================================
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Khoitaocacbien
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
count1EQU 0x20 ;cacbiendungchodoanchuongtrinhdelay
countaEQU 0x21
countbEQU 0x22
;=============================================================================
;CHUONGTRINHCHINH
;=============================================================================
 ORG 0x000
 GOTO start
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;KhoitaoPORTB
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
 BCF STATUS,RP1
 BSF STATUS,RP0 ;chonBANK1

 CLRF TRISB  ;PORTB
<‐output

 BCF STATUS,RP0 ;chonBANK0
Ngườibáocáo:
NguyễnTrungChính

Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
15/17

;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Vonglapchinh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
loop
 MOVLW 0XFF
 MOVWF PORTB ;battatcacacLEDoPORTB
 CALL delay_100ms;goichuongtrinhcontaothoigiandelay100ms
 CLRF PORTB ;tatcacLEDoPORTB
 CALL delay_100ms;goichuongtrinh
contaothoigiandelay100ms
GOTO loop ;trovevonglapchinhcuachuongtrinh
;=============================================================================
;CHUONGTRINHCON
;=============================================================================
delay_100ms;labelbatdauchuongtrinhcon
MOVLW dʹ100ʹ  ;doancodechochuongtrinhcondelay100ms
 MOVWF count1
d1
 MOVLW
dʹ199ʹ
 MOVWF counta
 MOVLW dʹ1ʹ
 MOVWF countb

delay_0
 DECFSZ counta,1
 GOTO $+2
 DECFSZ countb,1
 GOTO delay_0
 DECFSZ count1,1
 GOTO d1 
 RETURN  ;ketthucchuongtrinhcon,trovechuongtrinhchinh
 END
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
16/17

Tanhậnthấy rằng vớicách tổ chứcchương trình s ử dụngchươngtìnhcon, chương
trìnhchínhcũngtrởnênngắngọn,dễhiểuvàrõrànghơnrấtnhiều.
Tiếptheo,
tasẽtiếnthêmmộtbượcnữabằngcáchtựlàmkhómìnhvớiyêucầumới
nhưsau:

Ứngdụng2:
Yêucầucủaứngdụngnàycũngtươngtựnhưứngdụng1,tuynhiêntasẽthayđổi
nhiềuthờigiandelaykhácnhau,cụthểnhưsau:
- BậttấtcảcácLED
- delay100ms
-

TắttấtcảcácLED
- Delay200ms
Rõrànglàtrongđoạnchươngtrìnhchính,giảithuậtkhôngcónhiềukhácbiệt.Thayvì
saukhitắtLED,tagọichươngtrìnhcondelay_100msthìbâygiờs ẽg
ọichươngtrìnhcon
delay_200ms(tấtnhiênlàtaphảiviếtchươngtrìnhconnàythìmớicócáiđểgọi).Vấnđềở
đâylàviếtnhưthếnàochongắnnhất.
Đểđápứngđượcyêucầucủa
bàinày,tachỉcầnthayđổimộtvàichitiếtnhỏtrong
chươngtrìnhcondelay.Cụthểnhưsau:
delay_100ms;labelbatdauchuongtrinhcondelay_100ms
MOVLW dʹ100ʹ  
GOTO delay
 Delay_200ms;labelbatdauchuongtrinhcondelay_200ms
MOVLW d’200’

GOTO delay
 delay
 MOVWF count1
d1
 MOVLW dʹ199ʹ
 MOVWF counta
 MOVLW dʹ1ʹ
 MOVWF countb
delay_0
 DECFSZ counta,1
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03

Ngày:
2/9/2006
Trang:
17/17

 GOTO $+2
 DECFSZ countb,1
 GOTO delay_0
 DECFSZ count1,1
 GOTO d1 
 RETURN  ;ketthucchuongtrinhcon,trovechuongtrinhchinh
Nhưtađãbiếtởphần2,vớithuậttoán2,muốnthayđổithờigiandelaychochương
trình
delay,tachỉviệcthayđổigiátrịđưavàothanhghicount1.Ởđâytacũnglàmthao
táctươngtự.Đoạncodetừlabel“delay”đượcgiữnguyênkhôngthayđổi.Khigọichương
trình con delay_100ms, giá trị 100sẽ đượcđưa vào
 thanh ghi W, sau đó nhảy tới label
“delay”đểđưagiátrịđóvàothanhghi“count1”đểtiếptụcthựchiệnviệctạothờigian
delay.Cácthaotácđượctiếnhànhtươngtựnhưkhigọichương
trìnhcondelay_200msvà
lúcđógiátrịđượcđưavàothanhghiWsẽlà200.
Hoàntoàntươngtựtacóthểtạoramộtloạtnhữngchươngtr ìnhdelay1ms,2ms,5,
ms,…đểsửdụngmột
cáchdễdàngtùytheoyêucầuvềchươngtrìnhdelaycủaứngdụng
cụthể.
Đếnđâyxemnhưtađãpháttriểnmộtcáchkháhoànthiệnvềcácgiảiphápchochương
tìnhdelaythôngquavi
ệcxâydựngchươngtrìnhcondelayvàhiểuđượccáchtạonhiều
thờigiandelaykhácnhautrongcùng mộtchươngtrìnhmàkhôngcầnphảiviếtđiviếtlại
nhiềuchươngtrìnhdelay.

Bâygiờlàlúcrútramộtvàikếtluậntrướckhikếtthúcbài2vàchuẩnbịchobài3.
4. Kếtluận
Chương trình delayđóng một vai trò khá quan trọng trong việc phát triển cácứng 
dụngchoviđiềukhiển.Chươngtrìnhdelayđượcsửdụngnhiềutrongcácthaotáchiểnthị
vàtrongcácứngd
ụngcầnralệnhchoviđiềukhiểnphảichờ.
Cácthuậttoándùngđểxâydựngchươngtrìnhdelayphảithỏamãncáctiêuchíngắn
gọnvàthuậntiệnchoviệcsửdụ
ng,đồngthờigiúptakiểmsoátđượcthờigiandelaydo
đoạnchươngtrìnhtạora.
Thờigiandelaydochươngtrìnhdelaytạorasẽphụthuộcvàogiảithuậtsửdụngcho
chươngtrình
delayvàloạithạchanhsửdụngchoviđiềukhiển.
Chươngtrình congiúpta cóđượcnhiều phương ántổ chứcmột chươngtrìnhứng
dụngmộtcáchlinhhoạt,gọngàngvàd
ễhiểuhơn.
 Hếtbài2!


×