Chương trình Delay PIC16F877A từ dễ tới khó Cơ bản về VI điều khiển và PIC
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,picvietnam@googlegroups.com 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, ;picvietnam@googlegroups.com ;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 [...]... 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: ;============================================================================= ... Đế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 ... 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 ... 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 ... 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. ... 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. ... 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 ... chi tiết nhỏ trong chương trình con delay. Cụ thể như sau: delay_ 100ms MOVLW dʹ100ʹ GOTO delay Delay_ 200ms MOVLW d’200’ GOTO delay delay MOVWF count1 MOVLW dʹ199ʹ MOVWF counta MOVLW dʹ1ʹ MOVWF countb d1 delay_ 0 ; label bat dau chuong trinh con delay_ 100ms DECFSZ counta,1 ; label bat dau chuong trinh con delay_ 200ms Người báo cáo: ... 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, ... 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: