📄 main.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 + -