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

📄 send_485.s

📁 基于ATmega8开发的关于医疗康复的机器人
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module Send_485.c
	.area text(rom, con, rel)
	.dbfile F:\Work\Data\程序\修订版~1.1\Send_485.c
	.dbfunc e RS485_init _RS485_init fV
	.even
_RS485_init::
	.dbline -1
	.dbline 15
; /*****************************************************
; * File name      : Send_485.C
; * Description    : Header file of  main_H.H
; * Platform       : ICCAVR 
; * Author         : xiao xue      
; * Email          : ay1509@yahoo.com
; * Date           : 2008-03-13
; * Description    :485 Communications
; /********************头文件*************************/
; #include"main_H.h"
; #define fosc 8000000
; #define baud 9600
; /***************************485初始化***************************/
; void RS485_init(void)  
;  {
	.dbline 16
;     UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); 	//接收完成中断使能
	ldi R24,152
	out 0xa,R24
	.dbline 18
; 											//充许发送、充许接收 
;     UBRRL=(fosc/16/(baud+1))%256; 		  	//波特率为9600
	ldi R24,52
	out 0x9,R24
	.dbline 19
;     UBRRH=(fosc/16/(baud+1))/256;
	clr R2
	out 0x20,R2
	.dbline 20
;     UCSRC=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);   
	ldi R24,134
	out 0x20,R24
	.dbline 21
;     PORTD&=~0x04;  						  	//允许接收数据
	cbi 0x12,2
	.dbline 22
;     DDRD|=0x04;    							//数据方向
	sbi 0x11,2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e RS485_out_byte _RS485_out_byte fV
;           data -> R16
	.even
_RS485_out_byte::
	.dbline -1
	.dbline 26
; } 
; /******************485发送一个字节子程序************************/   
; void  RS485_out_byte(uchar data )  
; {
L3:
	.dbline 28
; 
;   while(!(UCSRA & (1<<UDRE)) );				//等待数据寄存器不为空
L4:
	.dbline 28
	sbis 0xb,5
	rjmp L3
X0:
	.dbline 29
;      UDR=data;
	out 0xc,R16
L6:
	.dbline 30
;   while(!(UCSRA & (BIT(TXC))));  			//等待USART发送完成
L7:
	.dbline 30
	sbis 0xb,6
	rjmp L6
X1:
	.dbline 31
;      UCSRA|=BIT(TXC);			 
	sbi 0xb,6
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbsym r data 16 c
	.dbend
	.dbfunc e RS485_out_6byte _RS485_out_6byte fV
;              i -> R20,R21
;          datas -> R10,R11
	.even
_RS485_out_6byte::
	rcall push_xgset300C
	movw R10,R16
	.dbline -1
	.dbline 37
; }
; 
; /**************************一次发送6个字节*********************/
; 
; void  RS485_out_6byte(uchar *datas )  
; {  
	.dbline 38
; 	uint i=0;
	clr R20
	clr R21
	.dbline 39
;  	CLI();							//关中断
	cli
	.dbline 40
;   	PORTD|=0x04;   					//允许发送
	sbi 0x12,2
	rjmp L11
L10:
	.dbline 41
;  	while(i<6 ){
	.dbline 42
;   		RS485_out_byte(*(datas+i));	//发送1个字节
	movw R30,R20
	add R30,R10
	adc R31,R11
	ldd R16,z+0
	rcall _RS485_out_byte
	.dbline 43
;  		i++;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 44
;   	} 
L11:
	.dbline 41
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	brlo L10
X2:
	.dbline 45
;  	delay_nms(5);					//延时
	ldi R16,5
	ldi R17,0
	rcall _delay_nms
	.dbline 46
;  	PORTD&=~0x04;  				 	//允许接收
	cbi 0x12,2
	.dbline 47
; 	SEI();
	sei
	.dbline -2
L9:
	.dbline 0 ; func end
	rjmp pop_xgset300C
	.dbsym r i 20 i
	.dbsym r datas 10 pc
	.dbend
	.dbfunc e Send_485 _Send_485 fV
	.even
_Send_485::
	.dbline -1
	.dbline 51
; } 
; /**************************485发送数据函数*****************/
; void Send_485(void)
; { 	
	.dbline 52
; 	RS485_out_6byte(moto1);			//给节点1发送数据
	ldi R16,<_moto1
	ldi R17,>_moto1
	rcall _RS485_out_6byte
	.dbline 53
;    	RS485_out_6byte(moto2);			//给节点2发送数据
	ldi R16,<_moto2
	ldi R17,>_moto2
	rcall _RS485_out_6byte
	.dbline 54
;     RS485_out_6byte(moto3);
	ldi R16,<_moto3
	ldi R17,>_moto3
	rcall _RS485_out_6byte
	.dbline 55
;  	RS485_out_6byte(moto4);
	ldi R16,<_moto4
	ldi R17,>_moto4
	rcall _RS485_out_6byte
	.dbline -2
L13:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 22
	rjmp _RS485_ISR
	.area text(rom, con, rel)
	.dbfile F:\Work\Data\程序\修订版~1.1\Send_485.c
	.dbfunc e RS485_ISR _RS485_ISR fV
	.even
_RS485_ISR::
	st -y,R2
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 60
; }
; /***************************中断接收服务子程序*******************/
; #pragma interrupt_handler RS485_ISR:iv_USART_RX
; void RS485_ISR(void)
;  {
	.dbline 61
;  CLI(); 							//关中断
	cli
	.dbline 62
;  PORTD&=~0x04; 						//允许接收
	cbi 0x12,2
	.dbline 63
;  getchar[RS_i]=UDR; 				//存储数据寄存器的值
	ldi R24,<_getchar
	ldi R25,>_getchar
	lds R30,_RS_i
	clr R31
	add R30,R24
	adc R31,R25
	in R2,0xc
	std z+0,R2
	.dbline 64
;  RS_i++;							//预备存储下一个
	lds R24,_RS_i
	subi R24,255    ; addi 1
	sts _RS_i,R24
	.dbline 65
;  if(RS_i==6) 						//接收6个后清零
	cpi R24,6
	brne L15
X3:
	.dbline 66
;  	{RS_i=0;flag=3;}		
	.dbline 66
	clr R2
	sts _RS_i,R2
	.dbline 66
	ldi R24,3
	sts _flag,R24
	.dbline 66
L15:
	.dbline 67
;  SEI();								//开中断
	sei
	.dbline -2
L14:
	.dbline 0 ; func end
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R2,y+
	reti
	.dbend
	.dbfunc e data_decide _data_decide fV
;           RS_j -> R16
	.even
_data_decide::
	.dbline -1
	.dbline 72
;  }
;  
;  /**********************接收数组判断存储子程序************************/
; void data_decide(void)
; {
	.dbline 73
; 	uchar RS_j=0;
	clr R16
	.dbline 74
; 	if(getchar[0]==0xaa){
	lds R24,_getchar
	cpi R24,170
	breq X15
	rjmp L18
X15:
X4:
	.dbline 74
	.dbline 75
; 		switch(getchar[1]){
	lds R18,_getchar+1
	clr R19
	cpi R18,45
	ldi R30,0
	cpc R19,R30
	brne X16
	rjmp L30
X16:
X5:
	ldi R24,45
	ldi R25,0
	cp R24,R18
	cpc R25,R19
	brlt L44
X6:
L43:
	cpi R18,30
	ldi R30,0
	cpc R19,R30
	breq L26
X7:
	rjmp L20
L44:
	cpi R18,60
	ldi R30,0
	cpc R19,R30
	brne X17
	rjmp L35
X17:
X8:
	cpi R18,60
	ldi R30,0
	cpc R19,R30
	brge X18
	rjmp L20
X18:
X9:
L45:
	cpi R18,75
	ldi R30,0
	cpc R19,R30
	brne X19
	rjmp L40
X19:
X10:
	rjmp L20
L25:
	.dbline 77
; 			case 0x1e:				//节点1
; 				while(RS_j<6){  
	.dbline 78
;   					get[0+RS_j]=getchar[RS_j];
	ldi R24,<_getchar
	ldi R25,>_getchar
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_get
	ldi R25,>_get
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 79
;     				RS_j++;
	inc R16
	.dbline 80
; 				}
L26:
	.dbline 77
	cpi R16,6
	brlo L25
X11:
	.dbline 81
; 				break;
	rjmp L21
L29:
	.dbline 83
; 			case 0x2d:				//节点2
; 				while(RS_j<6){  
	.dbline 84
;   					get[6+RS_j]=getchar[RS_j];
	ldi R24,<_getchar
	ldi R25,>_getchar
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_get+6
	ldi R25,>_get+6
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 85
;         			RS_j++;
	inc R16
	.dbline 86
; 				}
L30:
	.dbline 83
	cpi R16,6
	brlo L29
X12:
	.dbline 87
; 				break;
	rjmp L21
L34:
	.dbline 89
; 			case 0x3c:				//节点3
; 				while(RS_j<6){  
	.dbline 90
;   					get[12+RS_j]=getchar[RS_j];
	ldi R24,<_getchar
	ldi R25,>_getchar
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_get+12
	ldi R25,>_get+12
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 91
;         			RS_j++; 
	inc R16
	.dbline 92
; 				}
L35:
	.dbline 89
	cpi R16,6
	brlo L34
X13:
	.dbline 93
; 				break;
	rjmp L21
L39:
	.dbline 95
; 			case 0x4b:				//节点4
; 				while(RS_j<6){  
	.dbline 96
;   					get[18+RS_j]=getchar[RS_j];
	ldi R24,<_getchar
	ldi R25,>_getchar
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_get+18
	ldi R25,>_get+18
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 97
;         			RS_j++;    
	inc R16
	.dbline 98
;      			}//end while
L40:
	.dbline 95
	cpi R16,6
	brlo L39
X14:
	.dbline 99
; 				break;
L20:
L21:
	.dbline 101
; 		}//end switch
; 	}//end if
L18:
	.dbline -2
L17:
	.dbline 0 ; func end
	ret
	.dbsym r RS_j 16 c
	.dbend
	.dbfunc e moto_stop _moto_stop fV
	.even
_moto_stop::
	.dbline -1
	.dbline 106
; }
; 
; /***************************各电机停止函数,相关变量清零***********/
; void moto_stop(void)
; {
	.dbline 107
; 	moto1[2]=0xb4;      //向各节点停止命令
	ldi R24,180
	sts _moto1+2,R24
	.dbline 108
;    	moto2[2]=0xb4;     
	sts _moto2+2,R24
	.dbline 109
;    	moto3[2]=0xb4;	 	
	sts _moto3+2,R24
	.dbline 110
;    	moto4[2]=0xb4;   	  
	sts _moto4+2,R24
	.dbline 112
;     
;    	get[2]=0x00;		//接收控制指令数组清零
	clr R2

⌨️ 快捷键说明

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