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

📄 sys.c

📁 PWM输出控制三路步进电机
💻 C
📖 第 1 页 / 共 2 页
字号:


#include "sys.h"
#include <avr/eeprom.h>
#include <avr/wdt.h>
#include <avr/signal.h>

//#include <avr/interrupt.h>
/*#define Cofficient 80
#define Speed_Coff 10
#define Accel_step 2
#define Low_freq   50
*/

uint poo[4];
void system(void)
{	
	
	asm("nop");
	Position_Process();
	asm("nop");
	Data_Process();
	asm("nop");
	Pulse_Process();
	asm("nop");
	Power_ON();
	asm("nop");
	
	Check_Process();
	asm("nop");
	Sys_tm_key();
	asm("nop");
	ON_Process();
	asm("nop");
	OF_Process();
	asm("nop");
}
void OF_Process(void)
{
	asm("nop");	
	asm("nop");		
	if(!System_OF_Start)
	{
		asm("nop");	
		return;
	}
	switch(Sys_count_1s)
	{
		case 1:		
			PC_off_data =17;
			PORTC  &= 0xEF; break;
		case 2:
			PORTE  &= 0x7F;
			PORTC |= 0x10; break;
		case 3:
			PORTE |= 0x80;
			PORTC  &= 0xEF; break;
		case 4:
			PORTC |= 0x10;
			PORTE &=0x7F; 	break;
		case 5:
			PORTC &= 0xEF;
			PORTE |=0x80; 	break;
		case 6:
			PORTC &= 0xEF;
			PORTE &=0x7F; 	break;
		case 30:
			if(Coil_A_ON)		//if it's on fail!
				PORTC |= 0x10;
			if(Coil_B_ON)
				PORTE |= 0x80;
			break;
		case 31:		
				PORTC &= 0xEF;
				PORTE &= 0x7F;
			break;
		case 32:
			if(Coil_A_ON)		//if it's on fail!
				PORTC |= 0x10;
			if(Coil_B_ON)
				PORTE |= 0x80;
			break;
		case 33:		
				PORTC &= 0xEF;
				PORTE &= 0x7F;
			break;			
		case 60: //125
			PORTA |=0x40;	break;
		case 62: //125
			PORTA &=0xBF;	break;
		case 68: //127
			PC_off_data=0;
			PORTA &=0xBF;
			System_ON_Start=0;
			System_ON=0;
			System_OF_Start=0;
			System_OF=1;
			break;		
		default:
			break;
	}
}
void ON_Process(void)
{
	asm("nop");	
	if(!System_ON_Start)
	{
		asm("nop");	
		return;
	}
	switch(Sys_count_1s)
	{
		case 1:		
			PORTC  &= 0xEF; break;
		case 2:
			PORTE  &= 0x7F;
			PORTC |= 0x10; break;
		case 3:
			PORTE |= 0x80;
			PORTC  &= 0xEF; break;
		case 4:
			PORTE &=0x7F; 	break;
		case 30:
			if(!Coil_A_ON)		//if it's on fail!
				PORTC |= 0x10;
			if(!Coil_B_ON)
				PORTE |= 0x80;
			break;
		case 31:
			PORTC  &= 0xEF;										
			PORTE  &= 0x7F;	
			if(Coil_A_ON && Coil_B_ON)
				Sys_count_1s +=27;
			break;			
		case 60:
			PORTA |=0x08;	break;
		case 62:
			PORTA &=0xF7;
			PORTA |=0x10;	break;
		case 64:
			PORTA &=0xEF;
			PORTA |=0x20;	break;
		case 66:			
			PORTA &=0xDF;	break;
		case 68:
			System_ON_Start=0;
			System_ON=1;
			System_OF=0;
			power0=1; power1=1;power2=1;power3=1;
		    power_count1=0;
		    power_count2=0;
		    power_count3=0;
		    power_count=0;
			break;	
		default:
			break;
	}
}


void Sys_tm_key(void)
{
uchar i,j;
	asm("nop");		
	if(Sys_count_10ms <10)	//every 10ms once
	{
		asm("nop");		
		return;
	}
	Sys_count_10ms=0;
	Timer_1s++;
	if(Coin_data)
	{
		asm("nop");		
		coin_count++;
		if(coin_count >30)
		{
			asm("nop");		
			Coin_data=0;
		}
	}
	else
	{
		asm("nop");		
		Coin_data_read[1] = Coin_data_read[0];
		j = ~PINC;
	//	j &=0x40;
		Coin_data_read[0]= j & 0x40;
		//j= Coin_data_read[1]+Coin_data_read[0];
		if(Coin_data_read[1] && Coin_data_read[0])
		{
			asm("nop");		
			Coin_data=1;
			coin_count=0;
		}
	}

	if(Timer_1s >99)
	{
		asm("nop");		
		Timer_1s=0;
		Sys_count_1s ++;
		DDRA   = 0x78;
	   DDRB   = 0xF0; //1, out; 0,in   
	   DDRC   = 0x10;
	   DDRD   = 0xF9;    
	   DDRE   = 0xba;    // OC3A-C--PE3-5 设置端口E
	   DDRF   = 0x00;    // 设置端口F
	   DDRG   = 0x00;    // 设置端口G
	   if(Rs232_LED)
	   {
			if(Rs232_led_cnt)
			{
				Rs232_led_cnt=1;
				PORTD &=0xDF;
			}
			else
			{
				
				Rs232_led_cnt=0;
				PORTD |=0x20;
				Rs232_LED=0;
			}
	   }
	   else
	   {
				Rs232_led_cnt=0;
				PORTD |=0x20;			
	   }
	   
/*	   UCSR0B =  0x00; 
	   UCSR0A  = 0x00;
	   UCSR0B  = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<TXCIE0);
	   UCSR0C  = (1<<UCSZ01)|(1<<UCSZ00);  
	   UBRR0H  = 0x00;
	   UBRR0L  = 51; */    // UBRR0L=51;9600,8,n,1。UBRR0L=25;19200,8,n,1,fosc=8M		
	}	
	if(Coil_count++ >100)
	{
		asm("nop");		
		Coil_count=0;
		if(Coil_A_count >20)
			Coil_A_ON=1;	//coil a is on
		else
			Coil_A_ON=0;
		if(Coil_B_count >20)
			Coil_B_ON=1;
		else
			Coil_B_ON=0;
		Coil_A_count=0;
		Coil_B_count=0;
		LED1_count++;
		LED2_count++;
		LED3_count++;
//LED1
		if(System_ON_Start)
		{
			asm("nop");		
			if(LED1_count >2)
			{
				asm("nop");		
				LED1_count=0;
				PORTD |=0x80;	//D7
			}
			else if(LED1_count >1)
			{
				asm("nop");		
				PORTD &=0x7F;
			}
			else
			{
				asm("nop");		
				PORTD |=0x80;	//D7
			}
		}
	
		else if(System_ON)
		{	
				asm("nop");				
				PORTD &=0x7F;			
		}
		else
		{			
				asm("nop");		
				PORTD |=0x80;			
		}
//LED2
		if(System_OF_Start)
		{
			asm("nop");		
			if(LED2_count >2)
			{
				asm("nop");		
				LED2_count=0;
				PORTD |=0x40;	//D7
			}
			else if(LED2_count >1)
			{
				asm("nop");		
				PORTD &=0xBF;
			}
			else
			{
				asm("nop");		
				PORTD |=0x40;	//D7
			}
		}
		else if(System_OF)
		{			
				asm("nop");		
				PORTD &=0xBF;			
		}
		else
		{			
				asm("nop");		
				PORTD |=0x40;			
		}
//LED3
		if((Comm_status ==1) ||(Comm_status ==2))
		{
			if(LED3_count >2)
			{
				LED3_count=0;
				PORTD |=0x20;	
			}
			else if(LED3_count >1)
			{
				PORTD &=0xDF;
			}
			else
				PORTD |=0x20;	
		}
		else if(Comm_status ==3)
				PORTD &=0xDF;
		else
				PORTD |=0x20;	
	}
	else
	{
		asm("nop");	
		Coil_data[2] =Coil_data[1];
		Coil_data[1] =Coil_data[0];
		Coil_data[0] =PING;
		Coil_data[0] &=0x03;
		i = Coil_data[0];
		i &= Coil_data[1];
		i &= Coil_data[2];
		if(!(i &0x01))
		{
			asm("nop");		
			Coil_A_count++;
		}
		if(!(i &0x02))
		{
			asm("nop");		
			Coil_B_count++;	
		}	
	}

	//system on/off key
	asm("nop");		
	Sys_ON_OF_data[2] = Sys_ON_OF_data[1];
	Sys_ON_OF_data[1] = Sys_ON_OF_data[0];
	Sys_ON_OF_data[0] = PINA;
	Sys_ON_OF_data[0] &= 0x03;
	i =Sys_ON_OF_data[0]&1;
	i += Sys_ON_OF_data[1]&1;
	i += Sys_ON_OF_data[2]&1;//+Sys_ON_OF_data[3]&1;
	if((!i) && System_OF )
	{	//it can be start if off state.			
	//		Sys_ON_key=0;
			asm("nop");		
			System_ON_Start=1;
			Sys_count_1s=0;		
			System_OF=0;
	}
	//else
	//	Sys_ON_key=0;	
	asm("nop");		
	i =Sys_ON_OF_data[0]&2;
	i += Sys_ON_OF_data[1]&2;
	i += Sys_ON_OF_data[2]&2;	
	if((!i) && System_ON)//it can be start if off state.		
	{
//		Sys_OF_key=1;
		asm("nop");		
		Sys_count_1s=0;
		System_OF_Start=1;
		System_ON=0;
	}
//	else
//		Sys_OF_key=0;
}

void Pulse_Process(void)
{
   	uchar l,kp;
	asm("nop");		
   	if(!Touch_count)
	{
		asm("nop");		
     	return;
	}
    Touch_count=0;
/*	PC_off[2] = PC_off[1];
	PC_off[1] = PC_off[0];
	PC_off[0] = PINF;
	PC_off[0] &=0x08;
	l=PC_off[0]+PC_off[0]+PC_off[0];
	if(!l)
	{
		PC_off_flag=17;
	}	*/
	Touch_data[2] = Touch_data[1];
	Touch_data[1] = Touch_data[0];
 	Touch_data[0] = PINC;
	Touch_data[0] &=7;
	//coin
/*	kp = Touch_data[0] &0x40 +Touch_data[1] &0x40 +Touch_data[2] &0x40;
    if(kp)
	{
		asm("nop");
		asm("nop");
	}*/
	//-----------
	if(Touch_data[0]==Touch_data[1])
    {
		asm("nop");		
		if(Touch_data[1]==Touch_data[2])
		{
			asm("nop");		
			l = ~Touch_data[0];
			Reset_data =l&7;
			if(Reset_data &0x01)
			{
				asm("nop");		
				if(!M_c_direct[0])
				{
					asm("nop");		
					Start_data[0]=0;
					M_c_position[0]=0;
					if(End_data[0] >50)
					{
						asm("nop");		
					 	End_data[0]=50;
					}
				}
			}
			if(Reset_data &0x02)
			{
				asm("nop");		
				if(!M_c_direct[1])
				{
					asm("nop");		
					Start_data[1]=0;
					M_c_position[1]=0;
					if(End_data[1] >50)
					{
						asm("nop");		
					 	End_data[1]=50;
					}
				}
			}
			if(Reset_data &0x04)
			{
				asm("nop");		
				if(!M_c_direct[2])
				{
					asm("nop");		
					Start_data[2]=0;
					M_c_position[2]=0;
					if(End_data[2] >50)
					{
						asm("nop");		
					 	End_data[2]=50;
					}
				}
			}			
		}  
	}
}

void Position_Process(void) //inc/dec position, check up/down limited
{
	uchar i,j;
	asm("nop");		
	if(M_c_direct[0])//channel 1
	{
		asm("nop");		
		if(Puls_count0 > Cofficient)
    	{
			asm("nop");		
			M_c_position[0] ++;
			Puls_count0 -= Cofficient;
			if(M_c_position[0] > 0xf7) 
			{
				asm("nop");		
			    M_c_position[0]=0xf8;
				Start_data[0]=0;
				if(End_data[0] >100)
				{
					asm("nop");		
				  	End_data[0]=100;
				}
			}		
		}
	}
	else
	{
		asm("nop");		
		if(Puls_count0 > Cofficient)
    	{
			asm("nop");		
			if(M_c_position[0])
			{
				asm("nop");		
				M_c_position[0] --;
			}
			asm("nop");		
			Puls_count0 -= Cofficient;
		}
	}
	if(M_c_direct[1])//channel 2
	{
		asm("nop");		
		if(Puls_count1 > Cofficient)
    	{
			asm("nop");		
			M_c_position[1] ++;
			Puls_count1 -= Cofficient;
			if(M_c_position[1] > 0xf7) 
			{
				asm("nop");		
			    M_c_position[1]=0xf8;
				Start_data[1]=0;
				if(End_data[1] >100)
				{
					asm("nop");		
				  	End_data[1]=100;
				}
			}		
		}
	}

⌨️ 快捷键说明

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