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

📄 can.s

📁 不可多得的atmel公司canbus通讯程序(at90can128)
💻 S
字号:
	.module CAN.C
	.area text(rom, con, rel)
	.dbfile D:\CANBUS\数据帧\查询\单向通讯\结点2\CAN.C
	.area data(ram, con, rel)
	.dbfile D:\CANBUS\数据帧\查询\单向通讯\结点2\CAN.C
_send_Buf::
	.blkb 2
	.area idata
	.byte 49,50
	.area data(ram, con, rel)
	.dbfile D:\CANBUS\数据帧\查询\单向通讯\结点2\CAN.C
	.blkb 2
	.area idata
	.byte 51,52
	.area data(ram, con, rel)
	.dbfile D:\CANBUS\数据帧\查询\单向通讯\结点2\CAN.C
	.blkb 2
	.area idata
	.byte 53,54
	.area data(ram, con, rel)
	.dbfile D:\CANBUS\数据帧\查询\单向通讯\结点2\CAN.C
	.blkb 2
	.area idata
	.byte 55,56
	.area data(ram, con, rel)
	.dbfile D:\CANBUS\数据帧\查询\单向通讯\结点2\CAN.C
	.dbsym e send_Buf _send_Buf A[8:8]c
	.area text(rom, con, rel)
	.dbfile D:\CANBUS\数据帧\查询\单向通讯\结点2\CAN.C
	.dbfunc e CAN_ClrMailBox _CAN_ClrMailBox fV
;    mob_channel -> R16
;       mob_data -> R18
	.even
_CAN_ClrMailBox::
	.dbline -1
	.dbline 34
; //////////////////////////////////////////////////////////
; //单向查询
; //说明:
; //		本程序是结点2,只负责发送
; //////////////////////////////////////////////////////////
; 
; 
; //-------------------------------------------------------------------
; //					查询发送方式1总结:
; //检测上次发送完成(TXOK)
; //前提条件:CAN_Init()子程序中,必须事先将CANPAGE对象的TXOK位置位
; //-------------------------------------------------------------------
; //	IF 上次发送完成(TXOK) THEN
; //		(1)、清除TXOK
; //		(2)、填写发送数据
; //		(3)、启动发送
; 
; //-------------------------------------------------------------------
; //					查询发送方式2总结:
; //while (当前发送完成)
; //-------------------------------------------------------------------
; //	(1)、填写发送数据
; //	(2)、启动发送
; //	(3)、while (TXOK)
; //	(4)、清除TXOK
; 
; #define _CAN_H
; #include "AT90CAN128.H"
; 
; uint8 send_Buf[8] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38};
; 
; 
; void CAN_ClrMailBox(void) 
; { 
	.dbline 38
; 	uint8 mob_channel;
; 	uint8 mob_data; 
; 
; 	for (mob_channel = 0 ; mob_channel < 15 ; mob_channel++)
	clr R16
	xjmp L7
L4:
	.dbline 39
; 	{
	.dbline 40
; 		CANPAGE = (mob_channel << 4);
	mov R24,R16
	andi R24,#0x0F
	swap R24
	sts 237,R24
	.dbline 41
; 		CANIDT4        = 0; 
	clr R2
	sts 240,R2
	.dbline 42
; 		CANIDT3        = 0; 
	sts 241,R2
	.dbline 43
; 		CANIDT2        = 0; 
	sts 242,R2
	.dbline 44
; 		CANIDT1        = 0; 
	sts 243,R2
	.dbline 45
; 		CANIDM4        = 0; 
	sts 244,R2
	.dbline 46
; 		CANIDM3        = 0; 
	sts 245,R2
	.dbline 47
; 		CANIDM2        = 0; 
	sts 246,R2
	.dbline 48
; 		CANIDM1        = 0; 
	sts 247,R2
	.dbline 49
; 		CANSTMOB = 0; 
	sts 238,R2
	.dbline 50
; 		CANCDMOB = 0; 
	sts 239,R2
	.dbline 51
; 		for (mob_data = 0; mob_data < 8; mob_data++) 
	clr R18
	xjmp L11
L8:
	.dbline 52
;    			CANMSG = 0; 
	clr R2
	sts 250,R2
L9:
	.dbline 51
	inc R18
L11:
	.dbline 51
	cpi R18,8
	brlo L8
X0:
	.dbline 53
; 	}
L5:
	.dbline 38
	inc R16
L7:
	.dbline 38
	cpi R16,15
	brlo L4
X1:
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbsym r mob_channel 16 c
	.dbsym r mob_data 18 c
	.dbend
	.dbfunc e CAN_Init _CAN_Init fV
	.even
_CAN_Init::
	.dbline -1
	.dbline 58
; } 
; 
; 
; void CAN_Init(void)
; {
	.dbline 59
; 	CAN_SOFT_RESET();
	ldi R24,1
	sts 216,R24
L13:
	.dbline 60
; 	while (CANGSTA & (1 << ENFG));
L14:
	.dbline 60
	lds R2,217
	sbrc R2,2
	rjmp L13
X2:
	.dbline 61
; 	CAN_ClrMailBox();
	xcall _CAN_ClrMailBox
	.dbline 62
; 	CANBT1 = 0x02;
	ldi R24,2
	sts 226,R24
	.dbline 63
; 	CANBT2 = 0x04;
	ldi R24,4
	sts 227,R24
	.dbline 64
; 	CANBT3 = 0x13;
	ldi R24,19
	sts 228,R24
	.dbline 65
; 	CANTCON = 0xFF;
	ldi R24,255
	sts 229,R24
	.dbline 66
; 	CANPAGE = 0x00;
	clr R2
	sts 237,R2
	.dbline 67
; 	CANSTMOB = 0x00;
	sts 238,R2
	.dbline 68
; 	CANIDT4 = 0x00;
	sts 240,R2
	.dbline 69
; 	CANIDT3 = 0x00; 
	sts 241,R2
	.dbline 70
; 	CANIDT2 = 0x40;
	ldi R24,64
	sts 242,R24
	.dbline 71
; 	CANIDT1 = 0x02;
	ldi R24,2
	sts 243,R24
	.dbline 72
; 	CANSTMOB = BIT(TXOK);     
	ldi R24,64
	sts 238,R24
	.dbline 73
; 	CAN_START();
	lds R24,216
	ori R24,2
	sts 216,R24
L16:
	.dbline 74
; 	while (!(CANGSTA & (1 << ENFG)));
L17:
	.dbline 74
	lds R2,217
	sbrs R2,2
	rjmp L16
X3:
	.dbline -2
L12:
	.dbline 0 ; func end
	ret
	.dbend
; }
; 
; 
; /*
; #pragma interrupt_handler AT90CAN128_ISR:iv_CANIT
; void AT90CAN128_ISR(void)
; {
; 	uint8 i;
; 	uint8 save_canpage;
; 
;    save_canpage = CANPAGE;
; // echo receive data on channel 0 reception 
;    
; 	CANPAGE = (0 << 4);						// CHNB=0x00; select channel 0 
; 	if (CANSTMOB & (1 << RXOK))
; 	{
; 		CHA_Init();
;     USART1_send_buffer[0] = CANIDT1;
;     USART1_send_buffer[1] = CANIDT2;
; 		for (i = 0 ; i < 8 ; i++) 
; 			USART1_send_buffer[2+i] = CANMSG;	// save receive data 
;     USART1_Begin_Send();
;         
;         
; 		CANPAGE = (1 << 4);						// CHNB=0x00; select channel 1    
; // Channel 1 configuration 
; 		CANCDMOB = 0x00;						// reset channel 1 configuration
; 		for (i = 0 ; i < 8 ; i++) 
; 			CANMSG = i;							// load saved data 
; 		CANCDMOB |= 0x08;						//	DLC_MAX; /* transmit 8 bytes 
; 		CANCDMOB |= 0x40;						//	CH_TxENA; /* emission enabled 
; 		CANEN2 |= (1 << 1);						// channel 1 enable 
; 		CANSTMOB=0x00;							// reset channel 1 status 
; 
;     
; 	}   
; 	CANPAGE = (0 << 4);						// CHNB=0x00; select channel 0 
; 	CANCDMOB = 0x00;							//	CH_DISABLE;  reset channel 0 configuration 
; 	CANCDMOB |= 0x08;						//	DLC_MAX;  receive 8 bytes 
; 	CANCDMOB |= 0x80;						//CH_RxENA;  reception enable 
; 	CANEN2 |= (1 << 0);						// channel 0 enable 
; 	CANSTMOB=0x00;							// reset channel 0 status 
; 	CANPAGE= save_canpage; 					// restore saved context 
; 	CANGIT = 0x00; 							// reset all flags    
; }   
; */

⌨️ 快捷键说明

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