Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 18 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
18
Dung lượng
399 KB
Nội dung
Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT02.02 Ngày: 1/30/2006 Trang: 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Ể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ạ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à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à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á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động c ủ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.02 Ngày: 1/30/2006 Trang: 2/18 Tacũngđãbiếtrằngcóhailốikiếntrúcdùngđểtổchức mộ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ựcthi xongtrongm ột khoả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à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 × 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ác bạ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ệ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.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, 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.02 Ngày: 1/30/2006 Trang: 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ìnhdelay trong nhiềutình huố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.02 Ngày: 1/30/2006 Trang: 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: 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ề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à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.02 Ngày: 1/30/2006 Trang: 5/18 MOVLW d’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ạ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ờ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ếuta sửdụng loại thạchanh 4 MHzthì mộtchu kì lệnh sẽ 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ờigian Tnàys ẽ phụthuộcvàocấu trúcgiảithuật chươngtrìnhdelayvàthờigianmộtchukìlệnhti. Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT02.02 Ngày: 1/30/2006 Trang: 6/18 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ấtmà đoạnchươngtrìnhdelaytrêncóthểtạoralà: Tmax=3x(255+1)ti Muốn tạo thời gian delay lâu hơn, ta phải tăngsố lượng các vò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,0 ;giảmgiátrịthanhghi“delay‐reg1”vàsosánhvới0 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 DECFSZ delay‐reg2,0 ;giảmgiátrịthanhghi“delay‐reg2”vàsosánhvới0 MOVWF loop1 ;nếuchưabằng0thìnhảyđếnlabel“loop1” GOTO loop ;nếubằng0thìnhảyđếnlabel“loop” next ………………… Taxétđoạnchươngtrìnhtừlabel“loop1”trước.Đoạnchươngtrình nàytươngtự nhưđoạnchươngtrì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ịN2đưa vàothanhghi“delay‐reg2”(255).TagọiT 2làthờigiandelaydođoạnchươngtrìnhnày tạorathìT2sẽđựơ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ựcthi vònglặp“loop1”.NhưvậysaumộtkhoảngthờigianT2,giátritrong thanhghi“delay‐reg1”sẽgiảmđimộtđơnvị,vànếutagọiN1là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=(N1+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: Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT02.02 Ngày: 1/30/2006 Trang: 7/18 T=3×(255+1)×(255+1)ti=196608ti 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ạchanhsửdụngtrong mạchmàtacóthểđưacácgiátrịN1và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ịđưa và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ênti=1μs. Dođótacó (N1+1)×(N2+1)=T/3ti=90×10 ‐3 /(3×1×10 ‐6 )=30×10 3 Nếuchọngiátrịđưavàothanhghi“delay‐reg2”làN2 =199thìgiátrịN1đưavào thanhghi“delay‐reg1”sẽlà: N1=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ịN1vàN2 phảithỏamãnđiềukiện: 0<N1<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được sử dụngtrongtutorialcủaNigel.Phầnnàysẽphântíchcụthểgiảithuậtvàsourcecode củađoạnchươngtrìnhdelaynà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’ Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT02.02 Ngày: 1/30/2006 Trang: 8/18 MOVWF counta ;đưagiátrị199vàothanhghicounta MOVLW d’1’ 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ụngnhả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 thanhghi counta,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àothanhghicounta là199nênthờigiancầnthiếtđểthanhghicountagiảm hếtgiátrịvề0là: T a=5×(199+1)×ti Dotađangsửdụnglaọithạchanh4MHznênT asẽ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ẽ Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT02.02 Ngày: 1/30/2006 Trang: 9/18 đượcthựcthi.Sauđóchươngtrì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àothanhghicountbthựcchấtchỉlàđểthựchiệnquá trìnhchuyểntiếpmỗikhithanhghicountagiảmvề0.Vàđoạncode từlabel“delay_0” thựcchấtlàđểtạora thờigiandelaygầnđúng1msdotađãb ỏquamộtsốchukìlệnh trongbướcchuyểntiếp(lưuýmộtlầnnữalàtađangsửdụngloạithạch anh4MHz), sauđógiátrịtrongthanhghicount1đượcgiảm1đơnvị.Vònglặpcứtiếptụcchođến khigiátrịtrongthanhghicount1đượcgiảm về0.Khiđólệnh“GOTOd1”không đượcthực thinữavàquátrìnhtạothờigiandelaykếtthúc,cáclệnhtiếptheotrong chươngtrìnhchí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ấtcứ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ênthờ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đadođ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án2tuydà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ầnsố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đãđượcxâydựngtrongbài1.Trongbài1,tađãthựchiệnviệtxuấtcácgiá trịra PORTB vàkiểm chứngbằngcác LED gắn vàoPORTB.Bâygiờtasẽviếtchương trìnhchotấtcảcácLEDgắnvàoPORTBchớptắtsaumỗikhoảngthờigian100ms. Giảithuậtcho chươngtrìnhchắccũngkhôngcógìphảiđángbàn,cácbướcthựchiện lầnlượtsẽlà: Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT02.02 Ngày: 1/30/2006 Trang: 10/18 - BậttấtcảcácLEDởPORTB - Delay100ms - TắttấtcảcácLEDởPORTB - Delay100ms - Lặplạicácthaotáctrên 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 ;============================================================================= [...]... chi tiết nhỏ trong chương trình con delay. Cụ thể như sau: delay_ 100ms MOVLW dʹ100ʹ GOTO ; label bat dau chuong trinh con delay_ 100ms delay Delay_ 200ms d’200’ MOVLW ; label bat dau chuong trinh con delay_ 200ms Người báo cáo: Nguyễn Trung Chính Tài liệu: TUT02.02 Ngày: 1/30/2006 Trang: 17/18 GOTO delay delay MOVWF count1 MOVLW dʹ199ʹ ... 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 đề ở ... 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 ... 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 ... ; 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 Người báo cáo: Nguyễn Trung Chính Tài liệu: TUT02.02 Ngày: 1/30/2006 Trang: 13/18 GOTO delay_ 02 DECFSZ count1,1 GOTO d1_2 ; het doan chuong trinh delay 1 ms GOTO loop ... dʹ199ʹ MOVWF counta MOVLW dʹ1ʹ MOVWF countb d1 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 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 ... ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; Vong lap chinh ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ loop MOVLW 0XFF MOVWF PORTB CALL delay_ 100ms ; goi chuong trinh con tao thoi gian delay 100 ms CLRF PORTB CALL delay_ 100ms ; goi chuong trinh con tao thoi gian delay 100 ms GOTO loop ; bat tat ca cac LED o PORTB ; tat cac LED o PORTB ; tro ve vong lap chinh cua chuong trinh ;============================================================================= ... ;============================================================================= delay_ 100ms MOVLW dʹ100ʹ MOVWF count1 MOVLW dʹ199ʹ MOVWF counta MOVLW dʹ1ʹ MOVWF countb d1 ; label bat dau chuong trinh con ; doan code cho chuong trinh con delay 100 ms Người báo cáo: Nguyễn Trung Chính Tài liệu: TUT02.02 Ngày: 1/30/2006 Trang: 16/18 delay_ 0 DECFSZ counta,1 GOTO $+2 DECFSZ countb,1 GOTO delay_ 0 DECFSZ ... ; doan chuong tirnh tao thoi gian delay 100 ms MOVWF count1 Người báo cáo: Nguyễn Trung Chính Tài liệu: TUT02.02 Ngày: 1/30/2006 Trang: 12/18 d1_1 MOVLW dʹ199ʹ MOVWF counta MOVLW dʹ1ʹ MOVWF countb 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 . Delay 200ms Rõrànglàtrongđoạnchươngtrìnhchính,giảithuậtkhôngcónhiềukhácbiệt.Thayvì saukhitắtLED,tagọichươngtrìnhcon delay_ 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ủabàinày,tachỉcầnthayđổimộtvàichitiếtnhỏtrong chươngtrìnhcon delay. Cụthểnhưsau: delay_ 100ms;labelbatdauchuongtrinhcon delay_ 100ms MOVLW dʹ100ʹ GOTO delay Delay_ 200ms;labelbatdauchuongtrinhcon delay_ 200ms MOVLW. ;nếuđãbăng0chươngtrình delay hoàntất loop1 MOVLW d’255’ MOVWF delay reg2 ;đưavàothanhghi delay reg2”giátrị255 DECFSZ delay reg2,0 ;giảmgiátrịthanhghi delay reg2”vàsosánhvới0 MOVWF. T=3×(255+1)×(255+1)ti=196608ti Nếusửdụngloạithạchanh4MHzthìthờigian delay dođoạnchươngtrìnhtrên tạoralà196608μs. Nhưvậy,tùyvàothờigian delay cầnthiếtvàtùyvàoloạithạchanhsửdụngtrong mạchmàtacóthểđưacácgiátrịN1và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ịđưa vàothanhghi delay reg1”và delay reg2”đểthờigian delay dođ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ênti=1μs. Dođótacó (N1+1)×(N2+1)=T/3ti=90×10 ‐3 /(3×1×10 ‐6 )=30×10 3 Nếuchọngiátrịđưavàothanhghi delay reg2”làN2