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

📄 main.lis

📁 MCU:ATMEGA8515 Frequence: 16M 描述:利用已有CAN TEST V1.0电路板进行调试, 可靠性测试已通过
💻 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 + -