⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macan.lst

📁 工业开关量检测模块的原代码,带断线检测功能
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -