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

📄 can162.lis

📁 Atmel mcu can interface design example
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 00E6           ; // WGM: Normal
 00E6           ; // desired value: 1000Hz
 00E6           ; // actual value: 1008.065Hz (0.8%)
 00E6           ; void timer0_init(void)
 00E6           ; {
 00E6           ;  TCCR0= 0x00; //stop
 00E6           ;  TCNT0= 0xFE; //set count
 00E6           ;  OCR0= 0x3E; //set compare value
 00E6           ;  TCCR0= 0x04; //start timer
 00E6           ;  TIMSK = 0x02;
 00E6           ; }
 00E6           ; 
 00E6           ; #pragma interrupt_handler timer0_ovf_isr:18
 00E6           ; void timer0_ovf_isr(void)
 00E6           ; {
 00E6           ;  TCNT0= 0xFE; //reload counter value
 00E6           ;  timer_ok = 1;
 00E6           ;  count++;
 00E6           ;  if(count == 1)
 00E6           ;  {
 00E6           ;     count = 0;
 00E6           ;     PORTD ^= (1<<PD4); //程序在运行
 00E6           ;  }
 00E6           ; }*/
 00E6           ; 
 00E6           ; #pragma interrupt_handler int0_isr:2
 00E6           ; //中断处理可以考虑放外边
 00E6           ; void int0_isr(void)
 00E6           ; {
 00E6                   .dbline 126
 00E6           ;    unsigned char reg;
 00E6           ;    unsigned char CompCount;
 00E6           ;    unsigned char can_status;
 00E6           ;    CLI();                                              //关CPU中断
 00E6 F894              cli
 00E8                   .dbline 127
 00E8           ;    RevFlag = 1;
 00E8 81E0              ldi R24,1
 00EA 80930200          sts _RevFlag,R24
 00EE                   .dbline 128
 00EE           ;    reg = read_sja(IER);                                //保存SJA1000的中断允许状态
 00EE 04E0              ldi R16,4
 00F0 0E940000          xcall _read_sja
 00F4 402F              mov R20,R16
 00F6                   .dbline 129
 00F6           ;    write_sja(IER, 0x00);                       //重设中断允许状态为不允许任何中断
 00F6 2227              clr R18
 00F8 04E0              ldi R16,4
 00FA 0E940000          xcall _write_sja
 00FE                   .dbline 130
 00FE           ;    can_status = CanReceive();          //接收消息
 00FE 0E940000          xcall _CanReceive
 0102 602F              mov R22,R16
 0104                   .dbline 131
 0104           ;    if(can_status == 0x01)
 0104 0130              cpi R16,1
 0106 C9F4              brne L18
 0108                   .dbline 132
 0108           ;    {
 0108                   .dbline 133
 0108           ;         for(CompCount = 5; CompCount < 13; CompCount++)                               //检查接收到的数据是否正确
 0108 65E0              ldi R22,5
 010A 14C0              xjmp L23
 010C           L20:
 010C                   .dbline 134
 010C           ;         {
 010C                   .dbline 135
 010C           ;            if(RX_Buffer[CompCount] != TX_Buffer[CompCount])
 010C 80E0              ldi R24,<_TX_Buffer
 010E 90E0              ldi R25,>_TX_Buffer
 0110 E62F              mov R30,R22
 0112 FF27              clr R31
 0114 E80F              add R30,R24
 0116 F91F              adc R31,R25
 0118 2080              ldd R2,z+0
 011A 80E0              ldi R24,<_RX_Buffer
 011C 90E0              ldi R25,>_RX_Buffer
 011E E62F              mov R30,R22
 0120 FF27              clr R31
 0122 E80F              add R30,R24
 0124 F91F              adc R31,R25
 0126 3080              ldd R3,z+0
 0128 3214              cp R3,R2
 012A 19F0              breq L24
 012C                   .dbline 136
 012C           ;          {
 012C                   .dbline 137
 012C           ;                   RevFlag = 0;                                                                //发现有不一致时,则清0标志位 
 012C 2224              clr R2
 012E 20920200          sts _RevFlag,R2
 0132                   .dbline 138
 0132           ;            } 
 0132           L24:
 0132                   .dbline 139
 0132           L21:
 0132                   .dbline 133
 0132 6395              inc R22
 0134           L23:
 0134                   .dbline 133
 0134 6D30              cpi R22,13
 0136 50F3              brlo L20
 0138                   .dbline 140
 0138           ;       } 
 0138           ;    }
 0138 02C0              xjmp L19
 013A           L18:
 013A                   .dbline 142
 013A           ;    else
 013A           ;    Init_CAN();                                         //如果不是正确接收,则重新初始化
 013A 0E940000          xcall _Init_CAN
 013E           L19:
 013E                   .dbline 143
 013E           ;    write_sja(IER, reg);                        //重新写回中断允许模式
 013E 242F              mov R18,R20
 0140 04E0              ldi R16,4
 0142 0E940000          xcall _write_sja
 0146                   .dbline 144
 0146           ;    SEI();
 0146 7894              sei
 0148                   .dbline -2
 0148                   .dbline 145
 0148           ; }     
 0148           L17:
 0148 0E940000          xcall pop_gset2
 014C 0E940000          xcall pop_lset
 0150                   .dbline 0 ; func end
 0150 1895              reti
 0152                   .dbsym r can_status 22 c
 0152                   .dbsym r reg 20 c
 0152                   .dbsym r CompCount 22 c
 0152                   .dbend
 0152                   .dbfunc e init_devices _init_devices fV
                        .even
 0152           _init_devices::
 0152                   .dbline -1
 0152                   .dbline 150
 0152           ; 
 0152           ; // **Section [PCHINT1] not found**
 0152           ; //call this routine to initialise all peripherals
 0152           ; void init_devices(void)
 0152           ; {
 0152                   .dbline 152
 0152           ;  //stop errant interrupts until set up
 0152           ;  CLI(); //disable all interrupts
 0152 F894              cli
 0154                   .dbline 153
 0154           ;  port_init();
 0154 6EDF              xcall _port_init
 0156                   .dbline 154
 0156           ;  watchdog_init();
 0156 80DF              xcall _watchdog_init
 0158                   .dbline 157
 0158           ;  //timer1_init();
 0158           ; 
 0158           ;  MCUCR = 0x82; 
 0158 82E8              ldi R24,130
 015A 85BF              out 0x35,R24
 015C                   .dbline 158
 015C           ;  EMCUCR = 0x00;
 015C 2224              clr R2
 015E 26BE              out 0x36,R2
 0160                   .dbline 160
 0160           ;  //GIMSK= 0x00;
 0160           ;  TIMSK = 0x80; //timer interrupt sources
 0160 80E8              ldi R24,128
 0162 89BF              out 0x39,R24
 0164                   .dbline 162
 0164           ;  //ETIMSK = 0x00;
 0164           ;  GICR = 0x40;
 0164 80E4              ldi R24,64
 0166 8BBF              out 0x3b,R24
 0168                   .dbline 165
 0168           ;  //PCMSK0 = 0x00;
 0168           ;  //PCMSK1 = 0x00;
 0168           ;  SEI(); //re-enable interrupts
 0168 7894              sei
 016A                   .dbline -2
 016A                   .dbline 167
 016A           ;  //all peripherals are now initialised
 016A           ; }
 016A           L26:
 016A                   .dbline 0 ; func end
 016A 0895              ret
 016C                   .dbend
 016C                   .dbfunc e main _main fV
                        .even
 016C           _main::
 016C                   .dbline -1
 016C                   .dbline 170
 016C           ; 
 016C           ; void main(void)
 016C           ; {  
 016C                   .dbline 171
 016C           ;    init_devices();
 016C F2DF              xcall _init_devices
 016E                   .dbline 172
 016E           ;    WDR();
 016E A895              wdr
 0170                   .dbline 176
 0170           ;    
 0170           ;    //Delay(1000);
 0170           ;    
 0170           ;    Init_CAN();                             //CAN初始化        
 0170 0E940000          xcall _Init_CAN
 0174                   .dbline 177
 0174           ;    WDR();
 0174 A895              wdr
 0176                   .dbline 178
 0176           ;    timer1_init();
 0176 74DF              xcall _timer1_init
 0178                   .dbline 179
 0178           ;    WDR();
 0178 A895              wdr
 017A 24C0              xjmp L29
 017C           L28:
 017C                   .dbline 182
 017C           ;    
 017C           ;    while(1)
 017C           ;    {
 017C                   .dbline 183
 017C           ;         PORTD |= (1<<PD1);//初始化成功
 017C 919A              sbi 0x12,1
 017E                   .dbline 184
 017E           ;         WDR();
 017E A895              wdr
 0180                   .dbline 185
 0180           ;         if(timer_ok == 1)
 0180 80910400          lds R24,_timer_ok
 0184 8130              cpi R24,1
 0186 91F4              brne L31
 0188                   .dbline 186
 0188           ;         {
 0188                   .dbline 187
 0188           ;            timer_ok = 0;
 0188 2224              clr R2
 018A 20920400          sts _timer_ok,R2
 018E                   .dbline 188
 018E           ;                timer_count++;
 018E 80910300          lds R24,_timer_count
 0192 8F5F              subi R24,255    ; addi 1
 0194 80930300          sts _timer_count,R24
 0198                   .dbline 190
 0198           ;                
 0198           ;                if(timer_count == 60)
 0198 8C33              cpi R24,60
 019A 41F4              brne L33
 019C                   .dbline 191
 019C           ;                {
 019C                   .dbline 192
 019C           ;                   timer_count = 0;
 019C 20920300          sts _timer_count,R2
 01A0                   .dbline 194
 01A0           ;                       //TCCR1B = 0x00;
 01A0           ;                       CanTransmit();   //发送数据
 01A0 0E940000          xcall _CanTransmit
 01A4                   .dbline 195
 01A4           ;                   PORTD ^= (1<<PD3);
 01A4 88E0              ldi R24,8
 01A6 22B2              in R2,0x12
 01A8 2826              eor R2,R24
 01AA 22BA              out 0x12,R2
 01AC                   .dbline 197
 01AC           ;                       //TCCR1B = 0x04;
 01AC           ;                }
 01AC           L33:
 01AC                   .dbline 199
 01AC           ;                
 01AC           ;         }
 01AC           L31:
 01AC                   .dbline 202
 01AC           ;         //Delay(50);
 01AC           ;         //Delay(100);
 01AC           ;         WDR();  
 01AC A895              wdr
 01AE                   .dbline 203
 01AE           ;         if(RevFlag == 1)               //如果正确接收到数据
 01AE 80910200          lds R24,_RevFlag
 01B2 8130              cpi R24,1
 01B4 39F4              brne L35
 01B6                   .dbline 204
 01B6           ;         {
 01B6                   .dbline 205
 01B6           ;            RevFlag = 0;
 01B6 2224              clr R2
 01B8 20920200          sts _RevFlag,R2
 01BC                   .dbline 206
 01BC           ;                PORTD ^= (1<<PD5); 
 01BC 80E2              ldi R24,32
 01BE 22B2              in R2,0x12
 01C0 2826              eor R2,R24
 01C2 22BA              out 0x12,R2
 01C4                   .dbline 208
 01C4           ;                //write_sja(CMR, 0x04);        
 01C4           ;         }
 01C4           L35:
 01C4                   .dbline 210
 01C4           L29:
 01C4                   .dbline 181
 01C4 DBCF              xjmp L28
 01C6           X0:
 01C6                   .dbline -2
 01C6                   .dbline 211
 01C6           ;         
 01C6           ;    }
 01C6           ; }
 01C6           L27:
 01C6                   .dbline 0 ; func end
 01C6 0895              ret
 01C8                   .dbend
                        .area bss(ram, con, rel)
 0000                   .dbfile D:\candesignnow\CAN162.c
 0000           _count::
 0000                   .blkb 2
 0002                   .dbsym e count _count i
 0002           _RevFlag::
 0002                   .blkb 1
 0003                   .dbsym e RevFlag _RevFlag c
 0003           _timer_count::
 0003                   .blkb 1
 0004                   .dbsym e timer_count _timer_count c
 0004           _timer_ok::
 0004                   .blkb 1
 0005                   .dbsym e timer_ok _timer_ok c
 0005           _RX_Buffer::
 0005                   .blkb 13
 0012                   .dbsym e RX_Buffer _RX_Buffer A[13:13]c
 0012           _TX_Buffer::
 0012                   .blkb 13
 001F                   .dbsym e TX_Buffer _TX_Buffer A[13:13]c

⌨️ 快捷键说明

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