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