📄 16mcan.lst
字号:
__start:
__text_start:
00CC EFCF LDI R28,0xFF
00CD E1D0 LDI R29,0x10
00CE BFCD OUT 0x3D,R28
00CF BFDE OUT 0x3E,R29
00D0 52C0 SUBI R28,0x20
00D1 40D0 SBCI R29,0
00D2 EA0A LDI R16,0xAA
00D3 8308 STD Y+0,R16
00D4 2400 CLR R0
00D5 EFE2 LDI R30,0xF2
00D6 E0F1 LDI R31,1
00D7 E012 LDI R17,2
00D8 36E3 CPI R30,0x63
00D9 07F1 CPC R31,R17
00DA F011 BEQ 0x00DD
00DB 9201 ST R0,Z+
00DC CFFB RJMP 0x00D8
00DD 8300 STD Z+0,R16
00DE EAE6 LDI R30,0xA6
00DF E0F0 LDI R31,0
00E0 E0A0 LDI R26,0
00E1 E0B1 LDI R27,1
00E2 E011 LDI R17,1
00E3 39E8 CPI R30,0x98
00E4 07F1 CPC R31,R17
00E5 F021 BEQ 0x00EA
00E6 95C8 LPM
00E7 9631 ADIW R30,1
00E8 920D ST R0,X+
00E9 CFF9 RJMP 0x00E3
00EA 940E00ED CALL _main
_exit:
00EC CFFF RJMP _exit
_main:
i --> R20
j --> R22
00ED 972C SBIW R28,0xC
FILE: F:\测量模块\16MCan\main.c
(0001) #include "main.h"
(0002)
(0003) VCI_CAN_OBJ msg_test;
(0004)
(0005) void main(void)
(0006) {
(0007) Uchar i,j;
(0008) can_init ();
00EE 940E0121 CALL _can_init
(0009) SEI();
00F0 9478 BSET 7
(0010) for(i=0;i<10;i++)
00F1 2744 CLR R20
00F2 C027 RJMP 0x011A
(0011) {
(0012) msg_test.ID = i;
00F3 2E24 MOV R2,R20
00F4 2433 CLR R3
00F5 2444 CLR R4
00F6 2455 CLR R5
00F7 923001F3 STS msg_test+1,R3
00F9 922001F2 STS msg_test,R2
00FB 925001F5 STS msg_test+3,R5
00FD 924001F4 STS msg_test+2,R4
(0013) for(j=0;j<8;j++)
00FF 2766 CLR R22
0100 C008 RJMP 0x0109
(0014) {
(0015) msg_test.Data[j] = j;
0101 EF86 LDI R24,0xF6
0102 E091 LDI R25,1
0103 2FE6 MOV R30,R22
0104 27FF CLR R31
0105 0FE8 ADD R30,R24
0106 1FF9 ADC R31,R25
0107 8360 STD Z+0,R22
0108 9563 INC R22
0109 3068 CPI R22,0x8
010A F3B0 BCS 0x0101
(0016) }
(0017) can_tx_buff(msg_test);
010B EF82 LDI R24,0xF2
010C E091 LDI R25,1
010D 01FE MOVW R30,R28
010E E00C LDI R16,0xC
010F E010 LDI R17,0
0110 93FA ST R31,-Y
0111 93EA ST R30,-Y
0112 939A ST R25,-Y
0113 938A ST R24,-Y
0114 940E052F CALL asgnblk
0116 018E MOVW R16,R28
0117 940E02D2 CALL _can_tx_buff
0119 9543 INC R20
011A 304A CPI R20,0xA
011B F2B8 BCS 0x00F3
011C C001 RJMP 0x011E
(0018) }
(0019) while(1)
(0020) {
(0021) NOP();
011D 0000 NOP
011E CFFE RJMP 0x011D
011F 962C ADIW R28,0xC
0120 9508 RET
FILE: F:\测量模块\16MCan\can.c
(0001) #include "main.h"
(0002)
(0003) //#pragma interrupt_handler can_ReceiveData:19
(0004)
(0005) /*******************************************************************
(0006) CAN initialization:
(0007) Mailbox 0: Receive --> interrupt
(0008) Mailbox 1: Transmit --> polling
(0009) *******************************************************************/
(0010) #define TYP_RESET 5
(0011) #define TYP_BAUD 10
(0012)
(0013) #define SELFID 2
(0014)
(0015) extern unsigned char sysrst;
(0016) unsigned char canbaud;
(0017)
(0018) const Uchar CanBaud[6][3]={{0x02,0x04,0x13},{0x06,0x04,0x13},{0x0E,0x04,0x13},{0x12,0x04,0x13},{0x1E,0x04,0x13},{0x26,0x04,0x13}};
(0019)
(0020)
(0021)
(0022) unsigned long CANMOBID[15]={0x1300ff01,0x1300ff01,0x02000000|(SELFID<<8),0x02000000|(SELFID<<8),0x0100ff00,0x0100ff00,0x01000000|(SELFID<<8),0x01000000|(SELFID<<8),0x0200ff00,0x12000001,0x01000000|(SELFID<<8),0x01000000|(SELFID<<8),0x01000000|(SELFID<<8),0x01000000|(SELFID<<8),0x1300ff01};
(0023) unsigned long CANMOBMD[15]={0x1f00ffff,0x1f00ffff,0x0f00ff00, 0x0f00ff00, 0x0f00ff00,0x0f00ff00,0x0f00ff00, 0x0f00ff00, 0x0f00ff00,0x1f0000ff,0x0f00ff00,0x0f00ff00,0x0f00ff00,0x0f00ff00,0x1f00ffff};
(0024) unsigned char CANIDT[15][4]={0};
(0025) unsigned char CANIDM[15][4]={0};
(0026) Uchar counterTemp;
(0027) void can_init (void)
(0028) {
(0029) canMob_init();
_can_init:
0121 D001 RCALL _canMob_init
0122 9508 RET
_canMob_init:
temp2 --> R10
temp1 --> R22
temp --> Y,+0
j --> R22
i --> R20
0123 940E04D3 CALL push_gset3
0125 9724 SBIW R28,4
(0030) //IDRcbufInit();
(0031) //RstIDused();
(0032) }
(0033)
(0034)
(0035) void canMob_init (void)
(0036) {
(0037) unsigned char i,j;
(0038) unsigned long temp;
(0039) unsigned int temp1,temp2;
(0040)
(0041)
(0042) //DDRD=(1<<PD5)|(0<<PD6); //TXCAN, RXCNA
(0043) DDRD|=0x20;
0126 9A55 SBI 0x0A,5
(0044) DDRD&=0xBF;
0127 B18A IN R24,0x0A
0128 7B8F ANDI R24,0xBF
0129 B98A OUT 0x0A,R24
(0045) CANGCON |= (1<<SWRES); //reset CAN interface
012A 918000D8 LDS R24,0xD8
012C 6081 ORI R24,1
012D 938000D8 STS 0xD8,R24
(0046)
(0047)
(0048) //CANMOBID[2]=(unsigned long)(SELFID<<8)|CANMOBID[2];
(0049) for(i=0;i<15;i++)
012F 2744 CLR R20
0130 C043 RJMP 0x0174
(0050) {
(0051) temp=CANMOBID[i]<<3;
0131 E084 LDI R24,4
0132 9F84 MUL R24,R20
0133 01F0 MOVW R30,R0
0134 E080 LDI R24,0
0135 E091 LDI R25,1
0136 0FE8 ADD R30,R24
0137 1FF9 ADC R31,R25
0138 8100 LDD R16,Z+0
0139 8111 LDD R17,Z+1
013A 8122 LDD R18,Z+2
013B 8133 LDD R19,Z+3
013C E083 LDI R24,3
013D E090 LDI R25,0
013E 938A ST R24,-Y
013F 940E0523 CALL lsl32
0141 8308 STD Y+0,R16
0142 8319 STD Y+1,R17
0143 832A STD Y+2,R18
0144 833B STD Y+3,R19
(0052) temp1=(unsigned int)temp;
0145 8168 LDD R22,Y+0
0146 8179 LDD R23,Y+1
(0053) temp2=(unsigned int)(temp/0x00010000);
0147 8028 LDD R2,Y+0
0148 8039 LDD R3,Y+1
0149 804A LDD R4,Y+2
014A 805B LDD R5,Y+3
014B 0152 MOVW R10,R4
(0054) CANIDT[i][3]=(Uchar)temp1;
014C E084 LDI R24,4
014D 9F84 MUL R24,R20
014E 01F0 MOVW R30,R0
014F E78B LDI R24,0x7B
0150 E091 LDI R25,1
0151 0FE8 ADD R30,R24
0152 1FF9 ADC R31,R25
0153 8360 STD Z+0,R22
(0055) CANIDT[i][2]=(Uchar)(temp1>>8);
0154 E084 LDI R24,4
0155 9F84 MUL R24,R20
0156 01F0 MOVW R30,R0
0157 E78A LDI R24,0x7A
0158 E091 LDI R25,1
0159 0FE8 ADD R30,R24
015A 1FF9 ADC R31,R25
015B 011B MOVW R2,R22
015C 2C23 MOV R2,R3
015D 2433 CLR R3
015E 8220 STD Z+0,R2
(0056) CANIDT[i][1]=(Uchar)temp2;
015F E084 LDI R24,4
0160 9F84 MUL R24,R20
0161 01F0 MOVW R30,R0
0162 E789 LDI R24,0x79
0163 E091 LDI R25,1
0164 0FE8 ADD R30,R24
0165 1FF9 ADC R31,R25
0166 82A0 STD Z+0,R10
(0057) CANIDT[i][0]=(Uchar)(temp2>>8);
0167 E084 LDI R24,4
0168 9F84 MUL R24,R20
0169 01F0 MOVW R30,R0
016A E788 LDI R24,0x78
016B E091 LDI R25,1
016C 0FE8 ADD R30,R24
016D 1FF9 ADC R31,R25
016E 0115 MOVW R2,R10
016F 2C23 MOV R2,R3
0170 2433 CLR R3
0171 8220 STD Z+0,R2
(0058) NOP();
0172 0000 NOP
0173 9543 INC R20
0174 304F CPI R20,0xF
0175 F408 BCC 0x0177
0176 CFBA RJMP 0x0131
(0059) }
(0060)
(0061) for(i=0;i<15;i++)
0177 2744 CLR R20
0178 C043 RJMP 0x01BC
(0062) {
(0063) temp=CANMOBMD[i]<<3;
0179 E084 LDI R24,4
017A 9F84 MUL R24,R20
017B 01F0 MOVW R30,R0
017C E38C LDI R24,0x3C
017D E091 LDI R25,1
017E 0FE8 ADD R30,R24
017F 1FF9 ADC R31,R25
0180 8100 LDD R16,Z+0
0181 8111 LDD R17,Z+1
0182 8122 LDD R18,Z+2
0183 8133 LDD R19,Z+3
0184 E083 LDI R24,3
0185 E090 LDI R25,0
0186 938A ST R24,-Y
0187 940E0523 CALL lsl32
0189 8308 STD Y+0,R16
018A 8319 STD Y+1,R17
018B 832A STD Y+2,R18
018C 833B STD Y+3,R19
(0064) temp1=(unsigned int)temp;
018D 8168 LDD R22,Y+0
018E 8179 LDD R23,Y+1
(0065) temp2=(unsigned int)(temp/0x00010000);
018F 8028 LDD R2,Y+0
0190 8039 LDD R3,Y+1
0191 804A LDD R4,Y+2
0192 805B LDD R5,Y+3
0193 0152 MOVW R10,R4
(0066) CANIDM[i][3]=(Uchar)temp1;
0194 E084 LDI R24,4
0195 9F84 MUL R24,R20
0196 01F0 MOVW R30,R0
0197 EB87 LDI R24,0xB7
0198 E091 LDI R25,1
0199 0FE8 ADD R30,R24
019A 1FF9 ADC R31,R25
019B 8360 STD Z+0,R22
(0067) CANIDM[i][2]=(Uchar)(temp1>>8);
019C E084 LDI R24,4
019D 9F84 MUL R24,R20
019E 01F0 MOVW R30,R0
019F EB86 LDI R24,0xB6
01A0 E091 LDI R25,1
01A1 0FE8 ADD R30,R24
01A2 1FF9 ADC R31,R25
01A3 011B MOVW R2,R22
01A4 2C23 MOV R2,R3
01A5 2433 CLR R3
01A6 8220 STD Z+0,R2
(0068) CANIDM[i][1]=(Uchar)temp2;
01A7 E084 LDI R24,4
01A8 9F84 MUL R24,R20
01A9 01F0 MOVW R30,R0
01AA EB85 LDI R24,0xB5
01AB E091 LDI R25,1
01AC 0FE8 ADD R30,R24
01AD 1FF9 ADC R31,R25
01AE 82A0 STD Z+0,R10
(0069) CANIDM[i][0]=(Uchar)(temp2>>8);
01AF E084 LDI R24,4
01B0 9F84 MUL R24,R20
01B1 01F0 MOVW R30,R0
01B2 EB84 LDI R24,0xB4
01B3 E091 LDI R25,1
01B4 0FE8 ADD R30,R24
01B5 1FF9 ADC R31,R25
01B6 0115 MOVW R2,R10
01B7 2C23 MOV R2,R3
01B8 2433 CLR R3
01B9 8220 STD Z+0,R2
(0070) NOP();
01BA 0000 NOP
01BB 9543 INC R20
01BC 304F CPI R20,0xF
01BD F408 BCC 0x01BF
01BE CFBA RJMP 0x0179
(0071) }
(0072) //reset all MObs
(0073) for (i=0; i<15; i++)
01BF 2744 CLR R20
01C0 C023 RJMP 0x01E4
(0074) {
(0075) CANPAGE = (i<<4); //select MOb
01C1 2F84 MOV R24,R20
01C2 708F ANDI R24,0xF
01C3 9582 SWAP R24
01C4 938000ED STS 0xED,R24
(0076) CANCDMOB = 0; //disable MOb
01C6 2422 CLR R2
01C7 922000EF STS 0xEF,R2
(0077) CANSTMOB = 0; //clear status
01C9 922000EE STS 0xEE,R2
(0078) CANIDT1 = 0; //clear ID
01CB 922000F3 STS 0xF3,R2
(0079) CANIDT2 = 0;
01CD 922000F2 STS 0xF2,R2
(0080) CANIDT3 = 0;
01CF 922000F1 STS 0xF1,R2
(0081) CANIDT4 = 0;
01D1 922000F0 STS 0xF0,R2
(0082) CANIDM1 = 0; //clear mask
01D3 922000F7 STS 0xF7,R2
(0083) CANIDM2 = 0;
01D5 922000F6 STS 0xF6,R2
(0084) CANIDM3 = 0;
01D7 922000F5 STS 0xF5,R2
(0085) CANIDM4 = 0;
01D9 922000F4 STS 0xF4,R2
(0086) for (j=0; j<8; j++)
01DB 2766 CLR R22
01DC C004 RJMP 0x01E1
(0087) CANMSG = 0; //clear data
01DD 2422 CLR R2
01DE 922000FA STS 0xFA,R2
01E0 9563 INC R22
01E1 3068 CPI R22,0x8
01E2 F3D0 BCS 0x01DD
01E3 9543 INC R20
01E4 304F CPI R20,0xF
01E5 F2D8 BCS 0x01C1
(0088) }
(0089)
(0090) //bit timing -> datasheet page 260 (check table) 250Kbps
(0091) //CANBT1 = 0x02; //16Mhz,1Mbps
(0092) //CANBT2 = 0x04;
(0093) //CANBT3 = 0x13;
(0094)
(0095) //canbaud= EEPROM_read(0x0020);
(0096) CANBT1 = CanBaud[2][0];
01E6 E9EA LDI R30,0x9A
01E7 E0F0 LDI R31,0
01E8 91E4 LPM R30,0(Z)
01E9 93E000E2 STS 0xE2,R30
(0097) CANBT2 = CanBaud[2][1];
01EB E9EB LDI R30,0x9B
01EC E0F0 LDI R31,0
01ED 91E4 LPM R30,0(Z)
01EE 93E000E3 STS 0xE3,R30
(0098) CANBT3 = CanBaud[2][2];
01F0 E9EC LDI R30,0x9C
01F1 E0F0 LDI R31,0
01F2 91E4 LPM R30,0(Z)
01F3 93E000E4 STS 0xE4,R30
(0099)
(0100) //configure MObi
(0101) /******************************************************************/
(0102) for (i=0; i<15; i++)
01F5 2744 CLR R20
01F6 C05A RJMP 0x0251
(0103) {
(0104) CANPAGE = (i<<4); //MOb number 0
01F7 2F84 MOV R24,R20
01F8 708F ANDI R24,0xF
01F9 9582 SWAP R24
01FA 938000ED STS 0xED,R24
(0105) CANIDT1 = CANIDT[i][0]; //clear ID
01FC E084 LDI R24,4
01FD 9F84 MUL R24,R20
01FE 01F0 MOVW R30,R0
01FF E788 LDI R24,0x78
0200 E091 LDI R25,1
0201 0FE8 ADD R30,R24
0202 1FF9 ADC R31,R25
0203 8020 LDD R2,Z+0
0204 922000F3 STS 0xF3,R2
(0106) CANIDT2 = CANIDT[i][1];
0206 E084 LDI R24,4
0207 9F84 MUL R24,R20
0208 01F0 MOVW R30,R0
0209 E789 LDI R24,0x79
020A E091 LDI R25,1
020B 0FE8 ADD R30,R24
020C 1FF9 ADC R31,R25
020D 8020 LDD R2,Z+0
020E 922000F2 STS 0xF2,R2
(0107) CANIDT3 = CANIDT[i][2];
0210 E084 LDI R24,4
0211 9F84 MUL R24,R20
0212 01F0 MOVW R30,R0
0213 E78A LDI R24,0x7A
0214 E091 LDI R25,1
0215 0FE8 ADD R30,R24
0216 1FF9 ADC R31,R25
0217 8020 LDD R2,Z+0
0218 922000F1 STS 0xF1,R2
(0108) CANIDT4 = CANIDT[i][3];
021A E084 LDI R24,4
021B 9F84 MUL R24,R20
021C 01F0 MOVW R30,R0
021D E78B LDI R24,0x7B
021E E091 LDI R25,1
021F 0FE8 ADD R30,R24
0220 1FF9 ADC R31,R25
0221 8020 LDD R2,Z+0
0222 922000F0 STS 0xF0,R2
(0109) CANIDM1 = CANIDM[i][0]; //clear mask
0224 E084 LDI R24,4
0225 9F84 MUL R24,R20
0226 01F0 MOVW R30,R0
0227 EB84 LDI R24,0xB4
0228 E091 LDI R25,1
0229 0FE8 ADD R30,R24
022A 1FF9 ADC R31,R25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -