📄 comm.s
字号:
.module comm.c
.area data(ram, con, rel)
.area vector(rom, abs)
.org 44
jmp _serialri_int
.area data(ram, con, rel)
.area vector(rom, abs)
.org 52
jmp _serialti_int
.area data(ram, con, rel)
.area text(rom, con, rel)
.dbfile C:\BJQD\comm.c
.dbfunc e serialti_int _serialti_int fV
; i -> <dead>
.even
_serialti_int::
st -y,R2
st -y,R3
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 88
; /*******************************************************
; /*ICC-AVR application builder : 2004-3-11 12:02:11
; // Target : atMega16
; // Crystal: 8.0000Mhz
; 通讯模块 单工双向485接口
; ******************************************************/
; #include <string.h>
; #include <iom16v.h>
; #include <math.h>
; #include <stdlib.h>
; #include <macros.h>
; #include <eeprom.h>
; #include "eeprom_l.h"
; #include "comm.h"
; #include "main.h"
; #include "delay.h"
; #include "key.h"
;
; #pragma data:data
; unsigned char state2;
; //state2.0 disable_data //1:输入数据无效,0有效;
; //state2.1 remote //1:遥控输入有效,0:本地输入有效
; //state2.7 p99 //P99指令使能
; unsigned char state1;
; //state1.2 PE
; //state1.3 DOR
; //state1.4 FE
; //state1.5
; //state1.6
; unsigned char pump_tab; //机器号
; extern unsigned int speed;
; extern unsigned char state_other;
; extern unsigned char state0;
; extern unsigned char key;
; extern unsigned char in_out_number;
; extern unsigned char state;
; //state0.5接收消息有效标志
;
; /* 通信变量定义 */
; char txd_frm[15]; //物理层发送缓冲区
; char txd_frm_len; //物理层发送数据长度
; char rxd_frm[15]; //物理层接收缓冲区
; char rxd_frm_len; //物理层接收数据长度
; char tx485_busy; //485发送工作判忙
; char txd_cnt; //发送数据计数器
; char rxd_cnt; //接收数据计数器
; char rxd_ins_flag; //一帧接收数据中有E8或E9标志
; char txd_ins_flag; //一帧发送数据中有E8或E9标志
; char txd_ins_data; //发送数据
; char rxd_data; //接收数据
; char mac_txd_th; //发送状态 0发送完毕,1发送帧头,2发送中间数据
; char rxd_h_ok; //接收开始标志
; char fcs1; //异或校验
; char rxd_mesg_addr; //接收地址
; char rxd_mesg_len; //应用层接收数据长度
; char rxd_mesg[15]; //应用层接收数据缓冲区
; char txd_mesg_addr; //发送地址
; char txd_mesg_len; //应用层发送数据长度
; char txd_mesg[15]; //应用层发送数据缓冲区
; /*********任务管理*************/
; char pri[16];
; char act[16]; //任务寄存器
; char rxd_llc_job; //物理层收任务寄存器
; char txd_llc_job; //物理层发任务寄存器
; char rs485_app_job; //应用层任务寄存器
; char att_n_max;
; extern struct cal
; {
; unsigned int test_time;
; unsigned long int dispvol;
; unsigned long int test_dispvol;
; float dispk;
; unsigned long int run_time;
; };
; extern struct cal cal0;
; /*****************************************************************
; 功能: serial_int
; 描述: 运行串行口 FSAs.
; 参数: 无.
; 返回无.
; 影响无.
; *****************************************************************/
; #pragma interrupt_handler serialri_int:iv_USART_RX
; #pragma interrupt_handler serialti_int:iv_USART_TX
;
; /* 通信物理层发送中断程序模块 */
; void serialti_int(void)
; {
.dbline 90
; char i;
; UCSRA=RS485_UCSRA|0b01000000; /*清发送完中断标志位*/
ldi R24,64
out 0xb,R24
.dbline 91
; if(mac_txd_th==1)
lds R24,_mac_txd_th
cpi R24,1
brne L2
.dbline 92
; { UDR=0xe9;
.dbline 92
ldi R24,233
out 0xc,R24
.dbline 93
; txd_cnt=0;
clr R2
sts _txd_cnt,R2
.dbline 94
; txd_ins_flag=0;
sts _txd_ins_flag,R2
.dbline 95
; tx485_busy=1;
ldi R24,1
sts _tx485_busy,R24
.dbline 96
; mac_txd_th=2;
ldi R24,2
sts _mac_txd_th,R24
.dbline 97
; }
xjmp L3
L2:
.dbline 99
; else
; { if(mac_txd_th==2)
.dbline 99
lds R24,_mac_txd_th
cpi R24,2
breq X0
xjmp L4
X0:
.dbline 100
; { if(txd_ins_flag==1)
.dbline 100
lds R24,_txd_ins_flag
cpi R24,1
brne L6
.dbline 101
; { txd_ins_flag=0;
.dbline 101
clr R2
sts _txd_ins_flag,R2
.dbline 102
; UDR=txd_ins_data;
lds R2,_txd_ins_data
out 0xc,R2
.dbline 103
; }
xjmp L5
L6:
.dbline 105
; else
; { if(txd_cnt<=(txd_frm_len-1))
.dbline 105
lds R24,_txd_frm_len
subi R24,1
lds R2,_txd_cnt
cp R24,R2
brlo L8
.dbline 106
; { if(txd_frm[txd_cnt]==0xe8||txd_frm[txd_cnt]==0xe9)
.dbline 106
ldi R24,<_txd_frm
ldi R25,>_txd_frm
mov R30,R2
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
mov R24,R2
cpi R24,232
breq L12
cpi R24,233
brne L10
L12:
.dbline 107
; { txd_ins_flag=1;
.dbline 107
ldi R24,1
sts _txd_ins_flag,R24
.dbline 108
; txd_ins_data=txd_frm[txd_cnt]-0xe8;
ldi R24,<_txd_frm
ldi R25,>_txd_frm
lds R30,_txd_cnt
clr R31
add R30,R24
adc R31,R25
ldd R24,z+0
subi R24,232
sts _txd_ins_data,R24
.dbline 109
; UDR=0xe8;
ldi R24,232
out 0xc,R24
.dbline 110
; }
xjmp L11
L10:
.dbline 112
; else
; { UDR=txd_frm[txd_cnt];}
.dbline 112
ldi R24,<_txd_frm
ldi R25,>_txd_frm
lds R30,_txd_cnt
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0xc,R2
.dbline 112
L11:
.dbline 113
; txd_cnt=txd_cnt+1;
lds R24,_txd_cnt
subi R24,255 ; addi 1
sts _txd_cnt,R24
.dbline 114
; }
xjmp L5
L8:
.dbline 116
; else
; { tx485_busy=0;
.dbline 116
clr R2
sts _tx485_busy,R2
.dbline 117
; mac_txd_th=0;
sts _mac_txd_th,R2
.dbline 118
; PORTC&=~(1<<DE_485);
cbi 0x15,0
.dbline 119
; }
.dbline 120
; }
.dbline 121
; }
xjmp L5
L4:
.dbline 123
; else
; { tx485_busy=0;
.dbline 123
clr R2
sts _tx485_busy,R2
.dbline 124
; mac_txd_th=0;
sts _mac_txd_th,R2
.dbline 125
; PORTC&=~(1<<DE_485);
cbi 0x15,0
.dbline 126
; }
L5:
.dbline 127
L3:
.dbline -2
L1:
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym l i 1 c
.dbend
.dbfunc e serialri_int _serialri_int fV
; i -> <dead>
.even
_serialri_int::
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 132
; }
; }
;
; /* 通信物理层接收中断程序模块 */
; void serialri_int(void)
; {
.dbline 134
; char i;
; UCSRA=RS485_UCSRA&0b00111111; /*清接收完中断标志位*/
clr R2
out 0xb,R2
.dbline 135
; rxd_data=UDR;
in R2,0xc
sts _rxd_data,R2
.dbline 136
; if(tx485_busy!=1)
lds R24,_tx485_busy
cpi R24,1
brne X1
xjmp L14
X1:
.dbline 137
; { if(rxd_data==0xe9)
.dbline 137
mov R24,R2
cpi R24,233
brne L16
.dbline 138
; { rxd_h_ok=1;
.dbline 138
ldi R24,1
sts _rxd_h_ok,R24
.dbline 139
; rxd_cnt=0;
clr R2
sts _rxd_cnt,R2
.dbline 140
; rxd_ins_flag=0;
sts _rxd_ins_flag,R2
.dbline 141
; rxd_frm_len=0;
sts _rxd_frm_len,R2
.dbline 142
; fcs1=0;
sts _fcs1,R2
.dbline 143
; }
xjmp L17
L16:
.dbline 145
; else
; { if(rxd_h_ok==1)
.dbline 145
lds R24,_rxd_h_ok
cpi R24,1
breq X2
xjmp L18
X2:
.dbline 146
; { if(rxd_data==0xe8)
.dbline 146
lds R24,_rxd_data
cpi R24,232
brne L20
.dbline 147
; { rxd_frm[rxd_cnt]=0xe8;
.dbline 147
ldi R24,<_rxd_frm
ldi R25,>_rxd_frm
lds R30,_rxd_cnt
clr R31
add R30,R24
adc R31,R25
ldi R24,232
std z+0,R24
.dbline 148
; rxd_ins_flag=1;
ldi R24,1
sts _rxd_ins_flag,R24
.dbline 149
; }
xjmp L21
L20:
.dbline 151
; else
; { if(rxd_ins_flag==1)
.dbline 151
lds R24,_rxd_ins_flag
cpi R24,1
brne L22
.dbline 152
; { rxd_ins_flag=0;
.dbline 152
clr R2
sts _rxd_ins_flag,R2
.dbline 153
; rxd_frm[rxd_cnt]=rxd_frm[rxd_cnt]+rxd_data;
ldi R24,<_rxd_frm
ldi R25,>_rxd_frm
lds R2,_rxd_cnt
clr R3
add R2,R24
adc R3,R25
lds R4,_rxd_data
movw R30,R2
ldd R5,z+0
add R5,R4
std z+0,R5
.dbline 154
; }
xjmp L23
L22:
.dbline 156
; else
; { rxd_frm[rxd_cnt]=rxd_data;}
.dbline 156
ldi R24,<_rxd_frm
ldi R25,>_rxd_frm
lds R30,_rxd_cnt
clr R31
add R30,R24
adc R31,R25
lds R2,_rxd_data
std z+0,R2
.dbline 156
L23:
.dbline 157
; fcs1=fcs1^rxd_frm[rxd_cnt];
ldi R24,<_rxd_frm
ldi R25,>_rxd_frm
lds R30,_rxd_cnt
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
lds R3,_fcs1
eor R3,R2
sts _fcs1,R3
.dbline 158
; if(rxd_cnt==1)
lds R24,_rxd_cnt
cpi R24,1
brne L24
.dbline 159
; { rxd_frm_len=rxd_frm[rxd_cnt]+3;}
.dbline 159
ldi R24,<_rxd_frm
ldi R25,>_rxd_frm
lds R30,_rxd_cnt
clr R31
add R30,R24
adc R31,R25
ldd R24,z+0
subi R24,253 ; addi 3
sts _rxd_frm_len,R24
.dbline 159
L24:
.dbline 160
; rxd_cnt=rxd_cnt+1;
lds R24,_rxd_cnt
subi R24,255 ; addi 1
sts _rxd_cnt,R24
.dbline 161
; if((rxd_cnt>1)&&(rxd_cnt>=rxd_frm_len))
ldi R24,1
lds R2,_rxd_cnt
cp R24,R2
brsh L26
lds R2,_rxd_frm_len
lds R3,_rxd_cnt
cp R3,R2
brlo L26
.dbline 162
; { if(fcs1==0)
.dbline 162
lds R2,_fcs1
tst R2
brne L28
.dbline 163
; {
.dbline 164
; act[rxd_llc_job]=1;
ldi R24,<_act
ldi R25,>_act
lds R30,_rxd_llc_job
clr R31
add R30,R24
adc R31,R25
ldi R24,1
std z+0,R24
.dbline 165
; }
L28:
.dbline 166
; }
L26:
.dbline 167
; }
L21:
.dbline 168
; }
L18:
.dbline 169
; }
L17:
.dbline 170
L14:
.dbline -2
L13:
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym l i 1 c
.dbend
.dbfunc e rxd_llc_job1 _rxd_llc_job1 fV
; i -> R16
.even
_rxd_llc_job1::
.dbline -1
.dbline 176
; }
; }
;
;
; /*********************************/
; void rxd_llc_job1(void)
; {
.dbline 178
; char i;
; act[rxd_llc_job]=0;
ldi R24,<_act
ldi R25,>_act
lds R30,_rxd_llc_job
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
.dbline 179
; if((pump_tab==rxd_frm[0])||(rxd_frm[0]==BROADCAST_ADDR)) //接收指令地址等于设备或广播地址
lds R2,_rxd_frm
lds R3,_pump_tab
cp R3,R2
breq L33
mov R24,R2
cpi R24,31
brne L31
L33:
.dbline 180
; { rxd_mesg_addr=rxd_frm[0];
.dbline 180
lds R2,_rxd_frm
sts _rxd_mesg_addr,R2
.dbline 181
; rxd_mesg_len=rxd_frm[1];
lds R2,_rxd_frm+1
sts _rxd_mesg_len,R2
.dbline 182
; for(i=0;i<rxd_mesg_len;i++)
clr R16
xjmp L38
L35:
.dbline 183
.dbline 183
ldi R24,<_rxd_frm+2
ldi R25,>_rxd_frm+2
mov R30,R16
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_rxd_mesg
ldi R25,>_rxd_mesg
mov R30,R16
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 183
L36:
.dbline 182
inc R16
L38:
.dbline 182
lds R2,_rxd_mesg_len
cp R16,R2
brlo L35
.dbline 184
ldi R24,<_act
ldi R25,>_act
lds R30,_rs485_app_job
clr R31
add R30,R24
adc R31,R25
ldi R24,1
std z+0,R24
.dbline 185
L31:
.dbline -2
L30:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e txd_llc_job1 _txd_llc_job1 fV
; fcs -> R16
; i -> R18
.even
_txd_llc_job1::
.dbline -1
.dbline 189
; { rxd_mesg[i]=rxd_frm[i+2];}
; act[rs485_app_job]=1;
; }
; }
; /*********************************/
; void txd_llc_job1(void)
; {
.dbline 191
; char i,fcs;
; act[txd_llc_job]=0;
ldi R24,<_act
ldi R25,>_act
lds R30,_txd_llc_job
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
.dbline 192
; txd_frm[0]=txd_mesg_addr;
lds R2,_txd_mesg_addr
sts _txd_frm,R2
.dbline 193
; txd_frm[1]=txd_mesg_len;
lds R2,_txd_mesg_len
sts _txd_frm+1,R2
.dbline 194
; fcs=txd_frm[0]^txd_frm[1];
lds R16,_txd_frm
eor R16,R2
.dbline 195
; for(i=0;i<txd_mesg_len;i++)
clr R18
xjmp L46
L43:
.dbline 196
.dbline 196
ldi R24,<_txd_mesg
ldi R25,>_txd_mesg
mov R30,R18
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_txd_frm+2
ldi R25,>_txd_frm+2
mov R30,R18
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 197
mov R30,R18
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
eor R16,R2
.dbline 198
L44:
.dbline 195
inc R18
L46:
.dbline 195
lds R2,_txd_mesg_len
cp R18,R2
brlo L43
.dbline 199
; { txd_frm[i+2]=txd_mesg[i];
; fcs=fcs^txd_frm[i+2];
; }
; txd_frm_len=txd_mesg_len+3;
mov R24,R2
subi R24,253 ; addi 3
sts _txd_frm_len,R24
.dbline 200
; txd_frm[txd_frm_len-1]=fcs;
ldi R24,<_txd_frm-1
ldi R25,>_txd_frm-1
lds R30,_txd_frm_len
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 201
; txd_cnt=0;
clr R2
sts _txd_cnt,R2
.dbline 202
; txd_ins_flag=0;
sts _txd_ins_flag,R2
.dbline 203
; tx485_busy=1;
ldi R24,1
sts _tx485_busy,R24
.dbline 204
; mac_txd_th=2;
ldi R24,2
sts _mac_txd_th,R24
.dbline 205
; PORTC|=(1<<DE_485);
sbi 0x15,0
.dbline 206
; UDR=0xe9;
ldi R24,233
out 0xc,R24
.dbline -2
L40:
.dbline 0 ; func end
ret
.dbsym r fcs 16 c
.dbsym r i 18 c
.dbend
.dbfunc e rs485_app_job1 _rs485_app_job1 fV
; flow_temp -> y+4
; fcs -> <dead>
; i -> <dead>
; rxd_mesg_temp -> y+0
; temp -> R10,R11
.even
_rs485_app_job1::
xcall push_gset3
sbiw R28,8
.dbline -1
.dbline 211
; }
;
; /*********************************/
; void rs485_app_job1(void)
; {
.dbline 216
; char i,fcs;
; unsigned int temp;
; unsigned long int flow_temp;
; unsigned long int rxd_mesg_temp;
; act[rs485_app_job]=0;
ldi R24,<_act
ldi R25,>_act
lds R30,_rs485_app_job
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
.dbline 218
;
; if((rxd_mesg_addr!=BROADCAST_ADDR)&&(rxd_mesg[0]=='R')&&(rxd_mesg[1]=='I')&&(rxd_mesg[2]=='D')) /* 读取设备地址命令e9 01 03 52 49 44 5d */
lds R24,_rxd_mesg_addr
cpi R24,31
breq L51
lds R24,_rxd_mesg
cpi R24,82
brne L51
lds R24,_rxd_mesg+1
cpi R24,73
brne L51
lds R24,_rxd_mesg+2
cpi R24,68
brne L51
.dbline 219
; { txd_mesg_addr=pump_tab;
.dbline 219
lds R2,_pump_tab
sts _txd_mesg_addr,R2
.dbline 220
; txd_mesg_len=3;
ldi R24,3
sts _txd_mesg_len,R24
.dbline 221
; txd_mesg[0]='R';
ldi R24,82
sts _txd_mesg,R24
.dbline 222
; txd_mesg[1]='I';
ldi R24,73
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -