Beispiel #1
0
void ZIGB_ch_wrt(U8 *ch_no)
{
  uart1_send_string("ATCH");
  uart1_send_string(ch_no);
  uart1_send_byte('\r');

   if(ZIGB_responce(3,"OK\r"))
  {
   #if RESP_ON_UART0 == 1
   uart0_send_string("\n\n\rCH: OK ");
   #endif
   ms_delay(10000);
  }
 else
  {
   #if RESP_ON_UART0 == 1
   uart0_send_string("\n\n\rCH: ERROR ");
   #endif
   ms_delay(10000);
  }
}
Beispiel #2
0
void ZIGB_my_wrt(U8 *my_add)
{
  uart1_send_string("ATMY");
  uart1_send_string(my_add);
  uart1_send_byte('\r');

   if(ZIGB_responce(3,"OK\r"))
  {
   #if RESP_ON_UART0 == 1
   uart0_send_string("\n\n\rMY: OK ");
   #endif
   ms_delay(10000);
  }
 else
  {
   #if RESP_ON_UART0 == 1
   uart0_send_string("\n\n\rMY: ERROR ");
   #endif
   ms_delay(10000);					  
  }
}
Beispiel #3
0
void ZIGB_pan_wrt(U8 *pan_add)
{
  uart1_send_string("ATID");
  uart1_send_string(pan_add);
  uart1_send_byte('\r');

   if(ZIGB_responce(3,"OK\r"))
  {
   #if RESP_ON_UART0 == 1
   uart0_send_string("\n\n\rPAN: OK ");
   #endif
   ms_delay(10000);
  }
 else
  {
   #if RESP_ON_UART0 == 1
   uart0_send_string("\n\n\rPAN: ERROR ");
   #endif
   ms_delay(10000);
  }
}
Beispiel #4
0
void ZIGB_dl_wrt(U8 *dest_add)
{
  uart1_send_string("ATDL");
  uart1_send_string(dest_add);
  uart1_send_byte('\r');
  if(ZIGB_responce(3,"OK\r"))
  {
   #if RESP_ON_UART0 == 1
   uart0_send_string("\n\n\rDL: OK ");
   #endif
   ms_delay(10000);
  }
 else
  {
   #if RESP_ON_UART0 == 1
   uart0_send_string("\n\n\rDL: ERROR ");
   #endif
   ms_delay(10000);
  }

}
Beispiel #5
0
void ZIGB_exit_cmd()
{
 uart1_send_string("ATCN\r");
 if(ZIGB_responce(3,"OK\r"))
  {
   #if RESP_ON_UART0 == 1
   uart0_send_string("\n\n\rExit CMD: OK ");
   #endif
   ms_delay(10000);
  }
 else
  {
   #if RESP_ON_UART0 == 1
   uart0_send_string("\n\n\rExit CMD: ERROR ");
   #endif
   ms_delay(10000);
  }
}
Beispiel #6
0
void ZIGB_cmd_mode()
{
 uart1_send_string("+++");
 clrscr();
 lcd_line1_disp("CMD Mode",0);

 if(ZIGB_responce(3,"OK\r"))
  {
   #if RESP_ON_UART0 == 1
   uart0_send_string("\n\n\rCMD: OK ");
   #endif
   ms_delay(10000);
  }
 else
  {
   #if RESP_ON_UART0 == 1
   uart0_send_string("\n\n\rCMD: ERROR ");
   #endif
   ms_delay(10000);
  }
}
Beispiel #7
0
void ZIGB_my_read()
{
  U8 temp_arr[20]= "000";
  U8 temp_cnt;
  
  uart1_send_string("ATMY");
  uart1_send_byte('\r');

  for(temp_cnt = 0; Uc_zigb_my[temp_cnt - 1] != '\r'; temp_cnt++)
  {
   	while((U1LSR & 0x01) == 0);
   	Uc_zigb_my[temp_cnt] = U1RBR;
  }

  Uc_zigb_my[temp_cnt - 1] = '\0';

  uart0_send_string("\n\n\rMY Address: ");
  uart0_send_string(&Uc_zigb_my[0]);

 

}
Beispiel #8
0
void main()
{   
  PINSEL0 |= 0X00050005;	 // selecting UART0 and UART1
  PINSEL1 |= 0X00080000;
  IO1DIR  |= 0X0FFF0000;	 //pins 1.16 to 1.23 output pins
  IO0DIR  |= 0X003E0C00;	 //port 0 rs and en as output
  IO0CLR   = 0X00FF0000;	
  
  IO0SET   = 0X0FF00400;
  IO0CLR   = BUZZER;

  //*************************************//
  //         Initialisations             //
  //*************************************//
  lcd_init();
  irq_init();
  uart_init();
  adc_init();
  //wdt_init();
  pwm5_init();
  timer1_init_interrupt();
  rtc_init_interrupt();
  
  //*************************************//
  //          Welcome Note               //
  //*************************************//
  lcd_line2_disp(&welcome_note1[0],0);
  lcd_line3_disp(&welcome_note2[0],6);
  ms_delay(50000);
  clrscr();
  lcd_line1_disp(&lcd_data_sys_chk[0],0);
  display_dots();
  display_dots();
  //*************************************//
  //  Displaying Static Messages		 //
  //*************************************//
  clrscr();
  default_page();
  U0IER = 0;

  rtc_get_time();
  lcd_line4_disp(&Uc_real_time[0],12);
  lcd_line4_disp(&Uc_set_user_time[0],0);

  wdt_init();
  while(1)
  {	
  
  	wdt_feed(0x03ffffff);
	rtc_get_time();
	lcd_line4_disp(&Uc_real_time[0],12);
	if(wdt_timeout == 1)
	{
		wdt_timeout = 0;
		lcd_line3_disp("WDEnable",12);
	}
	//*********************************************//
	//		ADC input value						   //
	//*********************************************//
	if(Uc_adc_time_out_flag == 1)
	{			
		Uc_adc_time_out_flag = 0;
		Ui_sample1 = adc1_getval();
		ms_delay(800);
		Ui_sample2 = adc1_getval();
		ms_delay(800);
		Ui_sample3 = adc1_getval();
		ms_delay(800);
		Ui_sample4 = adc1_getval();
		ms_delay(800);
		Ui_sample5 = adc1_getval();
		adc_val_conv(Ui_sample1, Ui_sample2, Ui_sample3, Ui_sample4, Ui_sample5, 1);
		temp_ctrl();
		lcd_line1_disp(&Uc_dec_arr[1],5);
		
		
					
		//*********Sending DATA to User desk*************//
		//uart0_send_string("\n\r ");
		uart0_send_byte((Ui_sample1 & 0xff));
		uart1_send_byte(0x7E);
		uart1_send_string(&Uc_dec_arr[1]);
		uart1_send_byte('\0');
		//**********************************************//
		
		Ui_sample1 = adc3_getval();
		ms_delay(900);
		Ui_sample2 = adc3_getval();
		ms_delay(900);
		Ui_sample3 = adc3_getval();
		ms_delay(900);
		Ui_sample4 = adc3_getval();
		ms_delay(900);
		Ui_sample5 = adc3_getval();
		ms_delay(750);
		Ui_sample6 = adc3_getval();
		ms_delay(750);
		Ui_sample7 = adc3_getval();
		ms_delay(750);
		Ui_sample8 = adc3_getval();
		ms_delay(750);
		Ui_sample9 = adc3_getval();
		Ui_sample6 = ((Ui_sample6 + Ui_sample7 + Ui_sample8 + Ui_sample9) / 4);
		Ui_sample5 = ((Ui_sample6 + Ui_sample5)/2);
		adc_val_conv(Ui_sample1, Ui_sample2, Ui_sample3, Ui_sample4, Ui_sample5 , 0);
		lcd_line3_disp(&Uc_dec_arr[1],5);
		
		//*********Sending DATA to User desk*************//
		uart1_send_string(&Uc_dec_arr[1]);
		//**********************************************//

	}


	//*********************************************//
	//   displaying Real Time & user Set Time      //
	//*********************************************//
	
	if(Uc_alrm == 1)
	{
		Uc_alrm = 2;
		pwm5_pulse_width(5000, 100);
	}
	/*
	else if(Uc_alrm == 3)
	{
		if(Uc_user_dwn_sec == 0)
		{
		   Uc_user_dwn_sec  = 59;

		   if( (Uc_user_dwn_min +  Uc_user_dwn_hr) != 0)
	   	 	{	
				Uc_user_dwn_min -= 1;
	   	   	}
		   Uc_set_user_time[3] = ((Uc_user_dwn_min / 10) + 0x30);
	   	   Uc_set_user_time[4] = ((Uc_user_dwn_min % 10) + 0x30);
		}
		if(Uc_user_dwn_min == 0)
		{
		   Uc_user_dwn_min  = 59;
	       if(Uc_user_dwn_hr != 0)
		   {
		   		Uc_user_dwn_hr -= 1;
		   }
	   	   Uc_set_user_time[0] = ((Uc_user_dwn_hr / 10) + 0x30);
	   	   Uc_set_user_time[1] = ((Uc_user_dwn_hr % 10) + 0x30);
		}
		Uc_set_user_time[6] = ((Uc_user_dwn_sec / 10) + 0x30);
		Uc_set_user_time[7] = ((Uc_user_dwn_sec % 10) + 0x30);
	 }

	 */
	//*********************************************//
	rtc_get_time();
	lcd_line4_disp(&Uc_real_time[0],12);
	lcd_line4_disp(&Uc_set_user_time[0],0);

	//*********************************************//
	//			key press on background  		   //
	//*********************************************//
	Uc_key_temp = get_key(0);
	if(Uc_key_temp == 'E')
	{
		Uc_key_temp = 0;
		get_user_time();
	}
	else if((Uc_key_temp == '.')&(Uc_alrm == 2))
	{
		Uc_key_temp = 0;
		Uc_alrm = 0;
		pwm_disable();
	}
	else if(Uc_key_temp == 'A')
	{
		clrscr();
		ms_delay(1000);
		lcd_line2_disp("Emergency Stop!",3);
		lcd_line4_disp("Cooling ON",5);
		IO0CLR = SSR_ON;
		IO0CLR = HEATER_ON;
		IO0SET = COOLER_ON;
		while(1);
	}
	else if(Uc_key_temp == 'D')
	{
		Uc_key_temp = 0;
		rtc_change_time();
	}

  }
}
//---------------------------【主函数】↓-----------------------------------------------------------
void main(void)
{

 	//.....................[函数体内变量声明]...............................

 	uchar i;//清空指令存储变量时所用循环的计数变量
	
	//向舵机发送移动命令时所用的变量(下面2个)↓
	uchar motor_command[9]={0xff,0xff,0x00,0x05,0x03,0x20,0x00,0x00,0x00};//
	uchar CHECK;//舵机指令最后一位校验码
	
	//上电手指复位阶段用到的变量(下面2个)↓
	//保证舵机停止命令只进行一次
	uchar cage_0=1;
	uchar cage_1=1;
	
	//正常工作模式(模式一)手指松开阶段用到的变量(下面2个)↓
	//保证每次夹紧操作时舵机停止命令只进行一次	
	uchar approach_0;
	uchar approach_1;
	
	//夹紧第二阶段的while循环跳出指示
	uchar hold_stage_2_continue=1;
	
	//大循环中查询两端限位和空夹所用到的变量(下面7个)↓
	//while大循环从两端限位后开始,因此不允许再次发送舵机停止命令,而是等待限位结束
	uchar stop_allow_cage_0=0;
	uchar stop_allow_cage_1=0;
	//不允许手指向端部移动,允许手指向中间移动,设置四个变量是因为考虑到两端限位跟空夹
	uchar release_allow_motor_0=0;
	uchar release_allow_motor_1=0;
	uchar hold_allow_motor_0=1;
	uchar hold_allow_motor_1=1;
	//允许上电复位后就开始检测是否空夹
	uchar stop_allow_empty=1;
	
	//调试模式手指移动速度,初始值为通过串口设定前的默认值
	uchar PARA2=0x10,PARA3=0x01;//保证低速,仅允许通过串口命令更改其值!
	
	//一般模式手指移动速度,仅允从EEPROM中获取数值
	uchar com_finger0_ratio_1_PARA2,com_finger0_ratio_1_PARA3;//手指0,Ratio 1
	uchar com_finger0_ratio_2_PARA2,com_finger0_ratio_2_PARA3;//手指0,Ratio 2
	uchar com_finger0_ratio_3_PARA2,com_finger0_ratio_3_PARA3;//手指0,Ratio 3
	uchar com_finger1_ratio_1_PARA2,com_finger1_ratio_1_PARA3;//手指1,Ratio 1
	uchar com_finger1_ratio_2_PARA2,com_finger1_ratio_2_PARA3;//手指1,Ratio 2
	uchar com_finger1_ratio_3_PARA2,com_finger1_ratio_3_PARA3;//手指1,Ratio 3
	
	uchar msg_eeprom_array[17];//向上位机返回EEPROM中数值
	uchar msg_interrupt_array[7]={'z','z','4','4','0','0','0'};//向上位机返回夹持器与外部碰撞报警(中断)允许变量的值
	
	
	//.......................[初始化配置].........................
	
    uart0_init(19200);//串口0(与上位机通信)初始化,波特率均为19200
    uart1_init(19200);//串口1(与舵机通信)初始化,波特率均为19200
	timer1_init();//定时计数器1初始化
	force_data_init();//应变片读取初始化
	
	
	//限位的配置
	
	//PE2=接近开关0,高阻态输入
	DDRE&=(~BIT(2));//DDRE2=0
	PORTE&=(~BIT(2));//PORTE2=0
	
	//PE3=接近开关1,高阻态输入
	DDRE&=(~BIT(3));//DDRE2=0
	PORTE&=(~BIT(3));//PORTE2=0
	
    //PE5=INT5=限位0,带上拉电阻输入
    DDRE&=(~BIT(5));//意思是DDRE5=0,其余位不变。但注意不可按注释的方式写!
    PORTE|=BIT(5);//意思是PORTE5=1,其余位不变。但注意不可按注释的方式写!
	
    //PE6=INT6=限位1,带上拉电阻输入
    DDRE&=(~BIT(6));
    PORTE|=BIT(6);

	//PE7=空夹,带上拉电阻输入
    DDRE&=(~BIT(7));
    PORTE|=BIT(7);
	
	
	//................[功能:上电后手指复位]....................................

    SREG |= 0X80;//打开全局中断
    
    //相关变量初始化
    cage0_state=0;
    cage1_state=0;

    //命令舵机停止转动
    uart1_send_string((uchar*)no0stop,9);
	delay(50);
	uart1_send_string((uchar*)no1stop,9);
    delay(50);
	
    //使手爪松开
    uart1_send_string((uchar*)no0release,9);
	delay(50);
    uart1_send_string((uchar*)no1release,9);

    //等待两端限位触发	
	while(cage_0|cage_1)
	{
	    if(cage_0)
		{
    	    if(!(PINE & BIT(5)))//PE5=0进入
	    	{
		        delay(50);
				if(!(PINE & BIT(5)))
				{
			        uart1_send_string((uchar*)no0stop,9);
					//uart0_send_string("zz30");
					cage_0=0;
			    }
			
		    }
		}
		
	    if(cage_1)
		{
    	    if(!(PINE & BIT(6)))//PE6=0进入
	    	{
		        delay(50);
				if(!(PINE & BIT(6)))
				{
			        uart1_send_string((uchar*)no1stop,9);
					//uart0_send_string("zz31");
					cage_1=0;
			    }
			
		    }
		}
	}
	
    uart0_send_string("zz00");//向上位机报告准备就绪
	
	UCSR0B|=(1<<RXEN0)|(1<<RXCIE0);   //UART0接收使能,接收中断使能
	
	
//........................[while(1)大循环]............................................
	
    while(1)
	{
	 	 if(uart0_instr_flag==1)
		 {
	         switch(gripper_mood)
		     {
	             case 0:
			     {
			         if(array_cmp(uart0_instr,"0100")==0)
				     {
				         //uart0_send_string(" mood 0: enter 1-regular working mood! ");
					 	 gripper_mood=1;
						 ext_interrupt_init();//外部中断(夹持器与外部环境碰撞)初始化
						 //初始化后会立即出发一次INT0和INT1,所以报警允许变量需要先置0再置1
						 
						 //夹持器与外部碰撞报警(中断)允许变量
						 ext_collision_alert_allow_int0=1;//上侧
						 ext_collision_alert_allow_int1=1;//下侧
						 ext_collision_alert_allow_int4=1;//指尖

						 
						 //获取EEPROM中存储的RATIO值
    					 command_data_read_finger_0_ratio_1(&com_finger0_ratio_1_PARA2,&com_finger0_ratio_1_PARA3);
						 command_data_read_finger_0_ratio_2(&com_finger0_ratio_2_PARA2,&com_finger0_ratio_2_PARA3);
						 command_data_read_finger_0_ratio_3(&com_finger0_ratio_3_PARA2,&com_finger0_ratio_3_PARA3);
						 command_data_read_finger_1_ratio_1(&com_finger1_ratio_1_PARA2,&com_finger1_ratio_1_PARA3);
						 command_data_read_finger_1_ratio_2(&com_finger1_ratio_2_PARA2,&com_finger1_ratio_2_PARA3);
						 command_data_read_finger_1_ratio_3(&com_finger1_ratio_3_PARA2,&com_finger1_ratio_3_PARA3);
	
						 //获取EEPROM中存储的夹紧力阈值有效值高八位
						 command_data_read_force_high8(&force_judge);
						 
	
				     }
				 
				 	 if(array_cmp(uart0_instr,"0200")==0)
				 	 {
				         //uart0_send_string(" mood 0: enter 2-configuration mood! ");
					 	 gripper_mood=2;
						 ext_interrupt_init();//外部中断(夹持器与外部环境碰撞)初始化
						 //初始化后会立即出发一次INT0和INT1,所以报警允许变量需要先置0再置1
						 
						 //夹持器与外部碰撞报警(中断)允许变量
						 ext_collision_alert_allow_int0=1;//上侧
						 ext_collision_alert_allow_int1=1;//下侧
						 ext_collision_alert_allow_int4=1;//指尖
				 	 }
				 
				 	 break;
			     }
			 
		         case 1:
			     {
			     	 if(array_cmp(uart0_instr,"1000")==0)//调试模式·读取EEPROM中存储的RATIO和力阈值
				 	 {
						 //更新ratio变量值、力阈值和消息数组的值
						 
						 //获取EEPROM中存储的RATIO值
    					 command_data_read_finger_0_ratio_1(&com_finger0_ratio_1_PARA2,&com_finger0_ratio_1_PARA3);
						 command_data_read_finger_0_ratio_2(&com_finger0_ratio_2_PARA2,&com_finger0_ratio_2_PARA3);
						 command_data_read_finger_0_ratio_3(&com_finger0_ratio_3_PARA2,&com_finger0_ratio_3_PARA3);
						 command_data_read_finger_1_ratio_1(&com_finger1_ratio_1_PARA2,&com_finger1_ratio_1_PARA3);
						 command_data_read_finger_1_ratio_2(&com_finger1_ratio_2_PARA2,&com_finger1_ratio_2_PARA3);
						 command_data_read_finger_1_ratio_3(&com_finger1_ratio_3_PARA2,&com_finger1_ratio_3_PARA3);
	
						 msg_eeprom_array[0]='z';
						 msg_eeprom_array[1]='z';
						 msg_eeprom_array[2]='3';
						 msg_eeprom_array[3]='3';
						 msg_eeprom_array[4]=com_finger0_ratio_1_PARA2;
						 msg_eeprom_array[5]=com_finger0_ratio_1_PARA3;
						 msg_eeprom_array[6]=com_finger0_ratio_2_PARA2;
						 msg_eeprom_array[7]=com_finger0_ratio_2_PARA3;
						 msg_eeprom_array[8]=com_finger0_ratio_3_PARA2;
						 msg_eeprom_array[9]=com_finger0_ratio_3_PARA3;
						 msg_eeprom_array[10]=com_finger1_ratio_1_PARA2;
						 msg_eeprom_array[11]=com_finger1_ratio_1_PARA3;
						 msg_eeprom_array[12]=com_finger1_ratio_2_PARA2;
						 msg_eeprom_array[13]=com_finger1_ratio_2_PARA3;
						 msg_eeprom_array[14]=com_finger1_ratio_3_PARA2;
						 msg_eeprom_array[15]=com_finger1_ratio_3_PARA3;
	
						 //获取EEPROM中存储的夹紧力阈值有效值高八位
						 command_data_read_force_high8(&force_judge);
						 msg_eeprom_array[16]=force_judge;
						 
						 delay(50);
						 uart0_send_string_with_num(msg_eeprom_array,17);//上传EEPROM中存储的数值
	
					 }
	
					 
					 if(array_cmp(uart0_instr,"1100")==0)//松开
				 	 {
				         if(release_allow_motor_0)
						 {
						     //构造舵机指令
							 motor_command[2]=0x00;//ID=0
						 	 motor_command[6]=com_finger0_ratio_3_PARA2;
						 	 motor_command[7]=com_finger0_ratio_3_PARA3+0x04;
						 	 CHECK=ratio_command_check(0,com_finger0_ratio_3_PARA2,com_finger0_ratio_3_PARA3+0x04);
						 	 motor_command[8]=CHECK;
						 	 delay(50);
						 	 uart1_send_string(motor_command,9);//下发指令
						 }
						 
						 if(release_allow_motor_1)
						 {
						     //构造舵机指令
							 motor_command[2]=0x01;//ID=1
						 	 motor_command[6]=com_finger1_ratio_3_PARA2;
						 	 motor_command[7]=com_finger1_ratio_3_PARA3+0x04;
						 	 CHECK=ratio_command_check(1,com_finger1_ratio_3_PARA2,com_finger1_ratio_3_PARA3+0x04);
						 	 motor_command[8]=CHECK;
						 	 delay(50);
						 	 uart1_send_string(motor_command,9);//下发指令
						 }
				 	 }
				 
				 	 if(array_cmp(uart0_instr,"1200")==0)//夹紧
				 	 {
				         if(hold_allow_motor_0 & hold_allow_motor_1)
						 {
						     //第一阶段
							 //构造舵机指令
							 motor_command[2]=0x00;//ID=0
						 	 motor_command[6]=com_finger0_ratio_1_PARA2;
						 	 motor_command[7]=com_finger0_ratio_1_PARA3;
						 	 CHECK=ratio_command_check(0,com_finger0_ratio_1_PARA2,com_finger0_ratio_1_PARA3);
						 	 motor_command[8]=CHECK;
						 	 delay(50);
						 	 uart1_send_string(motor_command,9);//下发指令
							 
							 //构造舵机指令
							 motor_command[2]=0x01;//ID=1
						 	 motor_command[6]=com_finger1_ratio_1_PARA2;
						 	 motor_command[7]=com_finger1_ratio_1_PARA3;
						 	 CHECK=ratio_command_check(1,com_finger1_ratio_1_PARA2,com_finger1_ratio_1_PARA3);
						 	 motor_command[8]=CHECK;
						 	 delay(50);
						 	 uart1_send_string(motor_command,9);//下发指令
	
							 approach_0=1;
							 approach_1=1;
							 
							 //等接近开关触发,同时查询检测是否空夹
							 while((approach_0|approach_1)&&(PINE & BIT(7)))
							 {
	   						     if(approach_0)
								 {
								     if(!(PINE & BIT(2)))//PE2=0进入
									 {
		        					     delay(50);
										 if(!(PINE & BIT(2)))
										 {
			        					     uart1_send_string((uchar*)no0stop,9);
											 //uart0_send_string(" interrupt 5 ");
											 approach_0=0;
			    						 }
			
		    						 }
							 	 }
		
	    					 	 if(approach_1)
								 {
    	    					     if(!(PINE & BIT(3)))//PE3=0进入
	    						 	 {
		       					          delay(50);
								  	  	  if(!(PINE & BIT(3)))
								  	  	  {
			        			  	          uart1_send_string((uchar*)no1stop,9);
								  		  	  //uart0_send_string(" interrupt 6 ");
								  		  	  approach_1=0;
			    				          }
		    					     }
								 }
							 }
							 
							 if(PINE & BIT(7))//不空夹则进行第二阶段
							 {
							    //第二阶段
							 	//构造舵机指令
							 	motor_command[2]=0x00;//ID=0
						 	 	motor_command[6]=com_finger0_ratio_2_PARA2;
						 	 	motor_command[7]=com_finger0_ratio_2_PARA3;
						 	 	CHECK=ratio_command_check(0,com_finger0_ratio_2_PARA2,com_finger0_ratio_2_PARA3);
						 	 	motor_command[8]=CHECK;
						 	 	delay(50);
						 	 	uart1_send_string(motor_command,9);//下发指令
							 
							 	//构造舵机指令
								 motor_command[2]=0x01;//ID=1
						 	 	 motor_command[6]=com_finger1_ratio_2_PARA2;
						 		 motor_command[7]=com_finger1_ratio_2_PARA3;
						 	 	 CHECK=ratio_command_check(1,com_finger1_ratio_2_PARA2,com_finger1_ratio_2_PARA3);
						 		 motor_command[8]=CHECK;
						 	 	 delay(50);
						 	 	 uart1_send_string(motor_command,9);//下发指令
							 
							 	 //等待夹紧力达到阈值并继续判断是否空夹
							 	 force_high8=0;
								 hold_stage_2_continue=1;
							 	 while(hold_stage_2_continue && (PINE & BIT(7)))
							 	 {
								     force_ulong=ReadCount();
								 	 ulong_to_uchar_array(force_ulong);//目的是获取force_high8
									 if(force_high8>=force_judge)
									 {
									     hold_stage_2_continue=0;//下次循环跳出
										 
										 //停止舵机运行
							 	 		 delay(50);
							 	 		 uart1_send_string((uchar*)no0stop,9);
							 	 		 delay(50);
							 	 		 uart1_send_string((uchar*)no1stop,9);
							 
							 	 		 hold_allow_motor_0=0;//禁止0号手指向端部靠近
							 	 		 hold_allow_motor_1=0;//禁止1号手指向端部靠近
							 
							 	 		 //报告上位机已经夹紧
							 	 		 delay(50);
							 	 		 uart0_send_string("zz10");
										 delay(50);
							 	 		 uart0_send_string("zz10");
									 }
							 	 }
							 
							 	 
							 }
							 
						 }
				 	 }
					 
					 if(array_cmp(Type(uart0_instr),"13")==0)//设定手指0,Ratio 1
				 	 {
					     com_finger0_ratio_1_PARA2=uart0_instr[2];
						 com_finger0_ratio_1_PARA3=uart0_instr[3];
						 command_data_save_finger_0_ratio_1(com_finger0_ratio_1_PARA2,com_finger0_ratio_1_PARA3);
					 }
					 
					 if(array_cmp(Type(uart0_instr),"14")==0)//设定手指0,Ratio 2
				 	 {
					     com_finger0_ratio_2_PARA2=uart0_instr[2];
						 com_finger0_ratio_2_PARA3=uart0_instr[3];
						 command_data_save_finger_0_ratio_2(com_finger0_ratio_2_PARA2,com_finger0_ratio_2_PARA3);
					 }
					 
					 if(array_cmp(Type(uart0_instr),"15")==0)//设定手指0,Ratio 3
				 	 {
					     com_finger0_ratio_3_PARA2=uart0_instr[2];
						 com_finger0_ratio_3_PARA3=uart0_instr[3];
						 command_data_save_finger_0_ratio_3(com_finger0_ratio_3_PARA2,com_finger0_ratio_3_PARA3);
					 }
					 
					 if(array_cmp(Type(uart0_instr),"16")==0)//设定手指1,Ratio 1
				 	 {
					     com_finger1_ratio_1_PARA2=uart0_instr[2];
						 com_finger1_ratio_1_PARA3=uart0_instr[3];
						 command_data_save_finger_1_ratio_1(com_finger1_ratio_1_PARA2,com_finger1_ratio_1_PARA3);
					 }
					 
					 if(array_cmp(Type(uart0_instr),"17")==0)//设定手指1,Ratio 2
				 	 {
					     com_finger1_ratio_2_PARA2=uart0_instr[2];
						 com_finger1_ratio_2_PARA3=uart0_instr[3];
						 command_data_save_finger_1_ratio_2(com_finger1_ratio_2_PARA2,com_finger1_ratio_2_PARA3);
					 }
					 
					 if(array_cmp(Type(uart0_instr),"18")==0)//设定手指1,Ratio 3
				 	 {
					     com_finger1_ratio_3_PARA2=uart0_instr[2];
						 com_finger1_ratio_3_PARA3=uart0_instr[3];
						 command_data_save_finger_1_ratio_3(com_finger1_ratio_3_PARA2,com_finger1_ratio_3_PARA3);
					 }
					 
					 if(array_cmp(Type(uart0_instr),"19")==0)//设定force_judge
				 	 {
					     force_judge=uart0_instr[2];
						 command_data_save_force_high8(force_judge);
					 }
				 
				 	 break;
			     }
			 
		         case 2:
			     {
					 if(array_cmp(uart0_instr,"2100")==0)//调试模式·手指0停止
				 	 {
					     TIMSK&=(~BIT(2));//屏蔽定时计数1中断,停止向上返回夹持力值
						 uart1_send_string((uchar*)no0stop,9);
				 	 }

					 if(array_cmp(uart0_instr,"2101")==0)//调试模式·手指0松开方向移动
				 	 {
					     if(release_allow_motor_0)
						 {
						     TIMSK&=(~BIT(2));//屏蔽定时计数1中断,停止向上返回夹持力值
						 	 motor_command[2]=0x00;//ID=0
						 	 motor_command[6]=PARA2;
						 	 motor_command[7]=PARA3+0x04;//顺时针,绝对不可在此更改PARA3的值!
						 	 CHECK=ratio_command_check(0,PARA2,PARA3+0x04);
						 	 motor_command[8]=CHECK;
						 	 delay(50);
						 	 uart1_send_string(motor_command,9);
						 	 //delay(50);
						 	 //uart0_send_string_with_num(motor_command,9);
						 	 TIMSK|=BIT(2);//打开定时计数1中断,向上返回夹持力值
						 }
				 	 }
					 
					 if(array_cmp(uart0_instr,"2102")==0)//调试模式·手指0夹紧方向移动
				 	 {
					     if(hold_allow_motor_0)
						 {
						     TIMSK&=(~BIT(2));//屏蔽定时计数1中断,停止向上返回夹持力值
						 	 motor_command[2]=0x00;//ID=0
						 	 motor_command[6]=PARA2;
						 	 motor_command[7]=PARA3;
						 	 CHECK=ratio_command_check(0,PARA2,PARA3);
						 	 motor_command[8]=CHECK;
						 	 delay(50);
						 	 uart1_send_string(motor_command,9);
						 	 //delay(50);
						 	 //uart0_send_string_with_num(motor_command,9);
						 	 TIMSK|=BIT(2);//打开定时计数1中断,向上返回夹持力值
						 }
				 	 }

					 if(array_cmp(uart0_instr,"2110")==0)//调试模式·手指1停止
				 	 {
					     TIMSK&=(~BIT(2));//屏蔽定时计数1中断,停止向上返回夹持力值
						 uart1_send_string((uchar*)no1stop,9);
				 	 }

					 if(array_cmp(uart0_instr,"2111")==0)//调试模式·手指1松开方向移动
				 	 {
					     if(release_allow_motor_1)
						 {
						     TIMSK&=(~BIT(2));//屏蔽定时计数1中断,停止向上返回夹持力值
						 	 motor_command[2]=0x01;//ID=1
						 	 motor_command[6]=PARA2;
						 	 motor_command[7]=PARA3+0x04;//顺时针,绝对不可在此更改PARA3的值!
						 	 CHECK=ratio_command_check(1,PARA2,PARA3+0x04);
						 	 motor_command[8]=CHECK;
						 	 delay(50);
						 	 uart1_send_string(motor_command,9);
						 	 //delay(50);
						 	 //uart0_send_string_with_num(motor_command,9);
						 	 TIMSK|=BIT(2);//打开定时计数1中断,向上返回夹持力值
						 }
				 	 }
					 
					 if(array_cmp(uart0_instr,"2112")==0)//调试模式·手指1夹紧方向移动
				 	 {
					     if(hold_allow_motor_1)
						 {
						     TIMSK&=(~BIT(2));//屏蔽定时计数1中断,停止向上返回夹持力值
						 	 motor_command[2]=0x01;//ID=1
						 	 motor_command[6]=PARA2;
						 	 motor_command[7]=PARA3;
						 	 CHECK=ratio_command_check(1,PARA2,PARA3);
						 	 motor_command[8]=CHECK;
						 	 delay(50);
						 	 uart1_send_string(motor_command,9);
						 	 //delay(50);
						 	 //uart0_send_string_with_num(motor_command,9);
						 	 TIMSK|=BIT(2);//打开定时计数1中断,向上返回夹持力值
						 }
				 	 }

					 if(array_cmp(Type(uart0_instr),"22")==0)
				 	 {
						 TIMSK&=(~BIT(2));//屏蔽定时计数1中断,停止向上返回夹持力值
						 delay(50);
						 uart1_send_string((uchar*)no0stop,9);
						 delay(50);
						 uart1_send_string((uchar*)no1stop,9);
						 PARA2=uart0_instr[2];
						 PARA3=uart0_instr[3];
						 //delay(50);
						 //uart0_send_string("ratio changed");
				 	 }
					 
					 if(array_cmp(uart0_instr,"2301")==0)//调试模式·设置手指0速度1(两指相同)夹紧第一阶段
				 	 {
					     command_data_save_finger_0_ratio_1(PARA2,PARA3);
						 //delay(50);
						 //uart0_send_string(" Finger-0 Ratio-1 Set Successfully! ");
					 }
					 
					 if(array_cmp(uart0_instr,"2302")==0)//调试模式·设置手指0速度2(两指相同)夹紧第二阶段
				 	 {
					     command_data_save_finger_0_ratio_2(PARA2,PARA3);
						 //delay(50);
						 //uart0_send_string(" Finger-0 Ratio-2 Set Successfully! ");
					 }
					 
					 if(array_cmp(uart0_instr,"2303")==0)//调试模式·设置手指0速度3(两指相同)松开阶段
				 	 {
					     command_data_save_finger_0_ratio_3(PARA2,PARA3);
						 //delay(50);
						 //uart0_send_string(" Finger-0 Ratio-3 Set Successfully! ");
					 }
					 
					 if(array_cmp(uart0_instr,"2311")==0)//调试模式·设置手指1速度1(两指相同)夹紧第一阶段
				 	 {
					     command_data_save_finger_1_ratio_1(PARA2,PARA3);
						 //delay(50);
						 //uart0_send_string(" Finger-1 Ratio-1 Set Successfully! ");
					 }
					 
					 if(array_cmp(uart0_instr,"2312")==0)//调试模式·设置手指1速度2(两指相同)夹紧第二阶段
				 	 {
					     command_data_save_finger_1_ratio_2(PARA2,PARA3);
						 //delay(50);
						 //uart0_send_string(" Finger-1 Ratio-2 Set Successfully! ");
					 }
					 
					 if(array_cmp(uart0_instr,"2313")==0)//调试模式·设置手指1速度3(两指相同)松开阶段
				 	 {
					     command_data_save_finger_1_ratio_3(PARA2,PARA3);
						 //delay(50);
						 //uart0_send_string(" Finger-1 Ratio-3 Set Successfully! ");
					 }
					 
					 if(array_cmp(Type(uart0_instr),"24")==0)//调试模式·设置夹紧力阈值
				 	 {
					     force_judge=uart0_instr[2];
						 command_data_save_force_high8(force_judge);
						 //delay(50);
						 //uart0_send_string(" Force Set Successfully! ");
					 }
					 
					 
					 if(array_cmp(uart0_instr,"2500")==0)//调试模式·读取EEPROM中存储的RATIO和力阈值
				 	 {
						 //更新ratio变量值、力阈值和消息数组的值
						 
						 //获取EEPROM中存储的RATIO值
    					 command_data_read_finger_0_ratio_1(&com_finger0_ratio_1_PARA2,&com_finger0_ratio_1_PARA3);
						 command_data_read_finger_0_ratio_2(&com_finger0_ratio_2_PARA2,&com_finger0_ratio_2_PARA3);
						 command_data_read_finger_0_ratio_3(&com_finger0_ratio_3_PARA2,&com_finger0_ratio_3_PARA3);
						 command_data_read_finger_1_ratio_1(&com_finger1_ratio_1_PARA2,&com_finger1_ratio_1_PARA3);
						 command_data_read_finger_1_ratio_2(&com_finger1_ratio_2_PARA2,&com_finger1_ratio_2_PARA3);
						 command_data_read_finger_1_ratio_3(&com_finger1_ratio_3_PARA2,&com_finger1_ratio_3_PARA3);
	
						 msg_eeprom_array[0]='z';
						 msg_eeprom_array[1]='z';
						 msg_eeprom_array[2]='3';
						 msg_eeprom_array[3]='3';
						 msg_eeprom_array[4]=com_finger0_ratio_1_PARA2;
						 msg_eeprom_array[5]=com_finger0_ratio_1_PARA3;
						 msg_eeprom_array[6]=com_finger0_ratio_2_PARA2;
						 msg_eeprom_array[7]=com_finger0_ratio_2_PARA3;
						 msg_eeprom_array[8]=com_finger0_ratio_3_PARA2;
						 msg_eeprom_array[9]=com_finger0_ratio_3_PARA3;
						 msg_eeprom_array[10]=com_finger1_ratio_1_PARA2;
						 msg_eeprom_array[11]=com_finger1_ratio_1_PARA3;
						 msg_eeprom_array[12]=com_finger1_ratio_2_PARA2;
						 msg_eeprom_array[13]=com_finger1_ratio_2_PARA3;
						 msg_eeprom_array[14]=com_finger1_ratio_3_PARA2;
						 msg_eeprom_array[15]=com_finger1_ratio_3_PARA3;
	
						 //获取EEPROM中存储的夹紧力阈值有效值高八位
						 command_data_read_force_high8(&force_judge);
						 msg_eeprom_array[16]=force_judge;
						 
						 delay(50);
						 uart0_send_string_with_num(msg_eeprom_array,17);//上传EEPROM中存储的数值
	
					 }
					 
				     break;
			     }
			 
		         default:break;
			 }
			 
			 if(array_cmp(uart0_instr,"3100")==0)//恢复触碰报警 ext interrupt 0 
			 {
			     ext_collision_alert_allow_int0=1;//上侧
			 }
			 
			 if(array_cmp(uart0_instr,"3200")==0)//恢复触碰报警 ext interrupt 1 
			 {
			     ext_collision_alert_allow_int1=1;//下侧
			 }
			 
			 if(array_cmp(uart0_instr,"3300")==0)//恢复触碰报警 ext interrupt 4 
			 {
			     ext_collision_alert_allow_int4=1;//指尖
			 }
			 
			 if(array_cmp(uart0_instr,"3400")==0)//读取报警允许变量的状态
			 {
			     msg_interrupt_array[4]=ext_collision_alert_allow_int0;
				 msg_interrupt_array[5]=ext_collision_alert_allow_int1;
				 msg_interrupt_array[6]=ext_collision_alert_allow_int4;
				 uart0_send_string_with_num(msg_interrupt_array,7);
			 }
			 
			 /*末尾应完成命令执行后的还原工作A-D*/
			 uart0_instr_flag=0; //A.命令接收标志位置0
			 uart0_r_instr_chk=0;//B.命令构造字符数计数置0
			 for(i=0;i<12;i++)//C.命令清除
			 {
		         uart0_instr[i]=0;
			 }
			 UCSR0B|=BIT(RXCIE0);//D.恢复UART0的接收中断			
	     }
		 

		/*
		    【偏向撞击保护的编程】
			(1)一旦手指碰撞到限位开关产生低电平,哪怕是抖动、不稳定的低电平,
			也要禁止手指继续向碰撞位置移动,此时不需要延迟防抖的处理;
			(2)只有当手指真正完全地离开了碰撞地点,限位开关IO成为稳定的高电平,
			才允许手指再次向碰撞的方向移动。
		*/
		
		if(!(PINE & BIT(5)))//检测手指0是否复位
		{
			if(stop_allow_cage_0)
			{
			    release_allow_motor_0=0;//禁止1号手指向端部靠近
				hold_allow_motor_0=1;//允许1号手指向中间靠近
				TIMSK&=(~BIT(2));//屏蔽定时计数1中断,停止向上返回夹持力值
				delay(50);
				uart1_send_string((uchar*)no0stop,9);
				delay(50);
				uart0_send_string("zz30");
				delay(50);
				uart0_send_string("zz30");
				stop_allow_cage_0=0;
			}
		}
		else
		{
		    if(!stop_allow_cage_0)
			{
			    delay(500);
			    if(PINE & BIT(5))
				{
				    release_allow_motor_0=1;//允许1号手指向端部靠近
					stop_allow_cage_0=1;
				}
			}
		}
		
		if(!(PINE & BIT(6)))//检测手指1是否复位
		{
			if(stop_allow_cage_1)
			{
			    release_allow_motor_1=0;//禁止1号手指向端部靠近
				hold_allow_motor_1=1;//允许1号手指向中间靠近
				TIMSK&=(~BIT(2));//屏蔽定时计数1中断,停止向上返回夹持力值
				delay(50);
				uart1_send_string((uchar*)no1stop,9);
				delay(50);
				uart0_send_string("zz31");
				delay(50);
				uart0_send_string("zz31");
				stop_allow_cage_1=0;
			}
		}
		else
		{
			if(!stop_allow_cage_1)
			{
			    delay(500);
			    if(PINE & BIT(6))
				{
				    release_allow_motor_1=1;//允许1号手指向端部靠近
					stop_allow_cage_1=1;
				}
			}
		}

		if(!(PINE & BIT(7)))//检测是否空夹
		{
			if(stop_allow_empty)
			{
			    hold_allow_motor_0=0;//禁止0号手指向端部靠近
				hold_allow_motor_1=0;//禁止1号手指向端部靠近
				TIMSK&=(~BIT(2));//屏蔽定时计数1中断,停止向上返回夹持力值
				delay(50);
				uart1_send_string((uchar*)no1stop,9);
				delay(50);
				uart1_send_string((uchar*)no0stop,9);
				delay(50);
				uart0_send_string("zz32");
				delay(50);
				uart0_send_string("zz32");
				stop_allow_empty=0;
			}
		}
		else
		{
			if(!stop_allow_empty)
			{
			    delay(500);
			    if(PINE & BIT(7))
				{
				    hold_allow_motor_0=1;//允许0号手指向中间靠近
					hold_allow_motor_1=1;//允许1号手指向中间靠近
					stop_allow_empty=1;
				}
			}
		}
		
	}
}