Hiệnnaytrênthịtrườngcórấtnhiềuhọviđiềukhiểnnhư8051,Motorola68HC,AVR,ARM,...Ngoàihọ8051đượchướngdẫnmộtcáchcănbảnởmôitrườngđạihọc,bảnthânngườiviếtđãchọnhọviđiềukhiểnPICđểmởrộngvốnkiếnthứcv
Trang 1Tổngquanvềviđiềukhiển
Trang 21.1PICLÀGÌ??
1.2TẠISAOLÀPICMÀKHÔNGLÀCÁCHỌVIĐIỀUKHIỂNKHÁC??1.3KIẾNTRÚCPIC
Trang 51.1PICLÀGÌ??
PIClàviếttắtcủa“ProgramableIntelligentComputer”,cóthểtạmdịchlà“máytínhthôngminhkhảtrình
”dohãngGenenralInstrumentđặttênchoviđiềukhiểnđầutiêncủahọ:PIC1650đượcthiếtkếđểdùnglàmcácthiếtbịngoạivichoviđiềukhiểnCP1600.ViđiềukhiểnnàysauđóđượcnghiêncứupháttriểnthêmvàtừđóhìnhthànhnêndòngviđiềukhiểnPICngàynay
1.2TẠISAOLÀPICMÀKHÔNGLÀCÁCHỌVIĐIỀUKHIỂNKHÁC??
Hiệnnaytrênthịtrườngcórấtnhiềuhọviđiềukhiểnnhư8051,Motorola68HC,AVR,ARM, Ngoàihọ8051đượchướngdẫnmộtcáchcănbảnởmôitrườngđạihọc,bảnthânngườiviếtđãchọnhọviđiềukhiểnPICđểmởrộngvốnkiếnthứcvàpháttriểncácứngdụngtrêncôngcụnàyvìcácnguyênnhânsau:
HọviđiềukhiểnnàycóthểtìmmuadễdàngtạithịtrườngViệtNam.Giáthànhk
hôngquáđắt
Cóđầyđủcáctínhnăngcủamộtviđiềukhiểnkhihoạtđộngđộclập
Làmộtsựbổsungrấttốtvềkiếnthứccũngnhưvềứngdụngchohọviđiềukhiểnmangtínhtruyềnthống:họviđiềukhiển8051
SốlượngngườisửdụnghọviđiềukhiểnPIC.HiệnnaytạiViệtNamcũngnhưtrênthếgiới,họviđiềukhiểnnàyđượcsửdụngkhárộngrãi.Điềunàytạonhiềuthuậnlợitrongquátrìnhtìmhiểuvàpháttriểncácứngdụngnhư:sốlượngtàiliệu,sốlượngcácứngdụngmởđãđượcpháttriểnthànhcông,dễdàngtraođổi,họctập,dễdàngtìmđượcsựchỉdẫnkhigặpkhókhăn,…
Sựhỗtrợcủanhàsảnxuấtvềtrìnhbiêndịch,cáccôngcụlậptrình,nạpchươngtrìnhtừđơngiảnđếnphứctạp,…
CáctínhnăngđadạngcủaviđiềukhiểnPIC,vàcáctínhnăngnàykhôngngừngđượcpháttriển
1.3KIẾNTRÚCPIC
Cấutrúcphầncứngcủamộtviđiềukhiểnđượcthiếtkếtheohaidạngkiếntrúc:kiếntrúc
VonNeumanvàkiếntrúcHavard
Trang 6TổchứcphầncứngcủaPICđượcthiếtkếtheokiếntrúcHavard.ĐiểmkhácbiệtgiữakiếntrúcHavardvàkiếntrúcVon-Neumanlàcấutrúcbộnhớdữliệuvàbộnhớchươngtrình
ĐốivớikiếntrúcVon-Neuman,bộnhớdữliệuvàbộnhớchươngtrìnhnằmchungtrongmộtbộnhớ,dođótacóthểtổchức,cânđốimộtcáchlinhhoạtbộnhớchươngtrìnhvàbộnhớdữliệu.TuynhiênđiềunàychỉcóýnghĩakhitốcđộxửlícủaCPUphảirấtcao,vìvớicấutrúcđó,trongcùngmộtthờiđiểmCPUchỉcóthểtươngtácvớibộnhớdữliệuhoặcbộnhớchươngtrình.NhưvậycóthểnóikiếntrúcVon-
Neumankhôngthíchhợpvớicấutrúccủamộtviđiềukhiển
ĐốivớikiếntrúcHavard,bộnhớdữliệuvàbộnhớchươngtrìnhtáchrathànhhaibộnhớriêngbiệt.DođótrongcùngmộtthờiđiểmCPUcóthểtươngtácvớicảhaibộnhớ,nhưvậytốcđộxửlícủaviđiềukhiểnđượccảithiệnđángkể
MộtđiểmcầnchúýnữalàtậplệnhtrongkiếntrúcHavardcóthểđượctốiưutùytheoyêucầukiếntrúccủaviđiềukhiểnmàkhôngphụthuộcvàocấutrúcdữliệu.Vídụ,đốivớiviđiềukhiểndòng16F,độdàilệnhluônlà14bit(trongkhidữliệuđượctổchứcthànhtừngbyte),cònđốivớikiếntrúcVon-
Neuman,độdàilệnhluônlàbộisốcủa1byte(dodữliệuđượctổchứcthànhtừngbyte).Đặcđiểmnàyđượcminhhọacụthểtronghình1.1
1.4RISCvàCISC
Nhưđãtrìnhbàyởtrên,kiếntrúcHavardlàkháiniệmmớihơnsovớikiếntrúcVon-Neuman.Kháiniệmnàyđượchìnhthànhnhằmcảitiếntốcđộthựcthicủamộtviđiềukhiển.Quaviệctáchrờibộnhớchươngtrìnhvàbộnhớdữliệu,buschươngtrìnhvàbusdữliệu,CPUcóthểcùngmộtlúctruyxuấtcảbộnhớchươngtrìnhvàbộnhớdữliệu,giúptăngtốcđộxửlícủaviđiềukhiểnlêngấpđôi.Đồngthờicấutrúclệnhkhôngcònphụthuộcvàocấutrúcdữliệunữamàcóthểlinhđộngđiềuchỉnhtùytheokhảnăngvàtốcđộcủatừngviđiều
Trang 7cầnhaichukìxungđồnghồ).ĐiềunàycónghĩatậplệnhcủaviđiềukhiểnthuộccấutrúcHavardsẽítlệnhhơn,ngắnhơn,đơngiảnhơnđểđápứngyêucầumãhóalệnhbằngmộtsốlượngbitnhấtđịnh
ViđiềukhiểnđượctổchứctheokiếntrúcHavardcònđượcgọilàviđiềukhiểnRISC(ReducedInstructionSetComputer)hayviđiềukhiểncótậplệnhrútgọn.ViđiềukhiểnđượcthiếtkếtheokiếntrúcVon-NeumancònđượcgọilàviđiềukhiểnCISC(ComplexInstructionSetComputer)hayviđiềukhiểncótậplệnhphứctạpvìmãlệnhcủanókhôngphảilàmộtsốcốđịnhmàluônlàbộisốcủa8bit(1byte)
1.5PIPELINING
ĐâychínhlàcơchếxửlílệnhcủacácviđiềukhiểnPIC.Mộtchukìlệnhcủaviđiềukhiểnsẽbaogồm4xungclock.Vídụtasửdụngoscillatorcótầnsố4MHZ,thìxunglệnhsẽcótầnsố1MHz(chukìlệnhsẽlà1us).Giảsửtacómộtđoạnchươngtrìnhnhưsau:
Hình1.2:Cơchếpipelining
Trang 8øyđượcthựchiệntươngtựchocáclệnhtiếptheocủachươngtrình
Thôngthường,đểthựcthimộtlệnh,tacầnmộtchukìlệnhđểgọilệnhđó,vàmộtchukìxungclocknữađểgiảimãvàthựcthilệnh.Vớicơchếpipeliningđượctrìnhbàyởtrên,mỗilệnhxemnhưchỉđượcthựcthitrongmộtchukìlệnh.ĐốivớicáclệnhmàquátrìnhthựcthinólàmthayđổigiátrịthanhghiPC(ProgramCounter)cầnhaichukìlệnhđểthựcthivìphảithựchiệnviệcgọilệnhởđịachỉthanhghiPCchỉtới.SaukhiđãxácđịnhđúngvịtrílệnhtrongthanhghiPC,mỗilệnhchỉcầnmộtchukìlệnhđểthựcthixong
Trướchếtcầnchúýđếnsốchâncủaviđiềukhiểncầnthiếtchoứngdụng.Cónhiều
viđiềukhiểnPICvớisốlượngchânkhácnhau,thậmchícóviđiềukhiểnchỉcó8chân,ngoàiracòncócácviđiềukhiển28,40,44,…chân
Trang 9Saucùngcầnchúýđếnbộnhớchươngtrìnhmàviđiềukhiểnchophép
NgoàiramọithôngtinvềcáchlựachọnviđiềukhiểnPICcóthểđượctìmthấytrongcuốnsách“SelectPICguide”donhàsảnxuấtMicrochipcungcấp
1.7NGÔNNGỮLẬPTRÌNHCHOPIC
NgônngữlậptrìnhchoPICrấtđadạng.NgônngữlậptrìnhcấpthấpcóMPLAB(đượccungcấpmiễnphíbởinhàsảnxuấtMicrochip),cácngônngữlậptrìnhcấpcaohơnbaogồmC,Basic,Pascal,…
NgoàiracòncómộtsốngônngữlậptrìnhđượcpháttriểndànhriêngchoPICnhưPICBasic,MikroBasic,
…
1.8MẠCHNẠPPIC
ĐâycũnglàmộtdòngsảnphẩmrấtđadạngdànhchoviđiềukhiểnPIC.CóthểsửdụngcácmạchnạpđượccungcấpbởinhàsảnxuấtlàhãngMicrochipnhư:PICSTARTplus,MPLABICD2,MPLABPM3,PROMATEII.CóthểdùngcácsảnphẩmnàyđểnạpchoviđiềukhiểnkhácthôngquachươngtrìnhMPLAB.DòngsảnphẩmchínhthốngnàycóưuthếlànạpđượcchotấtcảcácviđiềukhiểnPIC,tuynhiêngiáthànhrấtcaovàthườnggặprấtnhiềukhókhăntrongquátrìnhmuasảnphẩm
Ngoàiradotínhnăngchophépnhiềuchếđộnạpkhácnhau,còncórấtnhiềumạchnạpđượcthiếtkếdànhchoviđiềukhiểnPIC.CóthểsơlượcmộtsốmạchnạpchoPICnhưsau:
JDMprogrammer:mạchnạpnàydùngchươngtrìnhnạpIcprogchophépnạpcácviđiềukhiểnPICcóhỗtrợtínhnăngnạpchươngtrìnhđiệnápthấpICSP(InCircuitSerialProgramming).Hầuhếtcácmạchnạpđềuhỗtrợtínhnăngnạpchươngtrìnhnày
WARP-13AvàMCP-USB:haimạchnạpnàygiốngvớimạchnạpPICSTARTPLUSdonhàsảnxuấtMicrochipcungcấp,tươngthíchvớitrìnhbiêndịchMPLAB,nghĩalàtacóthểtrựctiếpdùngchươngtrìnhMPLABđểnạpchoviđiềukhiểnPICmàkhôngcầnsửdụngmộtchươngtrìnhnạpkhác,chẳnghạnnhưICprog
P16PRO40:mạchnạpnàydoNigelthiếtkếvàcũngkhánổitiếng.Ôngcònthiếtkếcảchươngtrìnhnạp,tuynhiêntacũngcóthểsửdụngchươngtrìnhnạpIcprog
Trang 10PICnhưP16PRO40
Cácmạchnạpkểtrêncóưuđiểmrấtlớnlàđơngiản,rẻtiền,hoàntoàncóthểtựlắprápmộtcáchdễdàng,vàmọithôngtinvềsơđồmạchnạp,cáchthiếtkế,thicông,kiểmtravàchươngtrìnhnạpđềudễdàngtìmđượcvàdownloadmiễnphíthôngquamạngInternet.Tuynhiêncácmạchnạptrêncónhượcđiểmlàhạnchếvềsốviđiềukhiểnđượchỗtrợ,bêncạnhđómỗimạchnạpcầnđượcsửdụngvớimộtchươngtrìnhnạpthíchhợp
1.9BOOTLOADERVÀICP(InCircuitProgramming)
Trang 112.1SƠĐỒCHÂNVIĐIỀUKHIỂNPIC16F877A
Hình2.1ViđiềukhiểnPIC16F877A/PIC16F874Avàcácdạngsơđồchân
Trang 12ĐâylàviđiềukhiểnthuộchọPIC16Fxxxvớitậplệnhgồm35lệnhcóđộdài14bit.Mỗilệnhđềuđượcthựcthitrongmộtchukìxungclock.Tốcđộhoạtđộngtốiđachophéplà
20MHzvớimộtchukìlệnhlà200ns.Bộnhớchươngtrình8Kx14bit,bộnhớdữliệu368x8byteRAMvàbộnhớdữliệuEEPROMvớidunglượng256x8byte.SốPORTI/Olà5với33pinI/O
Trang 13Hình2.2SơđồkhốiviđiềukhiểnPIC16F877A
Trang 14CấutrúcbộnhớcủaviđiềukhiểnPIC16F877Abaogồmbộnhớchươngtrình(Programmemory)vàbộnhớdữliệu(DataMemory)
Trang 15Hình2.4SơđồbộnhớdữliệuPIC16F877A
Trang 16ĐâylàcácthanhghiđượcsửdụngbởiCPUhoặcđượcdùngđểthiếtlậpvàđiềukhiểncáckhốichứcnăngđượctíchhợpbêntrongviđiềukhiển.CóthểphânthanhghiSFRlàmhailọai:thanhghiSFRliênquanđếncácchứcnăngbêntrong(CPU)vàthanhghiSRFdùngđểthiếtlậpvàđiềukhiểncáckhốichứcnăngbênngoài(vídụnhưADC,PWM,
…).Phầnnàysẽđềcậpđếncácthanhghiliênquanđếncácchứcnăngbêntrong.Cácthanhghidùngđểthiếtlậpvàđiềukhiểncáckhốichứcnăngsẽđượcnhắcđếnkhitađềcậpđếncáckhốichứcnăngđó.ChitiếtvềcácthanhghiSFRsẽđượcliệtkêcụthểtrongbảngphụlục2
Trang 17Stackkhôngnằmtrongbộnhớchươngtrìnhhaybộnhớdữliệumàlàmộtvùngnhớđặcbiệtkhôngchophépđọchayghi.KhilệnhCALLđượcthựchiệnhaykhimộtngắtxảyralàmchươngtrìnhbịrẽnhánh,giátrịcủabộđếmchươngtrìnhPCtựđộngđượcviđiềukhiểncấtvàotrongstack.KhimộttrongcáclệnhRETURN,RETLWhatRETFIEđượcthựcthi,giátrịPCsẽtựđộngđượclấyratừtrongstack,viđiềukhiểnsẽthựchiệntiếpchươngtrìnhtheođúngquitrìnhđịnhtrước
BộnhớStacktrongviđiềukhiểnPIChọ16F87xAcókhảnăngchứađược8địachỉvàhoạtđộngtheocơchếxoayvòng.NghĩalàgiátrịcấtvàobộnhớStacklầnthứ9sẽghiđèlêngiátrịcấtvàoStacklầnđầutiênvàgiátrịcấtvàobộnhớStacklầnthứ10sẽghiđèlêngiátri6cấtvàoStacklầnthứ2
Cầnchúýlàkhôngcócờhiệunàochobiếttrạngtháistack,dođótakhôngbiếtđượckhinàostacktràn.BêncạnhđótậplệnhcủaviđiềukhiểndòngPICcũngkhôngcólệnhPOPhayPUSH,cácthaotácvớibộnhớstacksẽhoàntoànđượcđiềukhiểnbởiCPU
Trang 18Cổngxuấtnhập(I/
Oport)chínhlàphươngtiệnmàviđiềukhiểndùngđểtươngtácvớithếgiớibênngoài.Sựtươngtácnàyrấtđadạngvàthôngquaquátrìnhtươngtácđó,chứcnăngcủaviđiềukhiểnđượcthểhiệnmộtcáchrõràng
Mộtcổngxuấtnhậpcủaviđiềukhiểnbaogồmnhiềuchân(I/
Opin),tùytheocáchbốtrívàchứcnăngcủaviđiềukhiểnmàsốlượngcổngxuấtnhậpvàsốlượngchântrongmỗicổngcóthểkhácnhau.Bêncạnhđó,doviđiềukhiểnđượctíchhợpsẵnbêntrongcácđặctínhgiaotiếpngoạivinênbêncạnhchứcnănglàcổngxuấtnhậpthôngthường,mộtsốchânxuấtnhậpcòncóthêmcácchứcnăngkhácđểthểhiệnsựtácđộngcủacácđặctínhngoạivinêutrênđốivớithếgiớibênngoài.ChứcnăngcủatừngchânxuấtnhậptrongmỗicổnghoàntoàncóthểđượcxáclậpvàđiềukhiểnđượcthôngquacácthanhghiSFRliênquanđếnchânxuấtnhậpđó
ViđiềukhiểnPIC16F877Acó5cổngxuấtnhập,baogồmPORTA,PORTB,PORTC,PORTDvàPORTE.Cấutrúcvàchứcnăngcủatừngcổngxuấtnhậpsẽđượcđềcậpcụthểtrongphầnsau
2.5.1PORTA
PORTA(RPA)baogồm6I/
Opin.Đâylàcácchân“haichiều”(bidirectionalpin),nghĩalàcóthểxuấtvànhậpđược.ChứcnăngI/OnàyđượcđiềukhiểnbởithanhghiTRISA(địachỉ85h).MuốnxáclậpchứcnăngcủamộtchântrongPORTAlàinput,ta“set”bitđiềukhiểntươngứngvớichânđótrongthanhghiTRISAvàngượclại,muốnxáclậpchứcnăngcủamộtchântrongPORTAlàoutput,ta“clear”bitđiềukhiểntươngứngvớichânđótrongthanhghiTRISA.ThaotácnàyhoàntoàntươngtựđốivớicácPORTvàcácthanhghiđiềukhiểntươngứngTRIS(đốivớiPORTAlàTRISA,đốivớiPORTBlàTRISB,đốivớiPORTClàTRISC,đốivớiPORTDlàTRISDvàđốivớiPORTElàTRISE).BêncạnhđóPORTAcònlàngõracủabộADC,bộsosánh,ngõvàoanalogngõvàoxungclockcủaTimer0vàngõvàocủabộgiaotiếpMSSP(MasterSynchronousSerialPort).Đặctínhnàysẽđượctrìnhbàycụthểtrongphầnsau
CấutrúcbêntrongvàchứcnăngcụthểcủatừngchântrongPORTAsẽđượctrìnhbàycụthểtrongPhụlục1
Trang 19CấutrúcbêntrongvàchứcnăngcụthểcủatừngchântrongPORTBsẽđượctrìnhbàycụthểtrongPhụlục1
CấutrúcbêntrongvàchứcnăngcụthểcủatừngchântrongPORTCsẽđượctrìnhbàycụthểtrongPhụlục1
CấutrúcbêntrongvàchứcnăngcụthểcủatừngchântrongPORTDsẽđượctrìnhbàycụthểtrongPhụlục1
Trang 20PORTE(RPE)gồm3chânI/
O.ThanhghiđiềukhiểnxuấtnhậptươngứnglàTRISE.CácchâncủaPORTEcóngõvàoanalog.BêncạnhđóPORTEcònlàcácchânđiềukhiểncủachuẩngiaotiếpPSP
CấutrúcbêntrongvàchứcnăngcụthểcủatừngchântrongPORTEsẽđượctrìnhbàycụthểtrongPhụlục1
CácthanhghiliênquanđếnPORTEbaogồm:
PORTE :chứagiátrịcácchântrongPORTE
TRISE :điềukhiểnxuấtnhậpvàxáclậpcácthôngsốchochuẩngiaotiếpPSP.ADCON1:thanhghiđiềukhiểnkhốiADC
Chitiếtvềcácthanhghisẽđượctrìnhbàycụthểtrongphụlục2
2.6TIMER0
ĐâylàmộttrongbabộđếmhoặcbộđịnhthờicủaviđiềukhiểnPIC16F877A.Timer0làbộđếm8bitđượckếtnốivớibộchiatầnsố(prescaler)8bit.CấutrúccủaTimer0chophéptalựachọnxungclocktácđộngvàcạnhtíchcựccủaxungclock.NgắtTimer0sẽxuấthiệnkhiTimer0bịtràn.BitTMR0IE(INTCON<5>)làbitđiềukhiểncủaTimer0.TMR0IE=1chophépngắtTimer0tácđộng,TMR0IF=0khôngchophépngắtTimer0tácđộng.SơđồkhốicủaTimer0nhưsau:
Hình2.5SơđồkhốicủaTimer0
Trang 21MuốnTimer0hoạtđộngởchếđộcountertasetbitTOSC(OPTION_REG<5>).KhiđóxungtácđộnglênbộđếmđượclấytừchânRA4/
TOCK1.BitTOSE(OPTION_REG<4>)chophéplựachọncạnhtácđộngvàobộtđếm.CạnhtácđộngsẽlàcạnhlênnếuTOSE=0vàcạnhtácđộngsẽlàcạnhxuốngnếuTOSE=1
KhithanhghiTMR0bịtràn,bitTMR0IF(INTCON<2>)sẽđượcset.ĐâychínhlàcờngắtcủaTimer0.Cờngắtnàyphảiđượcxóabằngchươngtrìnhtrướckhibộđếmbắtđầuthựchiệnlạiquátrìnhđếm.NgắtTimer0khôngthể“đánhthức”viđiềukhiểntừchếđộ
sleep
Bộchiatầnsố(prescaler)đượcchiasẻgiữaTimer0vàWDT(WatchdogTimer).ĐiềuđócónghĩalànếuprescalerđượcsửdụngchoTimer0thìWDTsẽkhôngcóđượchỗtrợcủaprescalervàngượclại.PrescalerđượcđiềukhiểnbởithanhghiOPTION_REG.BitPSA(OPTION_REG<3>)xácđịnhđốitượngtácđộngcủaprescaler.CácbitPS2:PS0(OPTION_REG<2:0>)xácđịnhtỉsốchiatầnsốcủaprescaler.XemlạithanhghiOPTION_REGđểxácđịnhlạimộtcáchchitiếtvềcácbitđiềukhiểntrên
CáclệnhtácđộnglêngiátrịthanhghiTMR0sẽxóachếđộhoạtđộngcủaprescaler.KhiđốitượngtácđộnglàTimer0,tácđộnglêngiátrịthanhghiTMR0sẽxóaprescalernhưngkhônglàmthayđổiđốitượngtácđộngcủaprescaler.KhiđốitượngtácđộnglàWDT,lệnhCLRWDTsẽxóaprescaler,đồngthờiprescalersẽngưngtácvụhỗtrợchoWDT
CácthanhghiđiềukhiểnliênquanđếnTimer0baogồm:
TMR0(địachỉ01h,101h) :chứagiátrịđếmcủaTimer0
INTCON(địachỉ0Bh,8Bh,10Bh,18Bh):chophépngắthoạtđộng(GIEvàPEIE).OPTION_REG(địachỉ81h,181h):điềukhiểnprescaler
Chitiếtvềcácthanhghisẽđượctrìnhbàycụthểtrongphụlục2
2.7TIMER1
Timer1làbộđịnhthời16bit,giátrịcủaTimer1sẽđượclưutronghaithanhghi(TMR1H:TMR1L).CờngắtcủaTimer1làbitTMR1IF(PIR1<0>).BitđiềukhiểncủaTimer1sẽlàTMR1IE(PIE<0>)
TươngtựnhưTimer0,Timer1cũngcóhaichếđộhoạtđộng:chếđộđịnhthời(timer)vớixungkíchlàxungclockcủaoscillator(tầnsốcủatimerbằng¼tầnsốcủaoscillator)vàchếđộđếm(counter)vớixungkíchlàxungphảnánhcácsựkiệncầnđếmlấytừbênngoài
Trang 22T1CKI(cạnhtácđộnglàcạnhlên).Việclựachọnxungtácđộng(tươngứngvớiviệclựachọnchếđộhoạtđộnglàtimerhaycounter)đượcđiềukhiểnbởibitTMR1CS(T1CON<1>).SauđâylàsơđồkhốicủaTimer1:
Hình2.6SơđồkhốicủaTimer1
NgoàiraTimer1còncóchứcnăngresetinputbêntrongđượcđiềukhiểnbởimộttronghaikhốiCCP(Capture/Compare/PWM)
KhibitT1OSCEN(T1CON<3>)đượcset,Timer1sẽlấyxungclocktừhaichânRC1/T1OSI/CCP2vàRC0/T1OSO/
T1CKIlàmxungđếm.Timer1sẽbắtđầuđếmsaucạnhxuốngđầutiêncủaxungngõvào.KhiđóPORTCsẽbỏquasựtácđộngcủahaibitTRISC<1:0>vàPORTC<2:1>đượcgángiátrị0.KhiclearbitT1OSCENTimer1sẽlấyxungđếmtừoscillatorhoặctừchânRC0/T1OSO/T1CKI
Timer1cóhaichếđộđếmlàđồngbộ(Synchronous)vàbấtđồngbộ(Asynchronous).Chếđộđếmđượcquyếtđịnhbởibitđiềukhiển (T1CON<2>)
Khi =1xungđếmlấytừbênngoàisẽkhôngđượcđồngbộhóavớixungclockbêntrong,Timer1sẽtiếptụcquátrìnhđếmkhiviđiềukhiểnđangởchếđộsleepvàngắtdoTimer1tạorakhibịtràncókhảnăng“đánhthức”viđiềukhiển.Ởchếđộđếmbấtđồngbộ,Timer1khôngthểđượcsửdụngđểlàmnguồnxungclockchokhốiCCP(Capture/Compare/Pulsewidthmodulation)
Khi =0xungđếmvàoTimer1sẽđượcđồngbộhóavớixungclockbêntrong.Ở
chếđộnàyTimer1sẽkhônghoạtđộngkhiviđiềukhiểnđangởchếđộsleep.Cácthanhghil
iênquanđếnTimer1baogồm:
INTCON(địachỉ0Bh,8Bh,10Bh,18Bh):chophépngắthoạtđộng(GIEvàPEIE).PIR1(địachỉ0Ch):chứacờngắtTimer1(TMR1IF)
Trang 23Timer2làbộđịnhthời8bitvàđượchỗtrợbởihaibộchiatầnsốprescalervapostscaler.ThanhghichứagiátrịđếmcủaTimer2làTMR2.BitchophépngắtTimer2tácđộnglàTMR2ON(T2CON<2>).CờngắtcủaTimer2làbitTMR2IF(PIR1<1>).Xungngõvào(tầnsốbằng¼tầnsốoscillator)đượcđưaquabộchiatầnsốprescaler4bit(vớicáctỉsốchiatầnsốlà1:1,1:4hoặc1:16vàđượcđiềukhiểnbởicácbitT2CKPS1:T2CKPS0(T2CON<1:0>))
Hình2.7SơđồkhốiTimer2
Timer2cònđượchỗtrợbởithanhghiPR2.GiátrịđếmtrongthanhghiTMR2sẽtăngtừ00hđếngiátrịchứatrongthanhghiPR2,sauđóđượcresetvề00h.KhIresetthanhghiPR2đượcnhậngiátrịmặcđịnhFFh
NgõracủaTimer2đượcđưaquabộchiatầnsốpostscalervớicácmứcchiatừ1:1đến
1:16.Postscalerđượcđiềukhiểnbởi4bitT2OUTPS3:T2OUTPS0.Ngõracủapostscalerđóngvaitròquyếtđịnhtrongviệcđiềukhiểncờngắt
NgoàirangõracủaTimer2cònđượckếtnốivớikhốiSSP,dođóTimer2cònđóngvaitròtạoraxungclockđồngbộchokhốigiaotiếpSSP
CácthanhghiliênquanđếnTimer2baogồm:
INTCON(địachỉ0Bh,8Bh,10Bh,18Bh):chophéptoànbộcácngắt(GIEvàPEIE).PIR1(địachỉ0Ch):chứacờngắtTimer2(TMR2IF)
PIE1(địachị8Ch):chứabitđiềukhiểnTimer2(TMR2IE).TMR2
(địachỉ11h):chứagiátrịđếmcủaTimer2
T2CON(địachỉ12h):xáclậpcácthôngsốchoTimer2
Trang 24Chitiếtvềcácthanhghisẽđượctrìnhbàycụthểtrongphụlục2.Tacómộtva
øinhậnxétvềTimer0,Timer1vàTimer2nhưsau:
Timer0vàTimer2làbộđếm8bit(giátrịđếmtốiđalàFFh),trongkhiTimer1làbộđếm16bit(giátrịđếmtốiđalàFFFFh)
Timer0,Timer1vàTimer2đềucóhaichếđộhoạtđộnglàtimervàcounter.Xungclockcótầnsốbằng¼tầnsốcủaoscillator
XungtácđộnglênTimer0đượchỗtrợbởiprescalervàcóthểđượcthiếtlậpởnhiềuchếđộkhácnhau(tầnsốtácđộng,cạnhtácđộng)trongkhicácthôngsốcủaxungtácđộnglênTimer1làcốđịnh.Timer2đượchỗtrợbởihaibộchiatầnsốprescalervàpostcalerđộclập,tuynhiêncạnhtácđộngvẫnđượccốđịnhlàcạnhlên
Timer1cóquanhệvớikhốiCCP,trongkhiTimer2đượckếtnốivớikhốiSSP.Mộtvàisosa
ùnhsẽgiúptadễdànglựachọnđượcTimerthíchhợpchoứngdụng
2.9ADC
ADC(AnalogtoDigitalConverter)làbộchuyểnđổitínhiệugiữahaidạngtươngtựvàsố.PIC16F877Acó8ngõvàoanalog(RA4:RA0vàRE2:RE0).HiệuđiệnthếchuẩnVREFcóthểđượclựachọnlàVDD,VSShayhiệuđiệnthểchuẩnđượcxáclậptrênhaichânRA2vàRA3.Kếtquảchuyểnđổitừtíntiệutươngtựsangtínhiệusốlà10bitsốtươngứngvàđượclưutronghaithanhghiADRESH:ADRESL.KhikhôngsửdụngbộchuyểnđổiADC,cácthanhghinàycóthểđượcsửdụngnhưcácthanhghithôngthườngkhác.Khiquátrìnhchuyểnđổihoàntất,kếtquảsẽđượclưuvàohaithanhghiADRESH:ADRESL,bit (ADCON0<2>)đượcxóavề0vàcờngắtADIFđượcset
Quitrìnhchuyểnđổitừtươngtựsangsốbaogồmcácbướcsau:
1.ThiếtlậpcácthôngsốchobộchuyểnđổiADC:
Chọnngõvàoanalog,chọnđiệnápmẫu(dựatrêncácthôngsốcủathanhghi
ADCON1)ChọnhkênhchuyểnđổiAD(thanhghiADCON0)
ChọnhxungclockchokênhchuyểnđổiAD(thanhghiADCON0).ChophépbộchuyểnđổiADhoạtđộng(thanhghiADCON0)
2.ThiếtlậpcáccờngắtchobộADClear
bitADIF
SetbitADIE.SetbitPEIE.SetbitGIE
Trang 26INTCON(địachỉ0Bh,8Bh,10Bh,18Bh):chophépcácngắt(cácbitGIE,PEIE).PIR1(địachỉ0Ch):chứacờngắtAD(bitADIF)
PIE1(địachỉ8Ch):chứabitđiềukhiểnAD(ADIE)
ADRESH(địachỉ1Eh)vàADRESL(địachỉ9Eh):cácthanhghichứakếtquảchuyểnđổiAD.ADCON0(địachỉ1Fh)vàADCON1(địachỉ9Fh):xáclậpcácthôngsốchobộchuyểnđổiAD.PORTA(địachỉ05h)vàTRISA(địachỉ85h):liênquanđếncácngõvàoanalogở
CơchếhoạtđộngcủabộComparatornhưsau:
Trang 27IN-vàtínhiệuởngõrabộsosánhsẽthayđổitươngứngnhưhìnhvẽ.KhiđiệnápởchânVIN+lớnhơnđiệnápởchânVIN+ngõrasẽởmức1vàngượclại
Dựavàohìnhvẽtathấyđápứngtạingõrakhôngphảilàtứcthờisovớithayđổitạingõvàomàcầncómộtkhoảngthờigiannhấtđịnhđểngõrathayđổitrạngthái(tốiđalà10us).Cầnchúýđếnkhoảngthờigianđápứngnàykhisửdụngbộsosánh
CựctínhcủacácbộsosánhcóthểthayđổidựavàocácgiátrịđặtvàocácbitC2INV
vàC1INV(CMCON<4:5>)
Hình2.10Nguyênlíhoạtđộngcủamộtbộsosánhđơngiản
Trang 28CácbitC2OUTvàC1OUT(CMCON<7:6>)đóngvaitròghinhậnsựthayđổitínhiệuanalogsovớiđiệnápđặttrước.Cácbitnàycầnđượcxửlíthíchhợpbằngchươngtrìnhđểghinhậnsựthayđổicủatínhiệungõvào.CờngắtcủabộsosánhlàbitCMIF(thanhghiPIR1).Cờngắtnàyphảiđượcresetvề0.BitđiềukhiểnbộsosánhlàbitCMIE(TranhghiPIE)
Trang 29-của2bộsosánhC1vàC2(xemchitiếtởhình2.10).TrongkhiđóđiệnápđưavàongõVIN+sẽđượclấytừmộtbộtạođiệnápsosánh.Sơđồkhốicủabộtạođiệnápsosánhđựơctrìnhbàytronghìnhvẽsau:
Hình2.12Sơđồkhốibộtạođiệnápsosánh
Bộtạođiệnápsosánhnàybaogồmmộtthangđiệntrở16mứcđóngvaitròlàcầuphânápchianhỏđiệnápV
DDthànhnhiềumứckhácnhau(16mức).MỗimứccógiátrịđiệnápkhácnhautùythuộcvàobitđiềukhiểnCVRR(CVRCON<5>).NếuCVRRởmứclogic1,điệntrở
8Rsẽkhôngcótácdụngnhưmộtthànhphầncủacầuphânáp(BJTdẫnmạnhvàdòngđiện
Trang 30ThanhghiCVRCON(địachỉ9Dh):thanhghitrựctiếpđiềukhiểnbộsosánhđiệnáp.ThanhghiCMCON(địachỉ9Ch):thanhghiđiềukhiểnbộComparator.Chitiếtvềcácthanhghisẽđượctrìnhbàycụthểởphụlục2
2.11CCP
CCP(Capture/Compare/
PWM)baogồmcácthaotáctrêncácxungđếmcungcấpbởicácbộđếmTimer1vàTimer2.PIC16F877AđượctíchhợpsẵnhaikhốiCCP:CCP1vàCCP2.MỗiCCPcómộtthanhghi16bit(CCPR1H:CCPR1LvàCCPR2H:CCPR2L),pinđiềukhiểndùngchokhốiCCPxlàRC2/CCP1vàRC1/T1OSI/
TMR2
Trang 31ãicạnhlênthứ4
Mỗicạnhlênthứ16
SaukhigiátrịcủathanhghiTMR1đượcđưavàothanhghiCCPRx,cờngắtCCPIFđượcsetvàphảiđượcxóabằngchươngtrình.NếuhiệntượngtiếptheoxảyramàgiátrịtrongthanhghiCCPRxchưađượcxửlí,giátrịtiếptheonhậnđượcsẽtựđộngđượcghiđèlêngiátrịcũ
MộtsốđiểmcầnchúýkhisửdụngCCPnhưsau:
CácpindùngchokhốiCCPphảiđượcấnđịnhlàinput(setcácbittươngứngtrongthanhghiTRISC).KhiấnđịnhcácpindùngchokhốiCCPlàoutput,việcđưagiátrịvàoPORTCcũngcóthểgâyracác“hiệntượng”tácđộnglênkhốiCCPdotrạngtháicủapinthayđổi
Timer1phảiđượchoạtđộngởchếđộTimerhoặcchếđộđếmđồngbộ
TránhsửdụngngắtCCPbằngcáchclearbitCCPxIE(thanhghiPIE1),cờngắtCCPIFnênđượcxóabằngphầnmềmmỗikhiđượcsetđểtiếptụcnhậnđịnhđượctrạngtháihoạtđộngcủaCCP
CCPcònđượctíchhợpbộchiatầnsốprescalerđượcđiềukhiểnbởicácbitCCPxM3:CCPxM0.Việcthayđổiđốitượngtácđộngcủaprescalercóthểtạorahoạtđộngngắt.PrescalerđượcxóakhiCCPkhônghoạtđộnghoặckhireset
XemcácthanhghiđiềukhiểnkhốiCCP(phụlục2đểbiếtthêmchitiết)
Trang 32Hình2.14SơđồkhốiCCP(Comparemode)
TươngtựnhưởchếđộCapture,Timer1phảiđượcấnđịnhchếđộhoạtđộnglàtimerhoặcđếmđồngbộ.Ngoàira,khiởchếđộCompare,CCPcókhảnăngtạorahiệntượngđặcbiệt(SpecialEventtrigger)làmresetgiátrịthanhghiTMR1vàkhởiđộngbộchuyểnđổiADC.ĐiềunàychophéptađiềukhiểngiátrịthanhghiTMR1mộtcáchlinhđộnghơn
Trang 33BộchiatầnsốprescalercủaTimer2chỉcóthểnhậncácgiátrị1,4hoặc16(xemlạiTimer2đểbiếtthêmchitiết).KhigiátrịthanhghiPR2bằngvớigiátrịthanhghiTMR2thìquátrìnhsauxảyra:
Trang 34MộtsốđiểmcầnchúýkhisửdụngkhốiPWM:
Timer2cóhaibộchiatầnsốprescalervàpostscaler.TuynhiênbộpostscalerkhôngđượcsửdụngtrongquátrìnhđiềuchếđộrộngxungcủakhốiPWM
NếuthờigiandutycycledàihơnthờigianchukìxungperiodthìxungngõratiếptụcđượcgiữởmứccaosaukhigiátrịPR2bằngvớigiátrịTMR2
2.12GIAOTIẾPNỐITIẾP
1.12.1USART
USART(UniversalSynchronousAsynchronousReceiverTransmitter)làmộttronghaichuẩngiaotiếpnốitiếp.USARTcònđượcgọilàgiaodiệngiaotiếpnốitiếpnốitiếpSCI(SerialCommunicationInterface).Cóthểsửdụnggiaodiệnnàychocácgiaotiếpvớicácthiếtbịngọaivi,vớicácviđiềukhiểnkháchayvớimáytính.CácdạngcủagiaodiệnUSARTngọaivibaogồm:
Bấtđộngbộ(Asynchronous).Đồngbộ_Mastermode.Đồngbộ_
Slavemode
HaipindùngchogiaodiệnnàylàRC6/TX/CKvàRC7/RX/DT,trongđóRC6/TX/
CKdùngđểtruyềnxungclock(baudrate)vàRC7/RX/
DTdùngđểtruyềndata.TrongtrườnghợpnàytaphảisetbitTRISC<7:6>vàSPEN(RCSTA<7>)c0đểchophépgiaodiệnUSART
PIC16F877AđượctíchhợpsẵnbộtạotốcđộbaudBRG(BaudRateGenetator)8bitdùngchogiaodiệnUSART.BRGthựcchấtlàmộtbộđếmcóthểđượcsửdụngchocảhaidạngđồngbộvàbấtđồngbộvàđượcđiềukhiểnbởithanhghiPSBRG.Ởdạngbấtđồngbộ,BRGcònđượcđiềukhiểnbởibitBRGH(TXSTA<2>).ỞdạngđồngbộtácđộngcủabitBRGHđượcbỏqua.TốcđộbauddoBRGtạorađượctínhtheocôngthứcsau:
TrongđóXlàgiátrịcủathanhghiRSBRG(Xlàsốnguyênvà0<X<255)
Trang 35TXSTA(địachỉ98h):chọnchếđộđòngbộhaybấtđồngbộ(bitSYNC)vàchọnmứctốcđộbaud(bitBRGH)
2.12.1.1.1TRUYỀNDỮLIỆUQUACHUẨNGIAOTIẾPUSARTBẤTĐỒNGBỘ
ThànhphầnquantrọngnhấtcủakhốitruyềndữliệulàthanhghidịchdữliệuTSR(TransmitShiftRegister).ThanhghiTSRsẽlấydữliệutừthanhghiđệmdùngchoquátrìnhtruyềndữliệuTXREG.DữliệucầntruyềnphảiđựơcđưatrướcvàothanhghiTXREG.NgaysaukhibitStopcủadữliệucầntruyềntrướcđóđượctruyềnxong,dữliệutừthanhghiTXREGsẽđượcđưavàothanhghiTSR,thanhghiTXREGbịrỗng,ngắtxảyravàcờhiệuTXIF(PIR1<4>)đượcset.NgắtnàyđượcđiềukhiểnbởibitTXIE(PIE1<4>).CờhiệuTXIFvẫnđượcsetbấtchấptrạngtháicủabitTXIEhaytácđộngcủachươngtrình(khôngthểxóaTXIFbằngchươngtrình)màchỉresetvề0khicódữliệumớiđượcđưavàothanhhghiTXREG
Hình2.17SơđồkhốicủakhốitruyềndữliệuUSART
Trang 36KhốitruyềndữliệuđượcchophéphoạtđộngkhibitTXEN(TXSTA<5>)đượcset.QuátrìnhtruyềndữliệuchỉthựcsựbắtđầukhiđãcódữliệutrongthanhghiTXREGvàxungtruyềnbaudđượctạora.Khikhốitruyềndữliệuđượckhởiđộnglầnđầutiên,thanhghiTSRrỗng.Tạithờiđiểmđó,dữliệuđưavàothanhghiTXREGngaylậptứcđượcloadvàothanhghiTSRvàthanhghiTXREGbịrỗng.Lúcnàytacóthểhìnhthànhmộtchuỗidữliệuliêntụcchoquátrìnhtruyềndữliệu.TrongquátrìnhtruyềndữliệunếubitTXENbịresetvề0,quátrìnhtruyềnkếtthúc,khốitruyềndữliệuđượcresetvàpinRC6/TX/CKchuyểnđếntrạngtháihigh-impedance
Trongtrườnghợpdữliệucầntruyềnlà9bit,bitTX9(TXSTA<6>)đượcsetvàbitdữliệuthứ
9sẽđượclưutrongbitTX9D(TXSTA<0>).Nênghibitdữliệuthứ9vàotrước,vìkhighi8bitdữliệuvàothanhghiTXREGtrướccóthểxảyratrườnghợpnộidungthanhghiTXREGsẽđượcloadvàothanhghiTSGtrước,nhưvậydữliệutruyềnđisẽbịsaikhácsovớiyêucầu
Tómlại,đểtruyềndữliệutheogiaodiệnUSARTbấtđồngbộ,tacầnthựchiệntuầntựcácbướcsau:
1.TạoxungtruyềnbaudbằngcáchđưacácgiátrịcầnthiếtvàothanhghiRSBRGvàbitđiềukhiểnmứctốcđộbaudBRGH
Trang 37Hình2.18SơđồkhốicủakhốinhậndữliệuUSART
BitđiềukhiểnchophépkhốinhậndữliệulàbitRCEN(RCSTA<4>).ThànhphầnquantrọngnhấtcủakhốinhậndữliệulàthsnhghinhậndữliệuRSR(ReceiveShiftRegister).SaukhinhậndiệnbitStopcủadữliệutruyềntới,dữliệunhậnđượctrongthanhghiRSRsẽđượcđưavàothanhghiRCGER,sauđócờhiệuRCIF(PIR1<5>)sẽđượcsetvàngắtnhậnđượckíchhoạt.NgắtnàyđượcđiềukhiểnbởibitRCIE(PIE1<5>).BitcờhiệuRCIFlàbitchỉđọcvàkhôngthểđượctácđộngbởichươngtrình.RCIFchỉresetvề0khidữliệunhậnvàoởthanhghiRCREGđãđượcđọcvàkhiđóthanhghiRCREGrỗng.ThanhghiRCREGlàthanhghi
Trang 38cóbộđệmkép(double-bufferedregister)vàhoạtđộngtheocơchếFIFO(FirstInFirstOut)chophépnhận2bytevàbytethứ3tiếptụcđượcđưavàothanhghiRSR.NếusaukhinhậnđượcbitStopcủabytedữliệuthứ3màthanhghiRCREGvẫncònđầy,cờhiệubáotràndữliệu(OverrunErrorbit)OERR(RCSTA<1>)sẽđượcset,dữliệutrongthanhghiRSRsẽbịmấtđivàquátrìnhđưadữliệutừthanhghiRSRvàothanhghiRCREGsẽbịgiánđoạn.TrongtrườnghợpnàycầnlấyhếtdữliệuởthanhghiRSREGvàotrướckhitiếptụcnhậnbytedữliệutiếptheo.BitOERRphảiđượcxóabằngphầnmềmvàthựchiệnbằngcáchclearbitRCENrồisetlại.BitFERR(RCSTA<2>)sẽđượcsetkhipháthiệnbitStopdủadữliệuđượcnhậnvào.Bitdữliệuthứ9sẽđượcđưavàobitRX9D(RCSTA<0>).KhiđọcdữliệutừthanhghiRCREG,haibitFERRvàRX9Dsẽnhậncácgiátrịmới.DođócầnđọcdữliệutừthanhghiRCSTAtrướckhiđọcdữliệutừthanhghiRCREGđểtránhbịmấtdữliệu
ThanhghiTXSTA(địachỉ98h):chứacácbitđiềukhiểnSYNCvàBRGH.Thanhghi
SPBRG(địachỉ99h):điềukhiểntốcđộbaud
Chitiếtvềcácthanhghisẽđượctrìnhbàycụthểởphụlục2
Trang 39GiaodiệnUSARTđồngbộđượckíchhoạtbằngcáchsetbitSYNC.CổnggiaotiếpnốitiếpvẫnlàhaichânRC7/RX/DT,RC6/TX/
CKvàđượcchophépbằngcáchsetbitSPEN.USARTchophéphaichếđộtruyềnnhậndữliệulàMastermodevàSlavemode.MastermodeđượckíchhoạtbằngcáchsetbitCSRC(TXSTA<7>),SlavemodeđượckíchhoạtbằngcáchclearbitCSRC.ĐiểmkhácbiệtduynhấtgiữahaichếđộnàylàMastermodesẽlấyxungclockđồngbộtừbộtaoxungbaudBRGcònSlavemodelấyxungclockđồngbộtừbênngoàiquachânRC6/TX/CK.ĐiềunàychophépSlavemodehoạtđộngngaycảkhiviđiềukhiểnđangởchếđộsleep
2.12.1.2.1TRUYỀNDỮLIỆUQUACHUẨNGIAOTIẾPUSARTĐỒNGBỘMASTERMODE
TươngtựnhưgiaodiệnUSARTbâtđồngbộ,thànhphầnquantrọngnhấtcủahốitruyềndữliệulàthanhghidịchTSR(TransmitShiftRegister).ThanhghinàychỉđượcđiềukhiểnbởiCPU.DữliệuđưavàothanhghiTSRđượcchứatrongthanhghiTXREG.CờhiệucủakhốitruyềndữliệulàbitTXIF(chỉthịtrangtháithanhghiTXREG),cờhiệunàyđượcgắnvớimộtngắtvàbitđiềukhiểnngắtnàylàTXIE.CờhiệuchỉthịtrạngtháithanhghiTSRlàbitTRMT.BitTXENchophéphaykhôngchophéptruyềndữliệu
CácbướccầntiếnhànhkhitruyềndữliệuquagiaodiệnUSARTđồngbộMastermode:
1.TạoxungtruyềnbaudbằngcáchđưacácgiátrịcầnthiếtvàothanhghiRSBRGvàbitđiềukhiểnmứctốcđộbaudBRGH
Trang 40ThanhghiPIR1(địachỉ0Ch):chứacờhiệuRCIE.