📄 can_test.lst
字号:
(0244) }
(0245) }
(0246) }
(0247) return result;
01D8 2F06 MOV R16,R22
01D9 962D ADIW R28,0xD
01DA D085 RCALL pop_gset4
01DB 9508 RET
FILE: E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\IO.c
(0001) #include "iom8515v.h"
(0002) #include "macros.h"
(0003) #include "MAIN.h"
(0004)
(0005)
(0006) /*****************************************
(0007) IO初始化子程序
(0008) ******************************************/
(0009) void IOIni(void)
(0010) {
(0011) DDRA = 0xFF ; //IO口初始化
_IOIni:
01DC EF8F LDI R24,0xFF
01DD BB8A OUT 0x1A,R24
(0012) PORTA = 0xFF ;
01DE BB8B OUT 0x1B,R24
(0013) DDRB = 0x00 ;
01DF 2422 CLR R2
01E0 BA27 OUT 0x17,R2
(0014) PORTB = 0xFF ;
01E1 BB88 OUT 0x18,R24
(0015) DDRC = 0xFF ;
01E2 BB84 OUT 0x14,R24
(0016) PORTC = 0xFF ;
01E3 BB85 OUT 0x15,R24
(0017) DDRD = 0xF0 ;
01E4 EF80 LDI R24,0xF0
01E5 BB81 OUT 0x11,R24
(0018) PORTD= 0x00 ;
01E6 BA22 OUT 0x12,R2
(0019) MCUCR = 0x82; //允许外部并行扩展接口,设置外部中断为下降沿触发
01E7 E882 LDI R24,0x82
01E8 BF85 OUT 0x35,R24
(0020) GICR = 0x40; //外部中断0使能
01E9 E480 LDI R24,0x40
01EA BF8B OUT 0x3B,R24
01EB 9508 RET
_Inter0:
can_status --> R22
reg --> R20
CompCount --> R22
01EC D094 RCALL push_lset
01ED D07A RCALL push_gset2
FILE: E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\MAIN.c
(0001) /*****************************************
(0002) 测试版本
(0003) MCU:ATMEGA8515
(0004) Frequence: 16M
(0005) 描述:利用已有CAN TEST V1.0电路板进行调试,
(0006) 可靠性测试已通过,并发现8515外部中断不稳定
(0007) 的原因是没有在INT0脚加上拉电阻,加上后已能
(0008) 够稳定地运行
(0009) 调试过程中发现SJA1000的首地址设置有误,改过
(0010) 后,当CAN发送数据时,程序能进入中断了,但发现
(0011) 中断是由出错报警中断引起的,估计与波特率设置
(0012) 有关。
(0013) 通过修改CDR的参数,以及更换16M晶振,现在已能
(0014) 正常地收发送数据了!!!!!!!!!!!!!
(0015) 日期:2006.3.11
(0016) *****************************************/
(0017) #include "iom8515v.h"
(0018) #include "macros.h"
(0019) #include "MAIN.h"
(0020) #include "Timer.h"
(0021) #include "IO.h"
(0022) #include "CAN.h"
(0023) #pragma interrupt_handler Inter0:2
(0024) void Inter0(void)
(0025) {
(0026) uchar reg;
(0027) uchar CompCount;
(0028) uchar can_status;
(0029) CLI(); //关CPU中断
01EE 94F8 BCLR 7
(0030) RevFlag=1;
01EF E081 LDI R24,1
01F0 93800077 STS RevFlag,R24
(0031) reg=read_sja(4); //保存SJA1000的中断允许状态
01F2 E004 LDI R16,4
01F3 DEAC RCALL _read_sja
01F4 2F40 MOV R20,R16
(0032) write_sja(4,0x00); //重设中断允许状态为不允许任何中断
01F5 2722 CLR R18
01F6 E004 LDI R16,4
01F7 DEB9 RCALL _write_sja
(0033) can_status=Receive(); //接收消息
01F8 DF90 RCALL _Receive
01F9 2F60 MOV R22,R16
(0034) if(can_status == 0x01)
01FA 3001 CPI R16,1
01FB F4C9 BNE 0x0215
(0035) {
(0036) for(CompCount=5;CompCount<13;CompCount++) //检查接收到的数据是否正确
01FC E065 LDI R22,5
01FD C014 RJMP 0x0212
(0037) {
(0038) if(RxBuffer[CompCount] != TransBuffer[CompCount])
01FE E788 LDI R24,0x78
01FF E090 LDI R25,0
0200 2FE6 MOV R30,R22
0201 27FF CLR R31
0202 0FE8 ADD R30,R24
0203 1FF9 ADC R31,R25
0204 8020 LDD R2,Z+0
0205 E885 LDI R24,0x85
0206 E090 LDI R25,0
0207 2FE6 MOV R30,R22
0208 27FF CLR R31
0209 0FE8 ADD R30,R24
020A 1FF9 ADC R31,R25
020B 8030 LDD R3,Z+0
020C 1432 CP R3,R2
020D F019 BEQ 0x0211
(0039) {
(0040) RevFlag &= 0x00; //发现有不一致时,则清0标志位
020E 2422 CLR R2
020F 92200077 STS RevFlag,R2
0211 9563 INC R22
0212 306D CPI R22,0xD
0213 F350 BCS 0x01FE
(0041) }
(0042) }
(0043) }
0214 C001 RJMP 0x0216
(0044) else
(0045) Init_CAN(); //如果不是正确接收,则重新初始化
0215 DEAC RCALL _Init_CAN
(0046) write_sja(4,reg); //重新写回中断允许模式
0216 2F24 MOV R18,R20
0217 E004 LDI R16,4
0218 DE98 RCALL _write_sja
(0047) SEI();
0219 9478 BSET 7
021A D043 RCALL pop_gset2
021B D07C RCALL pop_lset
021C 9518 RETI
(0048) }
(0049) //////////////////////////////////////////////////////////////////////////
(0050)
(0051) void Status_lighting(uchar status)
(0052) {
(0053) if(status == 1)
_Status_lighting:
status --> R16
021D 3001 CPI R16,1
021E F411 BNE 0x0221
(0054) PORTD |= BIT(5);
021F 9A95 SBI 0x12,5
0220 C003 RJMP 0x0224
(0055) else if(status == 0)
0221 2300 TST R16
0222 F409 BNE 0x0224
(0056) PORTD &=~ BIT(5);
0223 9895 CBI 0x12,5
0224 9508 RET
(0057) }
(0058)
(0059) void delay_1ms( void )
(0060) {
(0061) uint k ;
(0062) for ( k = 0 ; k < ( 8*142-2 ) ; k++ ) // 定时1ms公式:xtal*142-2
_delay_1ms:
k --> R16
0225 2700 CLR R16
0226 2711 CLR R17
0227 C002 RJMP 0x022A
0228 5F0F SUBI R16,0xFF
0229 4F1F SBCI R17,0xFF
022A 360E CPI R16,0x6E
022B E0E4 LDI R30,4
022C 071E CPC R17,R30
022D F3D0 BCS 0x0228
022E 9508 RET
_Delay:
p --> R20
n --> R22
022F D038 RCALL push_gset2
0230 01B8 MOVW R22,R16
(0063) ;
(0064) }
(0065) void Delay (uint n)
(0066) {
(0067) uint p ;
(0068) for( p = 0 ; p < n ;p++ )
0231 2744 CLR R20
0232 2755 CLR R21
0233 C003 RJMP 0x0237
(0069) {
(0070) delay_1ms() ;
0234 DFF0 RCALL _delay_1ms
0235 5F4F SUBI R20,0xFF
0236 4F5F SBCI R21,0xFF
0237 1746 CP R20,R22
0238 0757 CPC R21,R23
0239 F3D0 BCS 0x0234
023A D023 RCALL pop_gset2
023B 9508 RET
(0071) }
(0072) }
(0073)
(0074) void main(void)
(0075) {
(0076) uchar lp_count;
(0077) CLI(); //关中断
_main:
lp_count --> Y+1
023C 94F8 BCLR 7
(0078) IOIni(); //IO口初始化
023D DF9E RCALL _IOIni
(0079) Timer0Ini();
023E DE05 RCALL _Timer0Ini
(0080) Delay(1000);
023F EE08 LDI R16,0xE8
0240 E013 LDI R17,3
0241 DFED RCALL _Delay
(0081) Init_CAN(); //CAN初始化
0242 DE7F RCALL _Init_CAN
(0082) SEI();
0243 9478 BSET 7
0244 C017 RJMP 0x025C
(0083) while(1)
(0084) {
(0085) Key3=KeyInput(3);
0245 E003 LDI R16,3
0246 DDED RCALL _KeyInput
0247 93000066 STS Key3,R16
(0086) if(KeyStatus == 1) //按键按下
0249 91800063 LDS R24,KeyStatus
024B 3081 CPI R24,1
024C F421 BNE 0x0251
(0087) {
(0088) KeyStatus=0;
024D 2422 CLR R2
024E 92200063 STS KeyStatus,R2
(0089) CanTransmit(); //发送数据
0250 DED2 RCALL _CanTransmit
(0090) }
(0091)
(0092) if(RevFlag == 1) //如果正确接收到数据
0251 91800077 LDS R24,RevFlag
0253 3081 CPI R24,1
0254 F439 BNE 0x025C
(0093) {
(0094) RevFlag=0;
0255 2422 CLR R2
0256 92200077 STS RevFlag,R2
(0095) PORTD ^= BIT(5);
FILE: <library>
0258 E280 LDI R24,0x20
0259 B222 IN R2,0x12
025A 2628 EOR R2,R24
025B BA22 OUT 0x12,R2
025C CFE8 RJMP 0x0245
025D 9508 RET
pop_gset2:
025E E0E2 LDI R30,2
025F C00E RJMP pop
pop_gset4:
0260 E0E8 LDI R30,0x8
0261 C00C RJMP pop
push_gset5:
0262 92FA ST R15,-Y
0263 92EA ST R14,-Y
push_gset4:
0264 92DA ST R13,-Y
0265 92CA ST R12,-Y
push_gset3:
0266 92BA ST R11,-Y
0267 92AA ST R10,-Y
push_gset2:
0268 937A ST R23,-Y
0269 936A ST R22,-Y
push_gset1:
026A 935A ST R21,-Y
026B 934A ST R20,-Y
026C 9508 RET
pop_gset1:
026D E0E1 LDI R30,1
pop:
026E 9149 LD R20,Y+
026F 9159 LD R21,Y+
0270 FDE0 SBRC R30,0
0271 9508 RET
0272 9169 LD R22,Y+
0273 9179 LD R23,Y+
0274 FDE1 SBRC R30,1
0275 9508 RET
0276 90A9 LD R10,Y+
0277 90B9 LD R11,Y+
0278 FDE2 SBRC R30,2
0279 9508 RET
027A 90C9 LD R12,Y+
027B 90D9 LD R13,Y+
027C FDE3 SBRC R30,3
027D 9508 RET
027E 90E9 LD R14,Y+
027F 90F9 LD R15,Y+
0280 9508 RET
push_lset:
0281 93FA ST R31,-Y
0282 93EA ST R30,-Y
0283 93BA ST R27,-Y
0284 93AA ST R26,-Y
0285 939A ST R25,-Y
0286 938A ST R24,-Y
0287 933A ST R19,-Y
0288 932A ST R18,-Y
0289 931A ST R17,-Y
028A 930A ST R16,-Y
028B 929A ST R9,-Y
028C 928A ST R8,-Y
028D 927A ST R7,-Y
028E 926A ST R6,-Y
028F 925A ST R5,-Y
0290 924A ST R4,-Y
0291 923A ST R3,-Y
0292 922A ST R2,-Y
0293 921A ST R1,-Y
0294 920A ST R0,-Y
0295 B60F IN R0,0x3F
0296 920A ST R0,-Y
0297 9508 RET
pop_lset:
0298 9009 LD R0,Y+
0299 BE0F OUT 0x3F,R0
029A 9009 LD R0,Y+
029B 9019 LD R1,Y+
029C 9029 LD R2,Y+
029D 9039 LD R3,Y+
029E 9049 LD R4,Y+
029F 9059 LD R5,Y+
02A0 9069 LD R6,Y+
02A1 9079 LD R7,Y+
02A2 9089 LD R8,Y+
02A3 9099 LD R9,Y+
02A4 9109 LD R16,Y+
02A5 9119 LD R17,Y+
02A6 9129 LD R18,Y+
02A7 9139 LD R19,Y+
02A8 9189 LD R24,Y+
02A9 9199 LD R25,Y+
02AA 91A9 LD R26,Y+
02AB 91B9 LD R27,Y+
02AC 91E9 LD R30,Y+
02AD 91F9 LD R31,Y+
02AE 9508 RET
lsl8:
02AF 2311 TST R17
02B0 F019 BEQ 0x02B4
02B1 0F00 LSL R16
02B2 951A DEC R17
02B3 CFFB RJMP lsl8
02B4 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -