
Ngườibáocáo:NguyễnTrungChínhTàiliệu:TUT02.02
Ngày:1/30/2006Trang:1/18
Tutorial02.02
Gửiđến:picvietnam@googlegroups.com
Nộidung:HàmDelay
MICROSOFTWORD
Tómtắt:
Tutorialpostlênpicvietnam,topic“PIC16F877ATỪDỄTỚIKHÓ”thuộcluồng“CƠBẢNVỀ
VIĐIỀUKHIỂNVÀPIC”vớinộidung:
‐ Vàinétsơlượcvềmụcđíchvàtácdụngcủachươngtrìnhdelay.
- Phântíchsourcecodemộtsốchươngtrìnhdelay.
- Tậptrungphântích,khaithácchươngtrìnhdelaycủaNigelnhưmộtdạngchươngtrìnhdelay
đượcchuẩnhóa.
TutorialnàysửdụngkhánhiềucáckiếnthứctrongtutorialcủaNigel.
1. Vàinétsơlượcvềchươngtrìnhdelay.
1.1. Chukìxungclockvàchukìlệnh
Trongphầnnàytasẽbànđếnmộtvàikiếnthứccơsởphụcvụchoviệcviếtchương
trìnhdelay.CụthểlàtìmhiểuvềchukìxungclockvàchukìlệnhtrongviđiềukhiểnPIC.
Tađãbiếtđểviđiềukhiểnhoạtđộngđượccầnphảicungcấpmộtnguồnxungclocktừ
bênngoài.ĐốivớiviđiềukhiểnPIC,nguồnxungclockcóthểlàmộtmạchdaođộngRC
đơngiản,mộtthạchanh,...Tấtnhiên,yêucầucủanguồnxungclockphảilàcàngổnđịnh
càngtốt.
Thôngthường,nguồnxungsửdụngchoviđiềukhiểnnóichungvàPICnóiriênglà
thạchanhvớicácưuđiểmgiáthànhkhôngcao,kháổnđịnhvàrấtthuậntiệntrongviệc
tínhtoán,thiếtkếmạchứngdụngvàchươngtrìnhchoviđiềukhiển.Trongbàinày,ta
cũngsửdụngthạchanhlàmnguồnxungchoviđiềukhiển.
Mỗithạchanhcómộttầnsốdaođộngcốđịnh,tagọitầnsốđólàf0,thôngthườngf0có
cáctầnsố4MHz,10MHz,20MHz,...Tùytheomỗiloạiviđiềukhiểnmàyêucầuđốivới
f0cóthểkhácnhau.ĐốivớiviđiềukhiểnPIC16F877A,tầnsốdaođộngf0phảinhỏhơn
hoặcbằng20MHz,đâycũnglàtầnsốhoạtđộngtốiđamàđasốcácviđiềukhiểnPIC
thuộcdòngmid‐rangecókhảnăngđápứngđược.Chukìdaođộngcủathạchanhtagọilà
t0vàđượctínhtheocôngthức:
t0=1/f0(1)
Rấtcơbản!Khôngcógìcầnchúthíchthêmchocôngthứcnày.

Ngườibáocáo:NguyễnTrungChínhTàiliệu:TUT02.02
Ngày:1/30/2006Trang:2/18
Tacũngđãbiếtrằngcóhailốikiếntrúcdùngđểtổchứcmộtviđiềukhiển,đólàkiến
trúcVon‐NeumanvàkiếntrúcHavard.ViđiềukhiểnPICđượctổchứctheolốikiếntrúc
Havard.Takhôngđisâuvàocáclốikiếntrúcnày,màchỉcầnbiếtrằngvớilốikiếntrúc
Havard,mỗilệnhsẽđượcthựcthixongtrongmộtkhoảngthờigianlàmộtchukìlệnh.
Khoảngthờigiannàyluôncốđịnhvàphụthuộcvàochukìcủaxungclock.
Tacómột“địnhnghĩa”mangtính...đạikháinhưsau:chukìlệnhcủaviđiềukhiển
PIClàkhoảngthờigianmàviđiềukhiểnPICthựcthixongmộtlệnh.Tagọithờigiancủa
mộtchukìlệnhlàti.
Đểthựcthixongmộtlệnh,viđiềukhiểnPICcầnđến4chukìxungclock.Nhưvậythời
gianthựcthixongmộtlệnhsẽđượctính:
ti=4t0 (2)
Thaycôngthức(1)vàocôngthức(2)tacóđượccôngthứctínhthờigiancủamộtlệnh
(mộtchukìlệnh)nhưsau:
ti=4/f0(3)
Vídụ:nếutasửdụngthạchanhloại4MHzthìthờigianthựcthimộtlệnhcủaviđiều
khiểnlà:
ti=4/(4
×
106)=1
μ
s
Đểthuậntiệnchoviệctínhtoánvàthiếtkếchươngtrìnhdelay,tasẽsửdụngloạithạch
anh4MHzchomạchứngdụng,vìnhưcácbạnđãthấy,thờigianthựcthimộtlệnhcủavi
điềukhiểnlúcdólà1μs.Quáchẵn!
1.2. Mụcđíchvàtácdụngcủachươngtrìnhdelay
Nhưtađãthấyởmục1.1,thờigianthựcthilệnhcủamộtviđiềukhiểnlàrấtnhanhso
vớitốcđộcảmnhậnsựvậthiệntượngcủaconngười.Điềunàygâynhiềukhókhăncho
việc“giaotiếp”giữaconngườivớimộtviđiềukhiểncũngnhưkhókhăntrongviệccảm
nhậnbằnggiácquankếtquảcácthaotáccủamộtviđiềukhiển.
Vídu,tadùngviđiềukhiểnđểđiềukhiểnmộtLEDchớptắtliêntục.Vớithaotácnày
viđiềukhiểnchỉcầnhaichukìlệnhlàhoàntấtmộtchukìchớptắt,vàthờigiancủamỗi
chukìsẽlà2μs(khisửdụngthạchanh4MHz),vàtrongmộtgiây,LEDsẽchớptắt500000
lần.Trongkhimắtngườichỉcóthểnhậnbiếtđược24hìnhảnhtrongmộtgiây.Điềunày
cónghĩalà,mộtngườingoàihànhtinh,vớiconmắtcótốcđộxửlíhìnhảnhnhanhhơn,
khichứngkiếnhiệntươngtrênsẽnóirằng:“Eh,ngườitráiđất,tôithấycócáigìđóđang
chớptắt”.Cònngườitráiđất,vớitốcđộxửlíhìnhảnhcủamắtlà24hìnhtrong1giây,khi
chứngkiếnhiệntượngtrênsẽnóirằng:“Không,ngườingoàihànhtinh,tôithấynósáng
liêntụcđóchứ!”.

Ngườibáocáo:NguyễnTrungChínhTàiliệu:TUT02.02
Ngày:1/30/2006Trang:3/18
Nhưvậy,làmsaođểmắtngườicảmnhậnđượcLEDđangchớptắt,cáchduynhấtlà
phảigiảmsốlầnchớptắttrong1giâynhỏhơn24,cácthaotácđểviđiềukhiểnhiểnthịcho
conngườithấyđượchiệntượngtrênlầnlượtsẽlà:
- BậtLEDsánglên
- ChờmộtchútchotớikhimắtnhậnđượchìnhảnhLEDsáng.
- TắtLED
- ChờmộtchútchotớikhimắtnhậnđượchìnhảnhLEDtắt.
- Lặplạicácthaotáctrên.
Nhưtađãbiết,doviđiềukhiểnkhôngcócáilệnhgọilà“chờmộtchủt”,chonênkhái
niệmchươngtrìnhdelaymớiđượcphátsinhđểthựchiệnquátrìnhchờđó.
Cóthểnóichươngtrìnhdelayđóngmộtvaitròquantrọngtrongcácthaotáchiểnthị.
Bêncạnhđó,chươngtrìnhdelaycòncóvaitròquantrọngtrongviệcgiaotiếpvớicácthiết
bịkhác,khimàtốcđộxửlícủaviđiềukhiểnvàcácthiếtbịkhôngđồngnhất.Ngoàira,ta
cònsửdụngchươngtrìnhdelaytrongnhiềutìnhhuốngthựctếcầnralệnhchoviđiều
khiểnphảichờ.
2. Xâydựngchươngtrìnhdelay
2.1. Cáclệnhsửdụngchochươngtrìnhdelay
Ngoàicáclệnhđãđượcđềcậpđếntrongbài1,tacầnsửdụngthêmcáclệnhsaucho
chươngtrìnhdelay:
LệnhDECFSZ
Cúpháp:DECFSZthanh_ghi,noi_den
Lệnh1
Lệnh2
Tácdụng:Giảmgiátrịchứatrongthamsố“thanh_ghi”vàsosánhvới0.
- Nếugiátrịsaukhigiảmkhác0,lệnh1đượcthựcthi.
- Nếugiátrịsaukhigiảmbằng0,lệnh1khôngđượcthựcthivàđượcthaybằng
lệnhNOP(khônglàmgìcả).
Thamsố“noi_den”dùngđểxácđịnhnơilưugiátrịthanhghi“thanh_ghi”saukhi
giảm.Khikhôngsửdụngthamsố“noi_den”,trìnhbiêndịchsẽmặcđịnhlàkếtquả
đượcchứatrongthanhghiW.
- Nếuthamsố“noi_den”bằng1,kếtquảđượcchứatrongthanhghi“thanh_ghi”.
- Nếuthamsố“noi_den”bằng0,kếtquảđượcchứatrongthanhghiW.

Ngườibáocáo:NguyễnTrungChínhTàiliệu:TUT02.02
Ngày:1/30/2006Trang:4/18
LệnhRETURN
Cúpháp: RETURN
Tácdụng:trởvềchươngtrìnhchínhtừchươngtrìnhcon.
LệnhRETLW
Cúpháp:RETLWtham_so(0≤tham_so≤255)
Tácdụng:trởvềchươngtrìnhchínhtừchươngtrìnhconvớigiátrịtham_so
đượcchứatrongthanhghiW.
2.2. Thuậttoánchochươngtrìnhdelay
Tađãbiếtởphần1,chươngtrìnhdelaylàchươngtrìnhdùngđểralệnhchoviđiều
khiển...“chờmộtchút”(tạmthờiđịnhnghĩamộtcách...đạikháinhưvậy).Điềunày
cũngđồngnghĩavớiviệcralệnhchoviđiềukhiểnlàmmộtcôngviệcvônghĩanàođó
trongmộtkhoảngthờigiandotaquyếtđịnh.
TrongtậplệnhcủaviđiềukhiểnPIC,tacólệnhNOP.Lệnhnàycótácdungralệnh
choviđiềukhiển...khônglàmgìcả,vàthờigianthựcthilệnhnàycũnglà1chukì
lệnh.Nhuvậy,tacócầnthiếtphảixâydựngthuậttoánchochươngtrìnhdelay,vìchỉ
cần...“NOP”liêntụclàxong?Hoàntoànkhôngđơngiảnnhưvậy,vìkhiđótasẽgặp
phảicácvấnđềsau:
- Thứnhất,cáithuậttoáncóvẻ...khôngbìnhthường.
- Thứhai,viếtchươngtrìnhnhư vậythìrấtmỏitay(muốnralệnhchoviđiều
khiểnchờ1ms,bạnphảiviếtđiviếtlạicáilệnhNOP...1000lầnnếusửdụng
loạithạchanh4MHz).
- Thứba,dunglượngbộnhớchươngtrìnhbịphíphạmmộtcách...quáđáng.
Rõrànglàtakhôngthểviếtchươngtrìnhdelaytheocáchđó.Vàviệckhắcphụctất
cảcácnhượcđiểmnêutrêncũnglàcáctiêuchíđặtrachomộtchươngtrìnhdelay,đó
là:ngắngonvàthuậntiệnchoviệcsửdụng.
Mộtphươngphápthườngsửdụngđểviếtcácchươngtrìnhdelaylàchoviđiềukhiển
...nhảytớinhảyluimấycáilabel.Tuynhiênđểkiểmsoátđượcthờigiandelaydo
chươngtrìnhtạora,tacầntínhtoáncácgiátrịtrongchươngtrìnhmộtcáchphùhợp.
Sauđâytasẽdisâuvàocácthuậttoándùngđểviếtchươngtrìnhdelaynày.
2.2.1 Thuậttoán1
TrongthuậttoánnàytasửdụnglệnhDECFSZđểxâydựngchươngtrìnhdelay.
Đoạnchươngtrình1:xétmộtđoạncodenhưsau

Ngườibáocáo:NguyễnTrungChínhTàiliệu:TUT02.02
Ngày:1/30/2006Trang:5/18
MOVLWd’20’ ;đưagiátrị20vàothanhghiW
MOVWFdelay‐reg;delay‐reg<‐20
loop
DECFSZdelay‐reg,0;giảmgiátrịtrongthanhghidelay‐reg
;vàsosánhvới0,kếtquảchứatrongW
GOTOloop ;nếugiátrithanhghi“delay_reg”khác0
;thìnhảytớilabel“loop”
;cáclệnhtiếptheosauđoạnchươngtrìnhdelaysau
;khigiátrịtrongthanhghi“delay‐reg”đãgiảmvề0.
Đoạnchươngtrìnhdelay đượcthể hiệntrongvònglặp“loop”.Tathấylệnh
“DECFSZ ...”cầnmộtchukìlệnhđểthựcthi,lệnh“GOTO...”cần2chukì
lệnh,khiđógiátrịtrongthanhghi“delay‐reg”sẽbịgiảmđimộtđơnvị.Nhưvậyđể
giátrịtrongthanhghi“delay‐reg”giảmmộtđơnvị,tacần(1+2)=3chukìlệnhvà
quãngthờigiancầnthiếtđểgiátrịtrongthanhghi“delay‐reg”giảmmộtđơnvịsẽlà3ti
(tinhưđãđềcậpđếntrongphầntrênlàthờigiancủamộtchukìlệnh).
Trongvídụtrên,dotađưavàothanhghidelay‐reggiátrị20chonênsốlầngiảm
giátrịthanhghi”delay‐reg”sẽlà(20+1)=21.TacóthểtínhđượcthờigiandelayTdo
đoạnchươngtrìnhtrêntạorasẽlà:
T=3×(20+1)×ti
Vídụ,nếutasử dụngloạithạchanh4MHzthìmộtchukìlệnhsẽ cóthờigian
ti=1μs,dođóđoạnchươngtrìnhtrênsẽtạorakhoảngthờigiandelay:
T=3×(20+1)×1μs=63μs
Mộtcáchtổngquát,tacóthểsuyrađượccôngthứctínhthờigiandelaychođoạn
chươngtrìnhtrênnhưsau:
T=3
×
(N+1)ti (4)
TrongđóNlàgiátrịđưavàothanhghi“delay‐reg”.
Đếnđâytađãcóthểhìnhdungđượcmộtcáchsơlượccáchtínhtoánthờigiandelay
Tcủamộtchươngtrìnhdelay.ThờigianTnàysẽphụthuộcvàocấutrúcgiảithuật
chươngtrìnhdelayvàthờigianmộtchukìlệnhti.

