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:
[email protected]
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
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
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
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.
Để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
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
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
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
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ẽ
#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
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
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
;========================================================================
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
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
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
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
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
(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
;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
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 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:
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
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
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
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
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
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
;===========================================================================
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
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
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