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

📄 main.lst

📁 AT90CAN128的CAN通信源码测试成功
💻 LST
📖 第 1 页 / 共 5 页
字号:
_sja_rx_service:
  ptr                  --> R10
  number               --> R12
  i                    --> R14
    042B 940E06CA  CALL	push_gset5x
(0266) }
(0267) 
(0268) 
(0269) /******************************************************************** 
(0270) *  函数说明:SJA1000接受中断服务函数,                              * 
(0271) *  输入:无                                                         * 
(0272) *  输出:正确读取返回TURE否则返回FALSE 。                           * 
(0273) *  影响变量:接受缓冲在正确读取时被刷新                             *
(0274) ********************************************************************/
(0275) void sja_rx_service(void)
(0276) {
(0277)     unsigned char number,i,ptr;
(0278)     ptr=RXEFF;           
    042D E180      LDI	R24,0x10
    042E 2EA8      MOV	R10,R24
(0279)             if((sja_read_data(RXEFF)&0x40)==0x40)  //如果RTR=1,为远程帧
    042F E100      LDI	R16,0x10
    0430 DECF      RCALL	_sja_read_data
    0431 2F80      MOV	R24,R16
    0432 7480      ANDI	R24,0x40
    0433 3480      CPI	R24,0x40
    0434 F421      BNE	0x0439
(0280)     		{
(0281)                 sja_write_data(CMR,0x04);          //则释放接收缓冲
    0435 E024      LDI	R18,4
    0436 E001      LDI	R16,1
    0437 DEB8      RCALL	_sja_write_data
(0282)     		}
    0438 C027      RJMP	0x0460
(0283)             else                    		         //为0,则是数据帧
(0284)     		{
(0285)                 number=(sja_read_data(RXEFF)&0x0f);//取第一个字节的低四位,即数据长度	
    0439 E100      LDI	R16,0x10
    043A DEC5      RCALL	_sja_read_data
    043B 2F80      MOV	R24,R16
    043C 708F      ANDI	R24,0xF
    043D 2EC8      MOV	R12,R24
(0286) 				if (number>0x08)
    043E E088      LDI	R24,0x8
    043F 158C      CP	R24,R12
    0440 F408      BCC	0x0442
(0287) 				number=0x08;			
    0441 2EC8      MOV	R12,R24
(0288)                 if ((sja_read_data(RXEFF))&0x80)         //判断是标准帧还是扩展帧
    0442 E100      LDI	R16,0x10
    0443 DEBC      RCALL	_sja_read_data
    0444 FF07      SBRS	R16,7
    0445 C004      RJMP	0x044A
(0289) 				{
(0290)                 number=number+5;              //扩展帧,则帧的总长度加5(13字节)
    0446 2D8C      MOV	R24,R12
    0447 5F8B      SUBI	R24,0xFB
    0448 2EC8      MOV	R12,R24
(0291) 				}
    0449 C003      RJMP	0x044D
(0292)         		else
(0293) 				{
(0294)                 number=number+3;              //标准帧,则帧的总长度加3(11字节)
    044A 2D8C      MOV	R24,R12
    044B 5F8D      SUBI	R24,0xFD
    044C 2EC8      MOV	R12,R24
(0295) 				}
(0296)                 for(i=0;i<number;i++)   	  //读取数据
    044D 24EE      CLR	R14
    044E C00C      RJMP	0x045B
(0297)         		{
(0298)                     RxBuffer[i]=sja_read_data(RXEFF+i);
    044F 2D0E      MOV	R16,R14
    0450 5F00      SUBI	R16,0xF0
    0451 DEAE      RCALL	_sja_read_data
    0452 EA8C      LDI	R24,0xAC
    0453 E090      LDI	R25,0
    0454 2DEE      MOV	R30,R14
    0455 27FF      CLR	R31
    0456 0FE8      ADD	R30,R24
    0457 1FF9      ADC	R31,R25
    0458 8300      STD	Z+0,R16
(0299)                 	ptr++;
    0459 94A3      INC	R10
    045A 94E3      INC	R14
    045B 14EC      CP	R14,R12
    045C F390      BCS	0x044F
(0300)         		}
(0301)                 sja_write_data(CMR,0x04);          //最后释放FXFIFO
    045D E024      LDI	R18,4
    045E E001      LDI	R16,1
    045F DE90      RCALL	_sja_write_data
(0302)     		}
    0460 940E06C0  CALL	pop_gset5x
    0462 9508      RET
_Search:
  SearchStatus         --> R10
    0463 940E06C3  CALL	push_gset3x
(0303) }
(0304) 
(0305) /******************************************************************** 
(0306) *  函数说明:SJA1000查询方式接收函数,                              * 
(0307) *  输入:无                                                         * 
(0308) *  输出:无                                                         * 
(0309) ********************************************************************/
(0310) void Search(void)                
(0311) {
(0312)    unsigned char SearchStatus;
(0313)    SearchStatus=sja_read_data(SR); //读取状态寄存器
    0465 E002      LDI	R16,2
    0466 DE99      RCALL	_sja_read_data
    0467 2EA0      MOV	R10,R16
(0314) #ifdef DEBUG
(0315)     rprintfStr("SR:   ");
(0316) 	rprintfu08(SearchStatus);
(0317) 	rprintfCRLF();
(0318) #endif   
(0319) //   if((SearchStatus & 0x83))       //是否存在总线关闭、错误状态、数据溢出、有数据位等状态
(0320) //   { 
(0321)       if(SearchStatus&(1<<7))//如果总线关闭
    0468 FF07      SBRS	R16,7
    0469 C005      RJMP	0x046F
(0322)          {
(0323) #ifdef DEBUG
(0324)     rprintfStr("****bus shut off****");
(0325) 	rprintfCRLF();
(0326) #endif
(0327)          sja_read_data(IR);              //读取中断寄存器,清除中断位
    046A E003      LDI	R16,3
    046B DE94      RCALL	_sja_read_data
(0328)          sja_write_data(MODE,0x08); 
    046C E028      LDI	R18,0x8
    046D 2700      CLR	R16
    046E DE81      RCALL	_sja_write_data
(0329)          }
(0330)       if(SearchStatus&0x02)//如果有数据溢出
    046F FEA1      SBRS	R10,1
    0470 C003      RJMP	0x0474
(0331) 		 {
(0332) #ifdef DEBUG
(0333)     rprintfStr("****data overflow****");
(0334) 	rprintfCRLF();
(0335) #endif
(0336)          sja_write_data(CMR,0x0c);          //在命令寄存器中清除数据溢出和释放接收缓冲区
    0471 E02C      LDI	R18,0xC
    0472 E001      LDI	R16,1
    0473 DE7C      RCALL	_sja_write_data
(0337) 		 }
(0338)        if(sja_read_data(IR) & 0x01)//IR.0=1,接收缓冲区有数据
    0474 E003      LDI	R16,3
    0475 DE8A      RCALL	_sja_read_data
    0476 FD00      SBRC	R16,0
(0339)          {
(0340)                 led_on;
    0477 9897      CBI	0x12,7
(0341) #ifdef DEBUG
(0342)     rprintfStr("****receive buffer have data****");
(0343) 	rprintfCRLF();
(0344) #endif
(0345)          }
    0478 940E06B1  CALL	pop_gset3x
    047A 9508      RET
_play_buffer:
  i                    --> R10
  ptr                  --> R12
    047B 940E06C6  CALL	push_gset4x
    047D 0168      MOVW	R12,R16
(0346) //   }
(0347) }
(0348) 
(0349) //=============================================================================
(0350) //显示缓冲区内容
(0351) void play_buffer(unsigned char *ptr)
(0352) {
(0353)  unsigned char i;
(0354)  for (i=0;i<13;i++)
    047E 24AA      CLR	R10
    047F C007      RJMP	0x0487
(0355)   {
(0356)     rprintfu08(*ptr);
    0480 01F6      MOVW	R30,R12
    0481 8100      LDD	R16,Z+0
    0482 DCB1      RCALL	_rprintfu08
(0357) //	rprintfStr("--");
(0358) 	ptr++;
    0483 01C6      MOVW	R24,R12
    0484 9601      ADIW	R24,1
    0485 016C      MOVW	R12,R24
    0486 94A3      INC	R10
    0487 2D8A      MOV	R24,R10
    0488 308D      CPI	R24,0xD
    0489 F3B0      BCS	0x0480
(0359)   }
(0360)    rprintfCRLF();
    048A DC94      RCALL	_rprintfCRLF
    048B 940E06BD  CALL	pop_gset4x
    048D 9508      RET
(0361) }
(0362) 
(0363) //=============================================================================
(0364) //初始化换冲区,在此监控卡上只有模拟管理系统降低充电电压的情况
(0365) void buffer_init(void)
(0366) {
(0367)     TransmitMessage[0]=0x88;		   //扩展贞,8个数据字节
_buffer_init:
    048E E888      LDI	R24,0x88
    048F 938000B9  STS	TransmitMessage,R24
(0368) 	
(0369)     TransmitMessage[1]=192;	       //管理系统优先级7:    ID.28--ID.21=111-00-111
    0491 EC80      LDI	R24,0xC0
    0492 938000BA  STS	TransmitMessage+1,R24
(0370)     TransmitMessage[2]=168;	       //PF=255- 235         ID.20--ID.13=01011-000 
    0494 EA88      LDI	R24,0xA8
    0495 938000BB  STS	TransmitMessage+2,R24
(0371)     TransmitMessage[3]=0x00;	       //PS=252- 22          ID.12--ID.5 =10110-000    
    0497 2422      CLR	R2
    0498 922000BC  STS	TransmitMessage+3,R2
(0372)     TransmitMessage[4]=0x08;	       //As=0x11             ID.4--ID.0  =10001-000
    049A E088      LDI	R24,0x8
    049B 938000BD  STS	0xBD,R24
(0373) 	
(0374)     TransmitMessage[5]=0xCC;	      //桢编号
    049D EC8C      LDI	R24,0xCC
    049E 938000BE  STS	0xBE,R24
(0375) 	
(0376)     TransmitMessage[6]=0x00;	
    04A0 922000BF  STS	0xBF,R2
(0377)     TransmitMessage[7]=0x01;	
    04A2 E081      LDI	R24,1
    04A3 938000C0  STS	0xC0,R24
(0378)     TransmitMessage[8]=0xa1;	
    04A5 EA81      LDI	R24,0xA1
    04A6 938000C1  STS	0xC1,R24
(0379)     TransmitMessage[9]=0xa2;	
    04A8 EA82      LDI	R24,0xA2
    04A9 938000C2  STS	0xC2,R24
(0380)     TransmitMessage[10]=0xa3;	
    04AB EA83      LDI	R24,0xA3
    04AC 938000C3  STS	0xC3,R24
(0381)     TransmitMessage[11]=0xa4;	
    04AE EA84      LDI	R24,0xA4
    04AF 938000C4  STS	0xC4,R24
(0382)     TransmitMessage[12]=0xff; 
    04B1 EF8F      LDI	R24,0xFF
    04B2 938000C5  STS	0xC5,R24
    04B4 9508      RET
(0383) }
(0384) 
(0385) void test_can(void)
(0386) {
(0387)       rprintfCRLF(); 
_test_can:
    04B5 DC69      RCALL	_rprintfCRLF
(0388) 	  rprintfStr("***CAN BUS DEBUG:***"); 
    04B6 E905      LDI	R16,0x95
    04B7 E010      LDI	R17,0
    04B8 DC0A      RCALL	_rprintfStr
(0389) 	  rprintfCRLF(); 
    04B9 DC65      RCALL	_rprintfCRLF
(0390) 	  
(0391) 	  rprintfStr("content of transmit buffer ");
    04BA E709      LDI	R16,0x79
    04BB E010      LDI	R17,0
    04BC DC06      RCALL	_rprintfStr
(0392) 	  rprintfCRLF();
    04BD DC61      RCALL	_rprintfCRLF
(0393) 	  play_buffer(TransmitMessage);
    04BE EB09      LDI	R16,0xB9
    04BF E010      LDI	R17,0
    04C0 DFBA      RCALL	_play_buffer
(0394) 	  
(0395) 	  CLI();
    04C1 94F8      BCLR	7
(0396)       sja_tx(TransmitMessage);
    04C2 EB09      LDI	R16,0xB9
    04C3 E010      LDI	R17,0
    04C4 DF01      RCALL	_sja_tx
(0397) 	  SEI();
    04C5 9478      BSET	7
(0398) 	  rprintfCRLF();
    04C6 DC58      RCALL	_rprintfCRLF
    04C7 9508      RET
_RX_ISR:
  i                    --> Y+1
  sreg                 --> R10
  comm_tempRec         --> R12
    04C8 940E0719  CALL	push_lset
    04CA 940E06C6  CALL	push_gset4x
FILE: D:\liliang\can-232\CAN-232\uart.c
(0001) /******************************************************************** 
(0002) *  函数库说明:RS232总线驱动函数库                                  * 
(0003) *  版本说明:  1.0 Bate                                             * 
(0004) *  作者:      andylee                                              * 
(0005) *  日期:      2006年7月                                            * 
(0006) *  平台:      mega16  16M                                          * 
(0007) *  说明:      为上层提供RS232的基本读写函数                        * 
(0008) ********************************************************************/ 
(0009) #include "uart.h"
(0010) #include "can.h"
(0011) 
(0012) unsigned char uart_b0_flag=0;                  //降压标志
(0013) unsigned char uart_b8_flag=0;                  //停止充电标志
(0014) unsigned char uart_normal_flag=0;                  //正常
(0015) unsigned char uart_alarm_flag=0;                  //报警
(0016) 
(0017) /************************************* 
(0018) *  函数说明:串口接收中断            *
(0019) *  输入:无                          * 
(0020) *  输出:无                          * 
(0021) ************************************/
(0022) #pragma interrupt_handler RX_ISR:12
(0023) void RX_ISR(void)      
(0024) {
(0025)      unsigned char sreg;
(0026) 	 unsigned char comm_tempRec;
(0027) 	 unsigned int i;
(0028) 	
(0029)    	 sreg=SREG;                               //保存全局中断标志
    04CC B6AF      IN	R10,0x3F
(0030)    	 CLI();
    04CD 94F8      BCLR	7
(0031) 	 
(0032) 	 comm_tempRec=UDR;
    04CE B0CC      IN	R12,0x0C
(0033) 	   
(0034) 	 if(comm_tempRec==0xb0)//表示降电压
    04CF 2D8C      MOV	R24,R12
    04D0 3B80      CPI	R24,0xB0
    04D1 F429      BNE	0x04D7
(0035) 	 {  
(0036)          uart_b0_flag=1;
    04D2 E081      LDI	R24,1
    04D3 93800072  STS	uart_b0_flag,R24
(0037) 		 uartSendByte(comm_tempRec);
    04D5 2D0C      MOV	R16,R12
    04D6 D05D      RCALL	_uartSendByte
(0038) 	 }
(0039) 	 if(comm_tempRec==0xb8)//表示停止充电
    04D7 2D8C      MOV	R24,R12
    04D8 3B88      CPI	R24,0xB8
    04D9 F429      BNE	0x04DF
(0040) 	 {
(0041) 	  	 uart_b8_flag=1;
    04DA E081      LDI	R24,1
    04DB 93800073  STS	uart_b8_flag,R24
(0042) 		 uartSendByte(0xb8);
    04DD EB08      LDI	R16,0xB8
    04DE D055      RCALL	_uartSendByte
(0043) 	 }
(0044) 	 
(0045) 	 if(comm_tempRec==0xf0)//正常
    04DF 2D8C      MOV	R24,R12
    04E0 3F80      CPI	R24,0xF0
    04E1 F429      BNE	0x04E7
(0046) 	 {  
(0047)          uart_normal_flag=1;
    04E2 E081      LDI	R24,1
    04E3 93800074  STS	uart_normal_flag,R24
(0048) 		 uartSendByte(comm_tempRec);
    04E5 2D0C      MOV	R16,R12
    04E6 D04D      RCALL	_uartSendByte
(0049) 	 }
(0050) 	 if(comm_tempRec==0xa0)//报警
    04E7 2D8C      MOV	R24,R12
    04E8 3A80      CPI	R24,0xA0
    04E9 F429      BNE	0x04EF
(0051) 	 {
(0052) 	  	 uart_alarm_flag=1;
    04EA E081      LDI	R24

⌨️ 快捷键说明

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