PSP và ứng dụng
Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT04.02 Ngày: 5/24/2006 Trang: 1/29 Tutorial04.02 Gửiđến: picvietnam@googlegroups.com Nộidung: BÀI4:PARALLELSLAVEPORT(PSP)VÀỨNGDỤNG MICROSOFTWORD Tómtắt: Tutorialpostlênluồng“PIC16F877ATỪDỄTỚIKHÓ”thuộcchuyênmục“CƠBẢNVỀVI ĐIỀUKHIỂNVÀPIC”.Bài4baogồmnộidungsau: ‐ CấutạophầncứngPSPvàcácthanhghiđiềukhiển. ‐ XâydựngmoduleđiềukhiểnPSP(phầncứngvàphầnmềm). 1. SơlượcvềcấutạovàchứcnăngcủaPSP ParallelslavePort(PSP)làmộtkhốichứcnăngon‐chipđượctíchhợptrongphầncứng củamộtsốviđiềukhiểnPIC.Bêncạnhcáckhốichứcnăngrấtđadạngdùngchogiaotiếp nốitiếp(I2C,SPI,CAN,USB,…),PSPlàkhốichứcnăngduynhấttrongviđiềukhiểnPIC dùngchogiaotiếpsongsong8bit. VớisựthamgiacủakhốiPSP,cácchứcnănggiaotiếpcủaviđiềukhiểnPICtrởnên hoànthiệnhơn,giốngnhưmộtmáytính,vớicáccổngnốitiếpvàmộtcổngsongsong.Ta cóthểtạmsosánhcáckhốigiaotiếpnốitiếpcủaPIC nhưcổngCOMhoặccổngUSBcủa máytính,cònkhốigiaotiếpsongsong8bitPSPcóthểsosánhnhưcổngLPT(cổngsong song)củamáytính. MộtđiểmtươngđồnggiữaPSPvàcácgiaotiếpnốitiếpkháctrongviđiềukhiểnPIC, đólàPSPcũnglàgiaotiếptheomôhìnhmaster‐slave.Mộtmasterđượcphépđiều khiển cácgiaotiếpvớimộthoặcnhiềuslave.mastercónhiệmvụđưaracácyêucầugiaotiếp,ví dụnhưgiaotiếpvớislavenào,nộidunggiaotiếp,địnhhướngchiềudữliệu(đọchayghi dữliệu),…vàslavecónhiệmvụđápứngcácyêucầuđócủamaster.Tùytheophương thứcgiao tiếp,ta cócác quiđịnhriêng vềcách “ralệnh” củamaster, cáchđápứng của slavecũngnhưcáchtruyềnnhậndữliệu. PSPcũngcócácyêucầuriêngvềhoạtđộnggiaotiếp.Tuynhiên,cómộtđiểmcầnlưu ý ởđây,làPSPcủaviđiềukhiểnPICchỉhoạtđộngđượcởvaitròcủam ộtslave.Cáchoạt độnggiaotiếptrênPSPsẽđượcđiềukhiểnhoàntoànb ởimộtmaster. TrênđâylàmộtvàiđiểmsơlượcvềPSP.Trongphầntiếptheo tasẽđisâuvàocấutạo vàhoạtđộngcủaPSP,cũngnhưxâydựngmộtsốứngdụngcơbảnchoPSP. Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT04.02 Ngày: 5/24/2006 Trang: 2/29 1.1 CấutạophầncứngcủaPSPtrongviđiềukhiểnPIC16F877A PSPđượctíchhợptrongkhánhiềuviđiềukhiểnPIC.Tùytheoviđiềukhiểnmàcách bốtrícácchânchứcnăngvàcácthanhghiđiềukhiểnchoPSPtrongmộtviđiềukhiểncó thểkhácnhau,tuynhiênvềbảnchất,cấutạocủaPSPlàkhôngđổi.Trongbàinày,viđiều khiểnPIC16F877AđượclựachọnđểtìmhiểuvàxâydựngcácứngdụngchoPSP. PSPcócácchânchứcnăngđượctíchhợptrongportDvàportEcủaPIC16F877A.port Dlàcácchândữliệudùngđểtruyềnnhậndữliệusongsong8bit.portElàcácchânđiều khiểnquátrìnhtruyềnnhận,baogồmcácchânRD*(ReaD,chânRE0),WR*(WRite,chân RE1)vàCS*(ChipSelect,chânRE2).Lưuýlàcácchânnàytíchcựcởtrạngtháilogic0. Cónghĩalà,ởtrạngtháikhôngtácđộng,cácchânnàyphảiđượcđưalênmứclogic1,nếu muốnmộtchânnàođótácđộnglênkhốiPSP,tađiềukhiểnchânđótrởvềtrạngtháilogic 0. KhiđượcchophéphoạtđộngởchếđộPSP,cácchânđiềukhiểnnêutrênsẽkhôngcòn đượcchophéphoạtđộngởchếđộI/O(portD)hoặcchếđộI/OAnalog(portE)nữa.Lúc này,portDvàportEsẽđượcđiềukhiểnbởicácthiếtbịngoạivikhác(mộtviđiềukhiển khácđóngvaitròlàmộtmasterchẳnghạn)đểtruyềnnhậndữliệusongsong8bit.Vaitrò cụthểcủachúngnhưsau: ‐ PortDlàngõxuấtnhậpdữliệuvàhoàntoànđượcđiềukhiểnbởikhốiPSP.Vaitrò củathanhghiTRISDtrongtrườnghợpnàysẽđượcbỏqua. ‐ PortElàcácchânđiềukhiểnvàphảiđượcthiếtlậpcácchếđộhoạtđộngthíchhợp, đólàchếđộngõvàoDigital.ChếđộnàyđượcđiềukhiểnbởithanhghiTRISEvà thanhghiADCON1. Bênc ạnhcácchânđiềukhiển,PSPcònđượchỗtrợngắtPSPvàcácbittrạngtháidùng đểđiềukhiểnhoạtđộngcủakhối.Cácthànhphầnhỗtrợnàyđượctrìnhbàytrongbảng sau(tachỉquantâmtớicácbitđiềukhiểnliênquantớiPSP): Thanh ghi Địa chỉ Chứcnăng PORTD 08h ChứadữliệutruyxuấtlênPSP PORTE 09h ĐiềukhiểncácchânRE2:RE0củaPORTE ChứacácbitđiềukhiểnPSPvàcácbitđiềukhiểnhướngtruyxuấtcác châncủaPORTE. Bit Chứcnăng 7 IBF:InputBufferFullstatusbit IBF=1:códữliệuởbộđệmngõvào IBF=0:khôngcódữliệuởbộđệmngõvào TRISE 89h 6 OBF:OutputBufferFullstatusbit OBF=1:Códữliệuởbộđệmngõra Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT04.02 Ngày: 5/24/2006 Trang: 3/29 OBF=0:Khôngcódữliệuởbộđệmngõra 5 IBOV:InputBufferOVerflowdetectbit IBOV=1:bộđệmdữliệungõvàobịtràn IBOV=0:bộđệmdữliệungõvàokhôngbịtràn 4 PSPMODE:ParallelslavePortMODE PSPMODE=1:chophépkhốiPSPhoạtđộng PSPMODE=0:khôngchophépkhốiPSPhoạtđộng 3 Khôngquantâm 2:0 CácbitđiềukhiểnhướngtruyxuấtcủaPORTE. TRISE<2:0>=1:Input TRISE<2:0>=0:Output Chứacờngắtcácngắtngoạivi Bit Chứcnăng PIR1 0Ch 7 PSPIF:ParallelSlavePortInterruptFlagbit PSPIF=1:XảyrangắtPSP PSPIF=0:chưaxảyrangắtPSP Chứacácbitchophépcácngătngoạivi Bit Chứcnăng PIE1 8Ch 7 PSPIE:ParallelSlavePortInterruptEnablebit PSPIE=1:ChophépngắtngoạiviPSP PSPIE=0:KhôngchophépngắtngoạiviPSP ADCON1 9Fh ChứacácbitđiềukhiểnADC.Cầnthiếtlậpcácgiátrịthíchhợpcho thanhghinàyđểcáccổngI/OcủaportElàDigitalinput 1.2 QuátrìnhtruyềnnhậndữliệuquaPSP ỞchếđộPSP,portDđóngvaitròlànơiđọcvàghidữliệuđượcđiềukhiểnbởimột master.Đểthựchiệnđượccảhaivaitròlàtruyềnvànhậndữliệu,port Dđượcbốtríhai bộchốtdữliệunhậpvàxuấttáchbiệtvớinhau.Cácchốtdữliệunàyđượcđiềukhỉểntrực tiếp bởi các chânđiều khiển RD*, WR* và CS*. Tùy theo mứclogictrêncác chânđiều khiểnnàymàquátrìnhđọchayghidữliệuđượctiếnhành. TasẽdựavàogiảnđồxungđểtìmhiểuquátrìnhtruyềnnhậndữliệucủaPSP.Trước tiênlàquátrìnhghidữliệulênPSP: Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT04.02 Ngày: 5/24/2006 Trang: 4/29 Hình1:GiảnđồxungthểhiệnquátrìnhghidữliệulênPSP. Trướctiêndữliệucầnghisẽđược đưavàocổngdữliệucủaPSP(portD).Quátrìnhghi dữliệuchỉbắtđầudiễnrakhicảhaichânWR*vàCS*cùngởmứclogicthấp.Khimột trong hai chân WR* hoặc CS* trở về mức logic cao, các bit IBF và PSPIF sẽ đồng thời chuyểntrạngtháitừmứclogic0lênmứclogic1vàngắtngoạiviPSP(nếuđãđượccho phéptrướcđóbằngcáchsetbitPSPIEtrongthanhghiPIE1)sẽđượckíchhoạt.BitIBF (thanhghiTRISE)chuyểnlênmứclogic1dùngđểbáohiệurằngdữliệubộđệmngõvào đãđầy.BitPSPIFchuyểnlênmứclogic1dùngđểchỉthịtrạngtháingắtPSP.BitPSPIF phảiđược xóa bằng chương trìnhđểnhận biếtđược trường hợp xảy ra ngắt tiếp theo. TrongkhibitIBFchỉđượcxóakhidữliệutừbufferđệmđượcđọcvào.Trongtrườnghợp dữliệucũchưađượcđọcvàomàdữliệumớiđãmuốnghilênPSP,bitIBOVsẽchuyểnlên mứclogic1. XétquátrìnhđọcdữliệutừPSP: Hình2:GiảnđồxungquátrìnhđọcdữliệutừPSP. Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT04.02 Ngày: 5/24/2006 Trang: 5/29 GiảnđồxungquátrìnhđọcdữliệutừPSPcóthểphứctạphơnsovớigiảnđồxungcủa quá trình ghi dữ liệu. Tuy nhiên nếuđểý phân tích kĩ, ta vẫn có thể hình dungđược phươngthứchoạtđộngcủaquátrìnhnày.Đầutiên,tathấychỉkhinàohaichânCS*và RD*cùngởmứclogicthấpthìquátrìnhđọcdữliệumớibắtđầu.Khiđó,bitOBFtừmức logic1sẽchuyểnvềmứclogic0,vàdữliệucầnđọcsẽxuấthiệntạingõracủaport D.Bit OBFtrởvềmứclogic 0đểchỉthịtrạngtháibộ đệmdữliệurađãrỗng,điềuđócó2 ý nghĩa: ‐ Thứnhất,dữliệucầnđọcphảiđượcđưavàoPSPtrướcđó.Khicósựtácđộngcủa haichânCS*vàRD*, PSPchỉlàmmộtcôngviệcđơngiản,đólàmởbufferđệmđể chophépdữliệudãđượcghivàotrướcđóxuấthiệnởngõraportD. ‐ Thứhai,khidữliệuchưađượcđọc,bufferđệmđãcós ẵndữliệunênbitOBFsẽở mứclogic1.Khidữliệuđượcđọc,bufferđệmrỗngnênmứclogiccủaOBFsẽbằng 0.MuốnbitOBFtrởvềmứclogic1,tathựchiệnthaotácghidữliệumớicầnđọclên bufferđệm. Đếngiaiđoạnnày,việcđọcdữliệuđãhoàntất,côngviệccònlạilàđánhdấukếtthúc quátrìnhđọcdữliệubằngcáchđưamộttronghaichânRD*hoặc CS*trởvềmứclogic cao,khiđócờngắtPSPIFđượcsetvàngắtngoạiviPSP(nếuđãđượcchophéptrướcđó) xảyra.BitPSPIFphảiđượcxóabằngchươngtrìnhđểnhậnbiếtđượctrườnghợpxảyra ngắttiếptheo. 2. XâydựngcácmoduleứngdụngchoPSP. MụcđíchcủacôngviệcnàylàứngdụngPSPtronggiaotiếpdữliệu vớicácthiếtbị ngoạivi.Trongcácứngdụngnày,đểđơngiản,tasẽsửdụng2viđiềukhiểnPIC16F877A, mộtviđiềukhiểnđượcchophéphoạtđộngởchếđộPSP,viđiềukhiểncònlạiđóngvai tròlàmộtmasterđểđiềukhiểnPSP(chúýlàPSPchỉhoạtđộngvớivaitròlàmộtslave). Ta sẽ xây dựng cácứng dụng này theo từng bước, từ thiết kế phần cứngđến viết chươngtrình. 2.1 ỨngdụngđọcdữliệutừPSP Trongứngdụngnày,tasẽthựchiệncôngviệcđọcdữliệutừPSPdựatrêncácthôngtin đãđượcchuẩnbịtrongphầntrước. 2.1.1 Xâydựngphầncứngchoứngdụng Trướctiênlàviệcthiếtkếphầncứngchoứngdụng.Rõràngtacầnnốitấtcảcácchân liênquanđếnPSPđếnviđiềukhiểnmaster,đểbảođảmviệccóthểkiểmsoáthoàntoàn hoạtđộngcủaPSP. Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT04.02 Ngày: 5/24/2006 Trang: 6/29 Đểkiểmtradữliệuđọcvàocóđúnghaykhông,tasửdụngmộtcôngcụthôngdụnglà cácLEDđượcnốivàomộtportkháccủamaster. Bêncạnhđótacũngcầnđếncácthànhphầnhỗtrợchocácviđiềukhiển(mạchreset, mạchổnđịnhxungdaođộngchothạchanh,…) Dựatrênmộtvàiýtưởngnhưvậy,tacóthểxâydựngmạchnguyênlíchoứngdụng nhưhình3. Trongmạchứngdụngởhình3,PSPcủaPIC16F877Aslavesẽđượcđiềukhiểnbởicác chânRE2:RE0c ủaPIC16F877Amaster.Cácchândữliệucủaslaveđượcnốivớicácchân củaportD.NhưvậykhốiPSPcủacả2PICmastervàslaveđềuđượcnốichungvớinhau (xéttrênquanđi ểmcấutạophầncứngcủaPIC16F877A).TuynhiênvaitròcủamỗiPIClà hoàntoànkhácbiệt,đólàPICmastersẽđiềukhiểnPSPcủaPICslave.NhưvậyPICslave đượcchophéphoạtđộngởchếđộPSP,cònPICmastersẽkhôngđượcchophéphoạtđộng ởchếđộPSP. Thựcchất tahoàn toàn cóthểsửdụngcácportđiều khiểnkhác củamasterđểđiều khiểnPSPslave(dùngPortBvàPortAchẳnghạn)màkhôngnhấtthiếtphảilàportDvà portE. Ngoàira,tachỉsửdụngmộtPSPslavenênviệcđiềukhiểnchânCS*(ChipSelect)là khôngcầnthiếtvàcóthểnốitrựctiếpchânCS*củaPSPslavexuốngmass.Trongtrường hợpnhiềuPSPslaveđượcsửdụng,chânCS*đượcdùngđểlựachọnviệcPSPslavenào đượcchophéptruyxuất.Ởđây,doyêucầucủaứngdụnglàchỉmangtínhchấttìmhiểu phươngthứchoạtđộngcủaPSP,vàđểứngdụngmangtínhtổngquátcaohơn,chânCS* vẫnsẽđượcđiềukhiển. Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT04.02 Ngày: 5/24/2006 Trang: 7/29 RD4 RD1 RD6 30 pF R3 RD3 R7 D2 RD0 RE2 R10 330 X 8 0 RD7 RD1 30 pF R5 R9 RE0 RE0 D8 0 RD3 RD2 SW2 HI D6 RD5 R1 10 K 4 MHz PIC16F877A MASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 MCLR/VPP RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+ RA4/TOCKI/C1OUT RA5/AN4/SS/C2OUT RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 VDD VSS OSC1/CLKI OSC2/CLKO RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RC4/SDI/SDA RC5/SD0 RC6/TX/CK RC7/RX/DT RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 VSS VDD RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD 30 pF D1 SW1 RD5 R4 RD0 PIC16F877A PSP SLAVE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 MCLR/VPP RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+ RA4/TOCKI/C1OUT RA5/AN4/SS/C2OUT RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 VDD VSS OSC1/CLKI OSC2/CLKO RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RC4/SDI/SDA RC5/SD0 RC6/TX/CK RC7/RX/DT RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 VSS VDD RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD D3 4 MHz RD4 0 D7 0 D4 R8 RD6 D5 0 30 pF RD7 HI 0 R6 HI 0 RE1 RE2 R2 10 K HI RD2 RE1 Hình3:SơđồnguyênlíứngdụngđọcdữliệutừPSPsửdụngPIC16F877A. 2.2 Viếtchươngtrìnhđiềukhiểnchoứngdụng Ởđâytacầnviếtchươngtrìnhchocảhaivi điềukhiểnmastervàslave.Cóthểnóiđây làmộtcông việckhôngđơngiản.Tasẽgiảiquyết vấnđềbằngcáchlần lượtđứngtrên phươngthứcđiềukhiểncủamastervàcách«phụcvụ»củaslaveđểhìnhdungracáchoạt độngchocảhaiviđiềukhiển. Trướchếtlàtrongvaitròcủamộtmaster.MastersẽyêucầuPSPslavexuẩtradữliệu cầnđọcchomasterbằngcáchđiềukhiểncácchânCS*vàRD*củaPSPslavexuốngmức logicthấp.Sauđóđọcdữliệuvàovàkếtthúctruyxuấtdữliệubằngcáchđưamộttrong haichânRD*hoặcCS*trởvềmứclogiccao.Nhưvậyhoạtđộngcủamasterkháđơngiản. BâygiờtasẽđóngvaitròlàmộtPSPslaveđểhìnhdungđượcnhữngthaotáccầnlàm củaPSPslave.KhihaichânCS*vàRD*cùngởmứclogicthấp,phầncứngcủaPSPsẽlập tứcđưadữliệutừbufferđệmrathẳngngõracủaPSP(ngõralàportD)vàbitOBFsẽ đượcset. KhimộttronghaichânCS*hoặcRD*trởvềmứclogiccaothìngắtngoạiviPSP sẽđượckíchhoạt,đồngthờiquátrìnhđọcdữliệucủamastercũngđãkếtthúc.Đâychỉ mớilànhữngphảnứngcủaphầncứngPSPkhiđượcđiềukhiểnbởimaster,màchưacósự canthiệpcủachươngtrình.Nhưvậy,mộtkhiPSPslaveđãcósẵndữliệuởbufferđệmthì mọi thao tác truy xuất sẽ hoàn toànđượcđiều khiển bởi master, và công việc của PSP slave,đơngiảnchỉlàchuẩnbịdữliệutiếptheochomaster,vàcôngviệcnàytốtnhấtnên Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT04.02 Ngày: 5/24/2006 Trang: 8/29 được tiến hành trong chương trình ngắt (ngay sau khimasterkết thúc thao tácđọc dữ liệu).CôngviệcchuẩnbịdữliệumớinàysẽđượchỗtrợbởicácbitOBFvàPSPIF. Dựatrênnhữngphântíchnhưtrên,tadãcóthểviếtđượcchươngtrìnhchocảhaivi điềukhiển.Cácchươngtrìnhcụthểnhưsau: Chươngtrình1M:dùngchomaster. processor 16f877a include <p16f877a.inc> __CONFIG _CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON &_XT_OSC&_WRT_OFF&_LVP_OFF&_CPD_OFF ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;Khaiba’opha^`ncu*’ng ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ #define READ PORTE,0 #define WRITE PORTE,1 #define CS PORTE,2 #define LEDPORT PORTB ;========================================================================== ; CHUONGTRINHCHINH ORG 0x000 CLRF STATUS MOVLW 0x00 MOVWF PCLATH GOTOstart ;========================================================================== start ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;Kho*?ita.oca’cPORT ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ BCF STATUS,RP1;BANK1 BSF STATUS,RP0 CLRF TRISB;kho*?ita.oca’cngo~ra CLRF TRISE MOVLW 0x06;kho*?ita.oca’cngo~I/Ola`digitalI/O MOVWF ADCON1 BCF STATUS,RP0 Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT04.02 Ngày: 5/24/2006 Trang: 9/29 CLRF PORTB BSF READ;‐du*ata^’tca?ca’ccha^n–die^`u BSF WRITE;khie^?nle^nmu*’clogiccao BSF CS ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;Vo`ngla*.pchi’nhcu?achuo*ngtri`nh ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ loop CALLreadPSP MOVWF LEDPORT;xua^’tdu*~lie^.u–do.c–duo*.craLED GOTOloop ;========================================================================== ; CHUONGTRINHCON ;========================================================================== ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;Chuo*ngtri`nhconʺreadPSPʺ ;Du`ng–de^?–do.cdu*~lie^.utu*`slaveve^`master ;Ke^’tqua?–do.cve^`chu*’atrongthanhghiW ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ readPSP BCF CS;ba*’t–da^`u–do.cdu*~lie^.u BCF READ BSF STATUS,RP0 MOVLW 0xFF;kho*?ita.oPORTDla`ca’cngo~va`o MOVWF TRISD BCF STATUS,RP0 MOVF PORTD,0;‐do.cdu*~lie^.uva`o BSF CS;ke^’tthu’c–do.cdu*~lie^.u BSF READ RETURN END ;========================================================================= Ngườibáocáo: NguyễnTrungChính Tàiliệu: TUT04.02 Ngày: 5/24/2006 Trang: 10/29 Chươngtrình1S:dùngchoslave processor 16f877a include <p16f877a.inc> __CONFIG _CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON& _XT_OSC&_WRT_OFF&_LVP_OFF&_CPD_OFF ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;Khaiba’obie^’n ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ DATAOUT EQU 0x20;chu*’adu*~lie^.uca^`n–do.c ;bo*?imaster W_save EQU 0x21;ca’cthanhghidu`ng–de^? PCLATH_save EQU 0x22;thaota’ckhiva`onga*’tva` STATUS_save EQU 0x23;;thoa’tnga*’t FSR_save EQU 0x24 ;======================================================================== ;CHUONGTRINHNGAT ORG 0x004 GOTO ISR ;======================================================================== ISR MOVWF W_save;‐doa.nchuo*ngtri`nhba*’t–da^`u SWAPF STATUS,W;va`onga*’t CLRF STATUS MOVWF STATUS_save MOVF PCLATH,W MOVWF PCLATH_save CLRF PCLATH MOVF FSR,W MOVWF FSR_save BTFSSPIR1,PSPIF;kie^?mtraco*`nga*’tPSPIF GOTOexit_int;ne^’unga*’tngoa.iviPSPkho^ngxa?yra ;‐>thoat BCF PIR1,PSPIF;ne^’uco’,xo’aco*`nga*’tva`ba*’t‐da^`u ;xu*?li’nga*’t BSFSTATUS,RP0;thanhghiTRISEna*`mo*?BANK1 BTFSC TRISE,OBF;du*~lie^.utrongbuffer–da~ ;‐duo*.c–do.cchu*a?? [...]... chương trình được thực thi đúng, các LED ở port B của master sẽ sáng tắt tương ứng với dữ liệu đọc vào. 2.2 Ứng dụng ghi dữ liệu lên PSP Ta sẽ tiếp tục tìm hiểu các thao tác ghi dữ liệu lên PSP. Các bước tiến hành cũng tương tự như ứng dụng đọc dữ liệu từ PSP. 2.2.1 Xây dựng phần cứng cho ứng dụng Việc thực hiện thành công ứng dụng trước tạo được nhiều thuận lợi hơn cho ta thực hiện ứng dụng tiếp theo này. Rõ ràng độ ... RB0/INT RE0 8 RE1 9 RE0/RD/AN5 RD7 /PSP7 RE2 10 RE1/WR/AN6 RE2/CS/AN7 RD6 /PSP6 RD5 /PSP5 15 RD4 /PSP4 16 RC0/T1OSO/T1CKI RD3 /PSP3 17 RC1/T1OSI/CCP2 RD2 /PSP2 18 RC2/CCP1 RD1 /PSP1 23 RC3/SCK/SCL RD0 /PSP0 RC4/SDI/SDA 24 RC5/SD0 25 26 RC6/TX/CK RC7/RX/DT VDD VDD 30 pF 14 OSC2/CLKO 0 HI 15 16 17 18 23 24 25 26 RD7 /PSP7 RD6 /PSP6 RD5 /PSP5 RD4 /PSP4 RD3 /PSP3 RD2 /PSP2 RD1 /PSP1 RD0 /PSP0 330 X 8 1 HI RE0 8 RE1 9 RE0/RD/AN5... RC5/SD0 RC6/TX/CK RC7/RX/DT RD7 /PSP7 RD6 /PSP6 RD5 /PSP5 RD4 /PSP4 RD3 /PSP3 RD2 /PSP2 RD1 /PSP1 RD0 /PSP0 13 30 pF 0 VDD VDD 40 39 38 37 36 35 34 33 30 29 28 27 22 21 20 19 RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 11 32 OSC2/CLKO 4 MHz OSC1/CLKI 0 MCLR/VPP HI R1 10 K SW1 VSS VSS 31 12 OSC1/CLKI 0 0 PIC16F877A MASTER PIC16F877A PSP SLAVE Hình 4 : Sơ đồ nguyên lí ứng dụng ghi dữ liệu lên PSP sử dụng PIC16F877A. 2.2.2... ;======================================================================== 2.3 Ứng dụng tổng hợp Trong các phần trước, ta đã xây dựng được các chương trình phục vụ cho các thao tác cơ bản trên PSP, bao gồm đọc và ghi dữ liệu. Để củng cố lại và nắm vững các thao tác trên, ta sẽ thực hiện một ứng dụng tổng hợp. Yêu cầu của ứng dụng như sau: ‐ Master sẽ được bổ sung thêm hai công tăc ấn “WRITEBUT” và “READBUT”. ‐ Nếu nút “WRITEBUT” ... phép trước đó) sẽ được kích hoạt. Nhiệm vụ của phần cứng PSP đến đây là kết thúc. Công việc còn lại của chương trình điều khiển là đọc dữ liệu từ bộ đệm vào và xử lí dữ liệu đó. Trong trường hợp của ứng dụng này, ta sẽ đọc dữ liệu đó vào và xuất ra port B của slave để kiểm tra xem dữ liệu nhận được hay chưa, và nhận được đúng hay sai. Thao tác này tốt nhất cũng nên được tiến hành trong chương trình ngắt (ngay khi dữ liệu vừa được nhận vào), như vậy sẽ tránh được trường hợp tràn bộ đệm. Hiện tượng này xảy ra khi dữ liệu cũ ... VSS 12 VSS OSC1/CLKI 0 PIC16F877A MASTER PIC16F877A PSP SLAVE Hình 5 : Sơ đồ nguyên lí ứng dụng tổnh hợp. 2.3.2 Viết chương trình cho ứng dụng Chương trình cho ứng dụng này, về cơ bản, là dựa trên các chương trình trước, ta chit thêm vào các thao tác tương ứng đối với các phím nhấn (chương trình của master) hoặc kết hợp các bước thao tác đọc và ghi dữ liệu trong chương trình ngắt (đối với chương trình của ... RA4/TOCKI/C1OUT RB1 RA5/AN4/SS/C2OUT RB0/INT RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SD0 RC6/TX/CK RC7/RX/DT RD7 /PSP7 RD6 /PSP6 RD5 /PSP5 RD4 /PSP4 RD3 /PSP3 RD2 /PSP2 RD1 /PSP1 RD0 /PSP0 VDD VDD 330 X 8 R3 R4 R5 R6 R7 R8 R9 R10 30 29 28 27 22 21 20 19 RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 D1 D2 D3 D4 D5 D6 D7 D8 1 2 3 4 5 6 7 0 RE0 8 RE1 9 RE2 10 0 15 16... dữ liệu lên PSP slave, sau đó slave xuất dữ liệu nhận được ra các LED ở PORT B. Sau mỗi lần ghi, giá trị ghi lên PSP slave sẽ tăng lên một đơn vị. ‐ Nếu nút “READBUT” được ấn, master sẽ đọc dữ liệu từ PSP slave, sau đó xuất dữ liệu nhận được ra các LED ở PORT B. Sau mỗi lần đọc, giá trị đọc từ PSP slave sẽ tăng lên một đơn vị. 2.3.1 Xây dựng phần cứng cho ứng dụng Phần cứng sẽ có một số thay đổi nhỏ như sau: ... Người báo cáo: Nguyễn Trung Chính Tài liệu: TUT04.02 Ngày: 5/24/2006 Trang: 21/29 Trong đó chương trình con “writePSP” dùng để xuât giá trị chứa trong thanh ghi “DATAOUT” ra PSP slave. Chương trình con “readPSP” dùng để đọc dữ liệu từ PSP vào và lưu dữ liệu đọc được vào trong thanh ghi ”DATAIN”. Đối với chương trình cho slave, chương trình chính chỉ thực hiện các thao tác khởi tạo, ... Hình 4 : Sơ đồ nguyên lí ứng dụng ghi dữ liệu lên PSP sử dụng PIC16F877A. 2.2.2 Viết chương trình điều khiển cho ứng dụng Ta tiến hành các bước phân tích như trong ứng dụng trước. Đầu tiên là xem xét các hoạt động của master. Thao tác ghi dữ liệu lên PSP được bắt đầu bằng việc master đưa dữ liệu cần ghi ra port D, sau đó điều khiển cho cả hai chân WR* và SC* xuống mức logic thấp. Công việc còn lại là kết thúc thao tác ghi dữ liệu bằng cách