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

PSP và ứng dụng

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


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×