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

📄 can_test.lst

📁 MCU:ATMEGA8515 Frequence: 16M 描述:利用已有CAN TEST V1.0电路板进行调试, 可靠性测试已通过
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    0014 E5CF      LDI	R28,0x5F
    0015 E0D2      LDI	R29,2
    0016 BFCD      OUT	0x3D,R28
    0017 BFDE      OUT	0x3E,R29
    0018 51C0      SUBI	R28,0x10
    0019 40D0      SBCI	R29,0
    001A EA0A      LDI	R16,0xAA
    001B 8308      STD	Y+0,R16
    001C 2400      CLR	R0
    001D E6E6      LDI	R30,0x66
    001E E0F0      LDI	R31,0
    001F E010      LDI	R17,0
    0020 39E2      CPI	R30,0x92
    0021 07F1      CPC	R31,R17
    0022 F011      BEQ	0x0025
    0023 9201      ST	R0,Z+
    0024 CFFB      RJMP	0x0020
    0025 8300      STD	Z+0,R16
    0026 E2E2      LDI	R30,0x22
    0027 E0F0      LDI	R31,0
    0028 E6A0      LDI	R26,0x60
    0029 E0B0      LDI	R27,0
    002A E010      LDI	R17,0
    002B 32E8      CPI	R30,0x28
    002C 07F1      CPC	R31,R17
    002D F021      BEQ	0x0032
    002E 95C8      LPM
    002F 9631      ADIW	R30,1
    0030 920D      ST	R0,X+
    0031 CFF9      RJMP	0x002B
    0032 D209      RCALL	_main
_exit:
    0033 CFFF      RJMP	_exit
_KeyInput:
  KeyData              --> R20
  BitData              --> R20
    0034 D235      RCALL	push_gset1
    0035 2F40      MOV	R20,R16
FILE: E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\Timer.c
(0001) #include "iom8515v.h"
(0002) #include "macros.h"
(0003) #include "MAIN.h"
(0004) 
(0005) 
(0006) #pragma interrupt_handler Timer0OverInter:8
(0007) uint LightCount=0;
(0008) uchar KeyTime=0;
(0009) uchar Key1,Key2,Key3;
(0010) uchar KeyStatus=0;
(0011) /*****************************************
(0012)            读按键输入口子程序
(0013) ******************************************/
(0014) uchar  KeyInput(uchar BitData)
(0015) {
(0016)     uchar KeyData;
(0017) 	KeyData=(PIND &= (1 << BitData ));
    0036 E001      LDI	R16,1
    0037 2F14      MOV	R17,R20
    0038 D276      RCALL	lsl8
    0039 B220      IN	R2,0x10
    003A 2220      AND	R2,R16
    003B BA20      OUT	0x10,R2
    003C 2D42      MOV	R20,R2
(0018) 	if(KeyData == 0)
    003D 2022      TST	R2
    003E F411      BNE	0x0041
(0019) 	return(1);
    003F E001      LDI	R16,1
    0040 C001      RJMP	0x0042
(0020) 	else
(0021) 	return(0);
    0041 2700      CLR	R16
    0042 D22A      RCALL	pop_gset1
    0043 9508      RET
(0022) }
(0023) 
(0024) void Timer0Ini(void) 
(0025) {
(0026)    TCCR0 = 0x00; 
_Timer0Ini:
    0044 2422      CLR	R2
    0045 BE23      OUT	0x33,R2
(0027)    TCNT0 = 0xC2; //定时1ms
    0046 EC82      LDI	R24,0xC2
    0047 BF82      OUT	0x32,R24
(0028)    TCCR0 = 0x04; //256分频
    0048 E084      LDI	R24,4
    0049 BF83      OUT	0x33,R24
(0029)    TIMSK = 0x02; //开定时器0溢出中断	  
    004A E082      LDI	R24,2
    004B BF89      OUT	0x39,R24
    004C 9508      RET
_Timer0OverInter:
    004D 922A      ST	R2,-Y
    004E 923A      ST	R3,-Y
    004F 938A      ST	R24,-Y
    0050 939A      ST	R25,-Y
    0051 93EA      ST	R30,-Y
    0052 B62F      IN	R2,0x3F
    0053 922A      ST	R2,-Y
(0030) }
(0031) 
(0032) void Timer0OverInter(void)
(0033) {
(0034)    TCNT0 = 0xC2; //恢复定时器初值
    0054 EC82      LDI	R24,0xC2
    0055 BF82      OUT	0x32,R24
(0035)    KeyTime++;	 //按键间隔时间计数器累加
    0056 91800062  LDS	R24,KeyTime
    0058 5F8F      SUBI	R24,0xFF
    0059 93800062  STS	KeyTime,R24
(0036)    LightCount++;
    005B 91800060  LDS	R24,LightCount
    005D 91900061  LDS	R25,LightCount+1
    005F 9601      ADIW	R24,1
    0060 93900061  STS	LightCount+1,R25
    0062 93800060  STS	LightCount,R24
(0037)    if(KeyTime == 6)	   	  	   	//取6ms的时间间隔
    0064 91800062  LDS	R24,KeyTime
    0066 3086      CPI	R24,6
    0067 F4F1      BNE	0x0086
(0038)    {
(0039)       KeyTime=0;
    0068 2422      CLR	R2
    0069 92200062  STS	KeyTime,R2
(0040) 	  if((Key1 == 0) && (Key2 == 1) && (Key3 == 1))  
    006B 90200068  LDS	R2,Key1
    006D 2022      TST	R2
    006E F461      BNE	0x007B
    006F 91800067  LDS	R24,Key2
    0071 3081      CPI	R24,1
    0072 F441      BNE	0x007B
    0073 91800066  LDS	R24,Key3
    0075 3081      CPI	R24,1
    0076 F421      BNE	0x007B
(0041) 	  //如果按键的前后三次状态分别是0、1、1的话,则认为有键按下
(0042) 	  KeyStatus=1;		//置位状态标志								  
    0077 E081      LDI	R24,1
    0078 93800063  STS	KeyStatus,R24
    007A C003      RJMP	0x007E
(0043) 	  else 
(0044) 	  KeyStatus=0;        //否则清0状态标志
    007B 2422      CLR	R2
    007C 92200063  STS	KeyStatus,R2
(0045) 	  Key1=Key2;
    007E 90200067  LDS	R2,Key2
    0080 92200068  STS	Key1,R2
(0046) 	  Key2=Key3;
    0082 90200066  LDS	R2,Key3
    0084 92200067  STS	Key2,R2
(0047)    }
(0048)    
(0049)    /*************************************************
(0050)    if(UartOverTime>0)
(0051)    {
(0052) 	    UartOverTime--;
(0053) 	    if(UartOverTime==0)
(0054) 	    UartStatus=0;
(0055)    }
(0056)    *************************************************/
(0057)    
(0058)    if(LightCount == 1000)		//状态灯控制
    0086 91800060  LDS	R24,LightCount
    0088 91900061  LDS	R25,LightCount+1
    008A 3E88      CPI	R24,0xE8
    008B E0E3      LDI	R30,3
    008C 079E      CPC	R25,R30
    008D F451      BNE	0x0098
(0059)    {
(0060)       	PORTD ^= BIT(4);
    008E E180      LDI	R24,0x10
    008F B222      IN	R2,0x12
    0090 2628      EOR	R2,R24
    0091 BA22      OUT	0x12,R2
(0061)    		LightCount=0;
    0092 2422      CLR	R2
    0093 2433      CLR	R3
    0094 92300061  STS	LightCount+1,R3
    0096 92200060  STS	LightCount,R2
(0062)    } 
    0098 9029      LD	R2,Y+
    0099 BE2F      OUT	0x3F,R2
    009A 91E9      LD	R30,Y+
    009B 9199      LD	R25,Y+
    009C 9189      LD	R24,Y+
    009D 9039      LD	R3,Y+
    009E 9029      LD	R2,Y+
    009F 9518      RETI
FILE: E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\CAN.c
(0001) /******************************************
(0002) MCU:ATMEGA8515
(0003) Frequence: 8M
(0004) ******************************************/
(0005) #include "iom8515v.h"
(0006) #include "macros.h"
(0007) #include "MAIN.h"
(0008) #include "CAN.h"
(0009) #define startadd 0x7f00		//SJA1000的首地址
(0010) uchar CanMode[14];
(0011) uchar TransBuffer[13];
(0012) uchar RxBuffer[13];
(0013) uchar RevFlag;
(0014) #define FALSE 0
(0015) #define TRUE 1
(0016) #define MODE	0x00		//模式寄存器
(0017) #define CMR		0x01		//命令寄存器
(0018) #define SR		0x02		//状态寄存器
(0019) #define IR		0x03		//中断寄存器
(0020) #define IER		0x04		//中断使能寄存器
(0021) #define BTR0	0x06		//总线时序寄存器0
(0022) #define BTR1	0x07		//总线时序寄存器1
(0023) #define OCR		0x08		//输出控制寄存器 
(0024) #define TEST	0x09
(0025) #define ALC		0x0B		//仲裁丢失捕捉寄存器
(0026) #define ECC		0x0C		//错误代码捕捉寄存器
(0027) #define EWLR	0x0D		//错误报警限额寄存器
(0028) #define RXERR	0x0E		//RX错误计数寄存器
(0029) #define TXERR	0x0F		//TX错误计数寄存器
(0030) #define ACR0	0x10		//验收代码寄存器
(0031) #define ACR1	0x11
(0032) #define ACR2	0x12
(0033) #define ACR3	0x13
(0034) #define AMR0	0x14		//验收屏障寄存器
(0035) #define AMR1	0x15
(0036) #define AMR2	0x16
(0037) #define AMR3	0x17
(0038) ///////////////////////////
(0039) #define TXEFF   0x10
(0040) #define TXID0   0x11
(0041) #define TXID1   0x12
(0042) #define TXID2   0x13
(0043) #define TXID3   0x14
(0044) 
(0045) #define RXEFF   0x10
(0046) #define RXID0   0x11
(0047) #define RXID1   0x12
(0048) #define RXID2   0x13
(0049) #define RXID3   0x14
(0050) 
(0051) #define TXDATA0 0x15
(0052) #define TXDATA1 0x16
(0053) #define TXDATA2 0x17
(0054) #define TXDATA3 0x18
(0055) #define TXDATA4 0x19
(0056) #define TXDATA5 0x1A
(0057) #define TXDATA6 0x1B
(0058) #define TXDATA7 0x1C
(0059) 
(0060) #define RXDATA0 0x15
(0061) #define RXDATA1 0x16
(0062) #define RXDATA2 0x17
(0063) #define RXDATA3 0x18
(0064) #define RXDATA4 0x19
(0065) #define RXDATA5 0x1A
(0066) #define RXDATA6 0x1B
(0067) #define RXDATA7 0x1C
(0068) //////////////////////////
(0069) #define RMC		0x1D		//RX报文计数器
(0070) #define RBSA	0x1E		//RX缓冲器起始地址寄存器
(0071) #define CDR		0x1F		//时钟分频寄存器
(0072) //////////////////////////////////////////////////////////////////////
(0073) uchar *sja_address=(uchar *)startadd;
(0074) 
(0075) uchar read_sja(uchar addr) 				   //读SJA1000状态寄存器子程序
(0076) {
(0077) 	sja_address=(uchar *)startadd;
_read_sja:
  addr                 --> R16
    00A0 E080      LDI	R24,0
    00A1 E79F      LDI	R25,0x7F
    00A2 93900065  STS	sja_address+1,R25
    00A4 93800064  STS	sja_address,R24
(0078) 	sja_address=sja_address+addr;
    00A6 2E40      MOV	R4,R16
    00A7 2455      CLR	R5
    00A8 0E48      ADD	R4,R24
    00A9 1E59      ADC	R5,R25
    00AA 92500065  STS	sja_address+1,R5
    00AC 92400064  STS	sja_address,R4
(0079) 	return (*(sja_address));
    00AE 01F2      MOVW	R30,R4
    00AF 8100      LDD	R16,Z+0
    00B0 9508      RET
(0080) }
(0081) 
(0082) void write_sja(uchar addr,uchar val) 	   //写SJA1000控制寄存器子程序
(0083) {
(0084) 	sja_address=(uchar *)startadd;
_write_sja:
  val                  --> R18
  addr                 --> R16
    00B1 E080      LDI	R24,0
    00B2 E79F      LDI	R25,0x7F
    00B3 93900065  STS	sja_address+1,R25
    00B5 93800064  STS	sja_address,R24
(0085) 	sja_address=sja_address+addr;
    00B7 2E40      MOV	R4,R16
    00B8 2455      CLR	R5
    00B9 0E48      ADD	R4,R24
    00BA 1E59      ADC	R5,R25
    00BB 92500065  STS	sja_address+1,R5
    00BD 92400064  STS	sja_address,R4
(0086) 	*(sja_address)=val;
    00BF 01F2      MOVW	R30,R4
    00C0 8320      STD	Z+0,R18
    00C1 9508      RET
_Init_CAN:
  temp                 --> Y+1
  k                    --> R20
    00C2 D1A7      RCALL	push_gset1
(0087) }
(0088) 
(0089) /*************************************************
(0090)             初始化SJA1000主控制器子函数
(0091) *************************************************/
(0092) void Init_CAN(void)                
(0093) {
(0094) 	uchar temp;
(0095) 	uint k ; 
(0096) 	CLI();
    00C3 94F8      BCLR	7
(0097) 	write_sja(MODE,0x09);
    00C4 E029      LDI	R18,0x9
    00C5 2700      CLR	R16
    00C6 DFEA      RCALL	_write_sja
(0098) 	read_sja(IR);		 	   	    //读取CAN的中断标识
    00C7 E003      LDI	R16,3
    00C8 DFD7      RCALL	_read_sja
    00C9 C003      RJMP	0x00CD
(0099) 	while(!(read_sja(MODE)&0x01))	//检测SJA1000是否达到复位工作模式
(0100) 	{
(0101) 	   write_sja(MODE,0x01);		//进入复位工作模式
    00CA E021      LDI	R18,1
    00CB 2700      CLR	R16
    00CC DFE4      RCALL	_write_sja
    00CD 2700      CLR	R16
    00CE DFD1      RCALL	_read_sja
    00CF FF00      SBRS	R16,0
    00D0 CFF9      RJMP	0x00CA
(0102) 	}
(0103) 	
(0104) 	for(k=0;k<6;k++); 				//延时约5us
    00D1 2744      CLR	R20
    00D2 2755      CLR	R21
    00D3 C002      RJMP	0x00D6
    00D4 5F4F      SUBI	R20,0xFF
    00D5 4F5F      SBCI	R21,0xFF
    00D6 3046      CPI	R20,6
    00D7 E0E0      LDI	R30,0
    00D8 075E      CPC	R21,R30
    00D9 F3D0      BCS	0x00D4
(0105) 	write_sja(CDR,0xC8);            //PeliCAN 模式,禁能CLOCKOUT引脚
    00DA EC28      LDI	R18,0xC8
    00DB E10F      LDI	R16,0x1F
    00DC DFD4      RCALL	_write_sja
(0106) 	for(k=0;k<6;k++); 				//延时约5us
    00DD 2744      CLR	R20
    00DE 2755      CLR	R21
    00DF C002      RJMP	0x00E2
    00E0 5F4F      SUBI	R20,0xFF
    00E1 4F5F      SBCI	R21,0xFF
    00E2 3046      CPI	R20,6
    00E3 E0E0      LDI	R30,0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -