📄 16mcan.lst
字号:
022B 8020 LDD R2,Z+0
022C 922000F7 STS 0xF7,R2
(0110) CANIDM2 = CANIDM[i][1];
022E E084 LDI R24,4
022F 9F84 MUL R24,R20
0230 01F0 MOVW R30,R0
0231 EB85 LDI R24,0xB5
0232 E091 LDI R25,1
0233 0FE8 ADD R30,R24
0234 1FF9 ADC R31,R25
0235 8020 LDD R2,Z+0
0236 922000F6 STS 0xF6,R2
(0111) CANIDM3 = CANIDM[i][2];
0238 E084 LDI R24,4
0239 9F84 MUL R24,R20
023A 01F0 MOVW R30,R0
023B EB86 LDI R24,0xB6
023C E091 LDI R25,1
023D 0FE8 ADD R30,R24
023E 1FF9 ADC R31,R25
023F 8020 LDD R2,Z+0
0240 922000F5 STS 0xF5,R2
(0112) CANIDM4 = CANIDM[i][3]; //0 = ignore bit
0242 E084 LDI R24,4
0243 9F84 MUL R24,R20
0244 01F0 MOVW R30,R0
0245 EB87 LDI R24,0xB7
0246 E091 LDI R25,1
0247 0FE8 ADD R30,R24
0248 1FF9 ADC R31,R25
0249 8020 LDD R2,Z+0
024A 922000F4 STS 0xF4,R2
(0113) //CANIDM4 = (1<<IDEMSK); //identifier extention mask
(0114) CANCDMOB = (2<<CONMOB) | (1<<IDE); //reception, ext. ID,rev2.0B
024C E980 LDI R24,0x90
024D 938000EF STS 0xEF,R24
(0115) NOP();
024F 0000 NOP
0250 9543 INC R20
0251 304F CPI R20,0xF
0252 F408 BCC 0x0254
0253 CFA3 RJMP 0x01F7
(0116) }
(0117)
(0118) //CANHPMOB = (2<<HPMOB);
(0119) CANGCON = (1<<ENASTB); //start CAN interface, enable mode
0254 E082 LDI R24,2
0255 938000D8 STS 0xD8,R24
(0120) /***********************************************************************/
(0121) //interrupts
(0122) //CANGIE = (1<<ENIT) | (1<<ENRX); //enable receive interrupt
(0123)
(0124) CANGIE = (1<<ENIT) | (1<<ENTX)| (1<<ENRX); //enable receive interrupt and transmitte interrupt
0257 EB80 LDI R24,0xB0
0258 938000DB STS 0xDB,R24
(0125) ///////////////////////////////////////////////////////////////////////
(0126) CANIE1 = 0xff;
025A EF8F LDI R24,0xFF
025B 938000DF STS 0xDF,R24
(0127) CANIE2 = 0x7f; //enable ALL MObs interrupt
025D E78F LDI R24,0x7F
025E 938000DE STS 0xDE,R24
(0128) CANSIT1 = 0; //clear MOb status interrupt
0260 2422 CLR R2
0261 922000E1 STS 0xE1,R2
(0129) CANSIT2 = 0;
0263 922000E0 STS 0xE0,R2
(0130)
(0131) /////////////////////////// Enable Mob0 transmit/////////////////////
(0132) CLI();
0265 94F8 BCLR 7
(0133) CANPAGE = (1<<4);
0266 E180 LDI R24,0x10
0267 938000ED STS 0xED,R24
(0134) CANCDMOB |= (1<<CONMOB0);
0269 918000EF LDS R24,0xEF
026B 6480 ORI R24,0x40
026C 938000EF STS 0xEF,R24
(0135) /////////////////////////////////////////////////////////////////////
(0136)
(0137) while (!(CANGSTA & (1<<ENFG))); //wait until module ready
026E 918000D9 LDS R24,0xD9
0270 7084 ANDI R24,4
0271 F3E1 BEQ 0x026E
(0138)
(0139) CANGCON |= (1<<ENA); //enable CAN controller
0272 918000D8 LDS R24,0xD8
0274 6082 ORI R24,2
0275 938000D8 STS 0xD8,R24
0277 9624 ADIW R28,4
0278 940E04C6 CALL pop_gset3
027A 9508 RET
_can_tx:
i --> R10
msg --> R12
027B 940E04D1 CALL push_gset4
027D 0168 MOVW R12,R16
(0140) }
(0141)
(0142) /*******************************************************************
(0143) CAN transmission via mailbox 1 (polling)
(0144) *******************************************************************/
(0145) void can_tx (VCI_CAN_OBJ msg)
(0146) {
(0147) unsigned char i;
(0148) //enable MOb1, auto increment index, start with index = 0
(0149) CANPAGE = (1<<4);
027E E180 LDI R24,0x10
027F 938000ED STS 0xED,R24
(0150)
(0151) CANCDMOB = (1<<IDE) | (8<<DLC0); //set IDE bit rev2.0B, data length = 8
0281 E188 LDI R24,0x18
0282 938000EF STS 0xEF,R24
(0152)
(0153)
(0154) msg.ID <<= 3; //write 29 Bit identifier
0284 E083 LDI R24,3
0285 E090 LDI R25,0
0286 01F6 MOVW R30,R12
0287 8100 LDD R16,Z+0
0288 8111 LDD R17,Z+1
0289 8122 LDD R18,Z+2
028A 8133 LDD R19,Z+3
028B 938A ST R24,-Y
028C 940E0523 CALL lsl32
028E 01F6 MOVW R30,R12
028F 8300 STD Z+0,R16
0290 8311 STD Z+1,R17
0291 8322 STD Z+2,R18
0292 8333 STD Z+3,R19
(0155) CANIDT4 = (unsigned char) (msg.ID&0xF8);
0293 EF48 LDI R20,0xF8
0294 E050 LDI R21,0
0295 E060 LDI R22,0
0296 E070 LDI R23,0
0297 8020 LDD R2,Z+0
0298 8031 LDD R3,Z+1
0299 8042 LDD R4,Z+2
029A 8053 LDD R5,Z+3
029B 2224 AND R2,R20
029C 2235 AND R3,R21
029D 2246 AND R4,R22
029E 2257 AND R5,R23
029F 922000F0 STS 0xF0,R2
(0156) CANIDT3 = (unsigned char) (msg.ID>>8);
02A1 E088 LDI R24,0x8
02A2 E090 LDI R25,0
02A3 938A ST R24,-Y
02A4 940E04BA CALL asr32
02A6 930000F1 STS 0xF1,R16
(0157) CANIDT2 = (unsigned char) (msg.ID>>16);
02A8 01F6 MOVW R30,R12
02A9 8020 LDD R2,Z+0
02AA 8031 LDD R3,Z+1
02AB 8042 LDD R4,Z+2
02AC 8053 LDD R5,Z+3
02AD 0112 MOVW R2,R4
02AE 922000F2 STS 0xF2,R2
(0158) CANIDT1 = (unsigned char) (msg.ID>>24);
02B0 E188 LDI R24,0x18
02B1 E090 LDI R25,0
02B2 8100 LDD R16,Z+0
02B3 8111 LDD R17,Z+1
02B4 8122 LDD R18,Z+2
02B5 8133 LDD R19,Z+3
02B6 938A ST R24,-Y
02B7 940E04BA CALL asr32
02B9 930000F3 STS 0xF3,R16
(0159)
(0160) for(i=0;i<8;i++)
02BB 24AA CLR R10
02BC C00A RJMP 0x02C7
(0161) {
(0162)
(0163) CANMSG = msg.Data[i];
02BD 01C6 MOVW R24,R12
02BE 9604 ADIW R24,4
02BF 2DEA MOV R30,R10
02C0 27FF CLR R31
02C1 0FE8 ADD R30,R24
02C2 1FF9 ADC R31,R25
02C3 8020 LDD R2,Z+0
02C4 922000FA STS 0xFA,R2
02C6 94A3 INC R10
02C7 2D8A MOV R24,R10
02C8 3088 CPI R24,0x8
02C9 F398 BCS 0x02BD
(0164) }
(0165) // for (i=0; i<8; i++) //put data in mailbox 6
(0166)
(0167) CANCDMOB |= (1<<CONMOB0); //enable transmission
02CA 918000EF LDS R24,0xEF
02CC 6480 ORI R24,0x40
02CD 938000EF STS 0xEF,R24
02CF 940E04C9 CALL pop_gset4
02D1 9508 RET
_can_tx_buff:
tx_msg --> R20
02D2 940E04D7 CALL push_gset1
02D4 01A8 MOVW R20,R16
02D5 972C SBIW R28,0xC
(0168)
(0169) //while (!(CANSTMOB & (1<<TXOK))); //wait until complete
(0170) //CANSTMOB &= ~(1<<TXOK); //reset flag
(0171) }
(0172)
(0173)
(0174) #define can_TX_BUFFER_SIZE 8
(0175) VCI_CAN_OBJ tx_msg_buff[can_TX_BUFFER_SIZE];
(0176) Uchar can_sendingP;
(0177) Uchar can_willsendP;
(0178) Uchar can_tx_count;
(0179) Uint CAN_tx_OverFlow= 60000;
(0180) void can_tx_buff(VCI_CAN_OBJ tx_msg)
(0181) {
(0182) CAN_tx_OverFlow = 60000;
02D6 E680 LDI R24,0x60
02D7 EE9A LDI R25,0xEA
02D8 939001F1 STS CAN_tx_OverFlow+1,R25
02DA 938001F0 STS CAN_tx_OverFlow,R24
02DC C024 RJMP 0x0301
(0183) while (can_tx_count == can_TX_BUFFER_SIZE)
(0184) {
(0185) CAN_tx_OverFlow--;
02DD 918001F0 LDS R24,CAN_tx_OverFlow
02DF 919001F1 LDS R25,CAN_tx_OverFlow+1
02E1 9701 SBIW R24,1
02E2 939001F1 STS CAN_tx_OverFlow+1,R25
02E4 938001F0 STS CAN_tx_OverFlow,R24
(0186) if(CAN_tx_OverFlow<=50)
02E6 E382 LDI R24,0x32
02E7 E090 LDI R25,0
02E8 902001F0 LDS R2,CAN_tx_OverFlow
02EA 903001F1 LDS R3,CAN_tx_OverFlow+1
02EC 1582 CP R24,R2
02ED 0593 CPC R25,R3
02EE F090 BCS 0x0301
(0187) {
(0188) can_tx_count = 0;
02EF 2422 CLR R2
02F0 922001FE STS can_tx_count,R2
(0189) can_sendingP = can_willsendP;
02F2 902001FF LDS R2,can_willsendP
02F4 92200200 STS can_sendingP,R2
(0190) CANSTMOB &= ~(1<<TXOK);
02F6 918000EE LDS R24,0xEE
02F8 7B8F ANDI R24,0xBF
02F9 938000EE STS 0xEE,R24
(0191) CAN_tx_OverFlow = 60000;
02FB E680 LDI R24,0x60
02FC EE9A LDI R25,0xEA
02FD 939001F1 STS CAN_tx_OverFlow+1,R25
02FF 938001F0 STS CAN_tx_OverFlow,R24
0301 918001FE LDS R24,can_tx_count
0303 3088 CPI R24,0x8
0304 F2C1 BEQ 0x02DD
(0192) }
(0193) }
(0194) if(can_tx_count || (CANGSTA & (1<<TXBSY)))
0305 2388 TST R24
0306 F421 BNE 0x030B
0307 918000D9 LDS R24,0xD9
0309 7180 ANDI R24,0x10
030A F111 BEQ 0x032D
(0195) {
(0196) tx_msg_buff[can_willsendP] = tx_msg;
030B 902001FF LDS R2,can_willsendP
030D E08C LDI R24,0xC
030E 9D82 MUL R24,R2
030F 0110 MOVW R2,R0
0310 E081 LDI R24,1
0311 E092 LDI R25,2
0312 0E28 ADD R2,R24
0313 1E39 ADC R3,R25
0314 E00C LDI R16,0xC
0315 E010 LDI R17,0
0316 923A ST R3,-Y
0317 922A ST R2,-Y
0318 935A ST R21,-Y
0319 934A ST R20,-Y
031A 940E052F CALL asgnblk
(0197) if(++can_willsendP == can_TX_BUFFER_SIZE)
031C 918001FF LDS R24,can_willsendP
031E 5F8F SUBI R24,0xFF
031F 2E28 MOV R2,R24
0320 922001FF STS can_willsendP,R2
0322 3088 CPI R24,0x8
0323 F419 BNE 0x0327
(0198) can_willsendP = 0;
0324 2422 CLR R2
0325 922001FF STS can_willsendP,R2
(0199) ++can_tx_count;
0327 918001FE LDS R24,can_tx_count
0329 5F8F SUBI R24,0xFF
032A 938001FE STS can_tx_count,R24
(0200) }
032C C017 RJMP 0x0344
(0201) else
(0202) {
(0203) if(can_willsendP != can_sendingP)
032D 90200200 LDS R2,can_sendingP
032F 903001FF LDS R3,can_willsendP
0331 1432 CP R3,R2
0332 F031 BEQ 0x0339
(0204) {
(0205) NOP();
0333 0000 NOP
(0206) can_willsendP=0;
0334 2422 CLR R2
0335 922001FF STS can_willsendP,R2
(0207) can_sendingP=0;
0337 92200200 STS can_sendingP,R2
(0208) }
(0209) can_tx(tx_msg);
0339 01CE MOVW R24,R28
033A E00C LDI R16,0xC
033B E010 LDI R17,0
033C 939A ST R25,-Y
033D 938A ST R24,-Y
033E 935A ST R21,-Y
033F 934A ST R20,-Y
0340 940E052F CALL asgnblk
0342 018E MOVW R16,R28
0343 DF37 RCALL _can_tx
(0210) }
0344 962C ADIW R28,0xC
0345 940E04DA CALL pop_gset1
0347 9508 RET
_can_ReceiveData:
RCFlag --> Y,+1
RCtemp2 --> R10
RCtemp1 --> R12
temp --> Y,+210
RC_CANSI --> Y,+208
CAN_REMOb --> Y,+180
RCF --> R10
tempp --> R14
nn --> R14
tt --> Y,+207
msg --> Y,+0
i --> R12
nb_data --> R10
0348 940E04EE CALL push_lset
034A 940E04CF CALL push_gset5
034C 97EF SBIW R28,0x3F
034D 97EF SBIW R28,0x3F
034E 97EF SBIW R28,0x3F
034F 9766 SBIW R28,0x16
(0211) }
(0212)
(0213)
(0214) /*******************************************************************
(0215) CAN receive interrupt service routine (mailbox i)
(0216) *******************************************************************/
(0217) #pragma interrupt_handler can_ReceiveData:19
(0218) void can_ReceiveData (void) //receive interrupt
(0219) {Uchar RCFlag;
(0220) unsigned char nb_data;
(0221) unsigned char temp = CANPAGE; //save CANPAGE
0350 902000ED LDS R2,0xED
0352 01FE MOVW R30,R28
0353 52EE SUBI R30,0x2E
0354 4FFF SBCI R31,0xFF
0355 8220 STD Z+0,R2
(0222) unsigned char i,tt=0,CAN_REMOb[15],nn;
0356 2400 CLR R0
0357 01FE MOVW R30,R28
0358 53E1 SUBI R30,0x31
0359 4FFF SBCI R31,0xFF
035A 8200 STD Z+0,R0
(0223) unsigned int RC_CANSI,RCtemp1,RCtemp2,tempp,RCF;
(0224) VCI_CAN_OBJ msg[15];
(0225)
(0226) //VCI_CAN_OBJ CanTkfrm;
(0227)
(0228)
(0229) if(CANSTMOB & (1<<TXOK))
035B 918000EE LDS R24,0xEE
035D 7480 ANDI R24,0x40
035E F199 BEQ 0x0392
(0230) {
(0231) CANSTMOB &= ~(1<<TXOK);
035F 918000EE LDS R24,0xEE
0361 7B8F ANDI R24,0xBF
0362 938000EE STS 0xEE,R24
(0232) if(can_tx_count)
0364 902001FE LDS R2,can_tx_count
0366 2022 TST R2
0367 F409 BNE 0x0369
0368 C142 RJMP 0x04AB
(0233) {
(0234) --can_tx_count;
0369 2D82 MOV R24,R2
036A 5081 SUBI R24,1
036B 938001FE STS can_tx_count,R24
(0235) can_tx(tx_msg_buff[can_sendingP]);
036D 90200200 LDS R2,can_sendingP
036F E08C LDI R24,0xC
0370 9D82 MUL R24,R2
0371 0110 MOVW R2,R0
0372 E081 LDI R24,1
0373 E092 LDI R25,2
0374 0E28 ADD R2,R24
0375 1E39 ADC R3,R25
0376 01CE MOVW R24,R28
0377 538D SUBI R24,0x3D
0378 4F9F SBCI R25,0xFF
0379 E00C LDI R16,0xC
037A E010 LDI R17,0
037B 939A ST R25,-Y
037C 938A ST R24,-Y
037D 923A ST R3,-Y
037E 922A ST R2,-Y
037F 940E052F CALL asgnblk
0381 018E MOVW R16,R28
0382 530D SUBI R16,0x3D
0383 4F1F SBCI R17,0xFF
0384 DEF6 RCALL _can_tx
(0236) if(++can_sendingP==can_TX_BUFFER_SIZE) can_sendingP=0;
0385 91800200 LDS R24,can_sendingP
0387 5F8F SUBI R24,0xFF
0388 2E28 MOV R2,R24
0389 92200200 STS can_sendingP,R2
038B 3088 CPI R24,0x8
038C F009 BEQ 0x038E
038D C11D RJMP 0x04AB
038E 2422 CLR R2
038F 92200200 STS can_sendingP,R2
(0237) }
(0238) }
0391 C119 RJMP 0x04AB
(0239) else
(0240) {
(0241) RCtemp2=CANSIT2;
0392 90A000E0 LDS R10,0xE0
0394 24BB CLR R11
(0242) RCtemp1=CANSIT1;
0395 90C000E1 LDS R12,0xE1
0397 24DD CLR R13
(0243) CANSTMOB &= ~(1<<RXOK);
0398 918000EE LDS R24,0xEE
039A 7D8F ANDI R24,0xDF
039B 938000EE STS 0xEE,R24
(0244) RC_CANSI=(RCtemp1<<8)|RCtemp2;
039D 0116 MOVW R2,R12
039E 2C32 MOV R3,R2
039F 2422 CLR R2
03A0 282A OR R2,R10
03A1 283B OR R3,R11
03A2 01FE MOVW R30,R28
03A3 53E0 SUBI R30,0x30
03A4 4FFF SBCI R31,0xFF
03A5 8231 STD Z+1,R3
03A6 8220 STD Z+0,R2
(0245) for(i=0;i<15;i++)
03A7 24CC CLR R12
03A8 C02B RJMP 0x03D4
(0246) {
(0247) tempp=(1<<i);
03A9 2D2C MOV R18,R12
03AA 2733 CLR R19
03AB E001 LDI R16,1
03AC E010 LDI R17,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -