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