📄 pannel_can.lst
字号:
022B 2744 CLR R20
022C C068 RJMP 0x0295
(0118) {
(0119) CANPAGE = (i<<4); //MOb 0,1,2设置为接收模式模式
022D 2F84 MOV R24,R20
022E 708F ANDI R24,0xF
022F 9582 SWAP R24
0230 EEED LDI R30,0xED
0231 E0F0 LDI R31,0
0232 8380 STD Z+0,R24
(0120) CANIDT1 = CANIDT[i][0]; //初始化 ID
0233 E084 LDI R24,4
0234 9F84 MUL R24,R20
0235 01F0 MOVW R30,R0
0236 E788 LDI R24,0x78
0237 E091 LDI R25,1
0238 0FE8 ADD R30,R24
0239 1FF9 ADC R31,R25
023A 8020 LDD R2,Z+0
023B EFE3 LDI R30,0xF3
023C E0F0 LDI R31,0
023D 8220 STD Z+0,R2
(0121) CANIDT2 = CANIDT[i][1];
023E E084 LDI R24,4
023F 9F84 MUL R24,R20
0240 01F0 MOVW R30,R0
0241 E789 LDI R24,0x79
0242 E091 LDI R25,1
0243 0FE8 ADD R30,R24
0244 1FF9 ADC R31,R25
0245 8020 LDD R2,Z+0
0246 EFE2 LDI R30,0xF2
0247 E0F0 LDI R31,0
0248 8220 STD Z+0,R2
(0122) CANIDT3 = CANIDT[i][2];
0249 E084 LDI R24,4
024A 9F84 MUL R24,R20
024B 01F0 MOVW R30,R0
024C E78A LDI R24,0x7A
024D E091 LDI R25,1
024E 0FE8 ADD R30,R24
024F 1FF9 ADC R31,R25
0250 8020 LDD R2,Z+0
0251 EFE1 LDI R30,0xF1
0252 E0F0 LDI R31,0
0253 8220 STD Z+0,R2
(0123) CANIDT4 = CANIDT[i][3];
0254 E084 LDI R24,4
0255 9F84 MUL R24,R20
0256 01F0 MOVW R30,R0
0257 E78B LDI R24,0x7B
0258 E091 LDI R25,1
0259 0FE8 ADD R30,R24
025A 1FF9 ADC R31,R25
025B 8020 LDD R2,Z+0
025C EFE0 LDI R30,0xF0
025D E0F0 LDI R31,0
025E 8220 STD Z+0,R2
(0124) CANIDM1 = CANIDM[i][0]; //初始化 mask
025F E084 LDI R24,4
0260 9F84 MUL R24,R20
0261 01F0 MOVW R30,R0
0262 EB84 LDI R24,0xB4
0263 E091 LDI R25,1
0264 0FE8 ADD R30,R24
0265 1FF9 ADC R31,R25
0266 8020 LDD R2,Z+0
0267 EFE7 LDI R30,0xF7
0268 E0F0 LDI R31,0
0269 8220 STD Z+0,R2
(0125) CANIDM2 = CANIDM[i][1];
026A E084 LDI R24,4
026B 9F84 MUL R24,R20
026C 01F0 MOVW R30,R0
026D EB85 LDI R24,0xB5
026E E091 LDI R25,1
026F 0FE8 ADD R30,R24
0270 1FF9 ADC R31,R25
0271 8020 LDD R2,Z+0
0272 EFE6 LDI R30,0xF6
0273 E0F0 LDI R31,0
0274 8220 STD Z+0,R2
(0126) CANIDM3 = CANIDM[i][2];
0275 E084 LDI R24,4
0276 9F84 MUL R24,R20
0277 01F0 MOVW R30,R0
0278 EB86 LDI R24,0xB6
0279 E091 LDI R25,1
027A 0FE8 ADD R30,R24
027B 1FF9 ADC R31,R25
027C 8020 LDD R2,Z+0
027D EFE5 LDI R30,0xF5
027E E0F0 LDI R31,0
027F 8220 STD Z+0,R2
(0127) CANIDM4 = CANIDM[i][3]; //0 = ignore bit
0280 E084 LDI R24,4
0281 9F84 MUL R24,R20
0282 01F0 MOVW R30,R0
0283 EB87 LDI R24,0xB7
0284 E091 LDI R25,1
0285 0FE8 ADD R30,R24
0286 1FF9 ADC R31,R25
0287 8020 LDD R2,Z+0
0288 EFE4 LDI R30,0xF4
0289 E0F0 LDI R31,0
028A 8220 STD Z+0,R2
(0128) //CANIDM4 = (1<<IDEMSK); //identifier extention mask
(0129) CANCDMOB = (2<<CONMOB0)|(1<<IDE)|(8<<DLC0); //reception, ext. ID,rev2.0B
028B E988 LDI R24,0x98
028C EEEF LDI R30,0xEF
028D 8380 STD Z+0,R24
(0130) NOP();
028E 0000 NOP
(0131) Pass_Flag = Pass_Flag + 1;
028F 9180037C LDS R24,Pass_Flag
0291 5F8F SUBI R24,0xFF
0292 9380037C STS Pass_Flag,R24
0294 9543 INC R20
0295 3043 CPI R20,3
0296 F408 BCC 0x0298
0297 CF95 RJMP 0x022D
(0132) }
(0133)
(0134) if(Pass_Flag!=0x03)
0298 9180037C LDS R24,Pass_Flag
029A 3083 CPI R24,3
029B F011 BEQ 0x029E
(0135) RESET;
029C 940C0000 JMP 0x0
(0136)
(0137) WDR();
029E 95A8 WDR
(0138)
(0139) Pass_Flag = 0x00;
029F 2422 CLR R2
02A0 9220037C STS Pass_Flag,R2
(0140) for(i=3;i<6;i++)
02A2 E043 LDI R20,3
02A3 C068 RJMP 0x030C
(0141) {
(0142) CANPAGE = (i<<4); //MOb3,4,5设置为发送模式
02A4 2F84 MOV R24,R20
02A5 708F ANDI R24,0xF
02A6 9582 SWAP R24
02A7 EEED LDI R30,0xED
02A8 E0F0 LDI R31,0
02A9 8380 STD Z+0,R24
(0143) CANIDT1 = CANIDT[i][0]; //初始化 ID
02AA E084 LDI R24,4
02AB 9F84 MUL R24,R20
02AC 01F0 MOVW R30,R0
02AD E788 LDI R24,0x78
02AE E091 LDI R25,1
02AF 0FE8 ADD R30,R24
02B0 1FF9 ADC R31,R25
02B1 8020 LDD R2,Z+0
02B2 EFE3 LDI R30,0xF3
02B3 E0F0 LDI R31,0
02B4 8220 STD Z+0,R2
(0144) CANIDT2 = CANIDT[i][1];
02B5 E084 LDI R24,4
02B6 9F84 MUL R24,R20
02B7 01F0 MOVW R30,R0
02B8 E789 LDI R24,0x79
02B9 E091 LDI R25,1
02BA 0FE8 ADD R30,R24
02BB 1FF9 ADC R31,R25
02BC 8020 LDD R2,Z+0
02BD EFE2 LDI R30,0xF2
02BE E0F0 LDI R31,0
02BF 8220 STD Z+0,R2
(0145) CANIDT3 = CANIDT[i][2];
02C0 E084 LDI R24,4
02C1 9F84 MUL R24,R20
02C2 01F0 MOVW R30,R0
02C3 E78A LDI R24,0x7A
02C4 E091 LDI R25,1
02C5 0FE8 ADD R30,R24
02C6 1FF9 ADC R31,R25
02C7 8020 LDD R2,Z+0
02C8 EFE1 LDI R30,0xF1
02C9 E0F0 LDI R31,0
02CA 8220 STD Z+0,R2
(0146) CANIDT4 = CANIDT[i][3];
02CB E084 LDI R24,4
02CC 9F84 MUL R24,R20
02CD 01F0 MOVW R30,R0
02CE E78B LDI R24,0x7B
02CF E091 LDI R25,1
02D0 0FE8 ADD R30,R24
02D1 1FF9 ADC R31,R25
02D2 8020 LDD R2,Z+0
02D3 EFE0 LDI R30,0xF0
02D4 E0F0 LDI R31,0
02D5 8220 STD Z+0,R2
(0147) CANIDM1 = CANIDM[i][0]; //初始化 mask
02D6 E084 LDI R24,4
02D7 9F84 MUL R24,R20
02D8 01F0 MOVW R30,R0
02D9 EB84 LDI R24,0xB4
02DA E091 LDI R25,1
02DB 0FE8 ADD R30,R24
02DC 1FF9 ADC R31,R25
02DD 8020 LDD R2,Z+0
02DE EFE7 LDI R30,0xF7
02DF E0F0 LDI R31,0
02E0 8220 STD Z+0,R2
(0148) CANIDM2 = CANIDM[i][1];
02E1 E084 LDI R24,4
02E2 9F84 MUL R24,R20
02E3 01F0 MOVW R30,R0
02E4 EB85 LDI R24,0xB5
02E5 E091 LDI R25,1
02E6 0FE8 ADD R30,R24
02E7 1FF9 ADC R31,R25
02E8 8020 LDD R2,Z+0
02E9 EFE6 LDI R30,0xF6
02EA E0F0 LDI R31,0
02EB 8220 STD Z+0,R2
(0149) CANIDM3 = CANIDM[i][2];
02EC E084 LDI R24,4
02ED 9F84 MUL R24,R20
02EE 01F0 MOVW R30,R0
02EF EB86 LDI R24,0xB6
02F0 E091 LDI R25,1
02F1 0FE8 ADD R30,R24
02F2 1FF9 ADC R31,R25
02F3 8020 LDD R2,Z+0
02F4 EFE5 LDI R30,0xF5
02F5 E0F0 LDI R31,0
02F6 8220 STD Z+0,R2
(0150) CANIDM4 = CANIDM[i][3]; //0 = ignore bit
02F7 E084 LDI R24,4
02F8 9F84 MUL R24,R20
02F9 01F0 MOVW R30,R0
02FA EB87 LDI R24,0xB7
02FB E091 LDI R25,1
02FC 0FE8 ADD R30,R24
02FD 1FF9 ADC R31,R25
02FE 8020 LDD R2,Z+0
02FF EFE4 LDI R30,0xF4
0300 E0F0 LDI R31,0
0301 8220 STD Z+0,R2
(0151) CANCDMOB = (1<<IDE)|(8<<DLC0);
0302 E188 LDI R24,0x18
0303 EEEF LDI R30,0xEF
0304 8380 STD Z+0,R24
(0152) NOP();
0305 0000 NOP
(0153) Pass_Flag = Pass_Flag + 1;
0306 9180037C LDS R24,Pass_Flag
0308 5F8F SUBI R24,0xFF
0309 9380037C STS Pass_Flag,R24
030B 9543 INC R20
030C 3046 CPI R20,6
030D F408 BCC 0x030F
030E CF95 RJMP 0x02A4
(0154) }
(0155) if(Pass_Flag!=0x03)
030F 9180037C LDS R24,Pass_Flag
0311 3083 CPI R24,3
0312 F011 BEQ 0x0315
(0156) RESET;
0313 940C0000 JMP 0x0
(0157)
(0158) CANGCON = (1<<ENASTB); //start CAN interface, enable mod
0315 E082 LDI R24,2
0316 EDE8 LDI R30,0xD8
0317 E0F0 LDI R31,0
0318 8380 STD Z+0,R24
(0159)
(0160) CANGIE = (1<<ENIT)| (1<<ENRX)|(1<<ENTX); //enable receive interrupt and transmitte interrupt
0319 EB80 LDI R24,0xB0
031A EDEB LDI R30,0xDB
031B 8380 STD Z+0,R24
(0161) CANIE1 = 0x00;
031C 2422 CLR R2
031D EDEF LDI R30,0xDF
031E 8220 STD Z+0,R2
(0162) CANIE2 = 0x3f; //enable ALL MObs interrupt
031F E38F LDI R24,0x3F
0320 EDEE LDI R30,0xDE
0321 8380 STD Z+0,R24
(0163)
(0164) WDR();
0322 95A8 WDR
(0165) while (!(CANGSTA & (1<<ENFG))); //wait until module ready
0323 EDE9 LDI R30,0xD9
0324 E0F0 LDI R31,0
0325 8020 LDD R2,Z+0
0326 FE22 SBRS R2,2
0327 CFFB RJMP 0x0323
(0166)
(0167) CANGCON |= (1<<ENA); //enable CAN controller
0328 918000D8 LDS R24,0xD8
032A 6082 ORI R24,2
032B 938000D8 STS 0xD8,R24
(0168)
(0169) SEI();
032D 9478 BSET 7
032E 9624 ADIW R28,4
032F 940E44B6 CALL pop_gset3
0331 9508 RET
_can_tx:
temp_id --> Y+0
index --> R14
pass_Flag --> R12
i --> R12
msg --> R10
0332 940E44BF CALL push_gset5
0334 0158 MOVW R10,R16
0335 9724 SBIW R28,4
(0170) }
(0171)
(0172)
(0173)
(0174) /*******************************************************************
(0175) CAN transmission via mailbox 1 (polling)
(0176) *******************************************************************/
(0177) void can_tx (VCI_CAN_OBJ msg)
(0178) {
(0179) unsigned char i,index,pass_Flag;
(0180) long temp_id;
(0181)
(0182) pass_Flag = 0x01;
0336 24CC CLR R12
0337 94C3 INC R12
(0183) pass_Flag <<= 1;
0338 0CCC LSL R12
(0184) msg.ID <<= 3;
0339 E083 LDI R24,3
033A E090 LDI R25,0
033B 01F5 MOVW R30,R10
033C 8100 LDD R16,Z+0
033D 8111 LDD R17,Z+1
033E 8122 LDD R18,Z+2
033F 8133 LDD R19,Z+3
0340 938A ST R24,-Y
0341 940E4530 CALL lsl32
0343 01F5 MOVW R30,R10
0344 8300 STD Z+0,R16
0345 8311 STD Z+1,R17
0346 8322 STD Z+2,R18
0347 8333 STD Z+3,R19
(0185) temp_id = msg.ID&0x0f000000 ;
0348 E040 LDI R20,0
0349 E050 LDI R21,0
034A E060 LDI R22,0
034B E07F LDI R23,0xF
034C 8020 LDD R2,Z+0
034D 8031 LDD R3,Z+1
034E 8042 LDD R4,Z+2
034F 8053 LDD R5,Z+3
0350 2224 AND R2,R20
0351 2235 AND R3,R21
0352 2246 AND R4,R22
0353 2257 AND R5,R23
0354 8228 STD Y+0,R2
0355 8239 STD Y+1,R3
0356 824A STD Y+2,R4
0357 825B STD Y+3,R5
(0186) index =( unsigned char )(temp_id>>24);
0358 E188 LDI R24,0x18
0359 E090 LDI R25,0
035A 8108 LDD R16,Y+0
035B 8119 LDD R17,Y+1
035C 812A LDD R18,Y+2
035D 813B LDD R19,Y+3
035E 938A ST R24,-Y
035F 940E4463 CALL asr32
0361 2EE0 MOV R14,R16
(0187) index = index + 3;
0362 2D8E MOV R24,R14
0363 5F8D SUBI R24,0xFD
0364 2EE8 MOV R14,R24
(0188) CANPAGE = (index<<4);
0365 708F ANDI R24,0xF
0366 9582 SWAP R24
0367 EEED LDI R30,0xED
0368 E0F0 LDI R31,0
0369 8380 STD Z+0,R24
(0189) CANCDMOB = (1<<IDE) |(8<<DLC0);
036A E188 LDI R24,0x18
036B EEEF LDI R30,0xEF
036C 8380 STD Z+0,R24
(0190) pass_Flag <<= 1;
036D 0CCC LSL R12
(0191) CANIDT4 = (unsigned char) (msg.ID&0xF8);
036E EF48 LDI R20,0xF8
036F E050 LDI R21,0
0370 E060 LDI R22,0
0371 E070 LDI R23,0
0372 01F5 MOVW R30,R10
0373 8020 LDD R2,Z+0
0374 8031 LDD R3,Z+1
0375 8042 LDD R4,Z+2
0376 8053 LDD R5,Z+3
0377 2224 AND R2,R20
0378 2235 AND R3,R21
0379 2246 AND R4,R22
037A 2257 AND R5,R23
037B EFE0 LDI R30,0xF0
037C E0F0 LDI R31,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -