;****************************************
;功能:AVR雙CPU通信程序,異步方式,類似于UART
;器件:AT90S2313
;硬件:主從CPU的PD.2通過上拉電阻連接
;時鐘:4.0MHz
;****************************************
.include"2313def.inc"
.equport=PORTD
.equPIN=PIND
.equddr=DDRD
.equbit=2
;*****************************************
;中斷向量表
;*****************************************
.org0x000
rjmpmain
rjmpINT0_isr
reti
reti
reti
reti
reti
reti
reti
reti
;*****************************************
;程序入口
;*****************************************
.org0x000B
main:ldiR16,0xDF;設置堆棧指針
outspl,R16
cbiport,bit;設置端口方向
cbiddr,bit
ldiR16,0x02;INT0下降沿有效
outMCUCR,R16
ldiR16,0x40;INT0中斷使能
outGIMSK,R16
sei;全局中斷使能
ldiR28,0x60
ldiR29,0x00
ldiR22,0x10
here:ldiR30,0x55;測試
rcallsendbyte
rjmphere
;*****************************************
;過程名:Delay
;功能:us級別精確延時
;入口參數(shù):R16延時時間微秒數(shù)-2
;出口參數(shù):無
;影響資源:
;*****************************************
delay:decR16
nop
brnedelay
nop
ret
;*****************************************
;外部中斷INTI0中斷服務程序(讀數(shù))
;*****************************************
INT0_isr:
ldiR16,0x49;延時75us
rcalldelay
sbICpin,bit
rjmpskip
clrR30
rcallreadbit;CLOCk1
rcallreadbit;Clock2
MOVR31,R30
ldiR20,0x08
RNext:rcallreadbit;讀數(shù)
decR20
brneRNext
deal:nop;數(shù)據(jù)處理,數(shù)據(jù)存放在R30中,兩個時鐘信號存在R31
的高兩位
skip:reti;非起始信號,跳過
;*****************************************
;過程名:readbit
;功能:從總線上讀取一位數(shù)據(jù)
;入口參數(shù):無
;出口參數(shù):R30
;影響資源:R16
;*****************************************
readbit:
ldiR16,0x08;延時10us
rcalldelay
waitu1:sbispin,bit;Waitfor"1"
rjmpwaitu1
waitu2:sbispin,bit;Waitfor"1"
rjmpwaitu2
waitu3:sbispin,bit;Waitfor"1"
rjmpwaitu3
waitu4:sbispin,bit;Waitfor"1"
rjmpwaitu4
waitf1:sbicpin,bit;Waitforthefallingedge
rjmpwaitf1
waitf2:sbicpin,bit;Waitforthefallingedge
rjmpwaitf2
waitf3:sbicpin,bit;Waitforthefallingedge
rjmpwaitf3
waitf4:sbicpin,bit;Waitforthefallingedge
rjmpwaitf4
ldiR16,0x2B;延時45us
rcalldelay
clc;清C
sbispin,bit
sec
rorR30;存數(shù)
ret
;*****************************************
;過程名:sendbit
;功能:傳出一位數(shù)據(jù)
;入口參數(shù):R30
;出口參數(shù):無
;影響資源:
;*****************************************
sendbit:
sbrsR30,0
rjmpsend0
send1:sbiddr,bit;Senda"1"
ldiR16,0x3A
rcalldelay
cbiddr,bit
ldiR16,0x1C
rcalldelay
ret
send0:sbiddr,bit;Senda"0"
ldiR16,0x1C
rcalldelay
cbiddr,bit
ldiR16,0x3A
rcalldelay
ret
;*****************************************
;過程名:sendbyte
;功能:傳出一個字節(jié)數(shù)據(jù)
;入口參數(shù):R30
;出口參數(shù):無
;影響資源:R24
;*****************************************
sendbyte:;測試總線是否忙
sbispin,bit
rjmpsendbyte
ldiR16,0x76;延時120us
rcalldelay
sbispin,bit;測試
rjmpsendbyte
cli;關(guān)中斷
sbiddr,bit;總線初始化
ldiR16,0x58;延時90us
rcalldelay
cbiddr,bit
ldiR16,0x1C;延時30us
rcalldelay
sbiddr,bit;Clock1
ldiR16,0x3A;延時60us
rcalldelay
cbiddr,bit
ldiR16,0x1C;延時30us
rcalldelay
sbiddr,bit;Clock2
ldiR16,0x1C
rcalldelay;延時30us
cbiddr,bit
ldiR16,0x3A;延時60us
rcalldelay
ldiR24,0x08;設置計數(shù)器
nextbit:
rcallsendbit;輸出數(shù)據(jù)
rorR30
decR24
brnenextbit
ldiR16,0xFF;清中斷標志
outGIFR,R16
sei;開中斷
ret