📄 can.lis
字号:
03B4 0C940000 jmp 0x00000
03B8 L58:
03B8 .dbline 154
03B8 ;
03B8 ; CANGCON = (1<<ENASTB); //start CAN interface, enable mod
03B8 82E0 ldi R24,2
03BA 8093D800 sts 216,R24
03BE .dbline 156
03BE ;
03BE ; CANGIE = (1<<ENIT)| (1<<ENRX)|(1<<ENTX); //enable receive interrupt and transmitte interrupt
03BE 80EB ldi R24,176
03C0 8093DB00 sts 219,R24
03C4 .dbline 157
03C4 ; CANIE1 = 0x00;
03C4 2224 clr R2
03C6 2092DF00 sts 223,R2
03CA .dbline 158
03CA ; CANIE2 = 0x3f; //enable ALL MObs interrupt
03CA 8FE3 ldi R24,63
03CC 8093DE00 sts 222,R24
03D0 .dbline 160
03D0 ;
03D0 ; WDR();
03D0 A895 wdr
03D2 L60:
03D2 .dbline 161
03D2 L61:
03D2 .dbline 161
03D2 ; while (!(CANGSTA & (1<<ENFG))); //wait until module ready
03D2 8091D900 lds R24,217
03D6 8470 andi R24,4
03D8 E1F3 breq L60
03DA .dbline 163
03DA ;
03DA ; CANGCON |= (1<<ENA); //enable CAN controller
03DA 8091D800 lds R24,216
03DE 8260 ori R24,2
03E0 8093D800 sts 216,R24
03E4 .dbline 165
03E4 ;
03E4 ; SEI();
03E4 7894 sei
03E6 .dbline -2
03E6 L2:
03E6 2496 adiw R28,4
03E8 0E940000 xcall pop_gset3
03EC .dbline 0 ; func end
03EC 0895 ret
03EE .dbsym r temp2 10 i
03EE .dbsym r temp1 22 i
03EE .dbsym l temp 0 l
03EE .dbsym r j 22 c
03EE .dbsym r i 20 c
03EE .dbend
03EE .dbfunc e can_tx _can_tx fV
03EE .dbstruct 0 12 _VCI_CAN_OBJ
03EE .dbfield 0 ID L
03EE .dbfield 4 Data A[8:8]c
03EE .dbend
03EE ; index -> R14
03EE ; pass_Flag -> R12
03EE ; i -> R12
03EE ; msg -> R10,R11
.even
03EE _can_tx::
03EE 0E940000 xcall push_gset5
03F2 5801 movw R10,R16
03F4 .dbline -1
03F4 .dbline 174
03F4 ; }
03F4 ;
03F4 ;
03F4 ;
03F4 ; /*******************************************************************
03F4 ; CAN transmission via mailbox 1 (polling)
03F4 ; *******************************************************************/
03F4 ; void can_tx (VCI_CAN_OBJ msg)
03F4 ; {
03F4 .dbline 176
03F4 ; unsigned char i,index,pass_Flag;
03F4 ; pass_Flag = 0x01;
03F4 CC24 clr R12
03F6 C394 inc R12
03F8 .dbline 177
03F8 ; CLI();
03F8 F894 cli
03FA .dbline 178
03FA ; index =(unsigned char) (msg.ID%256);
03FA 40E0 ldi R20,0
03FC 51E0 ldi R21,1
03FE 60E0 ldi R22,0
0400 70E0 ldi R23,0
0402 F501 movw R30,R10
0404 0081 ldd R16,z+0
0406 1181 ldd R17,z+1
0408 2281 ldd R18,z+2
040A 3381 ldd R19,z+3
040C 7A93 st -y,R23
040E 6A93 st -y,R22
0410 5A93 st -y,R21
0412 4A93 st -y,R20
0414 0E940000 xcall mod32s
0418 E02E mov R14,R16
041A .dbline 179
041A ; pass_Flag <<= 1;
041A CC0C lsl R12
041C .dbline 180
041C ; msg.ID <<= 3;
041C 83E0 ldi R24,3
041E 90E0 ldi R25,0
0420 F501 movw R30,R10
0422 0081 ldd R16,z+0
0424 1181 ldd R17,z+1
0426 2281 ldd R18,z+2
0428 3381 ldd R19,z+3
042A 8A93 st -y,R24
042C 0E940000 xcall lsl32
0430 F501 movw R30,R10
0432 0083 std z+0,R16
0434 1183 std z+1,R17
0436 2283 std z+2,R18
0438 3383 std z+3,R19
043A .dbline 181
043A ; CANPAGE = (index<<4);
043A 8E2D mov R24,R14
043C 8F70 andi R24,#0x0F
043E 8295 swap R24
0440 8093ED00 sts 237,R24
0444 .dbline 182
0444 ; CANCDMOB = (1<<IDE) |(8<<DLC0);
0444 88E1 ldi R24,24
0446 8093EF00 sts 239,R24
044A .dbline 183
044A ; pass_Flag <<= 1;
044A CC0C lsl R12
044C .dbline 184
044C ; CANIDT4 = (unsigned char) (msg.ID&0xF8);
044C 48EF ldi R20,248
044E 50E0 ldi R21,0
0450 60E0 ldi R22,0
0452 70E0 ldi R23,0
0454 2080 ldd R2,z+0
0456 3180 ldd R3,z+1
0458 4280 ldd R4,z+2
045A 5380 ldd R5,z+3
045C 2422 and R2,R20
045E 3522 and R3,R21
0460 4622 and R4,R22
0462 5722 and R5,R23
0464 2092F000 sts 240,R2
0468 .dbline 185
0468 ; CANIDT3 = (unsigned char) (msg.ID>>8);
0468 88E0 ldi R24,8
046A 90E0 ldi R25,0
046C 8A93 st -y,R24
046E 0E940000 xcall asr32
0472 0093F100 sts 241,R16
0476 .dbline 186
0476 ; CANIDT2 = (unsigned char) (msg.ID>>16);
0476 F501 movw R30,R10
0478 2080 ldd R2,z+0
047A 3180 ldd R3,z+1
047C 4280 ldd R4,z+2
047E 5380 ldd R5,z+3
0480 1201 movw R2,R4
0482 2092F200 sts 242,R2
0486 .dbline 187
0486 ; pass_Flag <<= 1;
0486 CC0C lsl R12
0488 .dbline 188
0488 ; CANIDT1 = (unsigned char) (msg.ID>>24);
0488 88E1 ldi R24,24
048A 90E0 ldi R25,0
048C 0081 ldd R16,z+0
048E 1181 ldd R17,z+1
0490 2281 ldd R18,z+2
0492 3381 ldd R19,z+3
0494 8A93 st -y,R24
0496 0E940000 xcall asr32
049A 0093F300 sts 243,R16
049E .dbline 189
049E ; if(pass_Flag!=0x08)
049E 8C2D mov R24,R12
04A0 8830 cpi R24,8
04A2 11F0 breq L64
04A4 .dbline 190
04A4 ; RESET;
04A4 0C940000 jmp 0x00000
04A8 L64:
04A8 .dbline 191
04A8 ; for(i=0;i<8;i++)
04A8 CC24 clr R12
04AA 0AC0 xjmp L69
04AC L66:
04AC .dbline 192
04AC .dbline 194
04AC C501 movw R24,R10
04AE 0496 adiw R24,4
04B0 EC2D mov R30,R12
04B2 FF27 clr R31
04B4 E80F add R30,R24
04B6 F91F adc R31,R25
04B8 2080 ldd R2,z+0
04BA 2092FA00 sts 250,R2
04BE .dbline 195
04BE L67:
04BE .dbline 191
04BE C394 inc R12
04C0 L69:
04C0 .dbline 191
04C0 8C2D mov R24,R12
04C2 8830 cpi R24,8
04C4 98F3 brlo L66
04C6 .dbline 196
04C6 ; {
04C6 ;
04C6 ; CANMSG = msg.Data[i];
04C6 ; }
04C6 ; CANCDMOB |= (1<<CONMOB0); //enable transmission
04C6 8091EF00 lds R24,239
04CA 8064 ori R24,64
04CC 8093EF00 sts 239,R24
04D0 .dbline 197
04D0 ; SEI();
04D0 7894 sei
04D2 .dbline -2
04D2 L63:
04D2 0E940000 xcall pop_gset5
04D6 .dbline 0 ; func end
04D6 0895 ret
04D8 .dbsym r index 14 c
04D8 .dbsym r pass_Flag 12 c
04D8 .dbsym r i 12 c
04D8 .dbsym r msg 10 pS[_VCI_CAN_OBJ]
04D8 .dbend
.area vector(rom, abs)
.org 72
0048 0C946C02 jmp _can_ReceiveData
.area text(rom, con, rel)
04D8 .dbfile D:\报警系统设计资料\报警系统软件\测量模块基于CAN的系统网程序\开关量CAN网\can.c
04D8 .dbfunc e can_ReceiveData _can_ReceiveData fV
04D8 ; msg -> y+0
04D8 ; RC_CANSI -> <dead>
04D8 ; nn -> <dead>
04D8 ; err_temp -> R10
04D8 ; sta_temp -> R14
04D8 ; RCtemp2 -> y+37
04D8 ; RCF -> R10,R11
04D8 ; tempp -> R12,R13
04D8 ; nb_data -> R14
04D8 ; i -> y+36
.even
04D8 _can_ReceiveData::
04D8 0A92 st -y,R0
04DA 1A92 st -y,R1
04DC 2A92 st -y,R2
04DE 3A92 st -y,R3
04E0 4A92 st -y,R4
04E2 5A92 st -y,R5
04E4 6A92 st -y,R6
04E6 7A92 st -y,R7
04E8 0A93 st -y,R16
04EA 1A93 st -y,R17
04EC 2A93 st -y,R18
04EE 3A93 st -y,R19
04F0 8A93 st -y,R24
04F2 9A93 st -y,R25
04F4 EA93 st -y,R30
04F6 FA93 st -y,R31
04F8 0FB6 in R0,0x3f
04FA 0A92 st -y,R0
04FC 0E940000 xcall push_gset5
0500 A797 sbiw R28,39
0502 .dbline -1
0502 .dbline 203
0502 ; }
0502 ;
0502 ;
0502 ; #pragma interrupt_handler can_ReceiveData:19
0502 ; void can_ReceiveData (void) //receive interrupt
0502 ; {
0502 .dbline 209
0502 ; unsigned char nb_data;
0502 ; unsigned char i,nn,err_temp,sta_temp;
0502 ; unsigned int RC_CANSI,RCtemp2,tempp,RCF;
0502 ; VCI_CAN_OBJ msg[3];
0502 ;
0502 ; WDR();
0502 A895 wdr
0504 .dbline 210
0504 ; CANGIE &= ~((1<<ENRX)|(1<<ENTX)); //关接收中断
0504 8091DB00 lds R24,219
0508 8F7C andi R24,207
050A 8093DB00 sts 219,R24
050E .dbline 211
050E ; RCtemp2=CANSIT2; //读取中断信息
050E 2090E000 lds R2,224
0512 3324 clr R3
0514 3EA2 std y+38,R3
0516 2DA2 std y+37,R2
0518 .dbline 212
0518 ; err_temp = CANTEC; //读取发送错误计数器
0518 A090EA00 lds R10,234
051C .dbline 214
051C ;
051C ; if(err_temp>96)
051C 80E6 ldi R24,96
051E 8A15 cp R24,R10
0520 10F4 brsh L71
0522 .dbline 215
0522 ; RESET;
0522 0C940000 jmp 0x00000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -