Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
1/17
Tutorial02.03
Gửiđến:
ĐoànHiệp,DoãnMinhĐăng,
Nộidung:
Bài2:CHƯƠNGTRÌNHDELAY
MICROSOFTWORD
Tómtắt:
Tutorialpostlênpicvietnam,topic“PIC16F877ATỪDỄTỚIKHÓ”thuộcluồng“CƠBẢNVỀ
VIĐIỀUKHIỂN VÀ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ạch
daođộ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àPIC
nó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ài
nà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ác
tầ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độngf
0 phả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à
t
0vàđượctínhtheocôngthức:
t
0=1/f0(1)
Rấtcơbản!Khôngcógìcầnchúthíchthêmchocôngthứcnày.
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
2/17
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ỗi lệnh sẽđược thựcthixong trongmộtkhoảngthời
gianlà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àt
i.
Đểthựcthixongmộtlệnh,viđiềukhiểnPICcầnđến4chukìxungclock.Nhưvậythời
gianthựcthixongmộtlệnhsẽđượctính:
t
i=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:
t
i=4/f0(3)
Vídụ:nếutasửdụngthạchanhloại4MHzthìthờigianthựcthimộtlệnhcủaviđiều
khiểnlà:
t
i=4/(4
×
10
6
)=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ựcthi
mộ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ệnh
là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.Trong
khimắ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,
khi
chứ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ình
trong1giâ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ính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
3/17
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ương trình delay trong nhiềutìnhhuống thực tế cần ra lệnh cho viđ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: DECFSZ thanh_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ính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
4/17
LệnhRETURN
Cúpháp: RETURN
Tácdụng: trởvềchươngtrìnhchínhtừchươngtrìnhcon.
LệnhRETLW
Cúpháp: RETLW tham_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ều
khiể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ết chươngtrìnhnhư vậythìrấtmỏitay(muốnralệnhchoviđiều
khiểnchờ1ms,bạnphải
viế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àng
là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ính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
5/17
MOVLW d’20’ ;đưagiátrị20vàothanhghiW
MOVWF delay‐reg ;delay‐reg<‐20
loop
DECFSZ delay‐reg,1 ;giảmgiátrịtrongthanhghidelay‐regvàsosánh
;với0,kếtquảchứatrongthanhghi“delay
‐reg”
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ạn chương trình delay được thể hiện trong vòng lặp “loop”. Ta thấy lệnh
“DECFSZ ”cầnmộtchukìlệnhđểthựcthi,lệnh“GOTO ” cần 2 chu kì
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ời
giancầnthiếtđểgiátrịtrongthanhghi“delay‐reg”giảmmộtđơnvịsẽlà3ti
(t
inhưđãđề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)×t
i
Ví dụ, nếuta sửdụng loại thạchanh 4 MHzthì mộtchu kìlệnh sẽcóthời gian
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ờigian Tnàysẽ
phụthuộcvàocấu trúcgiảithuật
chươngtrìnhdelayvàthờigianmộtchukìlệnht
i.
Mộtđiểmcầnchúýthôngthườngcácthanhghitasửdụnglàthanhghi8bit,cho
nêngiátrịtốiđacóthểđưavàomộtthanhghilà255.Vậythờigiandelaylớnnhất
mà
đoạnchươngtrìnhdelaytrêncóthểtạoralà:
T
max=3x(255+1)ti
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
6/17
Muốn tạo thời gian delaylâu hơn,ta phải tăng số lượng cácvòng lặp lên.Đoạn
chươngtrìnhsauminhhọacáchtăngsốlượngvònglặpchochươngtrìnhdelay:
Đoạnchươngtrình2:
MOVLW d’255’
MOVWF delay‐reg1 ;đưagiátrị255vàothanhghi“delay‐reg1”
loop
DECFSZ delay‐reg1,1 ;giảmgiátrịthanhghi“delay‐reg1”vàsosánhvới0
;giátrịsaukhigiảmlưuvàothanhghi“delay‐reg1”
GOTO
loop1 ;nếuchưabằng0nhảytớilabel“loop1”
GOTO next ;nếuđãbăng0chươngtrìnhdelayhoàntất
loop1
MOVLW d’255’
MOVWF delay‐reg2 ;đưavàothanhghi“delay‐reg2”giátrị255
loop2
DECFSZ
delay‐reg2,1 ;giảmgiátrịthanhghi“delay‐reg2”vàsosánhvới0
;giátrịsaukhigiảmlưuvàothanhghi“delay‐reg2”
GOTO loop2 ;nếuchưabằng0thìnhảyđếnlabel“loop2”
GOTO loop
;nếubằng0thìnhảyđếnlabel“loop”
next
………………… ; cáclệnhtiếptheosauchươngtrìnhdelay
Taxétđoạnchươngtrìnhtừlabel“loop1”trước.Đoạnchươngtrìnhnàytươngtự
nhưđoạnchương
trình1,chonêncáchtínhthờigiandelaytrongđoạnchươngtrình
nàykhôngcógìthayđổi.GiátrịNtrongcôngthức4sẽtươngứngvớigiátrịN
2đưa
vàothanhghi“delay‐reg2”(255).TagọiT
2làthờigiandelaydođoạnchươngtrìnhnày
tạorathìT
2sẽđựơctínhnhưsau:
T
2=3×(N2+1)ti (5)
Khigiátrịtrongthanhghi“delay‐reg2”giảmvề0thìcáclệnhtừlabel“loop”được
thựcthi.Ởthờiđiểmnàygiátrịtrongthanhghi“delay‐reg1”sẽgiảmđim ộtđơnvịvà
tiếptụcthựcthivònglặp“loop1”.NhưvậysaumộtkhoảngthờigianT
2,giátritrong
thanhghi“delay‐reg1”sẽgiảmđimộtđơnvị,vànếutagọiN
1làgiátrịđưavàothanh
ghi“delay‐reg1”thìsốlầngiảmgiátrịtrongthanhghi“delay‐reg1”sẽlà(N
1+1).Như
vậythờigiandelayTdođoạnchươngtrình2tạoralà:
T=(N
1+1)T2=3×(N1+1)×(N2+1)×ti (6)
Dựatheocácgiátrịđưavàotrongđoạnchươngtrình2tacóthểtínhđượcthờigian
delaydođoạnchươngtrìnhtrêntạoranhưsau:
T=3×(255+1)×(255+1)t
i=196608ti
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
7/17
Nếusửdụngloạithạchanh4MHzthìthờigiandelaydođoạnchươngtrìnhtrên
tạoralà196608μs.
Nhưvậy,tùyvàothờigiandelaycầnthiếtvàtùyvàoloạithạch
anhsửdụngtrong
mạchmàtacóthểđưacácgiátrịN
1vàN2vàocácthanhghi“delay‐reg1”và“delay‐
reg2”mộtcáchthíchhợpdựavàocôngthức(6).
Vídụ:tínhtoáncácgiátrịđưavàothanhghi“delay‐reg1”và“delay‐reg2”đểthờigian
delaydođoạnchươngtrình2t
ạoralà90ms.Giảsửtađangsửdụngloạithạchanh4MHz.
Tagiảibàitoánnhưsau:doloạithạchanhtasửdụngcótầnsố4MHznênt
i=1μs.
Dođótacó
(N
1+1)×(N2+1)=T/3ti=90×10
‐3
/(3×1×10
‐6
)=30×10
3
Nếuchọngiátrịđưavàothanh ghi“delay‐reg2”làN2=199thìgiátrịN1đưavào
thanhghi“delay‐reg1”sẽlà:
N
1=30×10
3
/(199+1)‐1=149
Mộtđiểmcầnchúýlàbêncạnhviệcthỏamãncôngthức(6),cácgiátrịN
1vàN2
phảithỏamãnđiềukiện:
0<N
1<256và0<N2<256 (7)
Thuậttoántrênchophéptagiảiquyếtkhátriệtđểcácvấnđềdànhchomộtchương
trìnhdelay.Tuynhiên,nhượcđiểmcủathuậttoántrênlà:trongtrườnghợpcầnnhiều
thờigiandelaykhácnhau,taphảiviếtnhiềuchươngtrìnhdelaykhácnhautươngứng.
Thuậttoán2chochươngtrìnhdelayđượcpháttriểndựatrênthuậttoán1chophép
khắcphụcnhượcđi
ểmtrênvàsẽđượctrìnhbàycụthểởphầntiếptheo.
2.2.2 Thuậttoán2
Cácbạncóthểdễdàngnhậnrađâylàthuậttoánchochươngtrìnhdelayđượcsử
dụngtrongtutorialcủaNigel.Phầnnàysẽphântíchcụthểgiảithuậtvàsourcecode
củađoạnchươngtrình
delaynày.Vàđểthểhiệntháiđộtôntrọngtácgiả,tutorialnày
vẫngiữnguyênmãlệnhnhưtrongtutorialcủaNigel.
Giảsửtađangsửdụngloạithạchanh4MHz.Taxétđoạncodesau:
Đoạnchươngtrình3:
MOVLW d’90’
MOVWF count1 ;đưagiátrị90vàothanhghicount1
d1
MOVLW d’199’
MOVWF counta ;đưagiátrị199vàothanhghicounta
MOVLW d’1’
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
8/17
MOVWF countb ;đưagiátrị1vàothanhghicountb
delay_0
DECFSZ counta,1 ;giảmgiátrịtrongthanghicountavàsosánhvới0
GOTO $+2 ;nếuchưabằng0,nhảytớilệnh“GOTOdelay_0”
DECFSZ
countb,1 ;nếubằng0,giảmgiátrịtrongthanhghicountb
GOTO delay_0 ;countbsaukhigiảmcógiátrịbằng0nênlệnhnày
;khôngđượcthựcthi
DECFSZ count1,1 ;giảmgiátrịtrongthanhghicount1
GOTO d1 ;nhảyvềlabeld1
‐‐‐‐‐‐‐‐‐‐‐‐‐ ;cáclệnhtiếptheocủachươngtrìnhchínhsauđoạn
;chươngtrìnhdelay
Trướctiêntalưuýđếnlệnh“GOTO$+2”.Lệnhnàycótácdụng
nhảytớilệnhthứ
haikểtừdònglệnh“GOTO$+2”,tứclànhảyđếnlệnh“GOTOdelay_0”.Hoàntoàn
tươngtựtacóthểdùnglệnhcócấutrúctươngtựđểnhảyđếnbấtcứdòngl
ệnhnào
trongchươngtrìnhthôngquaviệcthaythếhằngsốsaudấu“$”.
Taxétđoạncodebắtđầutừlabel“delay_0”trước.LệnhDECFSZcounta,1”mất
mộtchukìlệnhđểthựcthi.Nếugiá
trịchứatrongthanhghicountachưabằng0thì
lệnh“GOTO$+2”đượcthựcthi.Lệnhnàymấthaichukìlệnh.Tiếptheo,lệnh“GOTO
delay_0”đượcthựcthi.Lệnhnàycũngmấthaichu
kìlệnh.Sauđó,giátrịtrongthanh
ghicountatiếptụcđượcgiảm.Đếnđâytanhậnthấyrằng,đểgiảmmộtgiátrịtrong
thanhghicounta,tamấthết5chukìlệnh(1chukì
lệnhcholệnhDECFSZcounta,1”,2
chukìlệnhcholệnh“GOTO$+2”và2chukìlệnhcholệnh“GOTOdelay_0”),vàdo
giátrịđưavàothanhghicountalà199nênthờigiancầnthiếtđểthanhghicountagiảm
hếtgiátrịvề0là:
T
a=5×(199+1)×ti
Dotađangsửdụnglaọithạchanh4MHznênTasẽmanggiátrị1000μshay1ms.
Khigiátrịtrongthanhghicountab ằng0,lệnh“GOTO$+2”sẽkhôngđượcthựcthi
màthayvàođólàlệnhNOP,tiếptheolệnh“DECFSZcountb,1”sẽđượcthựcthi.Ta
thấygiátrịđưavàothanhghicountblà1nênsaukhigiảmcountbsẽbằng0nênlệnh
“GOTOdelay_0”sẽđượcthaybằnglệnhNOPvàtiếptheo,lệnh“DECFSZcount1,1”sẽ
đượcthực thi.Sauđóchương
trìnhquaytrởvềlabel“d1”đểthựchiệnviệcnạplạicác
giátrịchothanhghicounta,countbvàtiếptụcthựcthiđoạncoedetưlabel“delay_0”.
Nhưvậyviệcđưagiátrị1vàothanhghi
countbthựcchấtchỉlàđểthực hiệnquá
trìnhchuyểntiếpmỗikhithanhghicounta giảmvề0.Vàđoạncodetừlabel“delay_0”
thựcchấtlàđểtạorathờigiandelaygầnđúng1ms
dotađãbỏquamộtsốchukìlệnh
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
9/17
trongbướcchuyểntiếp(lưuýmộtlầnnữalàtađangsửdụngloạithạch anh4MHz),
sauđógiátrịtrongthanhghicount1đượcgiảm 1đơnvị.Vònglặpcứtiếp
tụcchođến
khigiátrịtrongthanhghicount1đượcgiảmvề0. Khiđólệnh“GOTOd1”không
đượcthực thinữavàquátrìnhtạothờigiandelaykếtthúc,cáclệnhtiếptheotrong
chươngtrình
chínhsẽtiếptụcđượcthựcthi.
Đếnđâytacóthểnhậnthấyrằngcứmỗi1msthìgiátrịtrongthanhghicount1sẽ
giảmđi1đơnvị.Dođó,muốntạorabất
cứmộtthờigiandelaynàolàbộisốcủa1ms,
tachỉviệcđưagiátrịtươngứngvàothanhghicount1.Trongvídụởđoạnchươngtrình
3,dotađưavàothanhghicount1giátrị90nên
thờigiandelaysẽlà90ms.Hoàntoàn
tươngtựchoviệctạorathờigiandelay10ms,50ms,100ms,150ms,200ms,…tacũng
dễdàngnhậnthấylàthờigiandelaytốiđa
dođoạnchươngtrìnhtrêntạoralà255ms.
Vớicácthaotácthôngthườngdànhchoviđiềukhiển,cóthểnóiđâylàthờigiandelay
đủlớnđểtacóthểsửdụng.
Thuậttoán2tuy
dàihơnvàsửdụngnhiềuthanhghihơnsovớithuậttoán1nhưng
nócónhiềuưuđiểmhơnthuậttoán1dotínhlinhđộngvàdễsửdụngcủanó.Tacóthể
s
ửdụngđoạnchươngtrìnhdelaynàynhưmộtchươngtrìnhdelaymẫuchoviệcxây
dựngcácứngdụngchoviđiềukhiểnPIC.
Trongtrườnghợpsửdụnglọaithạchanhcótần
sốcaohơn,tacóthểkếthợphai
thuậttoán1và2đểtạorathờigiandelaymongmuốn.
3. Ứngdụng
Trongcácphầntrên,tađãcóthểhìnhdungđượcmụcđích,tácdụngvàmộtsốgiải
thuậtchoviệcxâydựngmộtchươngtrìnhdelay.Bâygiờlàlúcsửdụngcáckiếnthứcđó
chocácứngdụngcụthể.
•
Ứngdụng1:
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ươngtrìnhđãđược xâydựngtrongbài1.Trongbài1,tađãthựchiệnviệtxuấtcácgiá
trịra PORTB
vàkiểmchứngbằng các LED gắnvàoPORTB.Bâygiờtasẽviếtchương
trìnhchotấtcảcácLEDgắnvàoPORTBchớptắtsaumỗikhoảngthờigian100ms.
Giảithuậtchochươngtrìnhchắccũngkhôngcógìphảiđángbàn,cácbướcthựchiện
lầnlượtsẽlà:
- BậttấtcảcácLEDởPORTB
- Delay100ms
- TắttấtcảcácLEDởPORTB
-
Delay100ms
- Lặplạicácthaotáctrên
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
10/17
Chươngtrìnhsẽđượcviếtnhưsau:
Chươngtrình2.1:
;=============================================================================
;WWW.PICVIETNAM.COM
;Laptrinh: NGUYENTRUNGCHINH
;Ngaybatdau: 23thang01nam2006
;Ngayhoanthanh: 23thang01nam2006
;Kiemtrachuongtrinh:DoanHiep,DoanMinhDang,
;
;Ngaykiemtra:
;SudungvidieukhienMicrochip:
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
;Capnhatvabosung:
;Motachuongtrinh: ChuongtrinhdungdedieukhientatcacacLEDganvao
;
PORTBchoptatlientucsaumoikhoangthoigian100ms.
;Khongsudungchuongtrinhcon
;Motaphancung: 8LEDduocganvaoPORTBthongquacacdientro,cac
;thanhphandikembaogomthachanh,machresetvanguon
;=============================================================================
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Khoitaocacbien
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
count1EQU 0x20 ;cacbiendungchodoanchuongtrinhdelay
countaEQU 0x21
countbEQU 0x22
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
11/17
;=============================================================================
;CHUONGTRINHCHINH
;=============================================================================
ORG 0x000
GOTO start
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;KhoitaoPORTB
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
BCF STATUS,RP1
BSF STATUS,RP0 ;chonBANK1
CLRF TRISB ;PORTB<‐output
BCF STATUS,RP0 ;chonBANK0
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Vonglapchinh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
loop
MOVLW 0XFF
MOVWF PORTB ;battatcacacLEDoPORTB
MOVLW dʹ100ʹ ;doanchuongtirnhtaothoigiandelay100ms
MOVWF count1
d1_1
MOVLW dʹ199ʹ
MOVWF counta
MOVLW dʹ1ʹ
MOVWF countb
Ngườibáocáo:
NguyễnTrungChính
Tàiliệ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 ;hetdoanchuongtrinhdelay
CLRF PORTB ;tatcacLEDoPORTB
MOVLW dʹ100ʹ ;doanchuongtrinhdelay100ms
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 ;hetdoanchuongtrinhdelay1ms
GOTO loop ;trovevonglapchinhcuachuongtrinh
END
Ngườibáocáo:
NguyễnTrungChính
Tàiliệ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ở
PORTBthôngquacácLED.Dothờigiandelaylà100mschonên trong1giâytrạngthái
củaLED
sẽthayđổi10lần.Điềunàychophéptaquansátđượcbằngm ắtthường.bâygiờ,
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),đểxemhi
ệntượnggìsẽxảyra.Khithờigiandelaygiảmđếnmộtgiátrịnàođó,ta
sẽcócảmgiácrằngcácLEDkhôngcònchớptắtnữa,màsẽsángmộtcáchliêntục.
Ta
dễdàngnhậnthấymộtnhượcđiểmtrongchươngtrìnhtrênlàphảiviếtđiviếtlại
chươngtrìnhdelayđếnhailần, và mộtlần nữa, vấnđềvề dung lượng bộnhớ ch
ương
trìnhđượcđặtra.Mộtgiảiphápđểkhắcphụcnhượcđiểmtrên,đólàchươngtrìnhcon.
Mộtchươngtrìnhconcóthểtạmhiểulàmộtđoạncodenàođóđượclặpđil
ặplạinhiều
lầntrongchươngtrìnhchính,vàthayviphảiviếtđiviếtlạiđoạncodeđónhiềulần,tatổ
chứcđoạncodeđóthànhmộtchươngtrìnhconvàgọiđ
oạncodeđótừchươngtrìnhchính
thôngqualệnh“CALL”.Mộtchươngtrìnhconsẽbắtđầubằng1labelvàkếtthúcbằng
lệnhRETURNhoặclệnhRETLW.
Cóthểnóichươngtrìnhcongiúpta
cónhiềuphươngánhơntrongviệctổchứcmột
chươngtrìnhviếtchoviđiềukhiển.
Bâygiờ,tasẽtổchứclạichươngtrình2.1thànhmộtchươngtrìnhmớibằng
cáchsử
dụngchươngtrìnhconchođoạncodetạothờigiandelay100ms.Chươngtrìnhmớis ẽ
đượcviếtnhưsau:
Chươngtrình2.2:
;=============================================================================
;WWW.PICVIETNAM.COM
;Laptrinh: NGUYENTRUNGCHINH
;Ngaybatdau: 23thang01nam2006
;Ngayhoanthanh: 23thang01nam2006
;Kiemtrachuongtrinh:DoanHiep,DoanMinhDang,
;
;Ngaykiemtra:
;SudungvidieukhienMicrochip:
PIC16F877A
title “chuongtrinh2‐2.asm”
processor 16f877a
include <p16f877a.inc>
Ngườibáocáo:
NguyễnTrungChính
Tàiliệ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
;Capnhatvabosung:
;Motachuongtrinh: ChuongtrinhdungdedieukhientatcacacLEDganvao
;PORTBchoptatlientucsaumoikhoangthoi
gian100ms.
;Cosudungchuongtrinhcon
;Motaphancung: 8LEDduocganvaoPORTBthongquacacdientro,cac
;thanhphandikembaogomthachanh,machresetvanguon
;=============================================================================
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Khoitaocacbien
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
count1EQU 0x20 ;cacbiendungchodoanchuongtrinhdelay
countaEQU 0x21
countbEQU 0x22
;=============================================================================
;CHUONGTRINHCHINH
;=============================================================================
ORG 0x000
GOTO start
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;KhoitaoPORTB
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
BCF STATUS,RP1
BSF STATUS,RP0 ;chonBANK1
CLRF TRISB ;PORTB
<‐output
BCF STATUS,RP0 ;chonBANK0
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
15/17
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Vonglapchinh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
loop
MOVLW 0XFF
MOVWF PORTB ;battatcacacLEDoPORTB
CALL delay_100ms;goichuongtrinhcontaothoigiandelay100ms
CLRF PORTB ;tatcacLEDoPORTB
CALL delay_100ms;goichuongtrinh
contaothoigiandelay100ms
GOTO loop ;trovevonglapchinhcuachuongtrinh
;=============================================================================
;CHUONGTRINHCON
;=============================================================================
delay_100ms;labelbatdauchuongtrinhcon
MOVLW dʹ100ʹ ;doancodechochuongtrinhcondelay100ms
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 ;ketthucchuongtrinhcon,trovechuongtrinhchinh
END
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT02.03
Ngày:
2/9/2006
Trang:
16/17
Tanhậnthấy rằng vớicách tổ chứcchương trình s ử dụngchươngtìnhcon, chương
trìnhchínhcũngtrởnênngắngọn,dễhiểuvàrõrànghơnrấtnhiều.
Tiếptheo,
tasẽtiếnthêmmộtbượcnữabằngcáchtựlàmkhómìnhvớiyêucầumới
nhưsau:
•
Ứngdụng2:
Yêucầucủaứngdụngnàycũngtươngtựnhưứngdụng1,tuynhiêntasẽthayđổi
nhiềuthờigiandelaykhácnhau,cụthểnhưsau:
- BậttấtcảcácLED
- delay100ms
-
TắttấtcảcácLED
- Delay200ms
Rõrànglàtrongđoạnchươngtrìnhchính,giảithuậtkhôngcónhiềukhácbiệt.Thayvì
saukhitắtLED,tagọichươngtrìnhcondelay_100msthìbâygiờs ẽg
ọichươngtrìnhcon
delay_200ms(tấtnhiênlàtaphảiviếtchươngtrìnhconnàythìmớicócáiđểgọi).Vấnđềở
đâylàviếtnhưthếnàochongắnnhất.
Đểđápứngđượcyêucầucủa
bàinày,tachỉcầnthayđổimộtvàichitiếtnhỏtrong
chươngtrìnhcondelay.Cụthểnhưsau:
delay_100ms;labelbatdauchuongtrinhcondelay_100ms
MOVLW dʹ100ʹ
GOTO delay
Delay_200ms;labelbatdauchuongtrinhcondelay_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ườibáocáo:
NguyễnTrungChính
Tàiliệ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 ;ketthucchuongtrinhcon,trovechuongtrinhchinh
Nhưtađãbiếtởphần2,vớithuậttoán2,muốnthayđổithờigiandelaychochương
trình
delay,tachỉviệcthayđổigiátrịđưavàothanhghicount1.Ởđâytacũnglàmthao
táctươngtự.Đoạncodetừlabel“delay”đượcgiữnguyênkhôngthayđổi.Khigọichương
trình con delay_100ms, giá trị 100sẽ đượcđưa vào
thanh ghi W, sau đó nhảy tới label
“delay”đểđưagiátrịđóvàothanhghi“count1”đểtiếptụcthựchiệnviệctạothờigian
delay.Cácthaotácđượctiếnhànhtươngtựnhưkhigọichương
trìnhcondelay_200msvà
lúcđógiátrịđượcđưavàothanhghiWsẽlà200.
Hoàntoàntươngtựtacóthểtạoramộtloạtnhữngchươngtr ìnhdelay1ms,2ms,5,
ms,…đểsửdụngmột
cáchdễdàngtùytheoyêucầuvềchươngtrìnhdelaycủaứngdụng
cụthể.
Đếnđâyxemnhưtađãpháttriểnmộtcáchkháhoànthiệnvềcácgiảiphápchochương
tìnhdelaythôngquavi
ệcxâydựngchươngtrìnhcondelayvàhiểuđượccáchtạonhiều
thờigiandelaykhácnhautrongcùng mộtchươngtrìnhmàkhôngcầnphảiviếtđiviếtlại
nhiềuchươngtrìnhdelay.
Bâygiờlàlúcrútramộtvàikếtluậntrướckhikếtthúcbài2vàchuẩnbịchobài3.
4. Kếtluậ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ụngchoviđiềukhiển.Chươngtrìnhdelayđượcsửdụngnhiềutrongcácthaotáchiểnthị
vàtrongcácứngd
ụngcầnralệnhchoviđiềukhiểnphảichờ.
Cácthuậttoándùngđểxâydựngchươngtrìnhdelayphảithỏamãncáctiêuchíngắn
gọnvàthuậntiệnchoviệcsửdụ
ng,đồngthờigiúptakiểmsoátđượcthờigiandelaydo
đoạnchươngtrìnhtạora.
Thờigiandelaydochươngtrìnhdelaytạorasẽphụthuộcvàogiảithuậtsửdụngcho
chươngtrình
delayvàloạithạchanhsửdụngchoviđiềukhiển.
Chươngtrình congiúpta cóđượcnhiều phương ántổ chứcmột chươngtrìnhứng
dụngmộtcáchlinhhoạt,gọngàngvàd
ễhiểuhơn.
Hếtbài2!