fork

Dependencies:   mbed

Fork of LG by igor Apu

Revision:
209:224e7331a061
Parent:
208:19150d2b528f
Child:
210:b02fa166315d
--- a/Command.c	Tue Feb 07 10:11:35 2017 +0000
+++ b/Command.c	Thu Apr 13 14:14:45 2017 +0000
@@ -10,15 +10,18 @@
 unsigned int Param2=0;
 unsigned int Param3=0;
 unsigned int Param4=0;
-unsigned int Consol=123;
+///unsigned int Consol=123;
 unsigned int TempParam=1;
 unsigned int CountParam=0;
-int  d8_anser=0,A=0,SA=0;
-int ttemp;
+unsigned int OldCuruAngle;
+unsigned int OldCaunPlus=0;
+unsigned int OldCaunMin=0;
+int ttemp,temp5=1;
 int OLDDAC=0;
 int rr = 123;
-unsigned int pDestT ; 
+unsigned int pDestT; 
 GyroParam *Flash;
+
  ///////////////flah and boot///////////
 void GoBoot(void)
   {
@@ -62,11 +65,11 @@
  void EraseFlash(void)
  {
  	rr = u32IAP_PrepareSectors(19, 21);
-	sprintf((Time)," dffddfd <%07d> ",rr);
-	WriteCon(Time);
+	/*sprintf((Time)," dffddfd <%07d> ",rr);
+	WriteCon(Time);*/
     rr = u32IAP_EraseSectors(19, 21);
-    sprintf((Time)," dffddfd <%07d> ",rr);
-    WriteCon(Time);
+   /* sprintf((Time)," dffddfd <%07d> ",rr);
+    WriteCon(Time);*/
     }
  
  void WriteFlash(void)
@@ -116,9 +119,11 @@
  ///////////////end flah and boot///////////
  void M_RateA(void)
  {  
-    switch(Gyro.ModeOut) {
+    switch(Gyro.ModeOut) 
+    {
     case 1: if(Gyro.Rate1_Event ) 				CMD_Rate();  		 	  break;  
-    case 2: if(Gyro.Reper_Event )				CMD_Rate2(); 			  break;    
+    case 2: if(Gyro.Reper_Event )				CMD_Rate2(); 			  break;  
+    case 8: if(Gyro.Rate3_Event )				CMD_Rate3();			  break;      
     case 3: if(Gyro.Event_500Hz ) 				CMD_Delta_PS();           break;   
     case 4: if(Gyro.EXT_Latch   ) 				CMD_Delta_PS();           break;   
     case 5: if(Gyro.Event_500Hz ) 				CMD_Delta_Bins();         break;   
@@ -135,15 +140,16 @@
    
    NP    = BuffTemp[3]; 
 
-   
+   for (int i=0;i<8;i++)
+   {BuffTemp[i]=0;}
    
    
    BuffTemp[0] =  Gyro.SOC_Out;
    BuffTemp[1] =  Gyro.My_Addres;
    
   
-   sprintf((Time),"%d = %d \r\n",NP, GyroP.Array[NP]);
-   WriteCon(Time);
+  /* sprintf((Time),"%d = %d \r\n",NP, GyroP.Array[NP]);
+   WriteCon(Time);*/
    Param = GyroP.Array[NP];
    BuffTemp[2] =(GyroP.Array[NP] >> 8) & 0xff;//старший байт требуемого параметра
    BuffTemp[3] =(GyroP.Array[NP] >> 0) & 0xff;//младший байт требуемого параметра
@@ -165,48 +171,48 @@
  
    GyroP.Array[NP] = Param;
    flash=GyroP.Array[5];
-   sprintf((Time),"%d\r\n",NP);
-   WriteCon(Time);
+ 
    switch(NP) 
    {
-   				case  0: Gyro.My_Addres 	= GyroP.Str.My_Addres; 					break;  
-     			case  3: Spi.DAC_A 			= GyroP.Str.DAC_current_Work;	     	break;  
-     			case  7: Gyro.PLC_Phase	 	= GyroP.Str.PLC_Phase;     				break; 
-     			case  8: Gyro.PLC_Gain		= GyroP.Str.PLC_Gain;     				break; 
-     			case 12: Gyro.FrqPhase		= GyroP.Str.FrqPhase;	     			break; 
-     			case 13: Gyro.FrqChengSpeed	= GyroP.Str.FrqChengSpeed;	     		break; 
+   				case  0: Gyro.My_Addres 	= GyroP.Str.My_Addres; 													break;  
+     			case  3: Spi.DAC_A 			= ((((int)(GyroP.Str.DAC_current_Work+ 0x7fff)&0xffff)+22544)*0.65); 	break;  
      			
-     			case 14: Gyro.FrqHZ			= GyroP.Str.FrqHZ;
-    			         Gyro.Frq 			= GyroP.Str.FrqHZ<<16;	
+     			case  7: Gyro.PLC_Phase	 	= GyroP.Str.PLC_Phase;     												break; 
+     			case  8: Gyro.PLC_Gain		= GyroP.Str.PLC_Gain;     												break; 
+     			case 12: Gyro.FrqPhase		= GyroP.Str.FrqPhase;	     											break; 
+     			case 13: Gyro.FrqChengSpeed	= GyroP.Str.FrqChengSpeed;	     										break; 
+     			
+     			case 14: Gyro.FrqHZ			= (7680000 / GyroP.Str.FrqHZ);
+    			         Gyro.Frq 			= (7680000 / GyroP.Str.FrqHZ)<<16;	
      			break; 
      			
-       			case 15: Gyro.FrqHZmin 		= GyroP.Str.FrqHZmin<<16;				break; 
-     			case 16: Gyro.FrqHZmax		= GyroP.Str.FrqHZmax<<16; 				break; 
+       			case 15: Gyro.FrqHZmin 		= (7680000 / GyroP.Str.FrqHZmin)<<16;									break; 
+     			case 16: Gyro.FrqHZmax		= (7680000 / GyroP.Str.FrqHZmax)<<16; 									break; 
      			
      			case 18: temp=((GyroP.Str.VB_Fdf_Hi<<16) | GyroP.Str.VB_Fdf_Lo);
     					 temp=temp/18.2;
     					 Gyro.AmpTarget=(unsigned int)(temp);
      			break; 
      			
-     			case 19: Gyro.AmpSpeed 		= GyroP.Str.AmpSpeed;	     			break; 
-     			case 20: Gyro.AmpPerMin 	= GyroP.Str.AmpPerMin;	     			break; 
-     			case 21: Gyro.AmpPerMax 	= GyroP.Str.AmpPerMax;	     			break; 
+     			case 19: Gyro.AmpSpeed 		= GyroP.Str.AmpSpeed;	     											break; 
+     			case 20: Gyro.AmpPerMin 	= GyroP.Str.AmpPerMin;	     											break; 
+     			case 21: Gyro.AmpPerMax 	= GyroP.Str.AmpPerMax;	     											break; 
      			
      			case 22: Gyro.AmpPer		= GyroP.Str.AmpPer;
     					 Gyro.Amp    		= GyroP.Str.AmpPer<<16;	   
     			break; 
     			
-     			case 23: Gyro.AmpMin 		= GyroP.Str.AmpMin;	    				break; 
-     			case 24: Gyro.AmpTD  		= GyroP.Str.AmpTD;     					break; 
-     			case 25: Gyro.AmpPerDel		= GyroP.Str.AmpPerDel;	     			break;
-     			case 34: Gyro.ModAmp		= GyroP.Str.ModAmp;	     				break;
+     			case 23: Gyro.AmpMin 		= GyroP.Str.AmpMin;	    												break; 
+     			case 24: Gyro.AmpTD  		= GyroP.Str.AmpTD;     													break; 
+     			case 25: Gyro.AmpPerDel		= GyroP.Str.AmpPerDel;	     											break;
+     			case 34: Gyro.ModAmp		= GyroP.Str.ModAmp;	     												break;
      			case 56: Gyro.Gain_Sin 		= GyroP.Str.Gain_Sin;	     		
      					 Out_G_photo(Gyro.Gain_Sin, Gyro.Gain_Cos); 
      			break;
      			case 57: Gyro.Gain_Cos 			= GyroP.Str.Gain_Cos;
      			 		 Out_G_photo(Gyro.Gain_Sin, Gyro.Gain_Cos); 
      			break;
-     			case 60: Gyro.GLD_Serial 		= GyroP.Str.GLD_Serial;	   			break;
+     			case 60: Gyro.GLD_Serial 		= GyroP.Str.GLD_Serial;	   											break;
    }
      			
     NP=0; 	
@@ -224,15 +230,24 @@
 }
 void CMD_Maintenance(void)
 {
-  //  Gyro.ModeOut=0;
+    Gyro.ModeOut=0;
    //Gyro.DropDelayGLD = DropDelayGLD_0;//задержка на выдачу 45 микросекунд для любого адреса ГЛД
     BuffTemp[0] =  Gyro.SOC_Out;
+
     BuffTemp[1] =  Gyro.My_Addres;
+
     BuffTemp[2] =  Gyro.Firmware_Version;
+   /* sprintf((Time),"%d \r\n", Gyro.Firmware_Version);
+     WriteCon(Time);*/
     BuffTemp[3] =  Gyro.GLD_Serial;
+
     BuffTemp[4]=0x00;
+
     BuffTemp[5]=0x00;
+
     Check(BuffTemp, 8);
+   /*  sprintf((Time),"%d  %d  %d  %d  %d %d %d %d\r\n",BuffTemp[0], BuffTemp[1],BuffTemp[2],BuffTemp[3],BuffTemp[4],BuffTemp[5],BuffTemp[6],BuffTemp[7]);
+     WriteCon(Time);*/
     WriteConN (BuffTemp,8);
    
 }
@@ -252,7 +267,6 @@
     BuffTemp[ 5] = 0x00000000;
     Check(BuffTemp, 8);
     WriteConN (BuffTemp,8);
-    
 }
 
 void CMD_Delta_Bins(void)
@@ -273,15 +287,18 @@
     WriteConN (BuffTemp,9);
 }  
 void CMD_Delta_PS(void)
-{   
+{   int drob;
     Gyro.EXT_Latch=0;
     Gyro.Event_500Hz=0;
     unsigned int Temp;
 	BuffTemp[ 0] = Gyro.SOC_Out;
     BuffTemp[ 1] = Gyro.My_Addres;
       
-    Temp = Gyro.CuruAngle;
-    Gyro.CuruAngle = 0;
+    Gyro.CuruAngle = Gyro.CuruAngle + OldCuruAngle; 						//(72 град/с)
+    
+	OldCuruAngle=Gyro.CuruAngle & 0x7;										//сохраняем 5 бит для след измирений 
+	Temp=Gyro.CuruAngle>>3;                                            	//приводим к форме вывода
+	Gyro.CuruAngle = 0;
 
     BuffTemp[ 2] =(Temp >> 8) & 0xff;//старший байт разности счетчиков
     BuffTemp[ 3] =(Temp >> 0) & 0xff;//младший байт разности счетчиков
@@ -302,12 +319,11 @@
      
      //HFO
      case 2:
-           Temp = 0;//HFO
+           Temp = Spi.DAC_A-0x7fff;
            BuffTemp[5] = (Temp >> 8) & 0xff;
      break;     
      
      case 3:
-           Temp = 0;//HFO
            BuffTemp[5] = (Temp >> 0) & 0xff;
      break;  
    
@@ -315,7 +331,7 @@
      
      //T_Vibro
      case 4:
-           Temp = (unsigned int)((7680000*16/(Gyro.Frq>>12))); 
+           Temp = (unsigned int)((7675000*16/(Gyro.Frq>>12))); 	
            BuffTemp[5] = (Temp >> 8) & 0xff;
      break;  
     
@@ -327,7 +343,7 @@
      
      //L_Vibro  
      case 6:
-          Temp = (unsigned int)(((7680000*16/200) *Gyro.AmpPer /(Gyro.Frq>>12))); 
+          Temp = Gyro.L_vibro>>1;
           BuffTemp[5]  =  (Temp >> 8) & 0xff;
  
      break;  
@@ -340,7 +356,7 @@
      
      //Напряжение на регуляторе периметра
      case 8:
-          Temp = Spi.DAC_B /*- 0x7fff*/;
+          Temp = (Spi.DAC_B - 0x7fff);
           BuffTemp[5] =  (Temp >> 8) & 0xff;
   
      break;  
@@ -436,47 +452,80 @@
 
 void CMD_Rate2(void)
 {
+	unsigned int Temp;
 	Gyro.Reper_Event=0;
+
     BuffTemp[ 0] = Gyro.SOC_Out;
     BuffTemp[ 1] = Gyro.My_Addres;
 
 
-    BuffTemp[ 2] =(Gyro.CaunPlus >> 8) & 0xff;//старший байт счетчика +.
-    BuffTemp[ 3] =(Gyro.CaunPlus >> 0) & 0xff;//младший байт счетчика +.
+	Temp=Gyro.CaunPlusReper;           
+	BuffTemp[ 2] =(Temp >> 8) & 0xff;//старший байт счетчика +.
+    BuffTemp[ 3] =(Temp >> 0) & 0xff;//младший байт счетчика +.
  
-    BuffTemp[ 4] =(Gyro.CaunMin >> 8) & 0xff;//старший байт счетчика -.
-    BuffTemp[ 5] =(Gyro.CaunMin >> 0) & 0xff;//младший байт счетчика -.
+							//сохраняем 5 бит для след измирений 
+ 
+ 	Temp= Gyro.CaunMinReper;
+    BuffTemp[ 4] =(Temp >> 8) & 0xff;//старший байт счетчика -.
+    BuffTemp[ 5] =(Temp >> 0) & 0xff;//младший байт счетчика -.
   
     Check(BuffTemp, 8);
     WriteConN (BuffTemp,8);
 }
 
+void CMD_Rate3(void)
+{
+	Gyro.Rate3_Event=0;
+    BuffTemp[ 0] = Gyro.SOC_Out;
+    BuffTemp[ 1] = Gyro.My_Addres;
+    BuffTemp[ 2] =  0xcc;//старший байт счетчика +.
+    BuffTemp[ 3] = 0xcc;//младший байт счетчика +.
+ 
+    BuffTemp[ 4] =0xBB;//старший байт счетчика -.
+    BuffTemp[ 5] =0xBB;//младший байт счетчика -.
+
+    Check(BuffTemp, 8);
+    WriteConN (BuffTemp,8);
+}
+
+
 void CMD_Rate(void)
 { 
     Gyro.Rate1_Event=0;
    	unsigned int Temp;
    	int Temp1;
-	unsigned int OldCuruAngle;
+   	float Temp2;
  
     BuffTemp[ 0] = Gyro.SOC_Out;												//1	--старт данных
     BuffTemp[ 1] = Gyro.My_Addres;												//2 --адрес отвечающего устройствва
 
+    BuffTemp[ 2] =(  Gyro.CaunPlusReper   >> 8) & 0xff;//старший байт счетчика +.		3 --сарший байт счентчика +
+    BuffTemp[ 3] =(  Gyro.CaunPlusReper   >> 0) & 0xff;//младший байт счетчика +.		4 --младший байт счетчика +
+   // Gyro.CaunPlusRate=0;
+/*
     BuffTemp[ 2] =(Gyro.CaunPlus >> 8) & 0xff;//старший байт счетчика +.		3 --сарший байт счентчика +
     BuffTemp[ 3] =(Gyro.CaunPlus >> 0) & 0xff;//младший байт счетчика +.		4 --младший байт счетчика +
- 
+ */
+    BuffTemp[ 4] =(	  Gyro.CaunMinReper  >> 8) & 0xff;//старший байт счетчика -.			5 --сарший байт счентчика -
+    BuffTemp[ 5] =(	  Gyro.CaunMinReper  >> 0) & 0xff;//младший байт счетчика -.			6 --младший байт счетчика -
+  //  Gyro.CaunMinRate=0;
+/*
     BuffTemp[ 4] =(Gyro.CaunMin >> 8) & 0xff;//старший байт счетчика -.			5 --сарший байт счентчика -
     BuffTemp[ 5] =(Gyro.CaunMin >> 0) & 0xff;//младший байт счетчика -.			6 --младший байт счетчика -
-
-    Temp=Gyro.CuruAngle;														//(0,28/с)
+*/
+    //Temp=Gyro.CuruAngle;														//(0,28/с)
     	//8 байт       + 4 байта от прошлых измерений
-		//Gyro.CuruAngle = Gyro.CuruAngle + OldCuruAngle; 						//(72 град/с)
-		/*  OldCuruAngle=Gyro.CuruAngle & 0xff;									//сохраняем 4 байта для след измирений
-		  Temp=Gyro.CuruAngle>>8; 		*/										//приводим к форме вывода 
-		 														
-		 /*																		//(9 град/с)
+	
+		Gyro.CuruAngle = Gyro.CuruAngle + OldCuruAngle; 						//(72 град/с)
+	 /* OldCuruAngle=Gyro.CuruAngle & 0xff;										//сохраняем 4 байта для след измирений
+		Temp=Gyro.CuruAngle>>8; 	 */ 											//приводим к форме вывода 
+																		//(9 град/с)
 		OldCuruAngle=Gyro.CuruAngle & 0x1f;										//сохраняем 5 бит для след измирений 
-		Temp=Gyro.CuruAngle>>5;    */                                          	//приводим к форме вывода
+		Temp=Gyro.CuruAngle>>5;                                            	//приводим к форме вывода
 		
+	/*sprintf((Time),"%d   %d\r\n",Gyro.CuruAngle, Temp);
+    WriteCon(Time);		*/
+    
     Gyro.CuruAngle = 0;
     BuffTemp[ 6] =(Temp >> 8) & 0xff;//старший байт разности счетчиков			7 --младший байт разности счетчиков
     BuffTemp[ 7] =(Temp >> 0) & 0xff;//младший байт разности счетчиков			8 --старший байт разности счетчиков
@@ -486,34 +535,35 @@
     BuffTemp[39] =(Temp >> 16) & 0xff;;															//40 формат 22.10
     BuffTemp[40] =(Temp >> 8)  & 0xff;;															//41 1бит знак
     BuffTemp[41] =(Temp >> 0)  & 0xff;;															//42
-	
-  
-  
-  
-  
+   
     Temp = Gyro.F_ras;	
+    //Gyro.F_ras=0;
     BuffTemp[ 8] = (Temp >> 8) & 0xff;//расщипление частота						9  --частота расщипления
-    BuffTemp[ 9] = (Temp >> 0) & 0xff;//										10 --частота расщипления
+    BuffTemp[ 9] = (Temp >> 0) & 0xff;//	    								10 --частота расщипления
     
-	Temp = 0xffff;//HFO
-    BuffTemp[10] = (Temp >> 8) & 0xff;//выход регулятора гвч;					11 --выход регулятора ГВЧ
-    BuffTemp[11] = (Temp >> 0) & 0xff;										  //12 --выход регулятора ГВЧ
-
-    Temp =0xffff;
+   // ((temp*1.67)-0x5523);
+	Temp2 = ((Spi.DAC_A/0.65)-22544)-0x7fff;   
+	Temp1=  (int)Temp2;
+	//Temp1=Gyro.DacIn/*-0x7fff*/;
+    BuffTemp[10] = (Temp1 >> 8) & 0xff;//выход регулятора гвч;					11 --выход регулятора ГВЧ
+    BuffTemp[11] = (Temp1 >> 0) & 0xff;										  //12 --выход регулятора ГВЧ
+   
+    Temp =(unsigned int)(0x7fff-Spi.ADC5)*0.79;
     BuffTemp[12]=(Temp >> 8) & 0xff;//// HFO									13 --сигнал ошибки регулятора ГВЧ
     BuffTemp[13]=(Temp >> 0) & 0xff;////										14 --сигнал ошибки регулятора ГВЧ
-
- 
- 	Temp = (unsigned int)((7675000*16/(Gyro.Frq>>12))); 					
+  
+ 	//Temp = (unsigned int)((7675000*16/(Gyro.Frq>>12))); 		
+ 	Temp = (unsigned int)(7675000/(Gyro.Frq>>16)); 
     BuffTemp[14]  =  (Temp >> 8) & 0xff;									    //15 период вибропривода.(частота) T_Vibro
     BuffTemp[15]  =  (Temp >> 0) & 0xff;								        //16 период вибропривода.
     
-    Temp =0xff;
-    BuffTemp[16] = 0x00;														//17 старший байт ФД регулятора периода вибропривода
-    BuffTemp[17] = 0x00;														//18
- 
+    Temp = Gyro.FrqPhaseEror<<2;//Spi.DAC_A-0x7fff;
+    BuffTemp[16] = (Temp >> 8) & 0xff;														//17 старший байт ФД регулятора периода вибропривода
+    BuffTemp[17] = (Temp >> 0) & 0xff;	
+    /*sprintf((Time),"%d   %d\r\n",Gyro.FrqPhaseEror, Gyro.FrqPhaseEror<<2);
+    WriteCon(Time);			*/										//18
 
- 	Temp = Gyro.L_vibro>>1;//(unsigned int)(((7675000*16/200) * Gyro.AmpPer /(Gyro.Frq>>12))); 
+ 	Temp =Gyro.L_vibro/*>>1*/;//(unsigned int)(((7675000*16/200) * Gyro.AmpPer /(Gyro.Frq>>12))); 
     BuffTemp[18]  =  (Temp >> 8) & 0xff;										//19 длительность импулься вибропривода(амплитуда)
     BuffTemp[19]  =  (Temp >> 0) & 0xff;										//20
     
@@ -522,31 +572,34 @@
     BuffTemp[20] = (Temp >> 8) & 0xff;//регулятор датчика  угла поворота		//21 старший байт регулятора датчика угла поворота
     BuffTemp[21] = (Temp >> 0) & 0xff;											//22
     
-    Temp = (Spi.DAC_B - 0x7fff);
-    BuffTemp[22] =  (Temp >> 8) & 0xff;											//23 Выход регулятора рабочего периметра
-    BuffTemp[23] =  (Temp >> 0) & 0xff;											//24
-
-    Temp =0x0; //Gyro.AD_Slow >> 16;
+    Temp1 =(Spi.DAC_B-0x7fff);
+    BuffTemp[22] =  (Temp1 >> 8) & 0xff;											//23 Выход регулятора рабочего периметра
+    BuffTemp[23] =  (Temp1 >> 0) & 0xff;	
+    										//24
+   /* sprintf((Time),"%d \r\n",Temp1);
+    WriteCon(Time);	*/
+    
+    Temp = Gyro.PLC_Eror_count>>4; //Gyro.AD_Slow >> 16; 
+    Gyro.PLC_Eror_count = 0;
     BuffTemp[24] = (Temp >> 8) & 0xff;//                                        //25 ФД СРП
     BuffTemp[25] = (Temp >> 0) & 0xff;// 										//26 ФД СРП
-    
-    Temp = Gyro.AD_Slow >> 16;
+        
+    Temp =0;/* Gyro.AD_Slow >> 16*/;
     BuffTemp[26] =  (Temp >> 8) & 0xff;											//27 ADC 0 
     BuffTemp[27] =  (Temp >> 0) & 0xff;											//28
     
-    Temp =  Gyro.AD_Slow >> 16;
+    Temp =0; /*Gyro.AD_Slow >> 16*/;
     BuffTemp[28] = (Temp >> 8) & 0xff;											//29 ADC 1
     BuffTemp[29] = (Temp >> 0) & 0xff;											//30
 	
-	Temp = (Gyro.In1 - 0x7fff);
-    BuffTemp[30] = (Temp >> 8) & 0xff;//in1//2									//31 ADC 2
-    BuffTemp[31] = (Temp >> 0) & 0xff;											//32
+	Temp1 = ((Gyro.In1>>1)*0.800875)-0x3e0b;
+    BuffTemp[30] = (Temp1 >> 8) & 0xff;//in1//2									//31 ADC 2
+    BuffTemp[31] = (Temp1 >> 0) & 0xff;											//32
 
- 	Temp = (Gyro.In2 - 0x7fff);
-    BuffTemp[32] = (Temp >> 8) & 0xff;											//33 ADC 3
-    BuffTemp[33] = (Temp >> 0) & 0xff;//in2//3									//34
-
-
+ 	Temp1 =((Gyro.In2>>1)*0.800875)-0x3e0b;// - 0x4FFF;
+    BuffTemp[32] = (Temp1 >> 8) & 0xff;											//33 ADC 3
+    BuffTemp[33] = (Temp1 >> 0) & 0xff;//in2//3									//34
+  	
 	Temp = (Gyro.DeltaT);
     BuffTemp[34] = (Temp >> 8) & 0xff;//дельта									//35 ADC 4
     BuffTemp[35] = (Temp >> 0) & 0xff;											//36
@@ -556,175 +609,179 @@
     BuffTemp[36] =(Temp >> 8) & 0xff;//температура                              //37 ADC 5
     BuffTemp[37] =(Temp >> 0) & 0xff;//ADC6   sesnsor 5							//38
 
-
-
     Check(BuffTemp, 44);
     WriteConN (BuffTemp,44);
+    for(int i=0; i<45;i++) {BuffTemp[i]=0;}
+}
+
+void CMD_M_Stymul()
+{
+    int temp,Consol=0,HFO,b4;
+    float Temp1;
+    temp=BuffTemp[3];
+   
+    b4		= temp;
+    Consol 	= temp>>7;
+    HFO    	= temp&0x3;// // (номер (код) ЦАПа 0...3, HFO - 3dac, PLC - 0DAC
+  
+    temp 	= (((BuffTemp[4]<<8) | BuffTemp[5])&0xFFFF);
+    if(HFO) 
+    {
+    	Gyro.DacIn=temp;
+    	Spi.DAC_A = (unsigned int)((temp+22544)*0.65);
+    }
+    else	Spi.DAC_B = (unsigned int)temp;
     
+    sprintf((Time)," %d  %d \r\n", Spi.DAC_B,temp);
+    WriteCon(Time);	
+
+    
+	/*
+      sprintf((Time),"%d     %d     %f     \r\n", temp,   Spi.DAC_A,    (temp+10744)*0.79);
+      WriteCon(Time);
+    */
+  
+    	/*{
+    		DACF =(temp*K_DAC)+deltaDAC;
+   			Spi.DAC_B =(unsigned int)(DACF) (unsigned int)(temp*K_DAC+deltaDAC); // K_DAC);
+    	}*/
+    if(Consol)
+    {
+    BuffTemp[0] = Gyro.SOC_Out;      //DD
+    BuffTemp[1] = Gyro.My_Addres;    //00
+    BuffTemp[2] = Gyro.CMD_In;       //D9
+    BuffTemp[3] =0;
+    Check(BuffTemp, CRC_N);
+    WriteConN (BuffTemp,CRC_N);
+    }
 }
+
 void CMD_M_vib()
 {   
-    unsigned int temp1,temp2;
+    unsigned int temp1,temp2,anser;
+   // anser		=	BuffTemp[3]>>7;
+   
+    temp1 		=	(((BuffTemp[4]<<8) | BuffTemp[5])&0xFFFF);
+    Gyro.Frq	=	(122780000/temp1)<<12;
+    
+    temp2		=	(((BuffTemp[6]<<8) | BuffTemp[7])&0xFFFF);
+    Gyro.AmpPer	=	((((((Gyro.Frq>>12)*200)/16)*temp2)/7675000)/2);
 
-    temp1 =((BuffTemp[4]<<8) | BuffTemp[5]);
-    temp1=temp1&0xFFFF;
     
-    Gyro.Frq=(122780000/temp1)<<12;
-    
-    temp2 =((BuffTemp[6]<<8) | BuffTemp[7]);
-    temp2=temp2&0xFFFF;
-    
-
-    Gyro.AmpPer=((((((Gyro.Frq>>12)*200)/16)*temp2)/7675000)/2);
+   // if(anser)
+   // {
+    BuffTemp[0] = Gyro.SOC_Out;      
+    BuffTemp[1] = Gyro.My_Addres;    
+    BuffTemp[2] = Gyro.CMD_In;       
+    BuffTemp[3] = 0x0;    
+    BuffTemp[4] = 0x0; 
+    Check(BuffTemp, CRC_N);
+    WriteConN (BuffTemp,CRC_N);  
+  //  }
 }
 void CMD_M_Control_D8()///установка\сброс регистров управления
 {
-    unsigned int bit,Pa;
-    unsigned int SR,V,Bit_num;
-    SR=0;
-    V=0;
-    A=0;
-    Bit_num=0;
+    unsigned int bit=0,Pa=0;
+    unsigned int SR=0,V=0,Bit_num=0,A=0;
+    Pa = BuffTemp[3];
+    SR = Pa >> 7;
+    V  = (Pa>>5)&0x3;
+    A  = (Pa>>4)&0x1;
+    Bit_num = Pa & 0xf;
     
+    switch (SR)
+   	{
+     case 0:
+      		 switch (A)
+   			 {
+     		 	case 0:
+      					switch (Bit_num)
+   						{
+				   	     case 0x06: 	FrqOFF 	 				break;
+				    	 case 0x05: 	AVibOFF	 				break;
+				    	 case 0x01: 	HFOOFF 	 				break;
+				    	 case 0x03: 	PlcOFF 	 				break;
+				    	}
+     			break;
+     			case 1:
+     					switch (Bit_num)
+   						{
+   						 case 0x00:  Gyro.RgConB &= ~(1<<0);	 break;
+				    	 case 0x01:  Gyro.RgConB &= ~(1<<1);	 break;
+				    	 case 0x02:  Gyro.RgConB &= ~(1<<2);	 break;	   	
+				    	}
+     			break;
+			 }
+      	
+      	
+     break;
+     case 1:
+    		 switch (A)
+   			 {
+     		 	case 0:
+      					switch (Bit_num)
+   						{
+				   	    case 0x06: 		FrqON  	 			break;
+    	 				case 0x05: 		AVibON 	 			break;
+			    	 	case 0x01: 		HFOON  	 			break;
+			    	 	case 0x03: 		PlcON 	 			break;
+				    	}
+     			break;
+     			case 1:
+     					switch (Bit_num)
+   						{
+   						 case 0x00:  Gyro.RgConB |= (1<<0);	 break;
+				    	 case 0x01:  Gyro.RgConB |= (1<<1);	 break;
+				    	 case 0x02:  Gyro.RgConB |= (1<<2);	 break;	   	
+				    	}
+     			break;
+			 }
+     break;
+	}
     BuffTemp[0] = Gyro.SOC_Out;      //DD
     BuffTemp[1] = Gyro.My_Addres;    //00
     BuffTemp[2] = Gyro.CMD_In;       //D8
-   // Gyro.CMD_In = BuffTemp[2];
-    Pa = BuffTemp[3];
-    SR = Pa >> 0x7;
-    V  = Pa >> 0x5;
-    V  = V  &  0x3;
-    A  = Pa >> 0x4;
-    A  = A  &  0x1;
-    Bit_num = Pa & 0xf;
-   if(A)
-  	 {
-  	   if(SR)
-  	    	{
-    			 switch (Bit_num)
-    	 				{
-    	 				case 0x00: Gyro.RgConB &= ~ 1<<0; 	 break;
-    	 				case 0x01: Gyro.RgConB &= ~ 1<<1; 	 break;
-			    	 	case 0x02: Gyro.RgConB &= ~ 1<<2;  	 break;
-			    		}
-			} 
-		else
-			{	 
-			    
-			     switch (Bit_num)
-   						{
-   						
-				   	     case 0x00:  Gyro.RgConB = 0xfffe;	 break;
-				    	 case 0x01:  Gyro.RgConB |= 1<<1;	 break;
-				    	 case 0x02:  Gyro.RgConB |= 1<<2;	 break;	    	
-				    	}
-      		} 
-      }
-   else
-      {
-     	if(SR) 
-       		 {
-    			 switch (Bit_num)
-    	 				{
-    	 				case 0x06: FrqON  	 break;
-    	 				case 0x05: AVibON 	 break;
-			    	 	case 0x01: HFOON  	 break;
-			    	 	case 0x03: PlcON 	 break;
-			    		}
-      		 } 
-	 	 else
-	 		 {
-   				switch (Bit_num)
-   						{
-				   	     case 0x06: FrqOFF 	 break;
-				    	 case 0x05: AVibOFF	 break;
-				    	 case 0x01: HFOOFF 	 break;
-				    	 case 0x03: PlcOFF 	 break;
-				    	}
-   	 		 }
-       }   
+    switch (A)
+   			 {
+     		 	case 0:
+      			BuffTemp[ 4] =(Gyro.RgConA >> 8) & 0xff;
+   				BuffTemp[ 5] =(Gyro.RgConA >> 0) & 0xff;	
+     			break;
+     		
+     			case 1:
+     			BuffTemp[ 4] =(Gyro.RgConB >> 8) & 0xff;
+   				BuffTemp[ 5] =(Gyro.RgConB >> 0) & 0xff;
+     			break;
+			 }
+    Check(BuffTemp, CRC_N);
+    WriteConN (BuffTemp,CRC_N); 
+}
 
-}
-void D8_Answer()
-{   
-    
-    
-   
-    BuffTemp[0] = Gyro.SOC_Out;      //DD
-
-    BuffTemp[1] = Gyro.My_Addres;    //00
-
-    BuffTemp[2] = 0xD8;       //D8
-
-    BuffTemp[3] =A<<4;
- 
-    if(A)
-    {      
-    BuffTemp[ 4] =(Gyro.RgConB >> 8) & 0xff;
-    BuffTemp[ 5] =(Gyro.RgConB >> 0) & 0xff;
-
-    }
-    else
-    {
-    BuffTemp[ 4] =(Gyro.RgConA >> 8) & 0xff;
-    BuffTemp[ 5] =(Gyro.RgConA >> 0) & 0xff;
-    }
-    Check(BuffTemp, CRC_N);
-    WriteConN (BuffTemp,CRC_N);
-
-}
 void CMD_M_Control_D9()///чтение регистров управления
 {
-    int bit,NReg;
+    int bit,NReg,param=0;
     BuffTemp[0] = Gyro.SOC_Out;      //DD
     BuffTemp[1] = Gyro.My_Addres;    //00
     BuffTemp[2] = Gyro.CMD_In;       //D9
-    if ((Param1 & 0x10) == 0) {
-        BuffTemp[3]=0<<4;
-        BuffTemp[4] = (Gyro.RgConA>>8 )& 0xff;
-        BuffTemp[5] =  Gyro.RgConA     & 0xff;
-    } else {
+    param = BuffTemp[3]; 
+    if (param) 
+    {
         BuffTemp[3]=1<<4;
         BuffTemp[4] = (Gyro.RgConB>>8 ) & 0xff;
         BuffTemp[5] =  Gyro.RgConB      & 0xff;
     }
+    else 
+    {
+        BuffTemp[3]=0<<4;
+        BuffTemp[4] = (Gyro.RgConA>>8 )& 0xff;
+        BuffTemp[5] =  Gyro.RgConA     & 0xff; 
+    }
     Check(BuffTemp, CRC_N);
     WriteConN (BuffTemp,CRC_N);
 }
 // (номер (код) ЦАПа 0...3, старший байт требуемого ЦАПа, младший байт треб ЦАПа)
-void CMD_M_Stymul_Answer()
-{   SA=0;
-	BuffTemp[ 0] =0xdd;
-    BuffTemp[ 1] = 0x00;
-    BuffTemp[ 2] = 0x0A;
-    BuffTemp[ 3] =0;
-    Check(BuffTemp, CRC_N);
-    WriteConN (BuffTemp,CRC_N);
-}
-void CMD_M_Stymul()
-{
-    int temp;
-    int HFO;
-    int b4;
-    temp=BuffTemp[3];
-    b4=temp;
-    Consol = temp>>7;
-    if(Consol)SA=1;
-    HFO    = temp&0x3;// // (номер (код) ЦАПа 0...3, HFO - 3dac, PLC - 0DAC
-    temp =((BuffTemp[4]<<8) | BuffTemp[5]);
-    // temp=0;
-    temp=temp&0xFFFF;
-    
-    if(HFO)
-    {
-     Spi.DAC_A=(unsigned int)temp;
-    }
-    else{
-    DACF =/*(*/temp/*K_DAC)+deltaDAC;*/;
-    Spi.DAC_B =(unsigned int)(DACF) /*(unsigned int)(temp*K_DAC+deltaDAC)*/; // K_DAC);
-    }
-   
-}
+
+
 
 void GLDStartDischarg(void)
 {                  TimeDischarg=0;
@@ -755,9 +812,27 @@
  //Gyro.flagGph_W=3;
 
  	Out_G_photo(BuffTemp[4],BuffTemp[5]); 
- 	   
+  BuffTemp[0] 	= Gyro.SOC_Out;      //DD
+  BuffTemp[1]	= Gyro.My_Addres;    //00
+  BuffTemp[2]	= Gyro.CMD_In;       //D9
+  BuffTemp[3]	= 0;    
+  Check(BuffTemp, CRC_N);
+  WriteConN (BuffTemp,CRC_N);          
 }
-
+void DeviceMode()
+{
+  int TempMod=1;
+  BuffTemp[0] 	= Gyro.SOC_Out;      //DD
+  BuffTemp[1]	= Gyro.My_Addres;    //00
+  BuffTemp[2]	= Gyro.CMD_In;       //D9
+  TempMod	 	= BuffTemp[3] & 0xf;
+  Gyro.RgConMod	= TempMod;
+  BuffTemp[3]=Gyro.RgConMod & 0xff;
+  BuffTemp[4]=0;
+  BuffTemp[5]=0;
+  Check(BuffTemp, CRC_N);
+  WriteConN (BuffTemp,CRC_N);
+}
 
 unsigned int Check(char *c, unsigned int Count)
 {
@@ -786,8 +861,6 @@
     c[Count-2]=(CRC>>8)&0xFF;
     c[Count-1]=(CRC>>0)&0xFF;
 
-
-
     return temp;
 }
 
@@ -802,14 +875,15 @@
        case 0x0F:  lengf=6; CRC_N=8;     break;  //Delta_Bins
        case 0xA0:  lengf=6; CRC_N=8;     break;  //Delta_PS
        case 0xDD:  lengf=6; CRC_N=44;    break;  //m_rate    
-       case 0x0A:  lengf=8; CRC_N=6;          	 break;	 //m_stymul
+       case 0x0A:  lengf=8; CRC_N=6;     break;	 //m_stymul
        case 0xE9:  lengf=6; CRC_N=8;	 break;	 //DeviceMode
        case 0xE8:  lengf=6; CRC_N=8; 	 break;  //DeviceMode
        case 0xA5:  lengf=6; CRC_N=8;     break;  //DeviceMode
-       case 0xD8:  lengf=6; CRC_N=6;     break;  //m_control   
+       case 0xD8:  lengf=6; CRC_N=8;     break;  //m_control   
        case 0xD9:  lengf=6; CRC_N=8;     break;  //m_control
-       case 0xE4:  lengf=8;              break;  //M_VIB_W
-       case 0xE6:  lengf=8;              break;  //M_Gph_W
+       case 0xE4:  lengf=8; CRC_N=6;     break;  //M_VIB_W
+       case 0xE6:  lengf=8; CRC_N=6;     break;  //M_Gph_W
+       
     }  return lengf;
 }
 
@@ -821,17 +895,21 @@
  // чтение данных из консоли
  if(CountBuFFIn==1) {
   	// если есть первый байт 
-    if (BuffTemp[0] != SOC_In) {
+    if (BuffTemp[0] != SOC_In) 
+      {
        ReadCon1(BuffTemp);
        Gyro.RsErrLine += 0x100;
-       BuffTemp[99]=Gyro.RsErrLine; 
-       }
+    //BuffTemp[99]=Gyro.RsErrLine;
+     ReadCon1(BuffTemp);  
+      }
     } 
     else if(CountBuFFIn==2) //если второй байт
     {		//                                 широковещаительный
-         if (BuffTemp[1] != Gyro.My_Addres /*|| BuffTemp[1] !=0x1f*/) {
+         if (BuffTemp[1] != Gyro.My_Addres /*|| BuffTemp[1] !=0x1f*/) 
+          {
             ReadCon1(BuffTemp); 
             Gyro.RsErrLine += 0x1;
+            ReadCon1(BuffTemp); 
           } 
     } 
     else if(CountBuFFIn==3) // если третий байт
@@ -867,26 +945,28 @@
      {
       ReadCon1(BuffTemp); 
      
-	  if(SA)CMD_M_Stymul_Answer();
+	  //if(SA)CMD_M_Stymul_Answer();
     //  if(d8_anser)D8_Answer();
       
       switch(Gyro.CMD_In) {
-      case 0x99: Gyro.ModeOut=0;  	CMD_Maintenance(); 							 break;
-      case 0xD8: 					CMD_M_Control_D8();	 D8_Answer();   		 break;
+      case 0x99: /*Gyro.ModeOut=0;*/CMD_Maintenance(); 							 break;
+      case 0xD8: 					CMD_M_Control_D8();	 	              		 break;
       case 0xE9:	 				CMD_M_Param_R();							 break;		//чтение параметров
       case 0xE8: 					CMD_M_Param_W(); 							 break;     //запись параметра
       case 0xDA:                    GLDStartDischarg();  						 break; 
       case 0xD9: 		            CMD_M_Control_D9();				             break;
       case 0x0A:	                CMD_M_Stymul();  							 break;
-      case 0xDD: 	TempParam=(BuffTemp[3]) & 0x9f; 							//Rate
+      case 0xDD:  TempParam=(BuffTemp[3]) & 0x9f; 							    //Rate
                   switch(TempParam) {
-  				  case  Rate1  :  CMD_Rate(); 			 	    				break;  
+  				  case  Rate1  :  CMD_Rate(); 	   								break;  
 				  case  Rate2  :  CMD_Rate2();             						break;
+				  case  Rate3  :  CMD_Rate3();             						break;
 				  case  PRate1 :  Gyro.ModeOut=1;	    						break;  
 				  case  PRate2 :  Gyro.ModeOut=2;								break;  
+				  case  PRate3 :  Gyro.ModeOut=8;								break;  
 				 }
       break;      //DropDelay(); выставка задержки для мультидропа сбрасывается в команде CMD_Maintenance() на () микросекунд; 
-      case 0xA0:  DropDelay();    TempParam=(BuffTemp[3]) & 0x90; 				//Delta_PS
+      case 0xA0:  /*DropDelay();*/    TempParam=(BuffTemp[3]) & 0x90; 				//Delta_PS
                   switch(TempParam) {
   				  case  Delta_500  :  CMD_Delta_PS();		 	    			break;  
 				  case  Delta_EXT  :  CMD_Delta_PS();              				break;
@@ -909,6 +989,7 @@
     			}
       break;
       case 0xE4:                	 CMD_M_vib(); 								break; 
+      case 0xA5:                	 DeviceMode(); 								break; 
       case 0xE6:					 Gph_W();									break; 
       Gyro.RsErrLine = 0;                       
       }
@@ -932,16 +1013,60 @@
 ///////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////
+
+
+
+
+            if (Time[0] == 'f') {		// выдача технологическая
+               Gyro.ModAmp += 1;
+            sprintf((Time),"%d \r\n",  Gyro.ModAmp);
+    		WriteCon(Time);
+            }
+            if (Time[0] == 'd') {		// выдача технологическая
+               Gyro.ModAmp -= 1;
+               sprintf((Time),"%d \r\n",  Gyro.ModAmp);
+    		   WriteCon(Time);
+            }
              if (Time[0] == 'V') {		// выдача технологическая
-                Spi.DAC_B += 200;
-               /* sprintf(Time,"%d\r\n", Spi.DAC_B);
-                WriteCon(Time);*/
-             }
+                Spi.DAC_B += 1000;
+            }
              if (Time[0] == 'v') {		// выдача технологическая
-                Spi.DAC_B -= 200;
-               /* sprintf(Time,"%d\r\n", Spi.DAC_B);
-                WriteCon(Time);*/
-             }        
+                Spi.DAC_B -= 1000;
+             }       
+             if (Time[0] == 'C') {		// выдача технологическая
+                Spi.DAC_B += 2000;
+            }
+             if (Time[0] == 'c') {		// выдача технологическая
+                Spi.DAC_B -= 2000;
+             }  
+             if (Time[0] == 'X') {		// выдача технологическая
+                Spi.DAC_B += 3000;
+            }
+             if (Time[0] == 'x') {		// выдача технологическая
+                Spi.DAC_B -= 3000;
+             } 
+             if (Time[0] == 'p') {		// выдача технологическая
+               PlcOFF //Gyro.RgConA&0x8=0;
+               Gyro.LogMod=1;
+               MODFlag=1;
+               Spi.DAC_B = 16000;
+            }
+             if (Time[0] == 'o') {		// выдача технологическая
+               PlcON
+               Gyro.LogMod=0;
+               MODFlag=2;
+               Spi.DAC_B = 32000;
+             } 
+             
+              
+                if (Time[0] == 'u') 
+                	{		// выдача технологическая
+               		MODFlag=0;  //Mod vibro Hz 
+                  	}   
+                if (Time[0] == 'y') 
+                	{			//Mod 250 Hz 		PLCRegul250();
+               		MODFlag=2;
+                  	}
                 if (Time[0] == 'l') 
                 {		// выдача технологическая
                 Gyro.My_Addres			= GyroP.Str.My_Addres; 								 //  Gyro.My_Addres			= 0;