?? main.lis
字號:
.module MAIN.c
.area vector(rom, abs)
.org 2
0002 00C0 rjmp _Inter0
.area text(rom, con, rel)
0000 .dbfile E:\羅鵬\工作資料\工作記錄\CAN\程序\完成版本\MAIN.c
0000 .dbfunc e Inter0 _Inter0 fV
0000 ; can_status -> R22
0000 ; reg -> R20
0000 ; CompCount -> R22
.even
0000 _Inter0::
0000 00D0 rcall push_lset
0002 00D0 rcall push_gset2
0004 .dbline -1
0004 .dbline 25
0004 ; /*****************************************
0004 ; 測試版本
0004 ; MCU:ATMEGA8515
0004 ; Frequence: 16M
0004 ; 描述:利用已有CAN TEST V1.0電路板進行調試,
0004 ; 可靠性測試已通過,并發現8515外部中斷不穩定
0004 ; 的原因是沒有在INT0腳加上拉電阻,加上后已能
0004 ; 夠穩定地運行
0004 ; 調試過程中發現SJA1000的首地址設置有誤,改過
0004 ; 后,當CAN發送數據時,程序能進入中斷了,但發現
0004 ; 中斷是由出錯報警中斷引起的,估計與波特率設置
0004 ; 有關。
0004 ; 通過修改CDR的參數,以及更換16M晶振,現在已能
0004 ; 正常地收發送數據了?。。。。。。。。。。。?!
0004 ; 日期:2006.3.11
0004 ; *****************************************/
0004 ; #include "iom8515v.h"
0004 ; #include "macros.h"
0004 ; #include "MAIN.h"
0004 ; #include "Timer.h"
0004 ; #include "IO.h"
0004 ; #include "CAN.h"
0004 ; #pragma interrupt_handler Inter0:2
0004 ; void Inter0(void)
0004 ; {
0004 .dbline 29
0004 ; uchar reg;
0004 ; uchar CompCount;
0004 ; uchar can_status;
0004 ; CLI(); //關CPU中斷
0004 F894 cli
0006 .dbline 30
0006 ; RevFlag=1;
0006 81E0 ldi R24,1
0008 80930000 sts _RevFlag,R24
000C .dbline 31
000C ; reg=read_sja(4); //保存SJA1000的中斷允許狀態
000C 04E0 ldi R16,4
000E 00D0 rcall _read_sja
0010 402F mov R20,R16
0012 .dbline 32
0012 ; write_sja(4,0x00); //重設中斷允許狀態為不允許任何中斷
0012 2227 clr R18
0014 04E0 ldi R16,4
0016 00D0 rcall _write_sja
0018 .dbline 33
0018 ; can_status=Receive(); //接收消息
0018 00D0 rcall _Receive
001A 602F mov R22,R16
001C .dbline 34
001C ; if(can_status == 0x01)
001C 0130 cpi R16,1
001E C9F4 brne L2
0020 .dbline 35
0020 ; {
0020 .dbline 36
0020 ; for(CompCount=5;CompCount<13;CompCount++) //檢查接收到的數據是否正確
0020 65E0 ldi R22,5
0022 14C0 rjmp L7
0024 L4:
0024 .dbline 37
0024 ; {
0024 .dbline 38
0024 ; if(RxBuffer[CompCount] != TransBuffer[CompCount])
0024 80E0 ldi R24,<_TransBuffer
0026 90E0 ldi R25,>_TransBuffer
0028 E62F mov R30,R22
002A FF27 clr R31
002C E80F add R30,R24
002E F91F adc R31,R25
0030 2080 ldd R2,z+0
0032 80E0 ldi R24,<_RxBuffer
0034 90E0 ldi R25,>_RxBuffer
0036 E62F mov R30,R22
0038 FF27 clr R31
003A E80F add R30,R24
003C F91F adc R31,R25
003E 3080 ldd R3,z+0
0040 3214 cp R3,R2
0042 19F0 breq L8
0044 .dbline 39
0044 ; {
0044 .dbline 40
0044 ; RevFlag &= 0x00; //發現有不一致時,則清0標志位
0044 2224 clr R2
0046 20920000 sts _RevFlag,R2
004A .dbline 41
004A ; }
004A L8:
004A .dbline 42
004A L5:
004A .dbline 36
004A 6395 inc R22
004C L7:
004C .dbline 36
004C 6D30 cpi R22,13
004E 50F3 brlo L4
0050 .dbline 43
0050 ; }
0050 ; }
0050 01C0 rjmp L3
0052 L2:
0052 .dbline 45
0052 ; else
0052 ; Init_CAN(); //如果不是正確接收,則重新初始化
0052 00D0 rcall _Init_CAN
0054 L3:
0054 .dbline 46
0054 ; write_sja(4,reg); //重新寫回中斷允許模式
0054 242F mov R18,R20
0056 04E0 ldi R16,4
0058 00D0 rcall _write_sja
005A .dbline 47
005A ; SEI();
005A 7894 sei
005C .dbline -2
005C L1:
005C 00D0 rcall pop_gset2
005E 00D0 rcall pop_lset
0060 .dbline 0 ; func end
0060 1895 reti
0062 .dbsym r can_status 22 c
0062 .dbsym r reg 20 c
0062 .dbsym r CompCount 22 c
0062 .dbend
0062 .dbfunc e Status_lighting _Status_lighting fV
0062 ; status -> R16
.even
0062 _Status_lighting::
0062 .dbline -1
0062 .dbline 52
0062 ; }
0062 ; //////////////////////////////////////////////////////////////////////////
0062 ;
0062 ; void Status_lighting(uchar status)
0062 ; {
0062 .dbline 53
0062 ; if(status == 1)
0062 0130 cpi R16,1
0064 11F4 brne L11
0066 .dbline 54
0066 ; PORTD |= BIT(5);
0066 959A sbi 0x12,5
0068 03C0 rjmp L12
006A L11:
006A .dbline 55
006A ; else if(status == 0)
006A 0023 tst R16
006C 09F4 brne L13
006E .dbline 56
006E ; PORTD &=~ BIT(5);
006E 9598 cbi 0x12,5
0070 L13:
0070 L12:
0070 .dbline -2
0070 L10:
0070 .dbline 0 ; func end
0070 0895 ret
0072 .dbsym r status 16 c
0072 .dbend
0072 .dbfunc e delay_1ms _delay_1ms fV
0072 ; k -> R16,R17
.even
0072 _delay_1ms::
0072 .dbline -1
0072 .dbline 60
0072 ; }
0072 ;
0072 ; void delay_1ms( void )
0072 ; {
0072 .dbline 62
0072 ; uint k ;
0072 ; for ( k = 0 ; k < ( 8*142-2 ) ; k++ ) // 定時1ms公式:xtal*142-2
0072 0027 clr R16
0074 1127 clr R17
0076 02C0 rjmp L19
0078 L16:
0078 .dbline 63
0078 L17:
0078 .dbline 62
0078 0F5F subi R16,255 ; offset = 1
007A 1F4F sbci R17,255
007C L19:
007C .dbline 62
007C 0E36 cpi R16,110
007E E4E0 ldi R30,4
0080 1E07 cpc R17,R30
0082 D0F3 brlo L16
0084 .dbline -2
0084 L15:
0084 .dbline 0 ; func end
0084 0895 ret
0086 .dbsym r k 16 i
0086 .dbend
0086 .dbfunc e Delay _Delay fV
0086 ; p -> R20,R21
0086 ; n -> R22,R23
.even
0086 _Delay::
0086 00D0 rcall push_gset2
0088 B801 movw R22,R16
008A .dbline -1
008A .dbline 66
008A ; ;
008A ; }
008A ; void Delay (uint n)
008A ; {
008A .dbline 68
008A ; uint p ;
008A ; for( p = 0 ; p < n ;p++ )
008A 4427 clr R20
008C 5527 clr R21
008E 03C0 rjmp L24
0090 L21:
0090 .dbline 69
0090 .dbline 70
0090 F0DF rcall _delay_1ms
0092 .dbline 71
0092 L22:
0092 .dbline 68
0092 4F5F subi R20,255 ; offset = 1
0094 5F4F sbci R21,255
0096 L24:
0096 .dbline 68
0096 4617 cp R20,R22
0098 5707 cpc R21,R23
009A D0F3 brlo L21
009C .dbline -2
009C L20:
009C 00D0 rcall pop_gset2
009E .dbline 0 ; func end
009E 0895 ret
00A0 .dbsym r p 20 i
00A0 .dbsym r n 22 i
00A0 .dbend
00A0 .dbfunc e main _main fV
00A0 ; lp_count -> <dead>
.even
00A0 _main::
00A0 .dbline -1
00A0 .dbline 75
00A0 ; {
00A0 ; delay_1ms() ;
00A0 ; }
00A0 ; }
00A0 ;
00A0 ; void main(void)
00A0 ; {
00A0 .dbline 77
00A0 ; uchar lp_count;
00A0 ; CLI(); //關中斷
00A0 F894 cli
00A2 .dbline 78
00A2 ; IOIni(); //IO口初始化
00A2 00D0 rcall _IOIni
00A4 .dbline 79
00A4 ; Timer0Ini();
00A4 00D0 rcall _Timer0Ini
00A6 .dbline 80
00A6 ; Delay(1000);
00A6 08EE ldi R16,1000
00A8 13E0 ldi R17,3
00AA EDDF rcall _Delay
00AC .dbline 81
00AC ; Init_CAN(); //CAN初始化
00AC 00D0 rcall _Init_CAN
00AE .dbline 82
00AE ; SEI();
00AE 7894 sei
00B0 17C0 rjmp L27
00B2 L26:
00B2 .dbline 84
00B2 ; while(1)
00B2 ; {
00B2 .dbline 85
00B2 ; Key3=KeyInput(3);
00B2 03E0 ldi R16,3
00B4 00D0 rcall _KeyInput
00B6 00930000 sts _Key3,R16
00BA .dbline 86
00BA ; if(KeyStatus == 1) //按鍵按下
00BA 80910000 lds R24,_KeyStatus
00BE 8130 cpi R24,1
00C0 21F4 brne L29
00C2 .dbline 87
00C2 ; {
00C2 .dbline 88
00C2 ; KeyStatus=0;
00C2 2224 clr R2
00C4 20920000 sts _KeyStatus,R2
00C8 .dbline 89
00C8 ; CanTransmit(); //發送數據
00C8 00D0 rcall _CanTransmit
00CA .dbline 90
00CA ; }
00CA L29:
00CA .dbline 92
00CA ;
00CA ; if(RevFlag == 1) //如果正確接收到數據
00CA 80910000 lds R24,_RevFlag
00CE 8130 cpi R24,1
00D0 39F4 brne L31
00D2 .dbline 93
00D2 ; {
00D2 .dbline 94
00D2 ; RevFlag=0;
00D2 2224 clr R2
00D4 20920000 sts _RevFlag,R2
00D8 .dbline 95
00D8 ; PORTD ^= BIT(5);
00D8 80E2 ldi R24,32
00DA 22B2 in R2,0x12
00DC 2826 eor R2,R24
00DE 22BA out 0x12,R2
00E0 .dbline 96
00E0 ; }
00E0 L31:
00E0 .dbline 97
00E0 L27:
00E0 .dbline 83
00E0 E8CF rjmp L26
00E2 X0:
00E2 .dbline -2
00E2 L25:
00E2 .dbline 0 ; func end
00E2 0895 ret
00E4 .dbsym l lp_count 1 c
00E4 .dbend
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -