?? 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 + -