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