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:
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??
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
11/29
GOTOexit_int;ne^’uchu*a–duo*.c–do.c,thoa’tnga*t
BCFSTATUS,RP0
MOVF DATAOUT,0;ne^’u–da~‐duo*.c–do.croi,
;‐du*adu*~lie^.umo*’iva`o
MOVWF PORTD ;buffer–de^.m
exit_int
BCFSTATUS,RP0
MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE
;========================================================================
;CHUONGTRINHCHINH
ORG 0x000
CLRF STATUS
MOVLW 0x00
MOVWF PCLATH
GOTOstart
;========================================================================
ORG 0x050
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.oca’cPORT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTD
BSF STATUS,RP0
MOVLW bʹ00010111ʹ;RE2:RE0la`ca’cngo~va`o
MOVWF TRISE;chophe’pPSPMODE
MOVLW 0x06;Ta^’tca?ca’ccha^nla`DigitalI/O
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
12/29
MOVWF ADCON1
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.onga*’tPSP
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
BSF PIE1,PSPIE
BCF STATUS,RP0
BSF INTCON,GIE
BSF INTCON,PEIE
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.oca’cbie^’n
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
MOVLW bʹ01010101ʹ
MOVWF DATAOUT
MOVWF PORTD
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Vo`ngla*.pchi’nhcu?achuo*ngtri`nh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
GOTO$
END
;========================================================================
Dodữliệutakhởitạotrongthanhghi“DATAOUT”banđầulàb’01010101’nênkhi
chươngtrìnhđượcthựcthiđúng,cácLEDởportBcủamastersẽsángtắttươngứngvới
dữliệuđọcvào.
2.2 ỨngdụngghidữliệulênPSP
TasẽtiếptụctìmhiểucácthaotácghidữliệulênPSP.Cácbướctiếnhànhcũngtương
tựnhưứngdụngđọcdữliệutừPSP.
2.2.1 Xâydựngphầncứngchoứngdụng
Việcthựchiệnthànhcôngứngdụngtrước tạođượcnhiềuthuậnlợihơnchotathực
hiệnứngdụngtiếptheonày.RõràngđộtincậycủamạchđiềukhiểnPSPđãđượcđảm
bảo,tachỉviệcchuyểncácLEDtừportBcủamastersangslaveđểkiểmtraxemdữliệu
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
13/29
ghilênPSPslavecóđúnghaykhông.Sơđồnguyênlícụthểcủaứngdụngnàynhưtrong
hình4.
RD7
HI
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
SW1
0
R10
330 X 8
D6
R5
0
R9
0
RD3
RE1
RD6
R7
RE1 RD7
4 MHz
RD3
RE2
RD5
R3
0
RD4
R1
10 K
30 pF
RE2
HI
R6
HI
RD4
RE0
D5
RD2
RD5
D7
RD1
RE0
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
RD6
D2
D3
RD1
D1
SW2
D8
RD0
RD2
30 pF
R4
R8
0
RD0
R2
10 K
0
4 MHz
30 pF
D4
30 pF
HI
0
Hình4:SơđồnguyênlíứngdụngghidữliệulênPSPsửdụngPIC16F877A.
2.2.2 Viếtchươngtrìnhđiềukhiểnchoứngdụng
Tatiếnhànhcácbướcphântíchnhưtrongứngdụngtrước.
Đầutiênlàxemxétcáchoạtđộngcủamaster.ThaotácghidữliệulênPSPđượcbắt
đầubằngviệcmasterđưadữliệucầnghiraportD,sauđóđiềukhiểnchocảhaichânWR*
vàSC*xuốngmứclogicthấp.Côngviệccònlạilàkếtthúcthaotácghidữliệubằngcách
đưamộttronghaichânWR*hoặcCS*trởvềmứclogic1.
HoạtđộngcủaPSPslavelầnlượtđượctiếnhànhnhưsau.Khinhậnđượctínhiệuyêu
cầu ghi dữliệu của master (WR* và CS*ởmức logic 0),dữ liệu lập tứcđượcđưavào
bufferđệm.Khinhậnđượctínhiêukếtthúcthaotácghidữliệu (mộttronghaichânWR*
hoặcCS*trởvềm ức logiccao),bitIBFvàPSPIFđượcset,ngắtngoạivi(nếuđượccho
phéptrướcđó)sẽđượckíchhoạt.NhiệmvụcủaphầncứngPSPđếnđâylàkếtthúc.Công
việccònlạicủachươngtrìnhđiềukhiểnlàđọcdữliệutừbộđệmvàovàxửlídữliệuđó.
Trongtrườnghợpcủaứngdụngnày,tasẽđọcdữliệuđóvàovàxuấtraportBcủaslave
đểkiểmtraxemdữliệunhậnđượchaychưa,vànhậnđượcđúnghaysai.Thaotácnàytốt
nhấtcũngnênđượctiếnhànhtrongchươngtrìnhngắt(ngaykhidữliệuvừađượcnhận
vào),nhưvậysẽtránhđượctrườnghợptrànbộđệm.Hiệntượngnàyxảyrakhidữliệucũ
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
14/29
chưađượcđọcvàomàdữliệumớiđãchuẩnbịghilên.BitchỉthịtrạngtháinàylàIBOV
(thanhghiTRISE).
Cácchươngtrìnhứngdụngnhưvậycóthểđượcviếtnhưsau:
Chươngtrình2M: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
;========================================================================
;CHUONGTRINHCHINH
ORG 0x000
CLRF STATUS
MOVLW 0x00
MOVWF PCLATH
GOTOstart
;========================================================================
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.oca’cPORT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISE
MOVLW 0x06
MOVWF ADCON1
BCF STATUS,RP0
BSF READ
BSF WRITE
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
15/29
BSF CS
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Vo`ngla*.pchi’nhcu?achuo*ngtri`nh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
loop
CALLwritePSP
MOVWF PORTB
GOTOloop
;========================================================================
; CHUONGTRINHCON
;========================================================================
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Chuo*ngtri`nhconʺwritePSPʺ
;Du`ng–de^?ghidu*~lie^.ule^nPSPslave
;Ke^’tqua?–do.cve^`chu*’atrongthanhghiW
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
writePSP
BCF CS
BCF WRITE
BSF STATUS,RP0
CLRF TRISD
BCF STATUS,RP0
MOVLW bʹ01010101ʹ;du*~lie^.uca^`nghile^nPSPslave
MOVWF PORTD
BSF CS
BSF WRITE
RETURN
END
;========================================================================
Chươngtrình2S:dùngchoslave
processor 16f877a
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
16/29
include <p16f877a.inc>
__CONFIG _CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON&
_XT_OSC&_WRT_OFF&_LVP_OFF&_CPD_OFF
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Khaiba’obie^’n
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
W_save EQU 0x20
PCLATH_save EQU 0x21
STATUS_save EQU 0x22
FSR_save EQU 0x23
;========================================================================
;CHUONGTRINHNGAT
ORG 0x004
GOTOISR
;========================================================================
ISR
MOVWF W_save;‐doa.nchuo*ngtri`nhva`onga*’t
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save
BTFSSPIR1,PSPIF;kie^?mtraco*`nga*’tPSP
GOTOexit_int
BCF PIR1,PSPIF
BSFSTATUS,RP0
BTFSS TRISE,IBF;du*~lie^.u–da~co’o*?trongbuffer
;_de^.mchu*a??
GOTO exit_int;ne^’uchu*a,thoa’tnga*’t
BCFSTATUS,RP0;ne^’uro^`i,‐du*adu*~lie^.unha^.n
;–duo*.craPORTB
MOVF PORTD,0
MOVWF PORTB
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
17/29
exit_int;thoa’tkho?inga*’t
BCFSTATUS,RP0
MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE
;========================================================================
;CHUONGTRINHCHINH
ORG 0x000
CLRF STATUS
MOVLW 0x00
MOVWF PCLATH
GOTOstart
;========================================================================
ORG 0x050
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.oca’cPORT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTD
CLRF PORTB
BSF STATUS,RP0
MOVLW bʹ00010111ʹ;RE2:RE0la`ca’cngo~va`o
MOVWF TRISE;chophe’pPSPMODE
MOVLW 0x06
MOVWF ADCON1
CLRF TRISB
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.onga*’tPSP
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
BSF PIE1,PSPIE
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
18/29
BCF STATUS,RP0
BSF INTCON,GIE
BSF INTCON,PEIE
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Vo`ngla*.pchi’nhcu?achuo*ngtri`nh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
GOTO$
END
;========================================================================
2.3 Ứngdụngtổnghợp
Trongcácphầntrước,tađãxâydựngđượccácchươngtrìnhphụcvụchocácthaotác
cơbảntrênPSP,baogồmđọcvàghidữliệu.Đểcủngcốlạivànắmvữngcácthaotáctrên,
tasẽthựchiệnmộtứngdụngtổnghợp.Yêucầucủaứngdụngnhưsau:
‐ Mastersẽđượcbổsungthêmhaicôngtăcấn“WRITEBUT”và“READBUT”.
‐ Nếunút“WRITEBUT”đượcấn,mastersẽghidữliệulênPSPslave,sauđóslave
xuấtdữliệunhậnđượcracácLEDởPORTB.Saumỗilầnghi,giátrịghilênPSP
slavesẽtănglênmộtđơnvị.
‐ Nếunút“READBUT”đượcấn,mastersẽđọcdữliệutừPSPslave,sauđóxuấtdữ
liệunhậnđượcracácLEDởPORTB.Saumỗilầnđọc,giátrịđọctừPSPslavesẽ
tănglênmộtđơnvị.
2.3.1 Xâydựngphầncứngchoứngdụng
Phầncứngsẽcómộtsốthayđổinhỏnhưsau:
‐ PORTBcủamỗiPICđềuphảiđượcnốivớicácLEDđểkiểmtradữliệunhậnđược.
‐ masterđượcb ổsungthêmhainútnhấn.TachọncácchânRA0vàRA1đểđọctrạng
tháicủacácnútấnnày.
Sauđâylàsơđồnguyênlícụthểcủaứngdụng:
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
19/29
RD3
RD0
RE2
0
30 pF
0
RD2
RD6
R1
10 K
RD7
10 K
RE1
RD0
RD4
30 pF
10 K
READBUT
0
RD1
RD5
0
330 X 8
30 pF
HI
SW2
0
0
HI
RD7
HI
HI
4 MHz
SW1
HI
0
RD5
SW4
0
0
RE2
RE0
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
RD1
WRITEBUT
30 pF
SW3
R2
10 K
HI
330 X 8
RE1
0
RD6
RD3
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
WRITEBUT
4 MHz
RD4
READBUT
RE0
RD2
Hình5:Sơđồnguyênlíứngdụngtổnhhợp.
2.3.2 Viếtchươngtrìnhchoứngdụng
Chươngtrìnhchoứngdụngnày,vềcơbản,làdựatrêncácchươngtrìnhtrước,tachit
thêmvàocácthaotáctươngứngđốivớicácphímnhấn(chươngtrìnhcủamaster)hoặckết
hợpcácbướcthaotácđọcvàghidữliệutrongchươngtrìnhngắt(đốivớichươngtrìnhcủa
slave).
Giảithuậtcủacácchươngtrìnhtrongứngdụngnàysẽđượctrìnhbàydướicácluuđồ
sau:
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
20/29
KHOI TAO
READBUT
DUOC AN??
GOI CHUONG TRINH
CON
readPSP
XUAT DU LIEU
DOC DUOC
RA PORT B
WRITEBUT
DUOC AN??
TANG GIA TRI
THANH GHI
DATAOUT
GOI CHUONG TRINH
CON
writePSP
Y
Y
START
N
N
Hình6:Lưuđồgiảithuậtchươngtrìnhchínhcủamaster.
Ngườibáocáo:
NguyễnTrungChính
Tàiliệ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”raPSPslave.Chươngtrìnhcon“readPSP”dùngđểđọcdữliệutừPSPvào
vàlưudữliệuđọcđượcvàotrongthanhghi”DATAIN”.
Đốivớichươngtrìnhchoslave,chươngtrìnhchínhchỉthựchiệncácthaotáckhởitạo,
phầnviệccònlạiđượcthựchiệntrongchươngtrìnhngắt.Lưuđồgiảithuậtchươngtrình
ngắtnhưsau:
START
INTERRUPT
PSPIF = 1??
IBF = 1 ??
DOC DU LIEU
VAO THANH GHI
DATAIN
XUAT RA PORT B
OBF = 0 ??
TANG GIA TRI
THANH GHI
DATAOUT
DUA VAO
BUFFER DEM
EXIT INTERRUPT
Y
Y
Y
XOA CO NGAT
PSPIF
N
N
N
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
22/29
Hình7:LưuđồgiảithuậtchươngtrìnhngắtcủaPSPslave.
TacầnphảikiểmtracảhaibittrạngtháiIBFvàOBFđểxácđịnhthaotáccầnthựcthi
tươngứngvớiyêucầucủamaster.
Sauđâylàchươngtrìnhcụthểcủaứngdụng:
Chươngtrình3M: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 READBUTTON PORTA,0
#define WRITEBUTTON PORTA,1
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Khaiba’obie^’n
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
count1EQU0x20
countaEQU0x21
countbEQU0x22
DATAIN EQU 0x23
DATAOUT EQU 0x24
;===========================================================================
;CHUONGTRINHCHINH
ORG 0x000
CLRF STATUS
MOVLW 0x00
MOVWF PCLATH
GOTOstart
;===========================================================================
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
23/29
;KhoitaocacPORT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISE
MOVLW bʹ00000011ʹ
MOVWF TRISA
CLRF TRISB
MOVLW 0x06
MOVWF ADCON1
BCF STATUS,RP0
BSF READ
BSF WRITE
BSF CS
CLRF PORTB
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.oca’cbie^’n
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
CLRF DATAIN
CLRF DATAOUT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Vo`ngla*.pchi’nhcu?achuo*ngtri`nh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
loop
BTFSC READBUTTON
GOTOnoread
wait1;do*.icho–de^’nkhinu’ta^’n
CALLdelay_50ms;‐duo*.c tha? ra
BTFSSREADBUTTON
GOTOwait1
CALLreadPSP
MOVF DATAIN,0
MOVWF PORTB
noread
BTFSC WRITEBUTTON
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
24/29
GOTO loop
wait2;do*.icho–de^’nkhinu’ta^’n
CALLdelay_50ms;‐duo*.c tha? ra
BTFSSWRITEBUTTON
GOTOwait2
INCF DATAOUT,1
CALLwritePSP
GOTO loop
;===========================================================================
; CHUONGTRINHCON
;===========================================================================
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Chuo*ngtri`nhconʺwritePSPʺ
;Du`ng–de^?ghidu*~lie^.utu*`masterle^nPSPslave
;Gia’tri.Ca^`nghichu*’atrongthanhghiDATAOUT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
writePSP
BCF CS
BCF WRITE
BSF STATUS,RP0
CLRF TRISD
BCF STATUS,RP0
MOVF DATAOUT,0
MOVWF PORTD
BSF CS
BSF WRITE
RETURN
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Chuo*ngtri`nhconʺreadPSPʺ
;Du`ng–de^?–do.cdu*~lie^.utu*`slaveve^`master
;Ke^’tqua?–do.cve^`chu*’atrongthanhghiDATAIN
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
readPSP
BCF CS
BCF READ
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
25/29
BSF STATUS,RP0
MOVLW 0xFF
MOVWF TRISD
BCF STATUS,RP0
MOVF PORTD,0
MOVWF DATAIN
BSF CS
BSF READ
RETURN
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Chuo*ngtri`nhconʺdelay_50msʺ
;Du`ng–de^?ta.otho*`igiandelay50ms
;Chuo*ngtri`nhdu`ng‐^?deho^~tro*.choqua’tri`nhxu*?Li’phi’mnha^’n
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
delay_50ms
MOVLW dʹ50ʹ
MOVWF count1
d2
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1
DECFSZ counta,1
GOTO$+2
DECFSZ countb,1
GOTOdelay_1
DECFSZ count1,1
GOTOd2
RETURN
END
;===========================================================================
Chươngtrình3S:dùngchoslave