📄 can.s
字号:
sei
.dbline -2
L63:
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r index 14 c
.dbsym r pass_Flag 12 c
.dbsym r i 12 c
.dbsym r msg 10 pS[_VCI_CAN_OBJ]
.dbend
.area vector(rom, abs)
.org 72
jmp _can_ReceiveData
.area text(rom, con, rel)
.dbfile D:\报警系统设计资料\报警系统软件\测量模块基于CAN的系统网程序\开关量CAN网\can.c
.dbfunc e can_ReceiveData _can_ReceiveData fV
; msg -> y+0
; RC_CANSI -> <dead>
; nn -> <dead>
; err_temp -> R10
; sta_temp -> R14
; RCtemp2 -> y+37
; RCF -> R10,R11
; tempp -> R12,R13
; nb_data -> R14
; i -> y+36
.even
_can_ReceiveData::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
xcall push_gset5
sbiw R28,39
.dbline -1
.dbline 203
; }
;
;
; #pragma interrupt_handler can_ReceiveData:19
; void can_ReceiveData (void) //receive interrupt
; {
.dbline 209
; unsigned char nb_data;
; unsigned char i,nn,err_temp,sta_temp;
; unsigned int RC_CANSI,RCtemp2,tempp,RCF;
; VCI_CAN_OBJ msg[3];
;
; WDR();
wdr
.dbline 210
; CANGIE &= ~((1<<ENRX)|(1<<ENTX)); //关接收中断
lds R24,219
andi R24,207
sts 219,R24
.dbline 211
; RCtemp2=CANSIT2; //读取中断信息
lds R2,224
clr R3
std y+38,R3
std y+37,R2
.dbline 212
; err_temp = CANTEC; //读取发送错误计数器
lds R10,234
.dbline 214
;
; if(err_temp>96)
ldi R24,96
cp R24,R10
brsh L71
.dbline 215
; RESET;
jmp 0x00000
L71:
.dbline 217
;
; err_temp = CANREC; //读取接收错误计数器
lds R10,235
.dbline 218
; if(err_temp>128)
ldi R24,128
cp R24,R10
brsh L73
.dbline 219
; RESET;
jmp 0x00000
L73:
.dbline 221
;
; if(RCtemp2&(0x07))
ldd R24,y+37
ldd R25,y+38
andi R24,7
andi R25,0
cpi R24,0
cpc R24,R25
breq L75
X4:
.dbline 222
; {
.dbline 223
; for(i=0;i<3;i++) //查询前三个邮箱中断状态
clr R0
std y+36,R0
xjmp L80
L77:
.dbline 224
; {
.dbline 225
; tempp=(1<<i);
ldd R18,y+36
clr R19
ldi R16,1
ldi R17,0
xcall lsl16
movw R12,R16
.dbline 226
; RCF=(RCtemp2&tempp);
ldd R10,y+37
ldd R11,y+38
and R10,R16
and R11,R17
.dbline 227
; if(RCF!=0)
tst R10
brne X5
tst R11
breq L81
X5:
.dbline 228
; {
.dbline 229
; CANPAGE = i<<4;
ldd R24,y+36
andi R24,#0x0F
swap R24
sts 237,R24
.dbline 230
; sta_temp = CANSTMOB;
lds R14,238
.dbline 231
; CANSTMOB &= ~(1<<TXOK);
lds R24,238
andi R24,191
sts 238,R24
.dbline 232
; CANCDMOB = 0x18;
ldi R24,24
sts 239,R24
.dbline 233
; if(sta_temp&0x40) //是发送完成中断
mov R24,R14
andi R24,64
breq L83
.dbline 234
; {
.dbline 235
; send_count = 0; //清发送计数器
clr R2
sts _send_count,R2
.dbline 236
; if(LED)
.dbline 238
;
; PORTB |= 0x40;
sbi 0x5,6
xjmp L86
L85:
.dbline 241
; else
;
; PORTB &= 0xbf;
in R24,0x5
andi R24,191
out 0x5,R24
L86:
.dbline 243
;
; WDR();
wdr
.dbline 244
; }
L83:
.dbline 245
; }
L81:
.dbline 246
L78:
.dbline 223
ldd R0,y+36
inc R0
std y+36,R0
L80:
.dbline 223
ldd R24,y+36
cpi R24,3
brlo L77
.dbline 247
; }
; }
xjmp L76
L75:
.dbline 248
; else if(RCtemp2&(0x38))
ldd R24,y+37
ldd R25,y+38
andi R24,56
andi R25,0
cpi R24,0
cpc R24,R25
brne X8
xjmp L87
X8:
X6:
.dbline 249
; {
.dbline 250
; for(i=3;i<6;i++) //判断哪个邮箱产生接收中断
ldi R24,3
std y+36,R24
xjmp L92
L89:
.dbline 251
; {
.dbline 252
; tempp=(1<<i);
ldd R18,y+36
clr R19
ldi R16,1
ldi R17,0
xcall lsl16
movw R12,R16
.dbline 253
; RCF=(RCtemp2&tempp);
ldd R10,y+37
ldd R11,y+38
and R10,R16
and R11,R17
.dbline 254
; if(RCF!=0)
tst R10
brne X7
tst R11
brne X9
xjmp L93
X9:
X7:
.dbline 255
; {
.dbline 256
; if(LED)
.dbline 257
; PORTB |= 0X80;
sbi 0x5,7
xjmp L96
L95:
.dbline 259
; else
; PORTB &= 0X7f;
in R24,0x5
andi R24,127
out 0x5,R24
L96:
.dbline 260
; CANPAGE = i<<4;
ldd R24,y+36
andi R24,#0x0F
swap R24
sts 237,R24
.dbline 261
; WDR();
wdr
.dbline 262
; for (nb_data = 0; nb_data <8; nb_data++)
clr R14
xjmp L100
L97:
.dbline 263
.dbline 264
ldi R24,12
ldd R0,y+36
mul R24,R0
movw R2,R0
ldi R24,<_rece_data-36+4
ldi R25,>_rece_data-36+4
add R2,R24
adc R3,R25
mov R30,R14
clr R31
add R30,R2
adc R31,R3
lds R2,250
std z+0,R2
.dbline 265
L98:
.dbline 262
inc R14
L100:
.dbline 262
mov R24,R14
cpi R24,8
brlo L97
.dbline 266
; {
; rece_data[i-3].Data[nb_data]=CANMSG;
; }
; rece_data[i-3].ID = 0;
ldi R24,12
ldd R0,y+36
mul R24,R0
movw R30,R0
ldi R24,<_rece_data-36
ldi R25,>_rece_data-36
add R30,R24
adc R31,R25
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
.dbline 267
; rece_data[i-3].ID |= ((unsigned long) CANIDT1<<24); //get identifier
ldi R24,12
ldd R0,y+36
mul R24,R0
movw R2,R0
ldi R24,<_rece_data-36
ldi R25,>_rece_data-36
add R2,R24
adc R3,R25
ldi R24,24
ldi R25,0
lds R16,243
clr R17
clr R18
clr R19
st -y,R24
xcall lsl32
movw R30,R2
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
or R4,R16
or R5,R17
or R6,R18
or R7,R19
std z+0,R4
std z+1,R5
std z+2,R6
std z+3,R7
.dbline 268
; rece_data[i-3].ID |= ((unsigned long) CANIDT2<<16);
ldi R24,12
ldd R0,y+36
mul R24,R0
movw R2,R0
ldi R24,<_rece_data-36
ldi R25,>_rece_data-36
add R2,R24
adc R3,R25
lds R4,242
clr R5
clr R6
clr R7
movw R6,R4
clr R4
clr R5
movw R30,R2
ldd R20,z+0
ldd R21,z+1
ldd R22,z+2
ldd R23,z+3
or R20,R4
or R21,R5
or R22,R6
or R23,R7
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
.dbline 269
; rece_data[i-3].ID |= ((unsigned long) CANIDT3<<8);
ldi R24,12
ldd R0,y+36
mul R24,R0
movw R2,R0
ldi R24,<_rece_data-36
ldi R25,>_rece_data-36
add R2,R24
adc R3,R25
ldi R24,8
ldi R25,0
lds R16,241
clr R17
clr R18
clr R19
st -y,R24
xcall lsl32
movw R30,R2
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
or R4,R16
or R5,R17
or R6,R18
or R7,R19
std z+0,R4
std z+1,R5
std z+2,R6
std z+3,R7
.dbline 270
; rece_data[i-3].ID |= (CANIDT4&0xF8);
ldi R24,12
ldd R0,y+36
mul R24,R0
movw R2,R0
ldi R24,<_rece_data-36
ldi R25,>_rece_data-36
add R2,R24
adc R3,R25
lds R24,240
clr R25
andi R24,248
andi R25,0
movw R4,R24
clr R6
sbrc R5,7
com R6
clr R7
sbrc R6,7
com R7
movw R30,R2
ldd R20,z+0
ldd R21,z+1
ldd R22,z+2
ldd R23,z+3
or R20,R4
or R21,R5
or R22,R6
or R23,R7
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
.dbline 271
; rece_data[i-3].ID >>= 3;
ldi R24,12
ldd R0,y+36
mul R24,R0
movw R2,R0
ldi R24,<_rece_data-36
ldi R25,>_rece_data-36
add R2,R24
adc R3,R25
ldi R24,3
ldi R25,0
movw R30,R2
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
st -y,R24
xcall asr32
movw R30,R2
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 273
;
; CANSTMOB &= ~((1<<RXOK)|(1<<TXOK));
lds R24,238
andi R24,159
sts 238,R24
.dbline 274
; CANCDMOB = 0x98; //接收使能
ldi R24,152
sts 239,R24
.dbline 275
; }
L93:
.dbline 276
L90:
.dbline 250
ldd R0,y+36
inc R0
std y+36,R0
L92:
.dbline 250
ldd R24,y+36
cpi R24,6
brsh X10
xjmp L89
X10:
.dbline 277
; }
; }
L87:
L76:
.dbline 279
;
; CANGIE |= (1<<ENRX); //开中断
lds R24,219
ori R24,32
sts 219,R24
.dbline 280
; CANGIE |= (1<<ENTX);
lds R24,219
ori R24,16
sts 219,R24
.dbline 281
; WDR();
wdr
.dbline -2
L70:
adiw R28,39
xcall pop_gset5
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R7,y+
ld R6,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
.dbline 0 ; func end
reti
.dbsym l msg 0 A[36:3]S[_VCI_CAN_OBJ]
.dbsym l RC_CANSI 1 i
.dbsym l nn 1 c
.dbsym r err_temp 10 c
.dbsym r sta_temp 14 c
.dbsym l RCtemp2 37 i
.dbsym r RCF 10 i
.dbsym r tempp 12 i
.dbsym r nb_data 14 c
.dbsym l i 36 c
.dbend
.area bss(ram, con, rel)
.dbfile D:\报警系统设计资料\报警系统软件\测量模块基于CAN的系统网程序\开关量CAN网\can.c
_send_count::
.blkb 1
.dbsym e send_count _send_count c
_counterTemp::
.blkb 1
.dbsym e counterTemp _counterTemp c
_canbaud::
.blkb 1
.dbsym e canbaud _canbaud c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -