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

📄 motor.s

📁 avr单片机ATMega16对三相异步电机的智能控制源码
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module motor.c
	.area data(ram, con, rel)
L5:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
L6:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.area text(rom, con, rel)
	.dbfile D:\_文档~1\easy-STQ-20080712\motor.c
	.dbfunc e Motor _Motor fV
	.dbsym s KeyTemp L6 c
	.dbsym s KeyLast L5 c
	.even
_Motor::
	xcall push_gset5
	sbiw R28,4
	.dbline -1
	.dbline 13
; 
; 
; #define MOTOR_GLOBAL
; #include "motor.h" 
;   
; static void MotorLocal(void);		  //本地控制
; static void MotorRemote3(void);	  	  //远程三线制
; static void MotorRemote4(void);	  	  //远程四线制	
;   
; 
; 
; void Motor(void)					  //电机任务
; {
	.dbline 17
;  	 								  //一个任务周期的信号消抖动
;  static uchar KeyLast = 0, KeyTemp = 0;			  
;  
;  KeyTemp = (GetLocalClose()|GetLocalOpen()<<1|GetLocal()<<2|GetRemote()<<3|\
	sbic 0x13,6
	rjmp L7
	ldi R24,1
	ldi R25,0
	std y+3,R25
	std y+2,R24
	xjmp L8
L7:
	clr R0
	clr R1
	std y+3,R1
	std y+2,R0
L8:
	sbic 0x13,7
	rjmp L9
	ldi R24,1
	ldi R25,0
	std y+1,R25
	std y+0,R24
	xjmp L10
L9:
	clr R0
	clr R1
	std y+1,R1
	std y+0,R0
L10:
	sbic 0x19,6
	rjmp L11
	ldi R24,1
	ldi R25,0
	movw R14,R24
	xjmp L12
L11:
	clr R14
	clr R15
L12:
	sbic 0x19,5
	rjmp L13
	ldi R24,1
	ldi R25,0
	movw R12,R24
	xjmp L14
L13:
	clr R12
	clr R13
L14:
	sbic 0x10,3
	rjmp L15
	ldi R24,1
	ldi R25,0
	movw R10,R24
	xjmp L16
L15:
	clr R10
	clr R11
L16:
	sbic 0x10,4
	rjmp L17
	ldi R22,1
	ldi R23,0
	xjmp L18
L17:
	clr R22
	clr R23
L18:
	sbic 0x10,5
	rjmp L19
	ldi R20,1
	ldi R21,0
	xjmp L20
L19:
	clr R20
	clr R21
L20:
	ldd R2,y+0
	ldd R3,y+1
	lsl R2
	rol R3
	ldd R4,y+2
	ldd R5,y+3
	or R4,R2
	or R5,R3
	movw R2,R14
	lsl R2
	rol R3
	lsl R2
	rol R3
	or R4,R2
	or R5,R3
	movw R2,R12
	lsl R2
	rol R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	or R4,R2
	or R5,R3
	movw R2,R10
	lsl R2
	rol R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	or R4,R2
	or R5,R3
	ldi R18,5
	ldi R19,0
	movw R16,R22
	xcall lsl16
	or R4,R16
	or R5,R17
	ldi R18,6
	ldi R19,0
	movw R16,R20
	xcall lsl16
	or R4,R16
	or R5,R17
	sts L6,R4
	xjmp L22
L21:
	.dbline 23
;                          GetRemoteStop()<<4|GetRemoteClose()<<5|GetRemoteOpen()<<6);
; 						 
; 						 			  //当有信号时消抖动											
;  while(GetLocalClose()||GetLocalOpen()||GetLocal()||GetRemote()||\
;                          GetRemoteStop()||GetRemoteClose()||GetRemoteOpen())
;  { 
	.dbline 24
;   if(KeyTemp == KeyLast) break;		  //如两次电机任务扫描键值相等,跳出并执行后面代码										  
	lds R2,L5
	lds R3,L6
	cp R3,R2
	brne L24
	.dbline 24
	xjmp L23
L24:
	.dbline 26
	.dbline 27
	lds R2,L6
	sts L5,R2
	.dbline 28
	xjmp L4
L22:
	.dbline 21
	sbis 0x13,6
	rjmp L21
	sbis 0x13,7
	rjmp L21
	sbis 0x19,6
	rjmp L21
	sbis 0x19,5
	rjmp L21
	sbis 0x10,3
	rjmp L21
	sbis 0x10,4
	rjmp L21
	sbis 0x10,5
	rjmp L21
L23:
	.dbline 32
;   else 
;   {
;    KeyLast = KeyTemp;				  //保存上次扫描键值
;    return; 	 		 	 		
;   }
;  } 
;  
;  if(KeyTemp == 0)StopMotor();     	  //所有信号丢失时关电机保护	
	lds R2,L6
	tst R2
	brne L26
	.dbline 32
	xcall _StopMotor
L26:
	.dbline 34
;     
;  ProtectMotor();  						  //电机过热、限位保护
	xcall _ProtectMotor
	.dbline 36
;   
;  if( GetLocal()&&(!GetRemote()))	  //本地控制
	sbic 0x19,6
	rjmp L28
	sbis 0x19,5
	rjmp L28
	.dbline 37
;  {
	.dbline 38
;   SetLocalLed();
	cbi 0x18,5
	.dbline 39
;   ClrRemoteLed();
	sbi 0x18,6
	.dbline 41
;  
;   if(ControlFlag != IN_LOCAL)		  //控制状态转换
	lds R24,_ControlFlag
	cpi R24,1
	breq L30
	.dbline 42
;   {
	.dbline 43
;    StopMotor();   
	xcall _StopMotor
	.dbline 44
;    ControlFlag = IN_LOCAL;
	ldi R24,1
	sts _ControlFlag,R24
	.dbline 45
;   }
L30:
	.dbline 47
;      
;   MotorLocal();
	xcall _MotorLocal
	.dbline 48
;  }
L28:
	.dbline 51
;  
;   			   	 		  			  //远程三线制
;  if( (!GetLocal()) && GetRemote() && GetRemoteMode() )		
	sbis 0x19,6
	rjmp L32
	sbic 0x19,5
	rjmp L32
	sbis 0x19,0
	rjmp L32
	.dbline 52
;  {
	.dbline 53
;   ClrLocalLed();
	sbi 0x18,5
	.dbline 54
;   SetRemoteLed();
	cbi 0x18,6
	.dbline 56
;   
;   if(ControlFlag != IN_REMOTE3)		 //控制状态转换
	lds R24,_ControlFlag
	cpi R24,2
	breq L34
	.dbline 57
;   {
	.dbline 58
;    StopMotor();   
	xcall _StopMotor
	.dbline 59
;    ControlFlag = IN_REMOTE3;
	ldi R24,2
	sts _ControlFlag,R24
	.dbline 60
;   }
L34:
	.dbline 62
;   
;   MotorRemote3();
	xcall _MotorRemote3
	.dbline 63
;  }
L32:
	.dbline 66
;  
;   				 					 //远程四线制
;  if( (!GetLocal()) && GetRemote() && (!GetRemoteMode()) )		
	sbis 0x19,6
	rjmp L36
	sbic 0x19,5
	rjmp L36
	sbic 0x19,0
	rjmp L36
	.dbline 67
;  {
	.dbline 68
;   ClrLocalLed();
	sbi 0x18,5
	.dbline 69
;   SetRemoteLed();
	cbi 0x18,6
	.dbline 71
;   
;   if(ControlFlag != IN_REMOTE4)		//控制状态转换
	lds R24,_ControlFlag
	cpi R24,3
	breq L38
	.dbline 72
;   {
	.dbline 73
;    StopMotor();   
	xcall _StopMotor
	.dbline 74
;    ControlFlag = IN_REMOTE4;
	ldi R24,3
	sts _ControlFlag,R24
	.dbline 75
;   }
L38:
	.dbline 77
	xcall _MotorRemote4
	.dbline 78
L36:
	.dbline -2
L4:
	adiw R28,4
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc s MotorLocal _MotorLocal fV
	.even
_MotorLocal:
	.dbline -1
	.dbline 84
;   
;   MotorRemote4();
;  } 
;       
; }//end of 电机任务
; 
; 
; static void MotorLocal(void)             //本地控制
; { 
	.dbline 85
;  if(GetLocalOpen()&&!GetLocalClose())	 //本地开
	sbic 0x13,7
	rjmp L41
	sbis 0x13,6
	rjmp L41
	.dbline 86
;  {
	.dbline 87
;   if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
	xcall _GetLimitOpen
	tst R16
	brne L43
	sbic 0x19,2
	rjmp L43
	lds R24,_MotorFlag
	cpi R24,1
	breq L43
	.dbline 88
;   {
	.dbline 89
;    OpenMotor();   						//开电机
	xcall _OpenMotor
	.dbline 90
;   }
L43:
	.dbline 93
;  
;   
;  }
L41:
	.dbline 95
; 
;  if(GetLocalClose()&&!GetLocalOpen())	 //本地关
	sbic 0x13,6
	rjmp L45
	sbis 0x13,7
	rjmp L45
	.dbline 96
;  {  
	.dbline 97
;   if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
	xcall _GetLimitClose
	tst R16
	brne L47
	sbic 0x19,2
	rjmp L47
	lds R24,_MotorFlag
	cpi R24,2
	breq L47
	.dbline 98
;   {
	.dbline 99
;    CloseMotor();
	xcall _CloseMotor
	.dbline 100
;   }
L47:
	.dbline 101
L45:
	.dbline -2
L40:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc s MotorRemote3 _MotorRemote3 fV
	.even
_MotorRemote3:
	.dbline -1
	.dbline 107
;  }
;  
; }//edd of 本地控制
; 
; 
; static void MotorRemote3(void)           //远程三线制
; { 
	.dbline 108
;  if(GetRemoteOpen()&&!GetRemoteClose())	 //远程三线开
	sbic 0x10,5
	rjmp L50
	sbis 0x10,4
	rjmp L50
	.dbline 109
;  {  
	.dbline 110
;   if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
	xcall _GetLimitOpen
	tst R16
	brne L52
	sbic 0x19,2
	rjmp L52
	lds R24,_MotorFlag
	cpi R24,1
	breq L52
	.dbline 111
;   {
	.dbline 112
;    OpenMotor();   
	xcall _OpenMotor
	.dbline 113
;   }
L52:
	.dbline 114
;  }
L50:
	.dbline 116
; 
;  if(GetRemoteClose()&&!GetRemoteOpen())	 //远程三线关
	sbic 0x10,4
	rjmp L54
	sbis 0x10,5
	rjmp L54
	.dbline 117
;  {
	.dbline 118
;   if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
	xcall _GetLimitClose
	tst R16
	brne L56
	sbic 0x19,2
	rjmp L56
	lds R24,_MotorFlag
	cpi R24,2
	breq L56
	.dbline 119
;   {
	.dbline 120
;    CloseMotor();
	xcall _CloseMotor
	.dbline 121
;   }
L56:
	.dbline 123
L54:
	.dbline -2
L49:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc s MotorRemote4 _MotorRemote4 fV
	.even
_MotorRemote4:
	.dbline -1
	.dbline 130
;   
;  }
; }
; 
; 
; 
; 
; static void MotorRemote4(void) 				//远程四线制
; { 
	.dbline 131
;  if(GetRemoteStop())	        			//远程四线停
	sbic 0x10,3
	rjmp L59
	.dbline 132
;  {
	.dbline 133
;   StopMotor();
	xcall _StopMotor
	.dbline 134
;  }
L59:
	.dbline 136
;   			  								//远程四线开
;  if(GetRemoteOpen()&&!GetRemoteClose()&&!GetRemoteStop())	 
	sbic 0x10,5
	rjmp L61
	sbis 0x10,4
	rjmp L61
	sbis 0x10,3
	rjmp L61
	.dbline 137
;  {  
	.dbline 138
;   if(!(GetLimitOpen()||GetOverheat())&&(MotorFlag != OPEN))
	xcall _GetLimitOpen
	tst R16
	brne L63
	sbic 0x19,2
	rjmp L63
	lds R24,_MotorFlag
	cpi R24,1
	breq L63
	.dbline 139
;   {
	.dbline 140
;    OpenMotor();   
	xcall _OpenMotor
	.dbline 141
;   }
L63:
	.dbline 142
;  }
L61:
	.dbline 144
;    				  						   //远程四线关
;  if(GetRemoteClose()&&!GetRemoteOpen()&&!GetRemoteStop())	 
	sbic 0x10,4
	rjmp L65
	sbis 0x10,5
	rjmp L65
	sbis 0x10,3
	rjmp L65
	.dbline 145
;  {  
	.dbline 146
;   if(!(GetLimitClose()||GetOverheat())&&(MotorFlag != CLOSE))
	xcall _GetLimitClose
	tst R16
	brne L67
	sbic 0x19,2
	rjmp L67
	lds R24,_MotorFlag
	cpi R24,2
	breq L67
	.dbline 147
;   {
	.dbline 148
;    CloseMotor();
	xcall _CloseMotor
	.dbline 149

⌨️ 快捷键说明

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