📄 can.s
字号:
ldi R31,0
std z+0,R2
.dbline 120
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDT+1
ldi R25,>_CANIDT+1
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,242
ldi R31,0
std z+0,R2
.dbline 121
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDT+2
ldi R25,>_CANIDT+2
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,241
ldi R31,0
std z+0,R2
.dbline 122
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDT+3
ldi R25,>_CANIDT+3
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,240
ldi R31,0
std z+0,R2
.dbline 123
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDM
ldi R25,>_CANIDM
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,247
ldi R31,0
std z+0,R2
.dbline 124
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDM+1
ldi R25,>_CANIDM+1
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,246
ldi R31,0
std z+0,R2
.dbline 125
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDM+2
ldi R25,>_CANIDM+2
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,245
ldi R31,0
std z+0,R2
.dbline 126
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDM+3
ldi R25,>_CANIDM+3
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,244
ldi R31,0
std z+0,R2
.dbline 128
ldi R24,152
ldi R30,239
std z+0,R24
.dbline 129
nop
.dbline 130
lds R24,_Pass_Flag
subi R24,255 ; addi 1
sts _Pass_Flag,R24
.dbline 131
L38:
.dbline 116
inc R20
L40:
.dbline 116
cpi R20,3
brsh X3
xjmp L37
X3:
.dbline 133
; {
; CANPAGE = (i<<4); //MOb 0,1,2设置为接收模式模式
; CANIDT1 = CANIDT[i][0]; //初始化 ID
; CANIDT2 = CANIDT[i][1];
; CANIDT3 = CANIDT[i][2];
; CANIDT4 = CANIDT[i][3];
; CANIDM1 = CANIDM[i][0]; //初始化 mask
; CANIDM2 = CANIDM[i][1];
; CANIDM3 = CANIDM[i][2];
; CANIDM4 = CANIDM[i][3]; //0 = ignore bit
; //CANIDM4 = (1<<IDEMSK); //identifier extention mask
; CANCDMOB = (2<<CONMOB0)|(1<<IDE)|(8<<DLC0); //reception, ext. ID,rev2.0B
; NOP();
; Pass_Flag = Pass_Flag + 1;
; }
;
; if(Pass_Flag!=0x03)
lds R24,_Pass_Flag
cpi R24,3
breq L47
.dbline 134
; RESET;
jmp 0x000
L47:
.dbline 136
;
; WDR();
wdr
.dbline 138
;
; Pass_Flag = 0x00;
clr R2
sts _Pass_Flag,R2
.dbline 139
; for(i=3;i<6;i++)
ldi R20,3
xjmp L52
L49:
.dbline 140
.dbline 141
mov R24,R20
andi R24,#0x0F
swap R24
ldi R30,237
ldi R31,0
std z+0,R24
.dbline 142
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDT
ldi R25,>_CANIDT
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,243
ldi R31,0
std z+0,R2
.dbline 143
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDT+1
ldi R25,>_CANIDT+1
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,242
ldi R31,0
std z+0,R2
.dbline 144
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDT+2
ldi R25,>_CANIDT+2
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,241
ldi R31,0
std z+0,R2
.dbline 145
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDT+3
ldi R25,>_CANIDT+3
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,240
ldi R31,0
std z+0,R2
.dbline 146
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDM
ldi R25,>_CANIDM
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,247
ldi R31,0
std z+0,R2
.dbline 147
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDM+1
ldi R25,>_CANIDM+1
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,246
ldi R31,0
std z+0,R2
.dbline 148
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDM+2
ldi R25,>_CANIDM+2
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,245
ldi R31,0
std z+0,R2
.dbline 149
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_CANIDM+3
ldi R25,>_CANIDM+3
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,244
ldi R31,0
std z+0,R2
.dbline 150
ldi R24,24
ldi R30,239
std z+0,R24
.dbline 151
nop
.dbline 152
lds R24,_Pass_Flag
subi R24,255 ; addi 1
sts _Pass_Flag,R24
.dbline 153
L50:
.dbline 139
inc R20
L52:
.dbline 139
cpi R20,6
brsh X4
xjmp L49
X4:
.dbline 154
; {
; CANPAGE = (i<<4); //MOb3,4,5设置为发送模式
; CANIDT1 = CANIDT[i][0]; //初始化 ID
; CANIDT2 = CANIDT[i][1];
; CANIDT3 = CANIDT[i][2];
; CANIDT4 = CANIDT[i][3];
; CANIDM1 = CANIDM[i][0]; //初始化 mask
; CANIDM2 = CANIDM[i][1];
; CANIDM3 = CANIDM[i][2];
; CANIDM4 = CANIDM[i][3]; //0 = ignore bit
; CANCDMOB = (1<<IDE)|(8<<DLC0);
; NOP();
; Pass_Flag = Pass_Flag + 1;
; }
; if(Pass_Flag!=0x03)
lds R24,_Pass_Flag
cpi R24,3
breq L59
.dbline 155
; RESET;
jmp 0x000
L59:
.dbline 157
;
; CANGCON = (1<<ENASTB); //start CAN interface, enable mod
ldi R24,2
ldi R30,216
ldi R31,0
std z+0,R24
.dbline 159
;
; CANGIE = (1<<ENIT)| (1<<ENRX)|(1<<ENTX); //enable receive interrupt and transmitte interrupt
ldi R24,176
ldi R30,219
std z+0,R24
.dbline 160
; CANIE1 = 0x00;
clr R2
ldi R30,223
std z+0,R2
.dbline 161
; CANIE2 = 0x3f; //enable ALL MObs interrupt
ldi R24,63
ldi R30,222
std z+0,R24
.dbline 163
;
; WDR();
wdr
L61:
.dbline 164
L62:
.dbline 164
; while (!(CANGSTA & (1<<ENFG))); //wait until module ready
ldi R30,217
ldi R31,0
ldd R2,z+0
sbrs R2,2
rjmp L61
.dbline 166
;
; CANGCON |= (1<<ENA); //enable CAN controller
lds R24,216
ori R24,2
sts 216,R24
.dbline 168
;
; SEI();
sei
.dbline -2
L3:
adiw R28,4
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r temp2 10 i
.dbsym r temp1 22 i
.dbsym l temp 0 l
.dbsym r j 22 c
.dbsym r i 20 c
.dbend
.dbfunc e can_tx _can_tx fV
.dbstruct 0 12 _VCI_CAN_OBJ
.dbfield 0 ID L
.dbfield 4 Data A[8:8]c
.dbend
; temp_id -> y+0
; index -> R14
; pass_Flag -> R12
; i -> R12
; msg -> R10,R11
.even
_can_tx::
xcall push_gset5
movw R10,R16
sbiw R28,4
.dbline -1
.dbline 177
; }
;
;
;
; /*******************************************************************
; CAN transmission via mailbox 1 (polling)
; *******************************************************************/
; void can_tx (VCI_CAN_OBJ msg)
; {
.dbline 181
; unsigned char i,index,pass_Flag;
; long temp_id;
;
; pass_Flag = 0x01;
clr R12
inc R12
.dbline 182
; pass_Flag <<= 1;
lsl R12
.dbline 183
; msg.ID <<= 3;
ldi R24,3
ldi R25,0
movw R30,R10
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
st -y,R24
xcall lsl32
movw R30,R10
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 184
; temp_id = msg.ID&0x0f000000 ;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,15
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
and R2,R20
and R3,R21
and R4,R22
and R5,R23
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
.dbline 185
; index =( unsigned char )(temp_id>>24);
ldi R24,24
ldi R25,0
ldd R16,y+0
ldd R17,y+1
ldd R18,y+2
ldd R19,y+3
st -y,R24
xcall asr32
mov R14,R16
.dbline 186
; index = index + 3;
mov R24,R14
subi R24,253 ; addi 3
mov R14,R24
.dbline 187
; CANPAGE = (index<<4);
andi R24,#0x0F
swap R24
ldi R30,237
ldi R31,0
std z+0,R24
.dbline 188
; CANCDMOB = (1<<IDE) |(8<<DLC0);
ldi R24,24
ldi R30,239
std z+0,R24
.dbline 189
; pass_Flag <<= 1;
lsl R12
.dbline 190
; CANIDT4 = (unsigned char) (msg.ID&0xF8);
ldi R20,248
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R10
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
and R2,R20
and R3,R21
and R4,R22
and R5,R23
ldi R30,240
ldi R31,0
std z+0,R2
.dbline 191
; CANIDT3 = (unsigned char) (msg.ID>>8);
ldi R24,8
ldi R25,0
movw R30,R10
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
st -y,R24
xcall asr32
ldi R30,241
ldi R31,0
std z+0,R16
.dbline 192
; CANIDT2 = (unsigned char) (msg.ID>>16);
movw R30,R10
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R2,R4
ldi R30,242
ldi R31,0
std z+0,R2
.dbline 193
; pass_Flag <<= 1;
lsl R12
.dbline 194
; CANIDT1 = (unsigned char) (msg.ID>>24);
ldi R24,24
ldi R25,0
movw R30,R10
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
st -y,R24
xcall asr32
ldi R30,243
ldi R31,0
std z+0,R16
.dbline 195
; if(pass_Flag!=0x08)
mov R24,R12
cpi R24,8
breq L65
.dbline 196
; RESET;
jmp 0x000
L65:
.dbline 197
; for(i=0;i<8;i++)
clr R12
xjmp L70
L67:
.dbline 198
.dbline 200
movw R24,R10
adiw R24,4
mov R30,R12
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R30,250
ldi R31,0
std z+0,R2
.dbline 201
L68:
.dbline 197
inc R12
L70:
.dbline 197
mov R24,R12
cpi R24,8
brlo L67
.dbline 202
; {
;
; CANMSG = msg.Data[i];
; }
; CANCDMOB |= (1<<CONMOB0); //enable transmission
lds R24,239
ori R24,64
sts 239,R24
.dbline -2
L64:
adiw R28,4
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym l temp_id 0 L
.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
.area func_lit(rom, con, rel)
L461:
.word `L107
.word `L113
.word `L120
.word `L127
.word `L134
.word `L141
.word `L148
.word `L155
.word `L162
.word `L169
.word `L176
.word `L183
.word `L190
.word `L197
.word `L204
.word `L211
.word `L218
.word `L225
.word `L232
.word `L239
.word `L246
.word `L253
.word `L260
.word `L267
.word `L274
.word `L281
.word `L288
.word `L295
.word `L302
.word `L309
.word `L316
.word `L323
.word `L330
.word `L337
.word `L344
.word `L351
.word `L358
.word `L365
.word `L372
.word `L379
.word `L386
.word `L393
.word `L400
.word `L407
.word `L414
.word `L421
.word `L428
.word `L435
.word `L442
.area text(rom, con, rel)
.dbfile D:\报警系统设计资料\报警系统软件\测量模块基于CAN的系统网程序\CAN网可配置型报警灯板程序\can.c
; err_temp -> R10
; sta_temp -> R10
; jj -> R14
; RCtemp2 -> y+9
; RCF -> y+7
; tempp -> y+5
; id_temp -> y+0
; i -> y+4
; nb_data -> R12
.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,R8
st -y,R9
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R26
st -y,R27
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
xcall push_gset5
sbiw R28,11
.dbline -1
.dbline 208
; }
;
;
; #pragma interrupt_handler can_ReceiveData:19
; void can_ReceiveData (void) //receive interrupt
; {
.dbline 214
; unsigned char nb_data;
; unsigned char i,err_temp,sta_temp,jj;
; unsigned int RCtemp2,tempp,RCF;
; long id_temp;
;
; WDR();
wdr
.dbline 215
; CANGIE &= ~((1<<ENRX)|(1<<ENTX)); //关接收中断
lds R24,219
andi R24,207
sts 219,R24
.dbline 216
; RCtemp2=CANSIT2; //读取中断信息
ldi R30,224
ldi R31,0
ldd R2,z+0
clr R3
std y+10,R3
std y+9,R2
.dbline 217
; err_temp = CANTEC; //读取发送错误计数器
ldi R30,234
ldd R10,z+0
.dbline 219
;
; if(err_temp>96)
ldi R24,96
cp R24,R10
brsh L72
.dbline 220
; RESET;
jmp 0x000
L72:
.dbline 222
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -