;****************************************
;功能:AVR双CPU通信程序,异步方式,类似于UART
;器件:AT90S2313
;硬件:主从CPU的PD.2通过上拉电阻连接
;时钟:4.0MHz
;****************************************
.include"2313def.inc"
.equ port =PORTD
.equ PIN =PIND
.equ ddr =DDRD
.equ bit =2
;*****************************************
;中断向量表
;*****************************************
.org 0x000
rjmp main
rjmp INT0_isr
reti
reti
reti
reti
reti
reti
reti
reti
;*****************************************
;程序入口
;*****************************************
.org 0x000B
main: ldi R16,0xDF ;设置堆栈指针
out spl,R16
cbi port,bit ;设置端口方向
cbi ddr,bit
ldi R16,0x02 ;INT0 下降沿有效
out MCUCR,R16
ldi R16,0x40 ;INT0 中断使能
out GIMSK,R16
sei ;全局中断使能
ldi R28,0x60
ldi R29,0x00
ldi R22,0x10
here: ldi R30,0x55 ;测试
rcall sendbyte
rjmp here
;*****************************************
;过程名:Delay
;功能:us级别精确延时
;入口参数:R16 延时时间微秒数-2
;出口参数:无
;影响资源:
;*****************************************
delay: dec R16
nop
brne delay
nop
ret
;*****************************************
;外部中断INTI0中断服务程序(读数)
;*****************************************
INT0_isr:
ldi R16,0x49 ;延时 75us
rcall delay
sbIC pin,bit
rjmp skip
clr R30
rcall readbit ;CLOCk 1
rcall readbit ;Clock 2
MOV R31,R30
ldi R20,0x08
RNext: rcall readbit ;读数
dec R20
brne RNext
deal: nop ;数据处理,数据存放在R30中,两个时钟信号存在R31
的高两位
skip: reti ;非起始信号,跳过
;*****************************************
;过程名:readbit
;功能:从总线上读取一位数据
;入口参数:无
;出口参数:R30
;影响资源:R16
;*****************************************
readbit:
ldi R16,0x08 ;延时10us
rcall delay
waitu1: sbis pin,bit ;Wait for "1"
rjmp waitu1
waitu2: sbis pin,bit ;Wait for "1"
rjmp waitu2
waitu3: sbis pin,bit ;Wait for "1"
rjmp waitu3
waitu4: sbis pin,bit ;Wait for "1"
rjmp waitu4
waitf1: sbic pin,bit ;Wait for the falling edge
rjmp waitf1
waitf2: sbic pin,bit ;Wait for the falling edge
rjmp waitf2
waitf3: sbic pin,bit ;Wait for the falling edge
rjmp waitf3
waitf4: sbic pin,bit ;Wait for the falling edge
rjmp waitf4
ldi R16,0x2B ;延时 45us
rcall delay
clc ;清 C
sbis pin,bit
sec
ror R30 ;存数
ret
;*****************************************
;过程名:sendbit
;功能:传出一位数据
;入口参数:R30
;出口参数:无
;影响资源:
;*****************************************
sendbit:
sbrs R30,0
rjmp send0
send1: sbi ddr,bit ;Send a "1"
ldi R16,0x3A
rcall delay
cbi ddr,bit
ldi R16,0x1C
rcall delay
ret
send0: sbi ddr,bit ;Send a "0"
ldi R16,0x1C
rcall delay
cbi ddr,bit
ldi R16,0x3A
rcall delay
ret
;*****************************************
;过程名:sendbyte
;功能:传出一个字节数据
;入口参数:R30
;出口参数:无
;影响资源:R24
;*****************************************
sendbyte: ;测试总线是否忙
sbis pin,bit
rjmp sendbyte
ldi R16,0x76 ;延时 120us
rcall delay
sbis pin,bit ;测试
rjmp sendbyte
cli ;关中断
sbi ddr,bit ;总线初始化
ldi R16,0x58 ;延时 90us
rcall delay
cbi ddr,bit
ldi R16,0x1C ;延时 30us
rcall delay
sbi ddr,bit ;Clock 1
ldi R16,0x3A ;延时 60us
rcall delay
cbi ddr,bit
ldi R16,0x1C ;延时 30us
rcall delay
sbi ddr,bit ;Clock 2
ldi R16,0x1C
rcall delay ;延时 30us
cbi ddr,bit
ldi R16,0x3A ;延时 60us
rcall delay
ldi R24,0x08 ;设置计数器
nextbit:
rcall sendbit ;输出数据
ror R30
dec R24
brne nextbit
ldi R16,0xFF ;清中断标志
out GIFR,R16
sei ;开中断
ret
本文关键字:通信 程序 AVR单片机,单片机-工控设备 - AVR单片机