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

📄 comm.s

📁 一个正在应用的步进电机控制程序,包括电机的调速,正反,细分,通讯控制
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module comm.c
	.area data(ram, con, rel)
	.area vector(rom, abs)
	.org 44
	jmp _serialri_int
	.area data(ram, con, rel)
	.area vector(rom, abs)
	.org 52
	jmp _serialti_int
	.area data(ram, con, rel)
	.area text(rom, con, rel)
	.dbfile C:\BJQD\comm.c
	.dbfunc e serialti_int _serialti_int fV
;              i -> <dead>
	.even
_serialti_int::
	st -y,R2
	st -y,R3
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 88
; /*******************************************************
; /*ICC-AVR application builder : 2004-3-11 12:02:11
; // Target : atMega16
; // Crystal: 8.0000Mhz
; 通讯模块  单工双向485接口
; ******************************************************/
; #include <string.h>
; #include <iom16v.h>
; #include <math.h>
; #include <stdlib.h>
; #include <macros.h>
; #include <eeprom.h>
; #include "eeprom_l.h"
; #include "comm.h"
; #include "main.h"
; #include "delay.h"
; #include "key.h"
; 	 
; #pragma data:data
; unsigned char state2;
; //state2.0 disable_data    //1:输入数据无效,0有效;
; //state2.1 remote		   //1:遥控输入有效,0:本地输入有效
; //state2.7 p99			   //P99指令使能
; unsigned char state1;		   				   					  
; //state1.2 PE  
; //state1.3 DOR
; //state1.4 FE
; //state1.5 
; //state1.6 
; unsigned char pump_tab;		//机器号								   
; extern unsigned int speed;
; extern unsigned char state_other;
; extern unsigned char state0;
; extern unsigned char key;
; extern unsigned char in_out_number;
; extern unsigned char state;
; //state0.5接收消息有效标志
; 
; /* 通信变量定义 */
; char txd_frm[15];         //物理层发送缓冲区
; char txd_frm_len;          //物理层发送数据长度
; char rxd_frm[15];         //物理层接收缓冲区
; char rxd_frm_len;          //物理层接收数据长度
; char tx485_busy;		   //485发送工作判忙
; char txd_cnt;			   //发送数据计数器
; char rxd_cnt;			   //接收数据计数器
; char rxd_ins_flag;		   //一帧接收数据中有E8或E9标志
; char txd_ins_flag;		   //一帧发送数据中有E8或E9标志
; char txd_ins_data;		   //发送数据
; char rxd_data;			   //接收数据
; char mac_txd_th;		   //发送状态 0发送完毕,1发送帧头,2发送中间数据
; char rxd_h_ok;			   //接收开始标志
; char fcs1;				   //异或校验
; char rxd_mesg_addr;		   //接收地址
; char rxd_mesg_len;		   //应用层接收数据长度
; char rxd_mesg[15];		   //应用层接收数据缓冲区
; char txd_mesg_addr;		   //发送地址
; char txd_mesg_len;		   //应用层发送数据长度
; char txd_mesg[15];		   //应用层发送数据缓冲区
; /*********任务管理*************/
; char pri[16];
; char act[16];           //任务寄存器
; char rxd_llc_job;       //物理层收任务寄存器
; char txd_llc_job;       //物理层发任务寄存器
; char rs485_app_job;     //应用层任务寄存器
; char att_n_max;
; extern struct cal
;        {
; 	   unsigned  int       test_time;
; 	   unsigned  long int  dispvol;
; 	   unsigned  long int  test_dispvol;
; 	   float               dispk;
; 	   unsigned  long int  run_time;
; 	   };
; extern struct cal cal0;
; /*****************************************************************
; 功能: serial_int
; 描述: 运行串行口 FSAs.
; 参数: 无.
; 返回无.
; 影响无.
; *****************************************************************/
; #pragma interrupt_handler serialri_int:iv_USART_RX
; #pragma interrupt_handler serialti_int:iv_USART_TX
; 
; /* 通信物理层发送中断程序模块 */
; void serialti_int(void)
; { 
	.dbline 90
; 	char i;
; 	    UCSRA=RS485_UCSRA|0b01000000;   /*清发送完中断标志位*/
	ldi R24,64
	out 0xb,R24
	.dbline 91
; 		if(mac_txd_th==1)
	lds R24,_mac_txd_th
	cpi R24,1
	brne L2
	.dbline 92
; 		{ UDR=0xe9;
	.dbline 92
	ldi R24,233
	out 0xc,R24
	.dbline 93
; 		  txd_cnt=0;
	clr R2
	sts _txd_cnt,R2
	.dbline 94
; 		  txd_ins_flag=0;
	sts _txd_ins_flag,R2
	.dbline 95
; 		  tx485_busy=1;
	ldi R24,1
	sts _tx485_busy,R24
	.dbline 96
; 		  mac_txd_th=2;
	ldi R24,2
	sts _mac_txd_th,R24
	.dbline 97
; 		}
	xjmp L3
L2:
	.dbline 99
; 		else
; 		{ if(mac_txd_th==2)
	.dbline 99
	lds R24,_mac_txd_th
	cpi R24,2
	breq X0
	xjmp L4
X0:
	.dbline 100
; 		  { if(txd_ins_flag==1)
	.dbline 100
	lds R24,_txd_ins_flag
	cpi R24,1
	brne L6
	.dbline 101
; 		    { txd_ins_flag=0;
	.dbline 101
	clr R2
	sts _txd_ins_flag,R2
	.dbline 102
; 			  UDR=txd_ins_data;
	lds R2,_txd_ins_data
	out 0xc,R2
	.dbline 103
; 			}
	xjmp L5
L6:
	.dbline 105
; 			else
; 			{ if(txd_cnt<=(txd_frm_len-1))
	.dbline 105
	lds R24,_txd_frm_len
	subi R24,1
	lds R2,_txd_cnt
	cp R24,R2
	brlo L8
	.dbline 106
; 			  { if(txd_frm[txd_cnt]==0xe8||txd_frm[txd_cnt]==0xe9)
	.dbline 106
	ldi R24,<_txd_frm
	ldi R25,>_txd_frm
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	mov R24,R2
	cpi R24,232
	breq L12
	cpi R24,233
	brne L10
L12:
	.dbline 107
; 			    { txd_ins_flag=1;
	.dbline 107
	ldi R24,1
	sts _txd_ins_flag,R24
	.dbline 108
;                   txd_ins_data=txd_frm[txd_cnt]-0xe8;
	ldi R24,<_txd_frm
	ldi R25,>_txd_frm
	lds R30,_txd_cnt
	clr R31
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	subi R24,232
	sts _txd_ins_data,R24
	.dbline 109
;                   UDR=0xe8;
	ldi R24,232
	out 0xc,R24
	.dbline 110
; 				}
	xjmp L11
L10:
	.dbline 112
; 				else
; 				{ UDR=txd_frm[txd_cnt];}
	.dbline 112
	ldi R24,<_txd_frm
	ldi R25,>_txd_frm
	lds R30,_txd_cnt
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	out 0xc,R2
	.dbline 112
L11:
	.dbline 113
; 				txd_cnt=txd_cnt+1;
	lds R24,_txd_cnt
	subi R24,255    ; addi 1
	sts _txd_cnt,R24
	.dbline 114
; 			  }
	xjmp L5
L8:
	.dbline 116
; 			  else
; 			  { tx485_busy=0;
	.dbline 116
	clr R2
	sts _tx485_busy,R2
	.dbline 117
; 			    mac_txd_th=0;
	sts _mac_txd_th,R2
	.dbline 118
; 				PORTC&=~(1<<DE_485);
	cbi 0x15,0
	.dbline 119
; 			  }
	.dbline 120
; 			}
	.dbline 121
; 		  }
	xjmp L5
L4:
	.dbline 123
; 		  else
; 		  { tx485_busy=0;
	.dbline 123
	clr R2
	sts _tx485_busy,R2
	.dbline 124
; 		    mac_txd_th=0;
	sts _mac_txd_th,R2
	.dbline 125
; 			PORTC&=~(1<<DE_485);
	cbi 0x15,0
	.dbline 126
; 		  }
L5:
	.dbline 127
L3:
	.dbline -2
L1:
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbsym l i 1 c
	.dbend
	.dbfunc e serialri_int _serialri_int fV
;              i -> <dead>
	.even
_serialri_int::
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 132
; 		}
; }
; 
; /* 通信物理层接收中断程序模块 */
; void serialri_int(void)
; {
	.dbline 134
; 	char i;
; 	    UCSRA=RS485_UCSRA&0b00111111;   /*清接收完中断标志位*/
	clr R2
	out 0xb,R2
	.dbline 135
; 		rxd_data=UDR;
	in R2,0xc
	sts _rxd_data,R2
	.dbline 136
; 		if(tx485_busy!=1)
	lds R24,_tx485_busy
	cpi R24,1
	brne X1
	xjmp L14
X1:
	.dbline 137
; 		{ if(rxd_data==0xe9)
	.dbline 137
	mov R24,R2
	cpi R24,233
	brne L16
	.dbline 138
; 		  { rxd_h_ok=1;
	.dbline 138
	ldi R24,1
	sts _rxd_h_ok,R24
	.dbline 139
;             rxd_cnt=0;
	clr R2
	sts _rxd_cnt,R2
	.dbline 140
; 			rxd_ins_flag=0;
	sts _rxd_ins_flag,R2
	.dbline 141
; 			rxd_frm_len=0;
	sts _rxd_frm_len,R2
	.dbline 142
; 			fcs1=0;
	sts _fcs1,R2
	.dbline 143
; 		  }
	xjmp L17
L16:
	.dbline 145
; 		  else
; 		  { if(rxd_h_ok==1)
	.dbline 145
	lds R24,_rxd_h_ok
	cpi R24,1
	breq X2
	xjmp L18
X2:
	.dbline 146
; 		    { if(rxd_data==0xe8)
	.dbline 146
	lds R24,_rxd_data
	cpi R24,232
	brne L20
	.dbline 147
; 			  { rxd_frm[rxd_cnt]=0xe8;
	.dbline 147
	ldi R24,<_rxd_frm
	ldi R25,>_rxd_frm
	lds R30,_rxd_cnt
	clr R31
	add R30,R24
	adc R31,R25
	ldi R24,232
	std z+0,R24
	.dbline 148
; 			    rxd_ins_flag=1;
	ldi R24,1
	sts _rxd_ins_flag,R24
	.dbline 149
; 			  }
	xjmp L21
L20:
	.dbline 151
; 			  else
; 			  { if(rxd_ins_flag==1)
	.dbline 151
	lds R24,_rxd_ins_flag
	cpi R24,1
	brne L22
	.dbline 152
; 			    { rxd_ins_flag=0;
	.dbline 152
	clr R2
	sts _rxd_ins_flag,R2
	.dbline 153
; 				  rxd_frm[rxd_cnt]=rxd_frm[rxd_cnt]+rxd_data;
	ldi R24,<_rxd_frm
	ldi R25,>_rxd_frm
	lds R2,_rxd_cnt
	clr R3
	add R2,R24
	adc R3,R25
	lds R4,_rxd_data
	movw R30,R2
	ldd R5,z+0
	add R5,R4
	std z+0,R5
	.dbline 154
; 				}
	xjmp L23
L22:
	.dbline 156
; 				else
; 				{ rxd_frm[rxd_cnt]=rxd_data;}
	.dbline 156
	ldi R24,<_rxd_frm
	ldi R25,>_rxd_frm
	lds R30,_rxd_cnt
	clr R31
	add R30,R24
	adc R31,R25
	lds R2,_rxd_data
	std z+0,R2
	.dbline 156
L23:
	.dbline 157
; 				fcs1=fcs1^rxd_frm[rxd_cnt];
	ldi R24,<_rxd_frm
	ldi R25,>_rxd_frm
	lds R30,_rxd_cnt
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	lds R3,_fcs1
	eor R3,R2
	sts _fcs1,R3
	.dbline 158
; 				if(rxd_cnt==1)
	lds R24,_rxd_cnt
	cpi R24,1
	brne L24
	.dbline 159
; 				{ rxd_frm_len=rxd_frm[rxd_cnt]+3;}
	.dbline 159
	ldi R24,<_rxd_frm
	ldi R25,>_rxd_frm
	lds R30,_rxd_cnt
	clr R31
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	subi R24,253    ; addi 3
	sts _rxd_frm_len,R24
	.dbline 159
L24:
	.dbline 160
; 				rxd_cnt=rxd_cnt+1;
	lds R24,_rxd_cnt
	subi R24,255    ; addi 1
	sts _rxd_cnt,R24
	.dbline 161
; 				if((rxd_cnt>1)&&(rxd_cnt>=rxd_frm_len))
	ldi R24,1
	lds R2,_rxd_cnt
	cp R24,R2
	brsh L26
	lds R2,_rxd_frm_len
	lds R3,_rxd_cnt
	cp R3,R2
	brlo L26
	.dbline 162
; 				{ if(fcs1==0)
	.dbline 162
	lds R2,_fcs1
	tst R2
	brne L28
	.dbline 163
; 				  { 
	.dbline 164
; 				  act[rxd_llc_job]=1;
	ldi R24,<_act
	ldi R25,>_act
	lds R30,_rxd_llc_job
	clr R31
	add R30,R24
	adc R31,R25
	ldi R24,1
	std z+0,R24
	.dbline 165
; 				  }
L28:
	.dbline 166
; 				}
L26:
	.dbline 167
; 			  }
L21:
	.dbline 168
; 			}
L18:
	.dbline 169
; 		  }
L17:
	.dbline 170
L14:
	.dbline -2
L13:
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R5,y+
	ld R4,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbsym l i 1 c
	.dbend
	.dbfunc e rxd_llc_job1 _rxd_llc_job1 fV
;              i -> R16
	.even
_rxd_llc_job1::
	.dbline -1
	.dbline 176
; 		}
; }
; 
; 
; /*********************************/
; void rxd_llc_job1(void)
;     { 
	.dbline 178
; 	char i;
; 	   act[rxd_llc_job]=0;
	ldi R24,<_act
	ldi R25,>_act
	lds R30,_rxd_llc_job
	clr R31
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 179
; 	   if((pump_tab==rxd_frm[0])||(rxd_frm[0]==BROADCAST_ADDR))  //接收指令地址等于设备或广播地址
	lds R2,_rxd_frm
	lds R3,_pump_tab
	cp R3,R2
	breq L33
	mov R24,R2
	cpi R24,31
	brne L31
L33:
	.dbline 180
; 	   { rxd_mesg_addr=rxd_frm[0];
	.dbline 180
	lds R2,_rxd_frm
	sts _rxd_mesg_addr,R2
	.dbline 181
; 	     rxd_mesg_len=rxd_frm[1];
	lds R2,_rxd_frm+1
	sts _rxd_mesg_len,R2
	.dbline 182
; 		 for(i=0;i<rxd_mesg_len;i++)
	clr R16
	xjmp L38
L35:
	.dbline 183
	.dbline 183
	ldi R24,<_rxd_frm+2
	ldi R25,>_rxd_frm+2
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_rxd_mesg
	ldi R25,>_rxd_mesg
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 183
L36:
	.dbline 182
	inc R16
L38:
	.dbline 182
	lds R2,_rxd_mesg_len
	cp R16,R2
	brlo L35
	.dbline 184
	ldi R24,<_act
	ldi R25,>_act
	lds R30,_rs485_app_job
	clr R31
	add R30,R24
	adc R31,R25
	ldi R24,1
	std z+0,R24
	.dbline 185
L31:
	.dbline -2
L30:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e txd_llc_job1 _txd_llc_job1 fV
;            fcs -> R16
;              i -> R18
	.even
_txd_llc_job1::
	.dbline -1
	.dbline 189
; 		 { rxd_mesg[i]=rxd_frm[i+2];}
; 		 act[rs485_app_job]=1;
; 	   }
; 	}
; /*********************************/
; void txd_llc_job1(void)
;     { 
	.dbline 191
; 	char i,fcs;
; 	   act[txd_llc_job]=0;
	ldi R24,<_act
	ldi R25,>_act
	lds R30,_txd_llc_job
	clr R31
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 192
; 	   txd_frm[0]=txd_mesg_addr;
	lds R2,_txd_mesg_addr
	sts _txd_frm,R2
	.dbline 193
; 	   txd_frm[1]=txd_mesg_len;
	lds R2,_txd_mesg_len
	sts _txd_frm+1,R2
	.dbline 194
; 	   fcs=txd_frm[0]^txd_frm[1];
	lds R16,_txd_frm
	eor R16,R2
	.dbline 195
; 	   for(i=0;i<txd_mesg_len;i++)
	clr R18
	xjmp L46
L43:
	.dbline 196
	.dbline 196
	ldi R24,<_txd_mesg
	ldi R25,>_txd_mesg
	mov R30,R18
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_txd_frm+2
	ldi R25,>_txd_frm+2
	mov R30,R18
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 197
	mov R30,R18
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	eor R16,R2
	.dbline 198
L44:
	.dbline 195
	inc R18
L46:
	.dbline 195
	lds R2,_txd_mesg_len
	cp R18,R2
	brlo L43
	.dbline 199
; 	   { txd_frm[i+2]=txd_mesg[i];
; 	     fcs=fcs^txd_frm[i+2];
; 	   }
; 	   txd_frm_len=txd_mesg_len+3;
	mov R24,R2
	subi R24,253    ; addi 3
	sts _txd_frm_len,R24
	.dbline 200
; 	   txd_frm[txd_frm_len-1]=fcs;
	ldi R24,<_txd_frm-1
	ldi R25,>_txd_frm-1
	lds R30,_txd_frm_len
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 201
; 	   txd_cnt=0;
	clr R2
	sts _txd_cnt,R2
	.dbline 202
; 	   txd_ins_flag=0;
	sts _txd_ins_flag,R2
	.dbline 203
; 	   tx485_busy=1;
	ldi R24,1
	sts _tx485_busy,R24
	.dbline 204
; 	   mac_txd_th=2;
	ldi R24,2
	sts _mac_txd_th,R24
	.dbline 205
; 	   PORTC|=(1<<DE_485);
	sbi 0x15,0
	.dbline 206
; 	   UDR=0xe9;
	ldi R24,233
	out 0xc,R24
	.dbline -2
L40:
	.dbline 0 ; func end
	ret
	.dbsym r fcs 16 c
	.dbsym r i 18 c
	.dbend
	.dbfunc e rs485_app_job1 _rs485_app_job1 fV
;      flow_temp -> y+4
;            fcs -> <dead>
;              i -> <dead>
;  rxd_mesg_temp -> y+0
;           temp -> R10,R11
	.even
_rs485_app_job1::
	xcall push_gset3
	sbiw R28,8
	.dbline -1
	.dbline 211
; 	}
; 	
; /*********************************/
; void rs485_app_job1(void)
;     { 
	.dbline 216
; 	char i,fcs;
; 	unsigned int temp;
; 	unsigned long int flow_temp;
; 	unsigned long int rxd_mesg_temp;
; 	act[rs485_app_job]=0;
	ldi R24,<_act
	ldi R25,>_act
	lds R30,_rs485_app_job
	clr R31
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 218
; 	
; 	   if((rxd_mesg_addr!=BROADCAST_ADDR)&&(rxd_mesg[0]=='R')&&(rxd_mesg[1]=='I')&&(rxd_mesg[2]=='D'))   /* 读取设备地址命令e9 01 03 52 49 44 5d */
	lds R24,_rxd_mesg_addr
	cpi R24,31
	breq L51
	lds R24,_rxd_mesg
	cpi R24,82
	brne L51
	lds R24,_rxd_mesg+1
	cpi R24,73
	brne L51
	lds R24,_rxd_mesg+2
	cpi R24,68
	brne L51
	.dbline 219
; 	   { txd_mesg_addr=pump_tab;
	.dbline 219
	lds R2,_pump_tab
	sts _txd_mesg_addr,R2
	.dbline 220
; 	     txd_mesg_len=3;
	ldi R24,3
	sts _txd_mesg_len,R24
	.dbline 221
; 		 txd_mesg[0]='R';
	ldi R24,82
	sts _txd_mesg,R24
	.dbline 222
; 		 txd_mesg[1]='I';
	ldi R24,73

⌨️ 快捷键说明

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