📄 can.lis
字号:
0382 80E0 ldi R24,<_CANIDM+1
0384 90E0 ldi R25,>_CANIDM+1
0386 E80F add R30,R24
0388 F91F adc R31,R25
038A 2080 ldd R2,z+0
038C E6EF ldi R30,246
038E F0E0 ldi R31,0
0390 2082 std z+0,R2
0392 .dbline 148
0392 84E0 ldi R24,4
0394 849F mul R24,R20
0396 F001 movw R30,R0
0398 80E0 ldi R24,<_CANIDM+2
039A 90E0 ldi R25,>_CANIDM+2
039C E80F add R30,R24
039E F91F adc R31,R25
03A0 2080 ldd R2,z+0
03A2 E5EF ldi R30,245
03A4 F0E0 ldi R31,0
03A6 2082 std z+0,R2
03A8 .dbline 149
03A8 84E0 ldi R24,4
03AA 849F mul R24,R20
03AC F001 movw R30,R0
03AE 80E0 ldi R24,<_CANIDM+3
03B0 90E0 ldi R25,>_CANIDM+3
03B2 E80F add R30,R24
03B4 F91F adc R31,R25
03B6 2080 ldd R2,z+0
03B8 E4EF ldi R30,244
03BA F0E0 ldi R31,0
03BC 2082 std z+0,R2
03BE .dbline 150
03BE 88E1 ldi R24,24
03C0 EFEE ldi R30,239
03C2 8083 std z+0,R24
03C4 .dbline 151
03C4 0000 nop
03C6 .dbline 152
03C6 80910000 lds R24,_Pass_Flag
03CA 8F5F subi R24,255 ; addi 1
03CC 80930000 sts _Pass_Flag,R24
03D0 .dbline 153
03D0 L50:
03D0 .dbline 139
03D0 4395 inc R20
03D2 L52:
03D2 .dbline 139
03D2 4630 cpi R20,6
03D4 08F4 brsh X4
03D6 95CF xjmp L49
03D8 X4:
03D8 .dbline 154
03D8 ; {
03D8 ; CANPAGE = (i<<4); //MOb3,4,5设置为发送模式
03D8 ; CANIDT1 = CANIDT[i][0]; //初始化 ID
03D8 ; CANIDT2 = CANIDT[i][1];
03D8 ; CANIDT3 = CANIDT[i][2];
03D8 ; CANIDT4 = CANIDT[i][3];
03D8 ; CANIDM1 = CANIDM[i][0]; //初始化 mask
03D8 ; CANIDM2 = CANIDM[i][1];
03D8 ; CANIDM3 = CANIDM[i][2];
03D8 ; CANIDM4 = CANIDM[i][3]; //0 = ignore bit
03D8 ; CANCDMOB = (1<<IDE)|(8<<DLC0);
03D8 ; NOP();
03D8 ; Pass_Flag = Pass_Flag + 1;
03D8 ; }
03D8 ; if(Pass_Flag!=0x03)
03D8 80910000 lds R24,_Pass_Flag
03DC 8330 cpi R24,3
03DE 11F0 breq L59
03E0 .dbline 155
03E0 ; RESET;
03E0 0C940000 jmp 0x000
03E4 L59:
03E4 .dbline 157
03E4 ;
03E4 ; CANGCON = (1<<ENASTB); //start CAN interface, enable mod
03E4 82E0 ldi R24,2
03E6 E8ED ldi R30,216
03E8 F0E0 ldi R31,0
03EA 8083 std z+0,R24
03EC .dbline 159
03EC ;
03EC ; CANGIE = (1<<ENIT)| (1<<ENRX)|(1<<ENTX); //enable receive interrupt and transmitte interrupt
03EC 80EB ldi R24,176
03EE EBED ldi R30,219
03F0 8083 std z+0,R24
03F2 .dbline 160
03F2 ; CANIE1 = 0x00;
03F2 2224 clr R2
03F4 EFED ldi R30,223
03F6 2082 std z+0,R2
03F8 .dbline 161
03F8 ; CANIE2 = 0x3f; //enable ALL MObs interrupt
03F8 8FE3 ldi R24,63
03FA EEED ldi R30,222
03FC 8083 std z+0,R24
03FE .dbline 163
03FE ;
03FE ; WDR();
03FE A895 wdr
0400 L61:
0400 .dbline 164
0400 L62:
0400 .dbline 164
0400 ; while (!(CANGSTA & (1<<ENFG))); //wait until module ready
0400 E9ED ldi R30,217
0402 F0E0 ldi R31,0
0404 2080 ldd R2,z+0
0406 22FE sbrs R2,2
0408 FBCF rjmp L61
040A .dbline 166
040A ;
040A ; CANGCON |= (1<<ENA); //enable CAN controller
040A 8091D800 lds R24,216
040E 8260 ori R24,2
0410 8093D800 sts 216,R24
0414 .dbline 168
0414 ;
0414 ; SEI();
0414 7894 sei
0416 .dbline -2
0416 L3:
0416 2496 adiw R28,4
0418 0E940000 xcall pop_gset3
041C .dbline 0 ; func end
041C 0895 ret
041E .dbsym r temp2 10 i
041E .dbsym r temp1 22 i
041E .dbsym l temp 0 l
041E .dbsym r j 22 c
041E .dbsym r i 20 c
041E .dbend
041E .dbfunc e can_tx _can_tx fV
041E .dbstruct 0 12 _VCI_CAN_OBJ
041E .dbfield 0 ID L
041E .dbfield 4 Data A[8:8]c
041E .dbend
041E ; temp_id -> y+0
041E ; index -> R14
041E ; pass_Flag -> R12
041E ; i -> R12
041E ; msg -> R10,R11
.even
041E _can_tx::
041E 0E940000 xcall push_gset5
0422 5801 movw R10,R16
0424 2497 sbiw R28,4
0426 .dbline -1
0426 .dbline 177
0426 ; }
0426 ;
0426 ;
0426 ;
0426 ; /*******************************************************************
0426 ; CAN transmission via mailbox 1 (polling)
0426 ; *******************************************************************/
0426 ; void can_tx (VCI_CAN_OBJ msg)
0426 ; {
0426 .dbline 181
0426 ; unsigned char i,index,pass_Flag;
0426 ; long temp_id;
0426 ;
0426 ; pass_Flag = 0x01;
0426 CC24 clr R12
0428 C394 inc R12
042A .dbline 182
042A ; pass_Flag <<= 1;
042A CC0C lsl R12
042C .dbline 183
042C ; msg.ID <<= 3;
042C 83E0 ldi R24,3
042E 90E0 ldi R25,0
0430 F501 movw R30,R10
0432 0081 ldd R16,z+0
0434 1181 ldd R17,z+1
0436 2281 ldd R18,z+2
0438 3381 ldd R19,z+3
043A 8A93 st -y,R24
043C 0E940000 xcall lsl32
0440 F501 movw R30,R10
0442 0083 std z+0,R16
0444 1183 std z+1,R17
0446 2283 std z+2,R18
0448 3383 std z+3,R19
044A .dbline 184
044A ; temp_id = msg.ID&0x0f000000 ;
044A 40E0 ldi R20,0
044C 50E0 ldi R21,0
044E 60E0 ldi R22,0
0450 7FE0 ldi R23,15
0452 2080 ldd R2,z+0
0454 3180 ldd R3,z+1
0456 4280 ldd R4,z+2
0458 5380 ldd R5,z+3
045A 2422 and R2,R20
045C 3522 and R3,R21
045E 4622 and R4,R22
0460 5722 and R5,R23
0462 2882 std y+0,R2
0464 3982 std y+1,R3
0466 4A82 std y+2,R4
0468 5B82 std y+3,R5
046A .dbline 185
046A ; index =( unsigned char )(temp_id>>24);
046A 88E1 ldi R24,24
046C 90E0 ldi R25,0
046E 0881 ldd R16,y+0
0470 1981 ldd R17,y+1
0472 2A81 ldd R18,y+2
0474 3B81 ldd R19,y+3
0476 8A93 st -y,R24
0478 0E940000 xcall asr32
047C E02E mov R14,R16
047E .dbline 186
047E ; index = index + 3;
047E 8E2D mov R24,R14
0480 8D5F subi R24,253 ; addi 3
0482 E82E mov R14,R24
0484 .dbline 187
0484 ; CANPAGE = (index<<4);
0484 8F70 andi R24,#0x0F
0486 8295 swap R24
0488 EDEE ldi R30,237
048A F0E0 ldi R31,0
048C 8083 std z+0,R24
048E .dbline 188
048E ; CANCDMOB = (1<<IDE) |(8<<DLC0);
048E 88E1 ldi R24,24
0490 EFEE ldi R30,239
0492 8083 std z+0,R24
0494 .dbline 189
0494 ; pass_Flag <<= 1;
0494 CC0C lsl R12
0496 .dbline 190
0496 ; CANIDT4 = (unsigned char) (msg.ID&0xF8);
0496 48EF ldi R20,248
0498 50E0 ldi R21,0
049A 60E0 ldi R22,0
049C 70E0 ldi R23,0
049E F501 movw R30,R10
04A0 2080 ldd R2,z+0
04A2 3180 ldd R3,z+1
04A4 4280 ldd R4,z+2
04A6 5380 ldd R5,z+3
04A8 2422 and R2,R20
04AA 3522 and R3,R21
04AC 4622 and R4,R22
04AE 5722 and R5,R23
04B0 E0EF ldi R30,240
04B2 F0E0 ldi R31,0
04B4 2082 std z+0,R2
04B6 .dbline 191
04B6 ; CANIDT3 = (unsigned char) (msg.ID>>8);
04B6 88E0 ldi R24,8
04B8 90E0 ldi R25,0
04BA F501 movw R30,R10
04BC 0081 ldd R16,z+0
04BE 1181 ldd R17,z+1
04C0 2281 ldd R18,z+2
04C2 3381 ldd R19,z+3
04C4 8A93 st -y,R24
04C6 0E940000 xcall asr32
04CA E1EF ldi R30,241
04CC F0E0 ldi R31,0
04CE 0083 std z+0,R16
04D0 .dbline 192
04D0 ; CANIDT2 = (unsigned char) (msg.ID>>16);
04D0 F501 movw R30,R10
04D2 2080 ldd R2,z+0
04D4 3180 ldd R3,z+1
04D6 4280 ldd R4,z+2
04D8 5380 ldd R5,z+3
04DA 1201 movw R2,R4
04DC E2EF ldi R30,242
04DE F0E0 ldi R31,0
04E0 2082 std z+0,R2
04E2 .dbline 193
04E2 ; pass_Flag <<= 1;
04E2 CC0C lsl R12
04E4 .dbline 194
04E4 ; CANIDT1 = (unsigned char) (msg.ID>>24);
04E4 88E1 ldi R24,24
04E6 90E0 ldi R25,0
04E8 F501 movw R30,R10
04EA 0081 ldd R16,z+0
04EC 1181 ldd R17,z+1
04EE 2281 ldd R18,z+2
04F0 3381 ldd R19,z+3
04F2 8A93 st -y,R24
04F4 0E940000 xcall asr32
04F8 E3EF ldi R30,243
04FA F0E0 ldi R31,0
04FC 0083 std z+0,R16
04FE .dbline 195
04FE ; if(pass_Flag!=0x08)
04FE 8C2D mov R24,R12
0500 8830 cpi R24,8
0502 11F0 breq L65
0504 .dbline 196
0504 ; RESET;
0504 0C940000 jmp 0x000
0508 L65:
0508 .dbline 197
0508 ; for(i=0;i<8;i++)
0508 CC24 clr R12
050A 0BC0 xjmp L70
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -