Tải bản đầy đủ (.pdf) (29 trang)

tai lieu PIC-BÀI 4: PARALLEL SLAVE PORT (PSP) VÀ ỨNG DỤNG  - vuson.tk doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (449.65 KB, 29 trang )

Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
1/29

Tutorial04.02

Gửiđến:

Nộidung:
BÀI4:PARALLELSLAVEPORT(PSP)VÀỨNGDỤNG
 MICROSOFTWORD

Tómtắt:
Tutorialpostlênluồng“PIC16F877ATỪDỄTỚIKHÓ”thuộcchuyênmục“CƠBẢNVỀVI
ĐIỀUKHIỂNVÀPIC”.Bài4baogồmnộidungsau:
‐ CấutạophầncứngPSPvàcácthanhghiđiềukhiển.
‐ XâydựngmoduleđiềukhiểnPSP(phầncứngvàphầnmềm).

1. SơlượcvềcấutạovàchứcnăngcủaPSP
ParallelslavePort(PSP)làmộtkhốichứcnăngon‐chipđượctíchhợptrongphầncứng
củamộtsốviđiềukhiểnPIC.Bêncạnhcáckhốichứcnăngrấtđadạngdùngchogiaotiếp
nốitiếp(I2C,SPI,CAN,USB,…),PSPlàkhốichứcnăngduynhấttrongviđiềukhiểnPIC
dùngchogiaotiếpsongsong8bit.
VớisựthamgiacủakhốiPSP,cácchứcnănggiaotiếpcủaviđiềukhiểnPICtrởnên
hoànthiệnhơn,giốngnhưmộtmáytính,vớicáccổngnốitiếpvàmộtcổngsongsong.Ta
cóthểtạmsosánhcáckhốigiaotiếpnốitiếpcủaPIC nhưcổngCOMhoặccổngUSBcủa


máytính,cònkhốigiaotiếpsongsong8bitPSPcóthểsosánhnhưcổngLPT(cổngsong
song)củamáytính.
MộtđiểmtươngđồnggiữaPSPvàcácgiaotiếpnốitiếpkháctrongviđiềukhiểnPIC,
đólàPSPcũnglàgiaotiếptheomôhìnhmaster‐slave.Mộtmasterđượcphépđiều khiển
cácgiaotiếpvớimộthoặcnhiềuslave.mastercónhiệmvụđưaracácyêucầugiaotiếp,ví
dụnhưgiaotiếpvớislavenào,nộidunggiaotiếp,địnhhướngchiềudữliệu(đọchayghi
dữliệu),…vàslavecónhiệmvụđápứngcácyêucầuđócủamaster.Tùytheophương
thứcgiao tiếp,ta cócác quiđịnhriêng vềcách “ralệnh” củamaster, cáchđápứng của
slavecũngnhưcáchtruyềnnhậndữliệu.
PSPcũngcócácyêucầuriêngvềhoạtđộnggiaotiếp.Tuynhiên,cómộtđiểmcầnlưu ý
ởđây,làPSPcủaviđiềukhiểnPICchỉhoạtđộngđượcởvaitròcủam ộtslave.Cáchoạt
độnggiaotiếptrênPSPsẽđượcđiềukhiểnhoàntoànb ởimộtmaster.
TrênđâylàmộtvàiđiểmsơlượcvềPSP.Trongphầntiếptheo tasẽđisâuvàocấutạo
vàhoạtđộngcủaPSP,cũngnhưxâydựngmộtsốứngdụngcơbảnchoPSP.

Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
2/29

1.1 CấutạophầncứngcủaPSPtrongviđiềukhiểnPIC16F877A
PSPđượctíchhợptrongkhánhiềuviđiềukhiểnPIC.Tùytheoviđiềukhiểnmàcách
bốtrícácchânchứcnăngvàcácthanhghiđiềukhiểnchoPSPtrongmộtviđiềukhiểncó
thểkhácnhau,tuynhiênvềbảnchất,cấutạocủaPSPlàkhôngđổi.Trongbàinày,viđiều
khiểnPIC16F877AđượclựachọnđểtìmhiểuvàxâydựngcácứngdụngchoPSP.
PSPcócácchânchứcnăngđượctíchhợptrongportDvàportEcủaPIC16F877A.port

Dlàcácchândữliệudùngđểtruyềnnhậndữliệusongsong8bit.portElàcácchânđiều
khiểnquátrìnhtruyềnnhận,baogồmcácchânRD*(ReaD,chânRE0),WR*(WRite,chân
RE1)vàCS*(ChipSelect,chânRE2).Lưuýlàcácchânnàytíchcựcởtrạngtháilogic0.
Cónghĩalà,ởtrạngtháikhôngtácđộng,cácchânnàyphảiđượcđưalênmứclogic1,nếu
muốnmộtchânnàođótácđộnglênkhốiPSP,tađiềukhiểnchânđótrởvềtrạngtháilogic
0.
KhiđượcchophéphoạtđộngởchếđộPSP,cácchânđiềukhiểnnêutrênsẽkhôngcòn
đượcchophéphoạtđộngởchếđộI/O(portD)hoặcchếđộI/OAnalog(portE)nữa.Lúc
này,portDvàportEsẽđượcđiềukhiểnbởicácthiếtbịngoạivikhác(mộtviđiềukhiển
khácđóngvaitròlàmộtmasterchẳnghạn)đểtruyềnnhậndữliệusongsong8bit.Vaitrò
cụthểcủachúngnhưsau:
‐ PortDlàngõxuấtnhậpdữliệuvàhoàntoànđượcđiềukhiểnbởikhốiPSP.Vaitrò
củathanhghiTRISDtrongtrườnghợpnàysẽđượcbỏqua.
‐ PortElàcácchânđiềukhiểnvàphảiđượcthiếtlậpcácchếđộhoạtđộngthíchhợp,
đólàchếđộngõvàoDigital.ChếđộnàyđượcđiềukhiểnbởithanhghiTRISEvà
thanhghiADCON1.
Bênc ạnhcácchânđiềukhiển,PSPcònđượchỗtrợngắtPSPvàcácbittrạngtháidùng
đểđiềukhiểnhoạtđộngcủakhối.Cácthànhphầnhỗtrợnàyđượctrìnhbàytrongbảng
sau(tachỉquantâmtớicácbitđiềukhiểnliênquantớiPSP):
Thanh
ghi
Địa
chỉ
Chứcnăng
PORTD 08h
ChứadữliệutruyxuấtlênPSP
PORTE 09h ĐiềukhiểncácchânRE2:RE0củaPORTE
ChứacácbitđiềukhiểnPSPvàcácbitđiềukhiểnhướngtruyxuấtcác
châncủaPORTE.
Bit Chứcnăng

7 IBF:InputBufferFullstatusbit
IBF=1:códữliệuởbộđệmngõvào
IBF=0:khôngcódữliệuởbộđệmngõvào
TRISE

89h
6 OBF:OutputBufferFullstatusbit
OBF=1:Códữliệuởbộđệmngõra
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
3/29

OBF=0:Khôngcódữliệuởbộđệmngõra
5 IBOV:InputBufferOVerflowdetectbit
IBOV=1:bộđệmdữliệungõvàobịtràn
IBOV=0:bộđệmdữliệungõvàokhôngbịtràn
4 PSPMODE:ParallelslavePortMODE
PSPMODE=1:chophépkhốiPSPhoạtđộng
PSPMODE=0:khôngchophépkhốiPSPhoạtđộng
3
Khôngquantâm
2:0
CácbitđiềukhiểnhướngtruyxuấtcủaPORTE.
TRISE<2:0>=1:Input
TRISE<2:0>=0:Output

Chứacờngắtcácngắtngoạivi
Bit Chứcnăng
PIR1 0Ch
7

PSPIF:ParallelSlavePortInterruptFlagbit
PSPIF=1:XảyrangắtPSP
PSPIF=0:chưaxảyrangắtPSP

Chứacácbitchophépcácngătngoạivi
Bit Chứcnăng
PIE1



8Ch
7

PSPIE:ParallelSlavePortInterruptEnablebit
PSPIE=1:ChophépngắtngoạiviPSP
PSPIE=0:KhôngchophépngắtngoạiviPSP
ADCON1 9Fh
ChứacácbitđiềukhiểnADC.Cầnthiếtlậpcácgiátrịthíchhợpcho
thanhghinàyđểcáccổngI/OcủaportElàDigitalinput

1.2 QuátrìnhtruyềnnhậndữliệuquaPSP
ỞchếđộPSP,portDđóngvaitròlànơiđọcvàghidữliệuđượcđiềukhiểnbởimột
master.Đểthựchiệnđượccảhaivaitròlàtruyềnvànhậndữliệu,port Dđượcbốtríhai
bộchốtdữliệunhậpvàxuấttáchbiệtvớinhau.Cácchốtdữliệunàyđượcđiềukhỉểntrực
tiếp bởi các chânđiều khiển RD*, WR* và CS*. Tùy theo mứclogictrêncác chânđiều

khiểnnàymàquátrìnhđọchayghidữliệuđượctiếnhành.
TasẽdựavàogiảnđồxungđểtìmhiểuquátrìnhtruyềnnhậndữliệucủaPSP.Trước
tiênlàquátrìnhghidữliệulênPSP:
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
4/29


Hình1:GiảnđồxungthểhiệnquátrìnhghidữliệulênPSP.

Trướctiêndữliệucầnghisẽđược đưavàocổngdữliệucủaPSP(portD).Quátrìnhghi
dữliệuchỉbắtđầudiễnrakhicảhaichânWR*vàCS*cùngởmứclogicthấp.Khimộ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ểntrạngtháitừmứclogic0lênmứclogic1vàngắtngoạiviPSP(nếuđãđượccho
phéptrướcđóbằngcáchsetbitPSPIEtrongthanhghiPIE1)sẽđượckíchhoạt.BitIBF
(thanhghiTRISE)chuyểnlênmứclogic1dùngđểbáohiệurằngdữliệubộđệmngõvào
đãđầy.BitPSPIFchuyểnlênmứclogic1dùngđểchỉthịtrạngtháingắtPSP.BitPSPIF
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.
TrongkhibitIBFchỉđượcxóakhidữliệutừbufferđệmđượcđọcvào.Trongtrườnghợp
dữliệucũchưađượcđọcvàomàdữliệumớiđãmuốnghilênPSP,bitIBOVsẽchuyểnlên
mứclogic1.
XétquátrìnhđọcdữliệutừPSP:

Hình2:GiảnđồxungquátrìnhđọcdữliệutừPSP.


Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
5/29

GiảnđồxungquátrìnhđọcdữliệutừPSPcóthểphứctạphơnsovớigiảnđồxungcủ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ươngthứchoạtđộngcủaquátrìnhnày.Đầutiên,tathấychỉkhinàohaichânCS*và
RD*cùngởmứclogicthấpthìquátrìnhđọcdữliệumớibắtđầu.Khiđó,bitOBFtừmức
logic1sẽchuyểnvềmứclogic0,vàdữliệucầnđọcsẽxuấthiệntạingõracủaport D.Bit
OBFtrởvềmứclogic 0đểchỉthịtrạngtháibộ đệmdữliệurađãrỗng,điềuđócó2 ý
nghĩa:
‐ Thứnhất,dữliệucầnđọcphảiđượcđưavàoPSPtrướcđó.Khicósựtácđộngcủa
haichânCS*vàRD*, PSPchỉlàmmộtcôngviệcđơngiản,đólàmởbufferđệmđể
chophépdữliệudãđượcghivàotrướcđóxuấthiệnởngõraportD.
‐ Thứhai,khidữliệuchưađượcđọc,bufferđệmđãcós ẵndữliệunênbitOBFsẽở
mứclogic1.Khidữliệuđượcđọc,bufferđệmrỗngnênmứclogiccủaOBFsẽbằng
0.MuốnbitOBFtrởvềmứclogic1,tathựchiệnthaotácghidữliệumớicầnđọclên
bufferđệm.
Đếngiaiđoạnnày,việcđọcdữliệuđãhoàntất,côngviệccònlạilàđánhdấukếtthúc
quátrìnhđọcdữliệubằngcáchđưamộttronghaichânRD*hoặc CS*trởvềmứclogic
cao,khiđócờngắtPSPIFđượcsetvàngắtngoạiviPSP(nếuđãđượcchophéptrướcđó)
xảyra.BitPSPIF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.

2. XâydựngcácmoduleứngdụngchoPSP.

MụcđíchcủacôngviệcnàylàứngdụngPSPtronggiaotiếpdữliệu  vớicácthiếtbị
ngoạivi.Trongcácứngdụngnày,đểđơngiản,tasẽsửdụng2viđiềukhiểnPIC16F877A,
mộtviđiềukhiểnđượcchophéphoạtđộngởchếđộPSP,viđiềukhiểncònlạiđóngvai
tròlàmộtmasterđểđiềukhiểnPSP(chúýlàPSPchỉhoạtđộngvớivaitròlàmộtslave).
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ươngtrình.

2.1 ỨngdụngđọcdữliệutừPSP
Trongứngdụngnày,tasẽthựchiệncôngviệcđọcdữliệutừPSPdựatrêncácthôngtin
đãđượcchuẩnbịtrongphầntrước.

2.1.1 Xâydựngphầncứngchoứngdụng
Trướctiênlàviệcthiếtkếphầncứngchoứngdụng.Rõràngtacầnnốitấtcảcácchân
liênquanđếnPSPđếnviđiềukhiểnmaster,đểbảođảmviệccóthểkiểmsoáthoàntoàn
hoạtđộngcủaPSP.
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
6/29








Đểkiểmtradữliệuđọcvàocóđúnghaykhông,tasửdụngmộtcôngcụthôngdụnglà
cácLEDđượcnốivàomộtportkháccủamaster.
Bêncạnhđótacũngcầnđếncácthànhphầnhỗtrợchocácviđiềukhiển(mạchreset,
mạchổnđịnhxungdaođộngchothạchanh,…)
Dựatrênmộtvàiýtưởngnhưvậy,tacóthểxâydựngmạchnguyênlíchoứngdụng
nhưhình3.
Trongmạchứngdụngởhình3,PSPcủaPIC16F877Aslavesẽđượcđiềukhiểnbởicác
chânRE2:RE0c ủaPIC16F877Amaster.Cácchândữliệucủaslaveđượcnốivớicácchân
củaportD.NhưvậykhốiPSPcủacả2PICmastervàslaveđềuđượcnốichungvớinhau
(xéttrênquanđi ểmcấutạophầncứngcủaPIC16F877A).TuynhiênvaitròcủamỗiPIClà
hoàntoànkhácbiệt,đólàPICmastersẽđiềukhiểnPSPcủaPICslave.NhưvậyPICslave
đượcchophéphoạtđộngởchếđộPSP,cònPICmastersẽkhôngđượcchophéphoạtđộng
ởchếđộPSP.
Thựcchất tahoàn toàn cóthểsửdụngcácportđiều khiểnkhác củamasterđểđiều
khiểnPSPslave(dùngPortBvàPortAchẳnghạn)màkhôngnhấtthiếtphảilàportDvà
portE.
Ngoàira,tachỉsửdụngmộtPSPslavenênviệcđiềukhiểnchânCS*(ChipSelect)là
khôngcầnthiếtvàcóthểnốitrựctiếpchânCS*củaPSPslavexuốngmass.Trongtrường
hợpnhiềuPSPslaveđượcsửdụng,chânCS*đượcdùngđểlựachọnviệcPSPslavenào
đượcchophéptruyxuất.Ởđây,doyêucầucủaứngdụnglàchỉmangtínhchấttìmhiểu
phươngthứchoạtđộngcủaPSP,vàđểứngdụngmangtínhtổngquátcaohơn,chânCS*
vẫnsẽđượcđiềukhiển.
Ngườibáocáo:
NguyễnTrungChính
Tàiliệ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ình3:SơđồnguyênlíứngdụngđọcdữliệutừPSPsửdụngPIC16F877A.

2.2 Viếtchươngtrìnhđiềukhiểnchoứngdụng
Ởđâytacầnviếtchươngtrìnhchocảhaivi điềukhiểnmastervàslave.Cóthểnóiđây
làmộtcông việckhôngđơngiản.Tasẽgiảiquyết vấnđềbằngcáchlần lượtđứngtrên
phươngthứcđiềukhiểncủamastervàcách«phụcvụ»củaslaveđểhìnhdungracáchoạt 
độngchocảhaiviđiềukhiển.
Trướchếtlàtrongvaitròcủamộtmaster.MastersẽyêucầuPSPslavexuẩtradữliệu
cầnđọcchomasterbằngcáchđiềukhiểncácchânCS*vàRD*củaPSPslavexuốngmức
logicthấp.Sauđóđọcdữliệuvàovàkếtthúctruyxuấtdữliệubằngcáchđưamộttrong
haichânRD*hoặcCS*trởvềmứclogiccao.Nhưvậyhoạtđộngcủamasterkháđơngiản.
BâygiờtasẽđóngvaitròlàmộtPSPslaveđểhìnhdungđượcnhữngthaotáccầnlàm
củaPSPslave.KhihaichânCS*vàRD*cùngởmứclogicthấp,phầncứngcủaPSPsẽlập
tứcđưadữliệutừbufferđệmrathẳngngõracủaPSP(ngõralàportD)vàbitOBFsẽ

đượcset. KhimộttronghaichânCS*hoặcRD*trởvềmứclogiccaothìngắtngoạiviPSP
sẽđượckíchhoạt,đồngthờiquátrìnhđọcdữliệucủamastercũngđãkếtthúc.Đâychỉ
mớilànhữngphảnứngcủaphầncứngPSPkhiđượcđiềukhiểnbởimaster,màchưacósự
canthiệpcủachươngtrình.Nhưvậy,mộtkhiPSPslaveđãcósẵndữliệuởbufferđệmthì
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,đơngiảnchỉlàchuẩnbịdữliệutiếptheochomaster,vàcôngviệcnàytốtnhấtnên
Ngườibáocáo:
NguyễnTrungChính
Tàiliệ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 khimasterkết thúc thao tácđọc dữ
liệu).CôngviệcchuẩnbịdữliệumớinàysẽđượchỗtrợbởicácbitOBFvàPSPIF.
Dựatrênnhữngphântíchnhưtrên,tadãcóthểviếtđượcchươngtrìnhchocảhaivi
điềukhiển.Cácchươngtrìnhcụthểnhưsau:
Chươngtrình1M:dùngchomaster.
processor 16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON
&_XT_OSC&_WRT_OFF&_LVP_OFF&_CPD_OFF
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Khaiba’opha^`ncu*’ng
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
#define READ PORTE,0
#define WRITE PORTE,1
#define CS PORTE,2


#define LEDPORT PORTB
;==========================================================================
;   CHUONGTRINHCHINH
ORG 0x000
CLRF STATUS
MOVLW 0x00
MOVWF PCLATH
GOTOstart
;==========================================================================
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.oca’cPORT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
BCF STATUS,RP1;BANK1
BSF STATUS,RP0

CLRF TRISB;kho*?ita.oca’cngo~ra
CLRF TRISE
MOVLW 0x06;kho*?ita.oca’cngo~I/Ola`digitalI/O
MOVWF ADCON1

BCF STATUS,RP0

Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006

Trang:
9/29

CLRF PORTB
BSF READ;‐du*ata^’tca?ca’ccha^n–die^`u
BSF WRITE;khie^?nle^nmu*’clogiccao
BSF CS
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Vo`ngla*.pchi’nhcu?achuo*ngtri`nh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
loop
CALLreadPSP
MOVWF LEDPORT;xua^’tdu*~lie^.u–do.c–duo*.craLED
GOTOloop
;==========================================================================
; CHUONGTRINHCON
;==========================================================================
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Chuo*ngtri`nhconʺreadPSPʺ
;Du`ng–de^?–do.cdu*~lie^.utu*`slaveve^`master
;Ke^’tqua?–do.cve^`chu*’atrongthanhghiW
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
readPSP
BCF CS;ba*’t–da^`u–do.cdu*~lie^.u
BCF READ

BSF STATUS,RP0

MOVLW 0xFF;kho*?ita.oPORTDla`ca’cngo~va`o
MOVWF TRISD


BCF STATUS,RP0

MOVF PORTD,0;‐do.cdu*~lie^.uva`o

BSF CS;ke^’tthu’c–do.cdu*~lie^.u
BSF READ

RETURN

END
;=========================================================================

Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
10/29

Chươngtrình1S:dùngchoslave
 processor 16f877a
 include <p16f877a.inc>
__CONFIG _CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON&
_XT_OSC&_WRT_OFF&_LVP_OFF&_CPD_OFF

‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Khaiba’obie^’n

;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
DATAOUT EQU 0x20;chu*’adu*~lie^.uca^`n–do.c
;bo*?imaster
W_save EQU 0x21;ca’cthanhghidu`ng–de^?
PCLATH_save EQU 0x22;thaota’ckhiva`onga*’tva` 
STATUS_save EQU 0x23;;thoa’tnga*’t
FSR_save EQU 0x24
;========================================================================
;CHUONGTRINHNGAT
ORG 0x004
GOTO ISR
;========================================================================
ISR
MOVWF W_save;‐doa.nchuo*ngtri`nhba*’t–da^`u
SWAPF STATUS,W;va`onga*’t
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save

BTFSSPIR1,PSPIF;kie^?mtraco*`nga*’tPSPIF
GOTOexit_int;ne^’unga*’tngoa.iviPSPkho^ngxa?yra
;‐>thoat
BCF PIR1,PSPIF;ne^’uco’,xo’aco*`nga*’tva`ba*’t‐da^`u
;xu*?li’nga*’t
BSFSTATUS,RP0;thanhghiTRISEna*`mo*?BANK1


BTFSC TRISE,OBF;du*~lie^.utrongbuffer–da~
;‐duo*.c–do.cchu*a??
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
11/29

GOTOexit_int;ne^’uchu*a–duo*.c–do.c,thoa’tnga*t

BCFSTATUS,RP0

MOVF DATAOUT,0;ne^’u–da~‐duo*.c–do.croi,
;‐du*adu*~lie^.umo*’iva`o
MOVWF PORTD ;buffer–de^.m
exit_int
BCFSTATUS,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
;========================================================================

;CHUONGTRINHCHINH
ORG 0x000
CLRF STATUS
MOVLW 0x00
MOVWF PCLATH
GOTOstart
;========================================================================
ORG 0x050
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.oca’cPORT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
BCF STATUS,RP1
BCF STATUS,RP0

CLRF PORTD

BSF STATUS,RP0

MOVLW bʹ00010111ʹ;RE2:RE0la`ca’cngo~va`o
MOVWF TRISE;chophe’pPSPMODE
MOVLW 0x06;Ta^’tca?ca’ccha^nla`DigitalI/O
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
12/29


MOVWF ADCON1
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.onga*’tPSP
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
BSF PIE1,PSPIE

BCF STATUS,RP0

BSF INTCON,GIE
BSF INTCON,PEIE
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.oca’cbie^’n
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
MOVLW bʹ01010101ʹ
MOVWF DATAOUT
MOVWF PORTD
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Vo`ngla*.pchi’nhcu?achuo*ngtri`nh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
GOTO$

END
;========================================================================

Dodữliệutakhởitạotrongthanhghi“DATAOUT”banđầulàb’01010101’nênkhi
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độtincậycủamạchđiềukhiểnPSPđãđượcđảm
bảo,tachỉviệcchuyểncácLEDtừportBcủamastersangslaveđểkiểmtraxemdữliệu
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
13/29

ghilênPSPslavecóđúnghaykhông.Sơđồnguyênlícụthểcủaứngdụngnàynhưtrong
hình4.
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ì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
đưamộttronghaichânWR*hoặcCS*trởvềmứclogic1.
HoạtđộngcủaPSPslavelầnlượtđượctiếnhànhnhưsau.Khinhậnđượctínhiệuyê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đưavào
bufferđệm.Khinhậnđượctínhiêukếtthúcthaotácghidữliệu (mộttronghaichânWR*
hoặcCS*trởvềm ức logiccao),bitIBFvàPSPIFđượcset,ngắtngoạivi(nếuđượccho
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ũ
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
14/29

chưađượcđọcvàomàdữliệumớiđãchuẩnbịghilên.BitchỉthịtrạngtháinàylàIBOV

(thanhghiTRISE).
Cácchươngtrìnhứngdụngnhưvậycóthểđượcviếtnhưsau:
Chươngtrình2M:dùngchomaster
 processor 16f877a
 include <p16f877a.inc>
 __CONFIG _CP_OFF&_WDT_OFF&_BODEN_OFF&_PWRTE_ON&
_XT_OSC&_WRT_OFF&_LVP_OFF&_CPD_OFF

;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Khaiba’opha^`ncu*’ng
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
 #define READ PORTE,0
 #define WRITE PORTE,1
 #define CS PORTE,2
;========================================================================
;CHUONGTRINHCHINH
 ORG 0x000
 CLRF STATUS
 MOVLW 0x00
 MOVWF PCLATH
 GOTOstart
;========================================================================
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.oca’cPORT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
 BCF STATUS,RP1
 BSF STATUS,RP0

 CLRF TRISE


 MOVLW 0x06
 MOVWF ADCON1

 BCF STATUS,RP0

 BSF READ
 BSF WRITE
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
15/29

 BSF CS
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Vo`ngla*.pchi’nhcu?achuo*ngtri`nh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
loop
 CALLwritePSP
 MOVWF PORTB
 GOTOloop
;========================================================================
; CHUONGTRINHCON
;========================================================================
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Chuo*ngtri`nhconʺwritePSPʺ

;Du`ng–de^?ghidu*~lie^.ule^nPSPslave
;Ke^’tqua?–do.cve^`chu*’atrongthanhghiW
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
writePSP
 BCF CS
 BCF WRITE

 BSF STATUS,RP0

 CLRF TRISD

 BCF STATUS,RP0

 MOVLW bʹ01010101ʹ;du*~lie^.uca^`nghile^nPSPslave
 MOVWF PORTD

 BSF CS
 BSF WRITE
 RETURN

 END
;========================================================================

Chươngtrình2S:dùngchoslave

 processor 16f877a
Ngườibáocáo:
NguyễnTrungChính
Tàiliệ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

;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Khaiba’obie^’n
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
W_save EQU 0x20
PCLATH_save EQU 0x21
STATUS_save EQU 0x22
FSR_save EQU 0x23
;========================================================================
;CHUONGTRINHNGAT
 ORG 0x004
 GOTOISR
;========================================================================
ISR
 MOVWF W_save;‐doa.nchuo*ngtri`nhva`onga*’t
 SWAPF STATUS,W
 CLRF STATUS
 MOVWF STATUS_save
 MOVF PCLATH,W
 MOVWF PCLATH_save
 CLRF PCLATH
 MOVF FSR,W

 MOVWF FSR_save

 BTFSSPIR1,PSPIF;kie^?mtraco*`nga*’tPSP
 GOTOexit_int
 BCF PIR1,PSPIF

BSFSTATUS,RP0

 BTFSS TRISE,IBF;du*~lie^.u–da~co’o*?trongbuffer
;_de^.mchu*a??
 GOTO exit_int;ne^’uchu*a,thoa’tnga*’t

BCFSTATUS,RP0;ne^’uro^`i,‐du*adu*~lie^.unha^.n
;–duo*.craPORTB
 MOVF PORTD,0
 MOVWF PORTB 
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
17/29

exit_int;thoa’tkho?inga*’t
BCFSTATUS,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
;========================================================================
;CHUONGTRINHCHINH
 ORG 0x000
 CLRF STATUS
 MOVLW 0x00
 MOVWF PCLATH
 GOTOstart
;========================================================================
 ORG 0x050
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.oca’cPORT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
 BCF STATUS,RP1
 BCF STATUS,RP0

 CLRF PORTD
 CLRF PORTB

 BSF STATUS,RP0

 MOVLW bʹ00010111ʹ;RE2:RE0la`ca’cngo~va`o
 MOVWF TRISE;chophe’pPSPMODE
 MOVLW 0x06

 MOVWF ADCON1
 CLRF TRISB
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Kho*?ita.onga*’tPSP
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
 BSF PIE1,PSPIE
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
18/29

 BCF STATUS,RP0
 BSF INTCON,GIE
 BSF INTCON,PEIE
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Vo`ngla*.pchi’nhcu?achuo*ngtri`nh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
 GOTO$

END
;========================================================================

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”đượcấn,mastersẽghi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:
‐ PORTBcủamỗiPICđềuphảiđượcnốivớicácLEDđểkiểmtradữliệunhậnđược.
‐ masterđượcb ổsungthêmhainútnhấn.TachọncácchânRA0vàRA1đểđọctrạng
tháicủacácnútấnnày.
Sauđâylàsơđồnguyênlícụthểcủaứngdụng:





Ngườibáocáo:
NguyễnTrungChính
Tàiliệ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ì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
slave).
Giảithuậtcủacácchươngtrìnhtrongứngdụngnàysẽđượctrìnhbàydướicácluuđồ
sau:
Ngườibáocáo:
NguyễnTrungChính
Tàiliệ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ình6:Lưuđồgiảithuậtchươngtrìnhchínhcủamaster.

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,
phầnviệccònlạiđượcthựchiệntrongchươngtrìnhngắt.Lưuđồgiảithuậtchươngtrình
ngắtnhư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ườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
22/29

Hình7:LưuđồgiảithuậtchươngtrìnhngắtcủaPSPslave.

TacầnphảikiểmtracảhaibittrạngtháiIBFvàOBFđểxácđịnhthaotáccầnthựcthi
tươngứngvớiyêucầucủamaster.
Sauđâylàchươngtrìnhcụthểcủaứngdụng:
Chươngtrình3M:dùngchomaster

 processor 16f877a
 include <p16f877a.inc>
 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON &
_XT_OSC&_WRT_OFF&_LVP_OFF&_CPD_OFF

;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Khaiba’opha^`ncu*’ng
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
 #define READ PORTE,0
 #define WRITE PORTE,1
 #define CS PORTE,2

 #define READBUTTON PORTA,0
 #define WRITEBUTTON PORTA,1
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Khaiba’obie^’n
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
count1EQU0x20
countaEQU0x21
countbEQU0x22

DATAIN EQU 0x23
DATAOUT EQU 0x24
;===========================================================================
;CHUONGTRINHCHINH
 ORG 0x000
 CLRF STATUS
 MOVLW 0x00
 MOVWF PCLATH
 GOTOstart

;===========================================================================
start
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:
23/29

;KhoitaocacPORT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
 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*?ita.oca’cbie^’n
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
 CLRF DATAIN
 CLRF DATAOUT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Vo`ngla*.pchi’nhcu?achuo*ngtri`nh
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
loop
 BTFSC READBUTTON
 GOTOnoread
wait1;do*.icho–de^’nkhinu’ta^’n 
 CALLdelay_50ms;‐duo*.c tha? ra
 BTFSSREADBUTTON
 GOTOwait1

 CALLreadPSP
 MOVF DATAIN,0
 MOVWF PORTB
noread
 BTFSC WRITEBUTTON
Ngườibáocáo:
NguyễnTrungChính
Tàiliệu:
TUT04.02
Ngày:
5/24/2006
Trang:

24/29

 GOTO loop
wait2;do*.icho–de^’nkhinu’ta^’n 
 CALLdelay_50ms;‐duo*.c tha? ra
 BTFSSWRITEBUTTON
 GOTOwait2

 INCF DATAOUT,1
 CALLwritePSP
 GOTO loop
;===========================================================================
; CHUONGTRINHCON
;===========================================================================
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Chuo*ngtri`nhconʺwritePSPʺ
;Du`ng–de^?ghidu*~lie^.utu*`masterle^nPSPslave
;Gia’tri.Ca^`nghichu*’atrongthanhghiDATAOUT
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
writePSP
 BCF CS
 BCF WRITE

 BSF STATUS,RP0

 CLRF TRISD

 BCF STATUS,RP0

 MOVF DATAOUT,0

 MOVWF PORTD

 BSF CS
 BSF WRITE
 RETURN
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;Chuo*ngtri`nhconʺreadPSPʺ
;Du`ng–de^?–do.cdu*~lie^.utu*`slaveve^`master
;Ke^’tqua?–do.cve^`chu*’atrongthanhghiDATAIN
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
readPSP
 BCF CS
 BCF READ
Ngườibáocáo:
NguyễnTrungChính
Tàiliệ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*ngtri`nhconʺdelay_50msʺ
;Du`ng–de^?ta.otho*`igiandelay50ms
;Chuo*ngtri`nhdu`ng‐^?deho^~tro*.choqua’tri`nhxu*?Li’phi’mnha^’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
 GOTOdelay_1
 DECFSZ count1,1
 GOTOd2
 RETURN

 END
;===========================================================================

Chươngtrình3S:dùngchoslave


×