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

📄 can.lss

📁 AT90CAN128的CAN通信源码测试成功
💻 LSS
📖 第 1 页 / 共 2 页
字号:
{
 27a:	80 91 12 01 	lds	r24, 0x0112
 27e:	8c 3c       	cpi	r24, 0xCC	; 204
 280:	a9 f4       	brne	.+42     	; 0x2ac <can_rx_deal+0x32>
	
	if(can_rx_data[0]==0Xcc)   //FET控制
	{
		//if(can_rx_data[1]==0xb0)   
		{
			switch(can_rx_data[1])
 282:	80 91 13 01 	lds	r24, 0x0113
 286:	80 3b       	cpi	r24, 0xB0	; 176
 288:	29 f0       	breq	.+10     	; 0x294 <can_rx_deal+0x1a>
 28a:	88 3b       	cpi	r24, 0xB8	; 184
 28c:	39 f0       	breq	.+14     	; 0x29c <can_rx_deal+0x22>
 28e:	80 3a       	cpi	r24, 0xA0	; 160
 290:	c9 f4       	brne	.+50     	; 0x2c4 <can_rx_deal+0x4a>
 292:	08 c0       	rjmp	.+16     	; 0x2a4 <can_rx_deal+0x2a>
			{
				case 0xb0: close_flag=1;               //通道关闭
 294:	81 e0       	ldi	r24, 0x01	; 1
 296:	80 93 20 01 	sts	0x0120, r24
 29a:	08 95       	ret
				break;
				
				case 0xb8: open_flag=1;                 //通道开启
 29c:	81 e0       	ldi	r24, 0x01	; 1
 29e:	80 93 1d 01 	sts	0x011D, r24
 2a2:	08 95       	ret
				break;
				
				case 0xa0: ad_flag=1;                  //AD采集启动
 2a4:	81 e0       	ldi	r24, 0x01	; 1
 2a6:	80 93 1f 01 	sts	0x011F, r24
 2aa:	08 95       	ret
				break;
			}
		}
		 
	}
	else if(can_rx_data[0]==0XDD)  //太阳能方阵开路电压采集
 2ac:	80 91 12 01 	lds	r24, 0x0112
 2b0:	8d 3d       	cpi	r24, 0xDD	; 221
 2b2:	41 f4       	brne	.+16     	; 0x2c4 <can_rx_deal+0x4a>
	     {
			if(can_rx_data[1]==address)
 2b4:	90 91 13 01 	lds	r25, 0x0113
 2b8:	80 91 1e 01 	lds	r24, 0x011E
 2bc:	98 17       	cp	r25, r24
 2be:	11 f4       	brne	.+4      	; 0x2c4 <can_rx_deal+0x4a>
			{
				switch(can_rx_data[2])
 2c0:	80 91 14 01 	lds	r24, 0x0114
 2c4:	08 95       	ret

000002c6 <__vector_18>:
	
}


ISR(CANIT_vect)                     //CAN接收中断处理函数
{
 2c6:	1f 92       	push	r1
 2c8:	0f 92       	push	r0
 2ca:	0f b6       	in	r0, 0x3f	; 63
 2cc:	0f 92       	push	r0
 2ce:	11 24       	eor	r1, r1
 2d0:	2f 93       	push	r18
 2d2:	3f 93       	push	r19
 2d4:	4f 93       	push	r20
 2d6:	5f 93       	push	r21
 2d8:	6f 93       	push	r22
 2da:	7f 93       	push	r23
 2dc:	8f 93       	push	r24
 2de:	9f 93       	push	r25
 2e0:	af 93       	push	r26
 2e2:	bf 93       	push	r27
 2e4:	ef 93       	push	r30
 2e6:	ff 93       	push	r31
	
	
  uchar i , num_i; 
  CANGIE &= ~(1<<ENRX);                  //关接收中断**** 
 2e8:	80 91 db 00 	lds	r24, 0x00DB
 2ec:	8f 7d       	andi	r24, 0xDF	; 223
 2ee:	80 93 db 00 	sts	0x00DB, r24
  num_i = CANSIT2; 
 2f2:	80 91 e0 00 	lds	r24, 0x00E0


//----------------------------------------------------- 
    if (num_i & (1<<SIT0)) 
 2f6:	80 ff       	sbrs	r24, 0
 2f8:	0f c0       	rjmp	.+30     	; 0x318 <__vector_18+0x52>
  { 

    i=0; 
    CANPAGE = i<<4; 
 2fa:	10 92 ed 00 	sts	0x00ED, r1
 2fe:	20 e0       	ldi	r18, 0x00	; 0
 300:	30 e0       	ldi	r19, 0x00	; 0
    for(num_i = 0; num_i < 8; num_i++) 
    { 
      can_rx_data[num_i]=CANMSG;           //取得8个字节的数据 
 302:	80 91 fa 00 	lds	r24, 0x00FA
 306:	f9 01       	movw	r30, r18
 308:	ee 5e       	subi	r30, 0xEE	; 238
 30a:	fe 4f       	sbci	r31, 0xFE	; 254
 30c:	80 83       	st	Z, r24
 30e:	2f 5f       	subi	r18, 0xFF	; 255
 310:	3f 4f       	sbci	r19, 0xFF	; 255
    if (num_i & (1<<SIT0)) 
  { 

    i=0; 
    CANPAGE = i<<4; 
    for(num_i = 0; num_i < 8; num_i++) 
 312:	28 30       	cpi	r18, 0x08	; 8
 314:	31 05       	cpc	r19, r1
 316:	a9 f7       	brne	.-22     	; 0x302 <__vector_18+0x3c>
    { 
      can_rx_data[num_i]=CANMSG;           //取得8个字节的数据 
    } 
  } 
	can_rx_deal() ;                           //处理接收指令
 318:	0e 94 3d 01 	call	0x27a	; 0x27a <can_rx_deal>
	
	CANPAGE = 0x00; 
 31c:	10 92 ed 00 	sts	0x00ED, r1
    CANSTMOB &= ~(1<<RXOK);                //清中断标志**** 
 320:	80 91 ee 00 	lds	r24, 0x00EE
 324:	8f 7d       	andi	r24, 0xDF	; 223
 326:	80 93 ee 00 	sts	0x00EE, r24
    CANCDMOB = 0x98;                      //接收使能  2.0B DLC=8
 32a:	88 e9       	ldi	r24, 0x98	; 152
 32c:	80 93 ef 00 	sts	0x00EF, r24
	CANGIE |= (1<<ENRX);                   //开中断 
 330:	80 91 db 00 	lds	r24, 0x00DB
 334:	80 62       	ori	r24, 0x20	; 32
 336:	80 93 db 00 	sts	0x00DB, r24
	
}
 33a:	ff 91       	pop	r31
 33c:	ef 91       	pop	r30
 33e:	bf 91       	pop	r27
 340:	af 91       	pop	r26
 342:	9f 91       	pop	r25
 344:	8f 91       	pop	r24
 346:	7f 91       	pop	r23
 348:	6f 91       	pop	r22
 34a:	5f 91       	pop	r21
 34c:	4f 91       	pop	r20
 34e:	3f 91       	pop	r19
 350:	2f 91       	pop	r18
 352:	0f 90       	pop	r0
 354:	0f be       	out	0x3f, r0	; 63
 356:	0f 90       	pop	r0
 358:	1f 90       	pop	r1
 35a:	18 95       	reti

0000035c <can_send_data>:


void can_send_data(void)                           //发送前数据整理
{
 35c:	8d ed       	ldi	r24, 0xDD	; 221
 35e:	80 93 13 01 	sts	0x0113, r24
	can_tx_data[0]=0xDD; 
	can_tx_data[1]=0x00;                                   //地址
 362:	10 92 14 01 	sts	0x0114, r1
	can_tx_data[2]=0x02;
 366:	82 e0       	ldi	r24, 0x02	; 2
 368:	80 93 15 01 	sts	0x0115, r24
	can_tx_data[3]=0x01;                                 //ad高位
 36c:	81 e0       	ldi	r24, 0x01	; 1
 36e:	80 93 16 01 	sts	0x0116, r24
	can_tx_data[4]=0x03;                                 //ad低位 
 372:	83 e0       	ldi	r24, 0x03	; 3
 374:	80 93 17 01 	sts	0x0117, r24
	can_tx_data[5]=0x00;
 378:	10 92 18 01 	sts	0x0118, r1
	can_tx_data[6]=0x00;
 37c:	10 92 19 01 	sts	0x0119, r1
	can_tx_data[7]=0xff;
 380:	8f ef       	ldi	r24, 0xFF	; 255
 382:	80 93 1a 01 	sts	0x011A, r24
}
 386:	08 95       	ret

00000388 <MOB_send>:


void MOB_send (void)                       //CAN发送函数
{ 
 388:	80 91 db 00 	lds	r24, 0x00DB
 38c:	8f 7d       	andi	r24, 0xDF	; 223
 38e:	80 93 db 00 	sts	0x00DB, r24
  CANGIE &= ~(1<<ENRX);                   //关接收中断
  uint i,n=4; 

  CANPAGE = (n<<4);                      //MOB_n, auto increment, index 0 
 392:	80 e4       	ldi	r24, 0x40	; 64
 394:	80 93 ed 00 	sts	0x00ED, r24
  if (CANSTMOB & (1<<TXOK)) 
 398:	80 91 ee 00 	lds	r24, 0x00EE
 39c:	86 ff       	sbrs	r24, 6
 39e:	2f c0       	rjmp	.+94     	; 0x3fe <MOB_send+0x76>
  { 
 // CANCDMOB= 0x18; 
  CANSTMOB &= ~(1<<TXOK); 
 3a0:	80 91 ee 00 	lds	r24, 0x00EE
 3a4:	8f 7b       	andi	r24, 0xBF	; 191
 3a6:	80 93 ee 00 	sts	0x00EE, r24
}


void can_send_data(void)                           //发送前数据整理
{
	can_tx_data[0]=0xDD; 
 3aa:	8d ed       	ldi	r24, 0xDD	; 221
 3ac:	80 93 13 01 	sts	0x0113, r24
	can_tx_data[1]=0x00;                                   //地址
 3b0:	10 92 14 01 	sts	0x0114, r1
	can_tx_data[2]=0x02;
 3b4:	82 e0       	ldi	r24, 0x02	; 2
 3b6:	80 93 15 01 	sts	0x0115, r24
	can_tx_data[3]=0x01;                                 //ad高位
 3ba:	81 e0       	ldi	r24, 0x01	; 1
 3bc:	80 93 16 01 	sts	0x0116, r24
	can_tx_data[4]=0x03;                                 //ad低位 
 3c0:	83 e0       	ldi	r24, 0x03	; 3
 3c2:	80 93 17 01 	sts	0x0117, r24
	can_tx_data[5]=0x00;
 3c6:	10 92 18 01 	sts	0x0118, r1
	can_tx_data[6]=0x00;
 3ca:	10 92 19 01 	sts	0x0119, r1
	can_tx_data[7]=0xff;
 3ce:	8f ef       	ldi	r24, 0xFF	; 255
 3d0:	80 93 1a 01 	sts	0x011A, r24
 3d4:	20 e0       	ldi	r18, 0x00	; 0
 3d6:	30 e0       	ldi	r19, 0x00	; 0
 // CANCDMOB= 0x18; 
  CANSTMOB &= ~(1<<TXOK); 
  can_send_data();                                   //发送前整理
  for(i = 0; i < 8; i++) 
	{
		CANMSG = can_tx_data[i]; 
 3d8:	f9 01       	movw	r30, r18
 3da:	ed 5e       	subi	r30, 0xED	; 237
 3dc:	fe 4f       	sbci	r31, 0xFE	; 254
 3de:	80 81       	ld	r24, Z
 3e0:	80 93 fa 00 	sts	0x00FA, r24
  if (CANSTMOB & (1<<TXOK)) 
  { 
 // CANCDMOB= 0x18; 
  CANSTMOB &= ~(1<<TXOK); 
  can_send_data();                                   //发送前整理
  for(i = 0; i < 8; i++) 
 3e4:	2f 5f       	subi	r18, 0xFF	; 255
 3e6:	3f 4f       	sbci	r19, 0xFF	; 255
 3e8:	28 30       	cpi	r18, 0x08	; 8
 3ea:	31 05       	cpc	r19, r1
 3ec:	a9 f7       	brne	.-22     	; 0x3d8 <MOB_send+0x50>
	{
		CANMSG = can_tx_data[i]; 
	}
  CANCDMOB = 0x58;                               //帧发送  DLC=8
 3ee:	88 e5       	ldi	r24, 0x58	; 88
 3f0:	80 93 ef 00 	sts	0x00EF, r24
  CANGIE |=(1<<ENRX);                            //开接收中断
 3f4:	80 91 db 00 	lds	r24, 0x00DB
 3f8:	80 62       	ori	r24, 0x20	; 32
 3fa:	80 93 db 00 	sts	0x00DB, r24
 3fe:	08 95       	ret

00000400 <USART_Transmit>:



//---------------------串口测试相关函数------------------------------
void USART_Transmit(uchar data)
{
 400:	98 2f       	mov	r25, r24
	while(!(UCSR1A&_BV(UDRE1)));
 402:	80 91 c8 00 	lds	r24, 0x00C8
 406:	85 ff       	sbrs	r24, 5
 408:	fc cf       	rjmp	.-8      	; 0x402 <USART_Transmit+0x2>
	
	UDR1=data;
 40a:	90 93 ce 00 	sts	0x00CE, r25
	
	
}
 40e:	08 95       	ret

00000410 <__vector_32>:
ISR(USART1_RX_vect)
{
 410:	1f 92       	push	r1
 412:	0f 92       	push	r0
 414:	0f b6       	in	r0, 0x3f	; 63
 416:	0f 92       	push	r0
 418:	11 24       	eor	r1, r1
 41a:	8f 93       	push	r24
 41c:	9f 93       	push	r25
 41e:	ef 93       	push	r30
 420:	ff 93       	push	r31
	uchar status,data;
	status=UCSR1A;
 422:	80 91 c8 00 	lds	r24, 0x00C8
	data=UDR1;
 426:	90 91 ce 00 	lds	r25, 0x00CE
	
	if((status&(_BV(FE1)|_BV(UPE1)|_BV(DOR1)))==0)
 42a:	8c 71       	andi	r24, 0x1C	; 28
 42c:	f1 f4       	brne	.+60     	; 0x46a <__vector_32+0x5a>
	
		{
	
	        rx_buffer[rx_counter]=data;
 42e:	e0 91 21 01 	lds	r30, 0x0121
 432:	f0 e0       	ldi	r31, 0x00	; 0
 434:	ec 5e       	subi	r30, 0xEC	; 236
 436:	fe 4f       	sbci	r31, 0xFE	; 254
 438:	90 83       	st	Z, r25
			
			rx_counter++;
 43a:	80 91 21 01 	lds	r24, 0x0121
 43e:	8f 5f       	subi	r24, 0xFF	; 255
 440:	80 93 21 01 	sts	0x0121, r24
			
			switch(rx_counter)
 444:	80 91 21 01 	lds	r24, 0x0121
 448:	81 30       	cpi	r24, 0x01	; 1
 44a:	19 f0       	breq	.+6      	; 0x452 <__vector_32+0x42>
 44c:	85 30       	cpi	r24, 0x05	; 5
 44e:	69 f4       	brne	.+26     	; 0x46a <__vector_32+0x5a>
 450:	05 c0       	rjmp	.+10     	; 0x45c <__vector_32+0x4c>
			{
				case 1:
						if(data!=0XBB)
 452:	9b 3b       	cpi	r25, 0xBB	; 187
 454:	51 f0       	breq	.+20     	; 0x46a <__vector_32+0x5a>
						rx_counter=0;
 456:	10 92 21 01 	sts	0x0121, r1
 45a:	07 c0       	rjmp	.+14     	; 0x46a <__vector_32+0x5a>
					break;
				
				case 5:
						if(data==0XFF)
 45c:	9f 3f       	cpi	r25, 0xFF	; 255
 45e:	29 f4       	brne	.+10     	; 0x46a <__vector_32+0x5a>
						{
							rx_counter=0;
 460:	10 92 21 01 	sts	0x0121, r1
							usart1_flag=1;
 464:	81 e0       	ldi	r24, 0x01	; 1
 466:	80 93 10 01 	sts	0x0110, r24
						}	
					break;
			}
		}
}
 46a:	ff 91       	pop	r31
 46c:	ef 91       	pop	r30
 46e:	9f 91       	pop	r25
 470:	8f 91       	pop	r24
 472:	0f 90       	pop	r0
 474:	0f be       	out	0x3f, r0	; 63
 476:	0f 90       	pop	r0
 478:	1f 90       	pop	r1
 47a:	18 95       	reti

0000047c <USART_init>:
void USART_init(void)
{	
 47c:	10 92 c8 00 	sts	0x00C8, r1
	                                        
	
	UCSR1A= 0X00 ;                                        
	UCSR1B= _BV(RXCIE1)|_BV(RXEN1)|_BV(TXEN1)|_BV(TXCIE1);          //发送允许,接收允许 发送中断使能,接收中断使能
 480:	88 ed       	ldi	r24, 0xD8	; 216
 482:	80 93 c9 00 	sts	0x00C9, r24
	UCSR1C= _BV(UCSZ11)|_BV(UCSZ10);                                //异步通信模式;通信参数 8位数据位1位停止位,无校验
 486:	86 e0       	ldi	r24, 0x06	; 6
 488:	80 93 ca 00 	sts	0x00CA, r24
	UBRR1H= 0x00;
 48c:	10 92 cd 00 	sts	0x00CD, r1
	UBRR1L= 0x4D;
 490:	8d e4       	ldi	r24, 0x4D	; 77
 492:	80 93 cc 00 	sts	0x00CC, r24
}
 496:	08 95       	ret

00000498 <adc_init>:



/**********************AD采集相关函数*****************************/
void adc_init(void)                 //初始化函数
{	
 498:	10 ba       	out	0x10, r1	; 16
	DDRF=0X00;
	PORTF=0X00;                    //输入禁止上拉
 49a:	11 ba       	out	0x11, r1	; 17
	ADCSRA=0x00;                 //暂时关闭AD

⌨️ 快捷键说明

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