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

📄 main.s

📁 MCU:ATMEGA8515 Frequence: 16M 描述:利用已有CAN TEST V1.0电路板进行调试, 可靠性测试已通过
💻 S
字号:
	.module MAIN.c
	.area vector(rom, abs)
	.org 2
	rjmp _Inter0
	.area text(rom, con, rel)
	.dbfile E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\MAIN.c
	.dbfunc e Inter0 _Inter0 fV
;     can_status -> R22
;            reg -> R20
;      CompCount -> R22
	.even
_Inter0::
	rcall push_lset
	rcall push_gset2
	.dbline -1
	.dbline 25
; /*****************************************
;                 测试版本
; MCU:ATMEGA8515
; Frequence: 16M
; 描述:利用已有CAN TEST V1.0电路板进行调试,
; 可靠性测试已通过,并发现8515外部中断不稳定
; 的原因是没有在INT0脚加上拉电阻,加上后已能
; 够稳定地运行
; 调试过程中发现SJA1000的首地址设置有误,改过
; 后,当CAN发送数据时,程序能进入中断了,但发现
; 中断是由出错报警中断引起的,估计与波特率设置
; 有关。
; 通过修改CDR的参数,以及更换16M晶振,现在已能
; 正常地收发送数据了!!!!!!!!!!!!!
; 日期:2006.3.11
; *****************************************/
; #include "iom8515v.h"
; #include "macros.h"
; #include "MAIN.h"
; #include "Timer.h"
; #include "IO.h"
; #include "CAN.h"
; #pragma interrupt_handler Inter0:2
; void Inter0(void)
; {
	.dbline 29
;    uchar reg;
;    uchar CompCount;
;    uchar can_status;
;    CLI();						 //关CPU中断
	cli
	.dbline 30
;    RevFlag=1;
	ldi R24,1
	sts _RevFlag,R24
	.dbline 31
;    reg=read_sja(4);				 //保存SJA1000的中断允许状态
	ldi R16,4
	rcall _read_sja
	mov R20,R16
	.dbline 32
;    write_sja(4,0x00);			 //重设中断允许状态为不允许任何中断
	clr R18
	ldi R16,4
	rcall _write_sja
	.dbline 33
;    can_status=Receive();		 //接收消息
	rcall _Receive
	mov R22,R16
	.dbline 34
;    if(can_status == 0x01)
	cpi R16,1
	brne L2
	.dbline 35
;    {
	.dbline 36
; 	  for(CompCount=5;CompCount<13;CompCount++)				//检查接收到的数据是否正确
	ldi R22,5
	rjmp L7
L4:
	.dbline 37
; 	  {
	.dbline 38
; 	     if(RxBuffer[CompCount] != TransBuffer[CompCount])
	ldi R24,<_TransBuffer
	ldi R25,>_TransBuffer
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_RxBuffer
	ldi R25,>_RxBuffer
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	ldd R3,z+0
	cp R3,R2
	breq L8
	.dbline 39
;          {
	.dbline 40
; 		    RevFlag &= 0x00;	   						  	//发现有不一致时,则清0标志位 
	clr R2
	sts _RevFlag,R2
	.dbline 41
; 	     } 
L8:
	.dbline 42
L5:
	.dbline 36
	inc R22
L7:
	.dbline 36
	cpi R22,13
	brlo L4
	.dbline 43
;       } 
;    }
	rjmp L3
L2:
	.dbline 45
;    else
;    Init_CAN();		 	 	 	 //如果不是正确接收,则重新初始化
	rcall _Init_CAN
L3:
	.dbline 46
;    write_sja(4,reg);			 //重新写回中断允许模式
	mov R18,R20
	ldi R16,4
	rcall _write_sja
	.dbline 47
;    SEI();
	sei
	.dbline -2
L1:
	rcall pop_gset2
	rcall pop_lset
	.dbline 0 ; func end
	reti
	.dbsym r can_status 22 c
	.dbsym r reg 20 c
	.dbsym r CompCount 22 c
	.dbend
	.dbfunc e Status_lighting _Status_lighting fV
;         status -> R16
	.even
_Status_lighting::
	.dbline -1
	.dbline 52
; }     
; //////////////////////////////////////////////////////////////////////////
; 
; void Status_lighting(uchar status)
; {
	.dbline 53
;    if(status == 1)
	cpi R16,1
	brne L11
	.dbline 54
;    PORTD |= BIT(5);
	sbi 0x12,5
	rjmp L12
L11:
	.dbline 55
;    else if(status == 0)
	tst R16
	brne L13
	.dbline 56
;    PORTD &=~ BIT(5);
	cbi 0x12,5
L13:
L12:
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbsym r status 16 c
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              k -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 60
; }
; 
; void delay_1ms( void ) 
; {
	.dbline 62
;  uint k ; 
;  for ( k = 0 ; k < ( 8*142-2 ) ; k++ ) // 定时1ms公式:xtal*142-2
	clr R16
	clr R17
	rjmp L19
L16:
	.dbline 63
L17:
	.dbline 62
	subi R16,255  ; offset = 1
	sbci R17,255
L19:
	.dbline 62
	cpi R16,110
	ldi R30,4
	cpc R17,R30
	brlo L16
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbsym r k 16 i
	.dbend
	.dbfunc e Delay _Delay fV
;              p -> R20,R21
;              n -> R22,R23
	.even
_Delay::
	rcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 66
;  	 ;  
; }
; void Delay (uint n)
; {
	.dbline 68
;  uint p ; 
;  for( p = 0 ; p < n ;p++ ) 
	clr R20
	clr R21
	rjmp L24
L21:
	.dbline 69
	.dbline 70
	rcall _delay_1ms
	.dbline 71
L22:
	.dbline 68
	subi R20,255  ; offset = 1
	sbci R21,255
L24:
	.dbline 68
	cp R20,R22
	cpc R21,R23
	brlo L21
	.dbline -2
L20:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r p 20 i
	.dbsym r n 22 i
	.dbend
	.dbfunc e main _main fV
;       lp_count -> <dead>
	.even
_main::
	.dbline -1
	.dbline 75
;  	  {
; 	   delay_1ms() ;
; 	  }
; }
; 
; void main(void)
; {  
	.dbline 77
;    uchar lp_count;
;    CLI();					 //关中断
	cli
	.dbline 78
;    IOIni();					 //IO口初始化
	rcall _IOIni
	.dbline 79
;    Timer0Ini();
	rcall _Timer0Ini
	.dbline 80
;    Delay(1000);
	ldi R16,1000
	ldi R17,3
	rcall _Delay
	.dbline 81
;    Init_CAN();			     //CAN初始化	
	rcall _Init_CAN
	.dbline 82
;    SEI();
	sei
	rjmp L27
L26:
	.dbline 84
;    while(1)
;    {
	.dbline 85
; 	  Key3=KeyInput(3);
	ldi R16,3
	rcall _KeyInput
	sts _Key3,R16
	.dbline 86
; 	  if(KeyStatus == 1)	 //按键按下
	lds R24,_KeyStatus
	cpi R24,1
	brne L29
	.dbline 87
; 	  {
	.dbline 88
; 	     KeyStatus=0;
	clr R2
	sts _KeyStatus,R2
	.dbline 89
; 		 CanTransmit(); 	 //发送数据
	rcall _CanTransmit
	.dbline 90
; 	  }
L29:
	.dbline 92
; 	 
; 	  if(RevFlag == 1)		 //如果正确接收到数据
	lds R24,_RevFlag
	cpi R24,1
	brne L31
	.dbline 93
; 	  {
	.dbline 94
; 	     RevFlag=0;
	clr R2
	sts _RevFlag,R2
	.dbline 95
; 		 PORTD ^= BIT(5); 
	ldi R24,32
	in R2,0x12
	eor R2,R24
	out 0x12,R2
	.dbline 96
; 	  }
L31:
	.dbline 97
L27:
	.dbline 83
	rjmp L26
X0:
	.dbline -2
L25:
	.dbline 0 ; func end
	ret
	.dbsym l lp_count 1 c
	.dbend

⌨️ 快捷键说明

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