📄 send_485.s
字号:
.module Send_485.c
.area text(rom, con, rel)
.dbfile F:\Work\Data\程序\修订版~1.1\Send_485.c
.dbfunc e RS485_init _RS485_init fV
.even
_RS485_init::
.dbline -1
.dbline 15
; /*****************************************************
; * File name : Send_485.C
; * Description : Header file of main_H.H
; * Platform : ICCAVR
; * Author : xiao xue
; * Email : ay1509@yahoo.com
; * Date : 2008-03-13
; * Description :485 Communications
; /********************头文件*************************/
; #include"main_H.h"
; #define fosc 8000000
; #define baud 9600
; /***************************485初始化***************************/
; void RS485_init(void)
; {
.dbline 16
; UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //接收完成中断使能
ldi R24,152
out 0xa,R24
.dbline 18
; //充许发送、充许接收
; UBRRL=(fosc/16/(baud+1))%256; //波特率为9600
ldi R24,52
out 0x9,R24
.dbline 19
; UBRRH=(fosc/16/(baud+1))/256;
clr R2
out 0x20,R2
.dbline 20
; UCSRC=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
ldi R24,134
out 0x20,R24
.dbline 21
; PORTD&=~0x04; //允许接收数据
cbi 0x12,2
.dbline 22
; DDRD|=0x04; //数据方向
sbi 0x11,2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e RS485_out_byte _RS485_out_byte fV
; data -> R16
.even
_RS485_out_byte::
.dbline -1
.dbline 26
; }
; /******************485发送一个字节子程序************************/
; void RS485_out_byte(uchar data )
; {
L3:
.dbline 28
;
; while(!(UCSRA & (1<<UDRE)) ); //等待数据寄存器不为空
L4:
.dbline 28
sbis 0xb,5
rjmp L3
X0:
.dbline 29
; UDR=data;
out 0xc,R16
L6:
.dbline 30
; while(!(UCSRA & (BIT(TXC)))); //等待USART发送完成
L7:
.dbline 30
sbis 0xb,6
rjmp L6
X1:
.dbline 31
; UCSRA|=BIT(TXC);
sbi 0xb,6
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r data 16 c
.dbend
.dbfunc e RS485_out_6byte _RS485_out_6byte fV
; i -> R20,R21
; datas -> R10,R11
.even
_RS485_out_6byte::
rcall push_xgset300C
movw R10,R16
.dbline -1
.dbline 37
; }
;
; /**************************一次发送6个字节*********************/
;
; void RS485_out_6byte(uchar *datas )
; {
.dbline 38
; uint i=0;
clr R20
clr R21
.dbline 39
; CLI(); //关中断
cli
.dbline 40
; PORTD|=0x04; //允许发送
sbi 0x12,2
rjmp L11
L10:
.dbline 41
; while(i<6 ){
.dbline 42
; RS485_out_byte(*(datas+i)); //发送1个字节
movw R30,R20
add R30,R10
adc R31,R11
ldd R16,z+0
rcall _RS485_out_byte
.dbline 43
; i++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 44
; }
L11:
.dbline 41
cpi R20,6
ldi R30,0
cpc R21,R30
brlo L10
X2:
.dbline 45
; delay_nms(5); //延时
ldi R16,5
ldi R17,0
rcall _delay_nms
.dbline 46
; PORTD&=~0x04; //允许接收
cbi 0x12,2
.dbline 47
; SEI();
sei
.dbline -2
L9:
.dbline 0 ; func end
rjmp pop_xgset300C
.dbsym r i 20 i
.dbsym r datas 10 pc
.dbend
.dbfunc e Send_485 _Send_485 fV
.even
_Send_485::
.dbline -1
.dbline 51
; }
; /**************************485发送数据函数*****************/
; void Send_485(void)
; {
.dbline 52
; RS485_out_6byte(moto1); //给节点1发送数据
ldi R16,<_moto1
ldi R17,>_moto1
rcall _RS485_out_6byte
.dbline 53
; RS485_out_6byte(moto2); //给节点2发送数据
ldi R16,<_moto2
ldi R17,>_moto2
rcall _RS485_out_6byte
.dbline 54
; RS485_out_6byte(moto3);
ldi R16,<_moto3
ldi R17,>_moto3
rcall _RS485_out_6byte
.dbline 55
; RS485_out_6byte(moto4);
ldi R16,<_moto4
ldi R17,>_moto4
rcall _RS485_out_6byte
.dbline -2
L13:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 22
rjmp _RS485_ISR
.area text(rom, con, rel)
.dbfile F:\Work\Data\程序\修订版~1.1\Send_485.c
.dbfunc e RS485_ISR _RS485_ISR fV
.even
_RS485_ISR::
st -y,R2
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 60
; }
; /***************************中断接收服务子程序*******************/
; #pragma interrupt_handler RS485_ISR:iv_USART_RX
; void RS485_ISR(void)
; {
.dbline 61
; CLI(); //关中断
cli
.dbline 62
; PORTD&=~0x04; //允许接收
cbi 0x12,2
.dbline 63
; getchar[RS_i]=UDR; //存储数据寄存器的值
ldi R24,<_getchar
ldi R25,>_getchar
lds R30,_RS_i
clr R31
add R30,R24
adc R31,R25
in R2,0xc
std z+0,R2
.dbline 64
; RS_i++; //预备存储下一个
lds R24,_RS_i
subi R24,255 ; addi 1
sts _RS_i,R24
.dbline 65
; if(RS_i==6) //接收6个后清零
cpi R24,6
brne L15
X3:
.dbline 66
; {RS_i=0;flag=3;}
.dbline 66
clr R2
sts _RS_i,R2
.dbline 66
ldi R24,3
sts _flag,R24
.dbline 66
L15:
.dbline 67
; SEI(); //开中断
sei
.dbline -2
L14:
.dbline 0 ; func end
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R2,y+
reti
.dbend
.dbfunc e data_decide _data_decide fV
; RS_j -> R16
.even
_data_decide::
.dbline -1
.dbline 72
; }
;
; /**********************接收数组判断存储子程序************************/
; void data_decide(void)
; {
.dbline 73
; uchar RS_j=0;
clr R16
.dbline 74
; if(getchar[0]==0xaa){
lds R24,_getchar
cpi R24,170
breq X15
rjmp L18
X15:
X4:
.dbline 74
.dbline 75
; switch(getchar[1]){
lds R18,_getchar+1
clr R19
cpi R18,45
ldi R30,0
cpc R19,R30
brne X16
rjmp L30
X16:
X5:
ldi R24,45
ldi R25,0
cp R24,R18
cpc R25,R19
brlt L44
X6:
L43:
cpi R18,30
ldi R30,0
cpc R19,R30
breq L26
X7:
rjmp L20
L44:
cpi R18,60
ldi R30,0
cpc R19,R30
brne X17
rjmp L35
X17:
X8:
cpi R18,60
ldi R30,0
cpc R19,R30
brge X18
rjmp L20
X18:
X9:
L45:
cpi R18,75
ldi R30,0
cpc R19,R30
brne X19
rjmp L40
X19:
X10:
rjmp L20
L25:
.dbline 77
; case 0x1e: //节点1
; while(RS_j<6){
.dbline 78
; get[0+RS_j]=getchar[RS_j];
ldi R24,<_getchar
ldi R25,>_getchar
mov R30,R16
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_get
ldi R25,>_get
mov R30,R16
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 79
; RS_j++;
inc R16
.dbline 80
; }
L26:
.dbline 77
cpi R16,6
brlo L25
X11:
.dbline 81
; break;
rjmp L21
L29:
.dbline 83
; case 0x2d: //节点2
; while(RS_j<6){
.dbline 84
; get[6+RS_j]=getchar[RS_j];
ldi R24,<_getchar
ldi R25,>_getchar
mov R30,R16
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_get+6
ldi R25,>_get+6
mov R30,R16
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 85
; RS_j++;
inc R16
.dbline 86
; }
L30:
.dbline 83
cpi R16,6
brlo L29
X12:
.dbline 87
; break;
rjmp L21
L34:
.dbline 89
; case 0x3c: //节点3
; while(RS_j<6){
.dbline 90
; get[12+RS_j]=getchar[RS_j];
ldi R24,<_getchar
ldi R25,>_getchar
mov R30,R16
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_get+12
ldi R25,>_get+12
mov R30,R16
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 91
; RS_j++;
inc R16
.dbline 92
; }
L35:
.dbline 89
cpi R16,6
brlo L34
X13:
.dbline 93
; break;
rjmp L21
L39:
.dbline 95
; case 0x4b: //节点4
; while(RS_j<6){
.dbline 96
; get[18+RS_j]=getchar[RS_j];
ldi R24,<_getchar
ldi R25,>_getchar
mov R30,R16
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_get+18
ldi R25,>_get+18
mov R30,R16
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 97
; RS_j++;
inc R16
.dbline 98
; }//end while
L40:
.dbline 95
cpi R16,6
brlo L39
X14:
.dbline 99
; break;
L20:
L21:
.dbline 101
; }//end switch
; }//end if
L18:
.dbline -2
L17:
.dbline 0 ; func end
ret
.dbsym r RS_j 16 c
.dbend
.dbfunc e moto_stop _moto_stop fV
.even
_moto_stop::
.dbline -1
.dbline 106
; }
;
; /***************************各电机停止函数,相关变量清零***********/
; void moto_stop(void)
; {
.dbline 107
; moto1[2]=0xb4; //向各节点停止命令
ldi R24,180
sts _moto1+2,R24
.dbline 108
; moto2[2]=0xb4;
sts _moto2+2,R24
.dbline 109
; moto3[2]=0xb4;
sts _moto3+2,R24
.dbline 110
; moto4[2]=0xb4;
sts _moto4+2,R24
.dbline 112
;
; get[2]=0x00; //接收控制指令数组清零
clr R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -