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

📄 main.lst

📁 AT90CAN128的CAN通信源码测试成功
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0256 01FE      MOVW	R30,R28
    0257 8020      LDD	R2,Z+0
    0258 8031      LDD	R3,Z+1
    0259 8042      LDD	R4,Z+2
    025A 8053      LDD	R5,Z+3
    025B 925A      ST	R5,-Y
    025C 924A      ST	R4,-Y
    025D 923A      ST	R3,-Y
    025E 922A      ST	R2,-Y
    025F E602      LDI	R16,0x62
    0260 E010      LDI	R17,0
    0261 940E0705  CALL	lpm32
    0263 933A      ST	R19,-Y
    0264 932A      ST	R18,-Y
    0265 931A      ST	R17,-Y
    0266 930A      ST	R16,-Y
    0267 940E08A7  CALL	cmp32f
    0269 F421      BNE	0x026E
    026A E081      LDI	R24,1
    026B E090      LDI	R25,0
    026C 015C      MOVW	R10,R24
    026D C002      RJMP	0x0270
    026E 24AA      CLR	R10
    026F 24BB      CLR	R11
    0270 842C      LDD	R2,Y+12
    0271 2433      CLR	R3
    0272 2C4E      MOV	R4,R14
    0273 2455      CLR	R5
    0274 2842      OR	R4,R2
    0275 2853      OR	R5,R3
    0276 284A      OR	R4,R10
    0277 285B      OR	R5,R11
    0278 2044      TST	R4
    0279 F411      BNE	0x027C
    027A 2055      TST	R5
    027B F039      BEQ	0x0283
(0190)     	{
(0191)             firstplace = TRUE;
    027C 2400      CLR	R0
    027D 9403      INC	R0
    027E 860C      STD	Y+12,R0
(0192)             rprintfChar(digit+0x30);
    027F 2D0E      MOV	R16,R14
    0280 5D00      SUBI	R16,0xD0
    0281 DE34      RCALL	_rprintfChar
(0193)     	}
    0282 C002      RJMP	0x0285
(0194)         else
(0195)             rprintfChar(' ');
    0283 E200      LDI	R16,0x20
    0284 DE31      RCALL	_rprintfChar
(0196)     	
(0197)         if(place == 1.0)
    0285 01FE      MOVW	R30,R28
    0286 8020      LDD	R2,Z+0
    0287 8031      LDD	R3,Z+1
    0288 8042      LDD	R4,Z+2
    0289 8053      LDD	R5,Z+3
    028A 925A      ST	R5,-Y
    028B 924A      ST	R4,-Y
    028C 923A      ST	R3,-Y
    028D 922A      ST	R2,-Y
    028E E602      LDI	R16,0x62
    028F E010      LDI	R17,0
    0290 940E0705  CALL	lpm32
    0292 933A      ST	R19,-Y
    0293 932A      ST	R18,-Y
    0294 931A      ST	R17,-Y
    0295 930A      ST	R16,-Y
    0296 940E08A7  CALL	cmp32f
    0298 F411      BNE	0x029B
(0198)     	{
(0199)             rprintfChar('.');
    0299 E20E      LDI	R16,0x2E
    029A DE1B      RCALL	_rprintfChar
(0200)     	}
(0201)     	
(0202)         x -= (digit*place);
    029B 01FE      MOVW	R30,R28
    029C 8825      LDD	R2,Z+21
    029D 8836      LDD	R3,Z+22
    029E 8847      LDD	R4,Z+23
    029F 8C50      LDD	R5,Z+24
    02A0 925A      ST	R5,-Y
    02A1 924A      ST	R4,-Y
    02A2 923A      ST	R3,-Y
    02A3 922A      ST	R2,-Y
    02A4 2D0E      MOV	R16,R14
    02A5 2711      CLR	R17
    02A6 940E078F  CALL	int2fp
    02A8 933A      ST	R19,-Y
    02A9 932A      ST	R18,-Y
    02AA 931A      ST	R17,-Y
    02AB 930A      ST	R16,-Y
    02AC 01FE      MOVW	R30,R28
    02AD 8420      LDD	R2,Z+8
    02AE 8431      LDD	R3,Z+9
    02AF 8442      LDD	R4,Z+10
    02B0 8453      LDD	R5,Z+11
    02B1 925A      ST	R5,-Y
    02B2 924A      ST	R4,-Y
    02B3 923A      ST	R3,-Y
    02B4 922A      ST	R2,-Y
    02B5 940E08D8  CALL	empy32fs
    02B7 940E07F4  CALL	sub32f
    02B9 01FE      MOVW	R30,R28
    02BA 8B05      STD	Z+21,R16
    02BB 8B16      STD	Z+22,R17
    02BC 8B27      STD	Z+23,R18
    02BD 8F30      STD	Z+24,R19
(0203)         place /= 10.0;
    02BE 01FE      MOVW	R30,R28
    02BF 8020      LDD	R2,Z+0
    02C0 8031      LDD	R3,Z+1
    02C1 8042      LDD	R4,Z+2
    02C2 8053      LDD	R5,Z+3
    02C3 925A      ST	R5,-Y
    02C4 924A      ST	R4,-Y
    02C5 923A      ST	R3,-Y
    02C6 922A      ST	R2,-Y
    02C7 E50A      LDI	R16,0x5A
    02C8 E010      LDI	R17,0
    02C9 940E0705  CALL	lpm32
    02CB 933A      ST	R19,-Y
    02CC 932A      ST	R18,-Y
    02CD 931A      ST	R17,-Y
    02CE 930A      ST	R16,-Y
    02CF 940E084D  CALL	div32f
    02D1 01FE      MOVW	R30,R28
    02D2 8300      STD	Z+0,R16
    02D3 8311      STD	Z+1,R17
    02D4 8322      STD	Z+2,R18
    02D5 8333      STD	Z+3,R19
    02D6 94C3      INC	R12
    02D7 880B      LDD	R0,Y+19
    02D8 14C0      CP	R12,R0
    02D9 F408      BCC	0x02DB
    02DA CF2B      RJMP	0x0206
    02DB 962D      ADIW	R28,0xD
    02DC 940E06C0  CALL	pop_gset5x
    02DE 9624      ADIW	R28,4
    02DF 9508      RET
FILE: D:\liliang\can-232\CAN-232\can.c
(0001) /******************************************************************** 
(0002) *  函数库说明:CAN总线驱动函数库                                    * 
(0003) *  版本说明:  1.0 Bate                                             * 
(0004) *  作者:      andylee                                              * 
(0005) *  日期:      2006年7月                                            * 
(0006) *  平台:      mega16  16M                                          * 
(0007) *  说明:      为上层提供CAN控制器的基本读写函数,数据发送、接受函数* 
(0008) ********************************************************************/ 
(0009) #include "can.h"
(0010) #include "delay.h"
(0011) 
(0012) //#define DEBUG
(0013) #define TransBuffer TransmitMessage
(0014) /*********************
(0015) * 全局变量定义       *
(0016) *********************/
(0017) //unsigned char CanMode[14];
(0018) unsigned char TransmitMessage[13];
(0019) unsigned char RxBuffer[13];
(0020) #ifdef DEBUG
(0021) unsigned char temp1;
(0022) #endif
(0023) 
(0024) /********************************************************** ********** 
(0025) *  函数说明:CAN控制器引脚初始化                                    * 
(0026) *  输入:                                                           * 
(0027) *  输出:无                                                         * 
(0028) ********************************************************************/
(0029) void sja_port_init(void)
(0030) { 
(0031)  //CAN数据线设置
(0032)    PORTC=0x00;
_sja_port_init:
    02E0 2422      CLR	R2
    02E1 BA25      OUT	0x15,R2
(0033)    DDRC=0xff;
    02E2 EF8F      LDI	R24,0xFF
    02E3 BB84      OUT	0x14,R24
(0034)    PORTD=0b11000000;          //INT引脚输入不上拉
    02E4 EC80      LDI	R24,0xC0
    02E5 BB82      OUT	0x12,R24
(0035)    DDRD =0b11111000;
    02E6 EF88      LDI	R24,0xF8
    02E7 BB81      OUT	0x11,R24
(0036)  //CAN 控制引脚设置
(0037)   CAN_DDR|=(1<<WR)|(1<<RD)|(1<<ALE)|(1<<CS);
    02E8 B38A      IN	R24,0x1A
    02E9 6F80      ORI	R24,0xF0
    02EA BB8A      OUT	0x1A,R24
(0038)   WR_H;
    02EB 9ADD      SBI	0x1B,5
(0039)   RD_H;
    02EC 9ADE      SBI	0x1B,6
(0040)   ALE_L;
    02ED 98DC      CBI	0x1B,4
(0041)   CS_H;
    02EE 9ADF      SBI	0x1B,7
    02EF 9508      RET
(0042) }
(0043) 
(0044) /******************************************************************** 
(0045) *  函数说明:模拟CAN收发时序,写一个字节到CAN控制器                 * 
(0046) *  输入:data,address                                               * 
(0047) *  输出:无                                                         * 
(0048) ********************************************************************/
(0049) void sja_write_data(unsigned char addr,unsigned char data)
(0050) {
(0051)  RD_H;
_sja_write_data:
  data                 --> R18
  addr                 --> R16
    02F0 9ADE      SBI	0x1B,6
(0052)  DDRC=0xFF; //总线设置为输出
    02F1 EF8F      LDI	R24,0xFF
    02F2 BB84      OUT	0x14,R24
(0053) // ALE_L;
(0054)  PORTC=addr; 
    02F3 BB05      OUT	0x15,R16
(0055)  ALE_H;
    02F4 9ADC      SBI	0x1B,4
(0056)  NOP();
    02F5 0000      NOP
(0057)  ALE_L;    //下降沿地址锁存
    02F6 98DC      CBI	0x1B,4
(0058)  NOP();
    02F7 0000      NOP
(0059)  
(0060)  PORTC=data;
    02F8 BB25      OUT	0x15,R18
(0061)  CS_L;
    02F9 98DF      CBI	0x1B,7
(0062)  WR_L;
    02FA 98DD      CBI	0x1B,5
(0063)  NOP();
    02FB 0000      NOP
(0064)  WR_H;     //上升沿数据写入
    02FC 9ADD      SBI	0x1B,5
(0065)  NOP();
    02FD 0000      NOP
(0066) // ALE_H;
(0067)  CS_H;
    02FE 9ADF      SBI	0x1B,7
    02FF 9508      RET
_sja_read_data:
  data                 --> R10
  addr                 --> R16
    0300 940E06C3  CALL	push_gset3x
(0068) }
(0069) 
(0070) /******************************************************************** 
(0071) *  函数说明:模拟CAN收发时序,从CAN控制器读一个字节                 * 
(0072) *  输入:address                                                    * 
(0073) *  输出:data                                                       * 
(0074) ********************************************************************/
(0075) unsigned char sja_read_data(unsigned char addr)
(0076) {
(0077)  unsigned char data;
(0078)  WR_H;
    0302 9ADD      SBI	0x1B,5
(0079)  DDRC=0xFF; //总线设置为输出
    0303 EF8F      LDI	R24,0xFF
    0304 BB84      OUT	0x14,R24
(0080)  
(0081)  ALE_L;
    0305 98DC      CBI	0x1B,4
(0082)  PORTC=addr;
    0306 BB05      OUT	0x15,R16
(0083)  ALE_H;
    0307 9ADC      SBI	0x1B,4
(0084)  NOP();
    0308 0000      NOP
(0085)  ALE_L;    //地址锁存
    0309 98DC      CBI	0x1B,4
(0086)  NOP();
    030A 0000      NOP
(0087)  
(0088)  PORTC=0xFF;  
    030B BB85      OUT	0x15,R24
(0089)  DDRC=0x00;   //总线设置为输入,内部上拉
    030C 2422      CLR	R2
    030D BA24      OUT	0x14,R2
(0090)  CS_L;
    030E 98DF      CBI	0x1B,7
(0091)  RD_L;
    030F 98DE      CBI	0x1B,6
(0092)  NOP();
    0310 0000      NOP
(0093)  RD_H;
    0311 9ADE      SBI	0x1B,6
(0094)  NOP();
    0312 0000      NOP
(0095)  data=PINC;
    0313 B2A3      IN	R10,0x13
(0096)  CS_H;
    0314 9ADF      SBI	0x1B,7
(0097)  return data;
    0315 2D0A      MOV	R16,R10
    0316 940E06B1  CALL	pop_gset3x
    0318 9508      RET
(0098) }
(0099) 
(0100) /******************************************************************** 
(0101) *  函数说明:初始化SJA1000的相关寄存器:设置工作模式,波特率,验收码* 
(0102) *  输入:无                                                         * 
(0103) *  输出:无                                                         * 
(0104) ********************************************************************/
(0105) void sja_init(void)                
(0106) {
(0107)     unsigned char temp;
(0108)     unsigned int k ; 
(0109) 	
(0110)     CLI();                 
_sja_init:
  k                    --> Y+1
  temp                 --> Y+1
    0319 94F8      BCLR	7
(0111)     sja_write_data(MODE,0x09);            //单个验收滤波,复位模式
    031A E029      LDI	R18,0x9
    031B 2700      CLR	R16
    031C DFD3      RCALL	_sja_write_data
(0112) 	
(0113)     sja_read_data(IR);                  //读取CAN的中断标识,除接受中断外的所有中断复位
    031D E003      LDI	R16,3
    031E DFE1      RCALL	_sja_read_data
    031F C003      RJMP	0x0323
(0114) 	
(0115)     while(!( sja_read_data(MODE)&0x01))   //检测SJA1000是否达到复位工作模式
(0116)     {
(0117)        sja_write_data(MODE,0x09);         //进入复位工作模式
    0320 E029      LDI	R18,0x9
    0321 2700      CLR	R16
    0322 DFCD      RCALL	_sja_write_data
    0323 2700      CLR	R16
    0324 DFDB      RCALL	_sja_read_data
    0325 FF00      SBRS	R16,0
    0326 CFF9      RJMP	0x0320
(0118)     }   
(0119)     delay_nus(5);                         //延时约5us
    0327 E005      LDI	R16,5
    0328 E010      LDI	R17,0
    0329 DD5D      RCALL	_delay_nus
(0120)     sja_write_data(CDR,REG_CDR_DATA);     //PeliCAN 模式,旁路输入比较器,禁能CLOCKOUT引脚
    032A E828      LDI	R18,0x88
    032B E10F      LDI	R16,0x1F
    032C DFC3      RCALL	_sja_write_data
(0121)     delay_nus(5);                         //延时约5us
    032D E005      LDI	R16,5
    032E E010      LDI	R17,0
    032F DD57      RCALL	_delay_nus
(0122) 	
(0123)     sja_write_data(BTR0,BTR0_Rate_250k);           //同步跳转宽度4;时钟4分频,波特率250Kb/s
    0330 E021      LDI	R18,1
    0331 E006      LDI	R16,6
    0332 DFBD      RCALL	_sja_write_data
(0124)     sja_write_data(BTR1,BTR1_Rate_250k);           //采样3次;时间段1,2=10,5    
    0333 E12C      LDI	R18,0x1C
    0334 E007      LDI	R16,7
    0335 DFBA      RCALL	_sja_write_data
(0125) 
(0126)     sja_write_data(OCR,REG_OCR_DATA);    //输出控制,推拉结构,正逻辑
    0336 E12A      LDI	R18,0x1A
    0337 E008      LDI	R16,0x8
    0338 DFB7      RCALL	_sja_write_data
(0127)     
(0128)     sja_write_data(RXERR,0x00);          //收发错误寄存器清零
    0339 2722      CLR	R18
    033A E00E      LDI	R16,0xE
    033B DFB4      RCALL	_sja_write_data

⌨️ 快捷键说明

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