AVR双CPU通信程序(异步方式)UART
扫描二维码
随时随地手机看文章
;****************************************
;功能: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级别精确延时
;入口参数:R16延时时间微秒数-2
;出口参数:无
;影响资源:
;*****************************************
delay:decR16
nop
brnedelay
nop
ret
;*****************************************
;外部中断INTI0中断服务程序(读数)
;*****************************************
INT0_isr:
ldiR16,0x49;延时75us
rcalldelay
sbICpin,bit
rjmpskip
clrR30
rcallreadbit;CLOCk1
rcallreadbit;Clock2
MOVR31,R30
ldiR20,0x08
RNext:rcallreadbit;读数
decR20
brneRNext
deal:nop;数据处理,数据存放在R30中,两个时钟信号存在R31
的高两位
skip:reti;非起始信号,跳过
;*****************************************
;过程名:readbit
;功能:从总线上读取一位数据
;入口参数:无
;出口参数: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;存数
ret
;*****************************************
;过程名:sendbit
;功能:传出一位数据
;入口参数:R30
;出口参数:无
;影响资源:
;*****************************************
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
;功能:传出一个字节数据
;入口参数:R30
;出口参数:无
;影响资源:R24
;*****************************************
sendbyte:;测试总线是否忙
sbispin,bit
rjmpsendbyte
ldiR16,0x76;延时120us
rcalldelay
sbispin,bit;测试
rjmpsendbyte
cli;关中断
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;设置计数器
nextbit:
rcallsendbit;输出数据
rorR30
decR24
brnenextbit
ldiR16,0xFF;清中断标志
outGIFR,R16
sei;开中断
ret