📄 macan.lst
字号:
__text_start:
__start:
00F7 EFCF LDI R28,0xFF
00F8 E1D0 LDI R29,0x10
00F9 BFCD OUT 0x3D,R28
00FA BFDE OUT 0x3E,R29
00FB 52C0 SUBI R28,0x20
00FC 40D0 SBCI R29,0
00FD EA0A LDI R16,0xAA
00FE 8308 STD Y+0,R16
00FF 2400 CLR R0
0100 EFE0 LDI R30,0xF0
0101 E0F1 LDI R31,1
0102 E013 LDI R17,3
0103 3DE5 CPI R30,0xD5
0104 07F1 CPC R31,R17
0105 F011 BEQ 0x0108
0106 9201 ST R0,Z+
0107 CFFB RJMP 0x0103
0108 8300 STD Z+0,R16
0109 EFEE LDI R30,0xFE
010A E0F0 LDI R31,0
010B E0A0 LDI R26,0
010C E0B1 LDI R27,1
010D E011 LDI R17,1
010E 3EEE CPI R30,0xEE
010F 07F1 CPC R31,R17
0110 F021 BEQ 0x0115
0111 95C8 LPM
0112 9631 ADIW R30,1
0113 920D ST R0,X+
0114 CFF9 RJMP 0x010E
0115 940E09B9 CALL _main
_exit:
0117 CFFF RJMP _exit
FILE: D:\报警系统设计资料\报警系统软件\测量模块基于CAN的系统网程序\电流CAN网\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,Pass_Flag;
(0016) unsigned char canbaud;
(0017) extern VCI_CAN_OBJ rece_data[3];
(0018)
(0019) const Uchar CanBaud[6][3]={{0x02,0x04,0x13},{0x06,0x04,0x13},{0x0E,0x04,0x13},{0x12,0x04,0x13},{0x1E,0x04,0x13},{0x26,0x04,0x13}};
(0020) //波特率数组
(0021)
(0022) //15个MOB的ID和MID
(0023) unsigned long CANMOBID[15]={0x10000000,0x20000000,0x30000000,0x40000000,0x50000000,0x60000000,0x01000000,0x01000001,0x0200ff00,0x12000001,0x01000002,0x01000003,0x01000004,0x01000005,0x1300ff01};
(0024) unsigned long CANMOBMD[15]={0x0000ffff,0x0000ffff,0x0000ffff,0x00ff00ff,0x00ff00ff,0x00ff00ff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff};
(0025) unsigned char CANIDT[15][4]={0};
(0026) unsigned char CANIDM[15][4]={0};
(0027) Uchar counterTemp;
(0028) extern unsigned char send_count;
(0029)
(0030) void can_init (void) //CAN初始化函数
(0031) {
(0032) canMob_init();
_can_init:
0118 D001 RCALL _canMob_init
0119 9508 RET
_canMob_init:
temp2 --> R10
temp1 --> R22
temp --> Y+0
j --> R22
i --> R20
011A 940E132A CALL push_gset3
011C 9724 SBIW R28,4
(0033) }
(0034)
(0035)
(0036) void canMob_init (void) //MOB初始化函数
(0037) {
(0038) unsigned char i,j;
(0039) unsigned long temp;
(0040) unsigned int temp1,temp2;
(0041)
(0042) CLI(); //关中断
011D 94F8 BCLR 7
(0043) //DDRD=(1<<PD5)|(0<<PD6); //TXCAN, RXCNA
(0044) DDRD|=0x20; //CAN管脚初始化
011E 9A55 SBI 0x0A,5
(0045) DDRD&=0xBF;
011F B18A IN R24,0x0A
0120 7B8F ANDI R24,0xBF
0121 B98A OUT 0x0A,R24
(0046) CANGCON |= (1<<SWRES); //reset CAN interface
0122 918000D8 LDS R24,0xD8
0124 6081 ORI R24,1
0125 938000D8 STS 0xD8,R24
(0047)
(0048) Pass_Flag = 0x00;
0127 2422 CLR R2
0128 92200357 STS Pass_Flag,R2
(0049) //CANMOBID[2]=(unsigned long)(SELFID<<8)|CANMOBID[2];
(0050) for(i=0;i<6;i++) //15个邮箱初始化
012A 2744 CLR R20
012B C048 RJMP 0x0174
(0051) {
(0052) temp=CANMOBID[i]<<3; //ID初始化
012C E084 LDI R24,4
012D 9F84 MUL R24,R20
012E 01F0 MOVW R30,R0
012F E080 LDI R24,0
0130 E091 LDI R25,1
0131 0FE8 ADD R30,R24
0132 1FF9 ADC R31,R25
0133 8100 LDD R16,Z+0
0134 8111 LDD R17,Z+1
0135 8122 LDD R18,Z+2
0136 8133 LDD R19,Z+3
0137 E083 LDI R24,3
0138 E090 LDI R25,0
0139 938A ST R24,-Y
013A 940E13BC CALL lsl32
013C 8308 STD Y+0,R16
013D 8319 STD Y+1,R17
013E 832A STD Y+2,R18
013F 833B STD Y+3,R19
(0053) temp1=(unsigned int)temp;
0140 8168 LDD R22,Y+0
0141 8179 LDD R23,Y+1
(0054) temp2=(unsigned int)(temp/0x00010000);
0142 8028 LDD R2,Y+0
0143 8039 LDD R3,Y+1
0144 804A LDD R4,Y+2
0145 805B LDD R5,Y+3
0146 0152 MOVW R10,R4
(0055) CANIDT[i][3]=(Uchar)temp1;
0147 E084 LDI R24,4
0148 9F84 MUL R24,R20
0149 01F0 MOVW R30,R0
014A E78B LDI R24,0x7B
014B E091 LDI R25,1
014C 0FE8 ADD R30,R24
014D 1FF9 ADC R31,R25
014E 8360 STD Z+0,R22
(0056) CANIDT[i][2]=(Uchar)(temp1>>8);
014F E084 LDI R24,4
0150 9F84 MUL R24,R20
0151 01F0 MOVW R30,R0
0152 E78A LDI R24,0x7A
0153 E091 LDI R25,1
0154 0FE8 ADD R30,R24
0155 1FF9 ADC R31,R25
0156 011B MOVW R2,R22
0157 2C23 MOV R2,R3
0158 2433 CLR R3
0159 8220 STD Z+0,R2
(0057) CANIDT[i][1]=(Uchar)temp2;
015A E084 LDI R24,4
015B 9F84 MUL R24,R20
015C 01F0 MOVW R30,R0
015D E789 LDI R24,0x79
015E E091 LDI R25,1
015F 0FE8 ADD R30,R24
0160 1FF9 ADC R31,R25
0161 82A0 STD Z+0,R10
(0058) CANIDT[i][0]=(Uchar)(temp2>>8);
0162 E084 LDI R24,4
0163 9F84 MUL R24,R20
0164 01F0 MOVW R30,R0
0165 E788 LDI R24,0x78
0166 E091 LDI R25,1
0167 0FE8 ADD R30,R24
0168 1FF9 ADC R31,R25
0169 0115 MOVW R2,R10
016A 2C23 MOV R2,R3
016B 2433 CLR R3
016C 8220 STD Z+0,R2
(0059) Pass_Flag = Pass_Flag + 1;
016D 91800357 LDS R24,Pass_Flag
016F 5F8F SUBI R24,0xFF
0170 93800357 STS Pass_Flag,R24
(0060) NOP();
0172 0000 NOP
0173 9543 INC R20
0174 3046 CPI R20,6
0175 F408 BCC 0x0177
0176 CFB5 RJMP 0x012C
(0061) }
(0062) if(Pass_Flag!=0x06)
0177 91800357 LDS R24,Pass_Flag
0179 3086 CPI R24,6
017A F011 BEQ 0x017D
(0063) RESET;
017B 940C0000 JMP 0x0
(0064) WDR();
017D 95A8 WDR
(0065)
(0066) Pass_Flag = 0x00;
017E 2422 CLR R2
017F 92200357 STS Pass_Flag,R2
(0067) for(i=0;i<6;i++)
0181 2744 CLR R20
0182 C048 RJMP 0x01CB
(0068) {
(0069) temp=CANMOBMD[i]<<3;
0183 E084 LDI R24,4
0184 9F84 MUL R24,R20
0185 01F0 MOVW R30,R0
0186 E38C LDI R24,0x3C
0187 E091 LDI R25,1
0188 0FE8 ADD R30,R24
0189 1FF9 ADC R31,R25
018A 8100 LDD R16,Z+0
018B 8111 LDD R17,Z+1
018C 8122 LDD R18,Z+2
018D 8133 LDD R19,Z+3
018E E083 LDI R24,3
018F E090 LDI R25,0
0190 938A ST R24,-Y
0191 940E13BC CALL lsl32
0193 8308 STD Y+0,R16
0194 8319 STD Y+1,R17
0195 832A STD Y+2,R18
0196 833B STD Y+3,R19
(0070) temp1=(unsigned int)temp; //低16位
0197 8168 LDD R22,Y+0
0198 8179 LDD R23,Y+1
(0071) temp2=(unsigned int)(temp/0x00010000); //高16位
0199 8028 LDD R2,Y+0
019A 8039 LDD R3,Y+1
019B 804A LDD R4,Y+2
019C 805B LDD R5,Y+3
019D 0152 MOVW R10,R4
(0072) CANIDM[i][3]=(Uchar)temp1;
019E E084 LDI R24,4
019F 9F84 MUL R24,R20
01A0 01F0 MOVW R30,R0
01A1 EB87 LDI R24,0xB7
01A2 E091 LDI R25,1
01A3 0FE8 ADD R30,R24
01A4 1FF9 ADC R31,R25
01A5 8360 STD Z+0,R22
(0073) CANIDM[i][2]=(Uchar)(temp1>>8);
01A6 E084 LDI R24,4
01A7 9F84 MUL R24,R20
01A8 01F0 MOVW R30,R0
01A9 EB86 LDI R24,0xB6
01AA E091 LDI R25,1
01AB 0FE8 ADD R30,R24
01AC 1FF9 ADC R31,R25
01AD 011B MOVW R2,R22
01AE 2C23 MOV R2,R3
01AF 2433 CLR R3
01B0 8220 STD Z+0,R2
(0074) CANIDM[i][1]=(Uchar)temp2;
01B1 E084 LDI R24,4
01B2 9F84 MUL R24,R20
01B3 01F0 MOVW R30,R0
01B4 EB85 LDI R24,0xB5
01B5 E091 LDI R25,1
01B6 0FE8 ADD R30,R24
01B7 1FF9 ADC R31,R25
01B8 82A0 STD Z+0,R10
(0075) CANIDM[i][0]=(Uchar)(temp2>>8);
01B9 E084 LDI R24,4
01BA 9F84 MUL R24,R20
01BB 01F0 MOVW R30,R0
01BC EB84 LDI R24,0xB4
01BD E091 LDI R25,1
01BE 0FE8 ADD R30,R24
01BF 1FF9 ADC R31,R25
01C0 0115 MOVW R2,R10
01C1 2C23 MOV R2,R3
01C2 2433 CLR R3
01C3 8220 STD Z+0,R2
(0076) Pass_Flag = Pass_Flag + 1;
01C4 91800357 LDS R24,Pass_Flag
01C6 5F8F SUBI R24,0xFF
01C7 93800357 STS Pass_Flag,R24
(0077) NOP();
01C9 0000 NOP
01CA 9543 INC R20
01CB 3046 CPI R20,6
01CC F408 BCC 0x01CE
01CD CFB5 RJMP 0x0183
(0078) }
(0079) if(Pass_Flag!=0x06)
01CE 91800357 LDS R24,Pass_Flag
01D0 3086 CPI R24,6
01D1 F011 BEQ 0x01D4
(0080) RESET;
01D2 940C0000 JMP 0x0
(0081) //reset all MObs
(0082)
(0083) Pass_Flag = 0x00;
01D4 2422 CLR R2
01D5 92200357 STS Pass_Flag,R2
(0084) for (i=0; i<15; i++)
01D7 2744 CLR R20
01D8 C02A RJMP 0x0203
(0085) {
(0086) CANPAGE = (i<<4); //select MOb
01D9 2F84 MOV R24,R20
01DA 708F ANDI R24,0xF
01DB 9582 SWAP R24
01DC EEED LDI R30,0xED
01DD E0F0 LDI R31,0
01DE 8380 STD Z+0,R24
(0087) CANCDMOB = 0; //disable MOb
01DF 2422 CLR R2
01E0 EEEF LDI R30,0xEF
01E1 8220 STD Z+0,R2
(0088) CANSTMOB = 0; //clear status
01E2 EEEE LDI R30,0xEE
01E3 8220 STD Z+0,R2
(0089) CANIDT1 = 0; //clear ID
01E4 EFE3 LDI R30,0xF3
01E5 8220 STD Z+0,R2
(0090) CANIDT2 = 0;
01E6 EFE2 LDI R30,0xF2
01E7 8220 STD Z+0,R2
(0091) CANIDT3 = 0;
01E8 EFE1 LDI R30,0xF1
01E9 8220 STD Z+0,R2
(0092) CANIDT4 = 0;
01EA EFE0 LDI R30,0xF0
01EB 8220 STD Z+0,R2
(0093) CANIDM1 = 0; //clear mask
01EC EFE7 LDI R30,0xF7
01ED 8220 STD Z+0,R2
(0094) CANIDM2 = 0;
01EE EFE6 LDI R30,0xF6
01EF 8220 STD Z+0,R2
(0095) CANIDM3 = 0;
01F0 EFE5 LDI R30,0xF5
01F1 8220 STD Z+0,R2
(0096) CANIDM4 = 0;
01F2 EFE4 LDI R30,0xF4
01F3 8220 STD Z+0,R2
(0097) for (j=0; j<8; j++)
01F4 2766 CLR R22
01F5 C005 RJMP 0x01FB
(0098) CANMSG = 0; //clear data
01F6 2422 CLR R2
01F7 EFEA LDI R30,0xFA
01F8 E0F0 LDI R31,0
01F9 8220 STD Z+0,R2
01FA 9563 INC R22
01FB 3068 CPI R22,0x8
01FC F3C8 BCS 0x01F6
(0099)
(0100) Pass_Flag = Pass_Flag + 1;
01FD 91800357 LDS R24,Pass_Flag
01FF 5F8F SUBI R24,0xFF
0200 93800357 STS Pass_Flag,R24
0202 9543 INC R20
0203 304F CPI R20,0xF
0204 F408 BCC 0x0206
0205 CFD3 RJMP 0x01D9
(0101) }
(0102) if(Pass_Flag!=0x0f)
0206 91800357 LDS R24,Pass_Flag
0208 308F CPI R24,0xF
0209 F011 BEQ 0x020C
(0103) RESET;
020A 940C0000 JMP 0x0
(0104)
(0105) WDR();
020C 95A8 WDR
(0106) CANBT1 = CanBaud[2][0];
020D E9E2 LDI R30,0x92
020E E0F0 LDI R31,0
020F 91E4 LPM R30,0(Z)
0210 EEA2 LDI R26,0xE2
0211 E0B0 LDI R27,0
0212 93EC ST R30,0(X)
(0107) CANBT2 = CanBaud[2][1];
0213 E9E3 LDI R30,0x93
0214 E0F0 LDI R31,0
0215 91E4 LPM R30,0(Z)
0216 EEA3 LDI R26,0xE3
0217 93EC ST R30,0(X)
(0108) CANBT3 = CanBaud[2][2];
0218 E9E4 LDI R30,0x94
0219 E0F0 LDI R31,0
021A 91E4 LPM R30,0(Z)
021B EEA4 LDI R26,0xE4
021C 93EC ST R30,0(X)
(0109)
(0110) //configure MObi
(0111) /******************************************************************/
(0112)
(0113) Pass_Flag = 0x00;
021D 2422 CLR R2
021E 92200357 STS Pass_Flag,R2
(0114) for (i=0; i<3; i++)
0220 2744 CLR R20
0221 C068 RJMP 0x028A
(0115) {
(0116) CANPAGE = (i<<4); //MOb 0,1,2设置为发送模式
0222 2F84 MOV R24,R20
0223 708F ANDI R24,0xF
0224 9582 SWAP R24
0225 EEED LDI R30,0xED
0226 E0F0 LDI R31,0
0227 8380 STD Z+0,R24
(0117) CANIDT1 = CANIDT[i][0]; //初始化 ID
0228 E084 LDI R24,4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -