📄 can_test.lst
字号:
__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 + -