forkd

Dependencies:   mbed

Fork of LG2 by Dmitry Kovalev

Revision:
208:19150d2b528f
Parent:
207:d1ce992f5d17
Child:
209:224e7331a061
--- a/Command.c	Fri Jan 13 08:27:28 2017 +0000
+++ b/Command.c	Tue Feb 07 10:11:35 2017 +0000
@@ -13,7 +13,7 @@
 unsigned int Consol=123;
 unsigned int TempParam=1;
 unsigned int CountParam=0;
-
+int  d8_anser=0,A=0,SA=0;
 int ttemp;
 int OLDDAC=0;
 int rr = 123;
@@ -61,11 +61,9 @@
   */
  void EraseFlash(void)
  {
- 	Gyro.FlashMod = 0;
  	rr = u32IAP_PrepareSectors(19, 21);
 	sprintf((Time)," dffddfd <%07d> ",rr);
 	WriteCon(Time);
-	
     rr = u32IAP_EraseSectors(19, 21);
     sprintf((Time)," dffddfd <%07d> ",rr);
     WriteCon(Time);
@@ -73,7 +71,8 @@
  
  void WriteFlash(void)
  
- 	{   	Gyro.FlashMod = 0;
+ 	{  
+ 	Gyro.FlashMod = 0;
  	
  	//SystemInitDef();
  	NVIC_DisableIRQ(TIMER1_IRQn);
@@ -81,26 +80,11 @@
  	NVIC_DisableIRQ(TIMER3_IRQn);
  	NVIC_DisableIRQ(EINT3_IRQn);
  
- 	 unsigned int start_address = (unsigned int) & GyroP;
- 	 sprintf((Time)," dffddfd <%07d> ",&rr);
-     WriteCon(Time);
-	 ////unsigned int address=0x0003000;
+   // unsigned int start_address = (unsigned int) & GyroP;
 	rr = u32IAP_PrepareSectors(19, 21);
-	sprintf((Time)," dffddfd <%07d> ",rr);
-	WriteCon(Time);
-	
-    rr = u32IAP_EraseSectors(19, 21);
-    sprintf((Time)," dffddfd <%07d> ",rr);
-    WriteCon(Time);
-    
+    rr = u32IAP_EraseSectors  (19, 21);
     rr = u32IAP_PrepareSectors(19, 21);
-	sprintf((Time)," dffddfd <%07d> ",rr);
-	WriteCon(Time);
-	
-     	/// SystemInitDef();
-   rr =	 u32IAP_CopyRAMToFlash(0x030000,  &GyroP , 1024);
-   sprintf((Time)," dffddfd <%07d> ",rr);
-   WriteCon(Time);
+    rr = u32IAP_CopyRAMToFlash(0x030000,  &GyroP , 1024);
    //	 SystemInit1();  // Инициализация контроллера: установка тактовых частот
     //SystemCoreClockUpdate1(); // расчет тактовой частоты процессора перед инициализацией UART - 103MHz
    	 
@@ -108,6 +92,7 @@
     NVIC_EnableIRQ(TIMER2_IRQn);
  	NVIC_EnableIRQ(TIMER3_IRQn);
  	NVIC_EnableIRQ(EINT3_IRQn);
+ 	//SystemCoreClockUpdate1(); 
 
 	}
  void ReadFlash ( void)
@@ -127,30 +112,13 @@
     NVIC_EnableIRQ(TIMER2_IRQn);
  	NVIC_EnableIRQ(TIMER3_IRQn);
  	NVIC_EnableIRQ(EINT3_IRQn);
-  //char table = (char*)your_address;
- /* sprintf((Time)," dffddfd <%07d> ",GyroP.Array[10]);
-  WriteCon(Time);*/
- 
-
-  /*int address = flash_size() - SECTOR_SIZE;           //Write in last sector
-    
-    int *data = (int*)address;
-    printf("Starting\r\n"); 
-   // erase_sector(address);  do not erase the previous content
-   // int numbers[10] = {0, 1, 10, 100, 1000, 10000, 1000000, 10000000, 100000000, 1000000000};
-   // program_flash(address, (char*)&numbers, 40);        //dont overwrite the previous data
-    printf("Resulting flash: \r\n");
-    for (int i = 0; i<10; i++)
-        printf("%d\r\n", data[i]);     //display the non volatile data
-    
-    printf("Done\r\n\n");*/
- }
+}
  ///////////////end flah and boot///////////
  void M_RateA(void)
  {  
     switch(Gyro.ModeOut) {
     case 1: if(Gyro.Rate1_Event ) 				CMD_Rate();  		 	  break;  
-    case 2: if(Gyro.Reper_Event )				CMD_Rate2(); 			  break;    //Gyro.Reper_Event выставляется при переходе синуса из - в + 
+    case 2: if(Gyro.Reper_Event )				CMD_Rate2(); 			  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;   
@@ -161,49 +129,103 @@
  
 void CMD_M_Param_R(void)
 {
-   unsigned int NP;
+   
+   unsigned int NP=0;
    unsigned int Param;
+   
+   NP    = BuffTemp[3]; 
+
+   
+   
+   
    BuffTemp[0] =  Gyro.SOC_Out;
    BuffTemp[1] =  Gyro.My_Addres;
    
-   NP    = BuffTemp[3]; 
-   
+  
+   sprintf((Time),"%d = %d \r\n",NP, GyroP.Array[NP]);
+   WriteCon(Time);
    Param = GyroP.Array[NP];
-   
-   BuffTemp[2] =(Param >> 8) & 0xff;//старший байт требуемого параметра
-   BuffTemp[3] =(Param >> 0) & 0xff;//младший байт требуемого параметра
+   BuffTemp[2] =(GyroP.Array[NP] >> 8) & 0xff;//старший байт требуемого параметра
+   BuffTemp[3] =(GyroP.Array[NP] >> 0) & 0xff;//младший байт требуемого параметра
    
    Check(BuffTemp, 6);
    WriteConN (BuffTemp,6);
    /*sprintf((Time),"READ  Param = <%07d>   GyroP.Array[NP] = <%07d>  NP= <%07d>   Gyro.CaunPlus+Gyro.CaunMin-5000 <%07d>  \r\n",Param,  GyroP.Array[NP],  NP, GyroP.Str.PLC_Lern);
    WriteCon(Time);*/
+   NP=0;
 }
 void CMD_M_Param_W(void)
 {
-   unsigned int NP;
-   unsigned int Param;
+   unsigned int NP=0;
+   unsigned int Param,temp,flash;
    
    NP     =  BuffTemp[3];
    Param  = (BuffTemp[4]<<8);
    Param |=  BuffTemp[5];
  
-  GyroP.Array[NP] = Param;
-     
+   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 14: Gyro.FrqHZ			= GyroP.Str.FrqHZ;
+    			         Gyro.Frq 			= GyroP.Str.FrqHZ<<16;	
+     			break; 
+     			
+       			case 15: Gyro.FrqHZmin 		= GyroP.Str.FrqHZmin<<16;				break; 
+     			case 16: Gyro.FrqHZmax		= 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 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 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;
+   }
+     			
+    NP=0; 	
    
    BuffTemp[0] =  Gyro.SOC_Out;
    BuffTemp[1] =  Gyro.My_Addres;
    BuffTemp[2] =  Gyro.CMD_In;
-   BuffTemp[3] =  (GyroP.Array[NP]>> 8) & 0xff;//старший байт требуемого параметра
+   BuffTemp[3] =0;  //(//GyroP.Array[NP]>> 8) & 0xff;//старший байт требуемого параметра
    
    Check(BuffTemp, 6);
    WriteConN (BuffTemp,6);
-  /* sprintf((Time),"READ  Param = <%07d>   GyroP.Array[NP] = <%07d>  NP= <%07d>   GyroP.Str.PLC_Lern = <%07d>  \r\n",Param,  GyroP.Array[NP],  NP, GyroP.Str.PLC_Lern);
-   WriteCon(Time);*/
+   if(flash){GyroP.Array[5]=0; flash=0; WriteFlash(); ReadFlash ();}
+   
+  
 }
 void CMD_Maintenance(void)
 {
-   
-    Gyro.DropDelayGLD = DropDelayGLD_0;//задержка на выдачу 45 микросекунд для любого адреса ГЛД
+  //  Gyro.ModeOut=0;
+   //Gyro.DropDelayGLD = DropDelayGLD_0;//задержка на выдачу 45 микросекунд для любого адреса ГЛД
     BuffTemp[0] =  Gyro.SOC_Out;
     BuffTemp[1] =  Gyro.My_Addres;
     BuffTemp[2] =  Gyro.Firmware_Version;
@@ -230,6 +252,7 @@
     BuffTemp[ 5] = 0x00000000;
     Check(BuffTemp, 8);
     WriteConN (BuffTemp,8);
+    
 }
 
 void CMD_Delta_Bins(void)
@@ -256,7 +279,7 @@
     unsigned int Temp;
 	BuffTemp[ 0] = Gyro.SOC_Out;
     BuffTemp[ 1] = Gyro.My_Addres;
-    
+      
     Temp = Gyro.CuruAngle;
     Gyro.CuruAngle = 0;
 
@@ -275,8 +298,7 @@
      case 1:
            BuffTemp[5] = (Temp >> 0) & 0xff;
      break; 
-    
-    
+     
      
      //HFO
      case 2:
@@ -433,102 +455,107 @@
 { 
     Gyro.Rate1_Event=0;
    	unsigned int Temp;
+   	int Temp1;
 	unsigned int OldCuruAngle;
-    Gyro.Firmware_Version=0xff; /// промежуточная затычка
  
-
-    BuffTemp[ 0] = Gyro.SOC_Out;
-    BuffTemp[ 1] = Gyro.My_Addres;
+    BuffTemp[ 0] = Gyro.SOC_Out;												//1	--старт данных
+    BuffTemp[ 1] = Gyro.My_Addres;												//2 --адрес отвечающего устройствва
 
-
-    BuffTemp[ 2] =(Gyro.CaunPlus >> 8) & 0xff;//старший байт счетчика +.
-    BuffTemp[ 3] =(Gyro.CaunPlus >> 0) & 0xff;//младший байт счетчика +.
- 
-    BuffTemp[ 4] =(Gyro.CaunMin >> 8) & 0xff;//старший байт счетчика -.
-    BuffTemp[ 5] =(Gyro.CaunMin >> 0) & 0xff;//младший байт счетчика -.
- 
+    BuffTemp[ 2] =(Gyro.CaunPlus >> 8) & 0xff;//старший байт счетчика +.		3 --сарший байт счентчика +
+    BuffTemp[ 3] =(Gyro.CaunPlus >> 0) & 0xff;//младший байт счетчика +.		4 --младший байт счетчика +
  
-    Temp=Gyro.CuruAngle;												//(0,28/с)
- 
- 
- //8 байт       + 4 байта от прошлых измерений
-//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;    */                                          //приводим к форме вывода
-Gyro.CuruAngle = 0;
-    BuffTemp[ 6] =(Temp >> 8) & 0xff;//старший байт разности счетчиков
-    BuffTemp[ 7] =(Temp >> 0) & 0xff;//младший байт разности счетчиков
+    BuffTemp[ 4] =(Gyro.CaunMin >> 8) & 0xff;//старший байт счетчика -.			5 --сарший байт счентчика -
+    BuffTemp[ 5] =(Gyro.CaunMin >> 0) & 0xff;//младший байт счетчика -.			6 --младший байт счетчика -
+
+    Temp=Gyro.CuruAngle;														//(0,28/с)
+    	//8 байт       + 4 байта от прошлых измерений
+		//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;    */                                          	//приводим к форме вывода
+		
+    Gyro.CuruAngle = 0;
+    BuffTemp[ 6] =(Temp >> 8) & 0xff;//старший байт разности счетчиков			7 --младший байт разности счетчиков
+    BuffTemp[ 7] =(Temp >> 0) & 0xff;//младший байт разности счетчиков			8 --старший байт разности счетчиков
 
   
-    Temp = Gyro.F_ras;
-    BuffTemp[ 8] = (Temp >> 8) & 0xff;//расщипление частота
-    BuffTemp[ 9] = (Temp >> 0) & 0xff;//
+    BuffTemp[38] =(Temp >> 24) & 0xff;;															//39 приращение угла
+    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;	
+    BuffTemp[ 8] = (Temp >> 8) & 0xff;//расщипление частота						9  --частота расщипления
+    BuffTemp[ 9] = (Temp >> 0) & 0xff;//										10 --частота расщипления
+    
+	Temp = 0xffff;//HFO
+    BuffTemp[10] = (Temp >> 8) & 0xff;//выход регулятора гвч;					11 --выход регулятора ГВЧ
+    BuffTemp[11] = (Temp >> 0) & 0xff;										  //12 --выход регулятора ГВЧ
 
-    BuffTemp[10] = (Temp >> 8) & 0xff;//выход регулятора гвч;
-    BuffTemp[11] = (Temp >> 0) & 0xff;
-
-    Temp = (Gyro.AD_Slow >> 16)- 0x7fff;
-    BuffTemp[12]=(Temp >> 8) & 0xff;////
-    BuffTemp[13]=(Temp >> 0) & 0xff;////
+    Temp =0xffff;
+    BuffTemp[12]=(Temp >> 8) & 0xff;//// HFO									13 --сигнал ошибки регулятора ГВЧ
+    BuffTemp[13]=(Temp >> 0) & 0xff;////										14 --сигнал ошибки регулятора ГВЧ
 
  
- 	Temp = (unsigned int)((7445000*16/(Gyro.Frq>>12))); 
-    BuffTemp[14]  =  (Temp >> 8) & 0xff;
-    BuffTemp[15]  =  (Temp >> 0) & 0xff;
-
-    BuffTemp[16] = 0xf;
-    BuffTemp[17] = 0x02;
+ 	Temp = (unsigned int)((7675000*16/(Gyro.Frq>>12))); 					
+    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 = (unsigned int)(((7445000*16/200) *Gyro.AmpPer /(Gyro.Frq>>12))); 
-    BuffTemp[18]  =  (Temp >> 8) & 0xff;
-    BuffTemp[19]  =  (Temp >> 0) & 0xff;
-
-    BuffTemp[20] = 0x00;
-    BuffTemp[21] = 0x00;
+ 	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
+    
+    
+    Temp = 0x0;//Gyro.L_vibro<<2;
+    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 = Spi.DAC_B - 0x7fff;
-    BuffTemp[22] =  (Temp >> 8) & 0xff;
-    BuffTemp[23] =  (Temp >> 0) & 0xff;
-
-    Temp =0x0;// Gyro.PLC_Delta >> 16;
-    BuffTemp[24] = (Temp >> 8) & 0xff;
-    BuffTemp[25] = (Temp >> 0) & 0xff;//
+    Temp =0x0; //Gyro.AD_Slow >> 16;
+    BuffTemp[24] = (Temp >> 8) & 0xff;//                                        //25 ФД СРП
+    BuffTemp[25] = (Temp >> 0) & 0xff;// 										//26 ФД СРП
     
     Temp = Gyro.AD_Slow >> 16;
-    BuffTemp[26] =  (Temp >> 8) & 0xff;
-    BuffTemp[27] =  (Temp >> 0) & 0xff;
+    BuffTemp[26] =  (Temp >> 8) & 0xff;											//27 ADC 0 
+    BuffTemp[27] =  (Temp >> 0) & 0xff;											//28
     
-    Temp = Gyro.AD_Slow >> 16;
-    BuffTemp[28] = (Temp >> 8) & 0xff;
-    BuffTemp[29] = (Temp >> 0) & 0xff;
-	
-	Temp = Gyro.In1;
-    BuffTemp[30] = (Temp >> 8) & 0xff;//in1//2
-    BuffTemp[31] = (Temp >> 0) & 0xff;
-    
- 	Temp = Gyro.In2;
-    BuffTemp[32] = (Temp >> 8) & 0xff;
-    BuffTemp[33] = (Temp >> 0) & 0xff;//in2//3
+    Temp =  Gyro.AD_Slow >> 16;
+    BuffTemp[28] = (Temp >> 8) & 0xff;											//29 ADC 1
+    BuffTemp[29] = (Temp >> 0) & 0xff;											//30
 	
-	Temp = Gyro.DeltaT;
-    BuffTemp[34] = (Temp >> 8) & 0xff;//дельта
-    BuffTemp[35] = (Temp >> 0) & 0xff;
-	//  Temp = 000;  
-	Temp = Gyro.Termo;
-    Temp = (0x7fff + Temp);///164
+	Temp = (Gyro.In1 - 0x7fff);
+    BuffTemp[30] = (Temp >> 8) & 0xff;//in1//2									//31 ADC 2
+    BuffTemp[31] = (Temp >> 0) & 0xff;											//32
+
+ 	Temp = (Gyro.In2 - 0x7fff);
+    BuffTemp[32] = (Temp >> 8) & 0xff;											//33 ADC 3
+    BuffTemp[33] = (Temp >> 0) & 0xff;//in2//3									//34
+
 
-    BuffTemp[36] =(Temp >> 8) & 0xff;//температура
-    BuffTemp[37] =(Temp >> 0) & 0xff;//ADC6   sesnsor 5
+	Temp = (Gyro.DeltaT);
+    BuffTemp[34] = (Temp >> 8) & 0xff;//дельта									//35 ADC 4
+    BuffTemp[35] = (Temp >> 0) & 0xff;											//36
+	//  Temp = 000;  
+	
+	Temp = Gyro.Termo;
+    BuffTemp[36] =(Temp >> 8) & 0xff;//температура                              //37 ADC 5
+    BuffTemp[37] =(Temp >> 0) & 0xff;//ADC6   sesnsor 5							//38
 
-    BuffTemp[38] =0x00;
-    BuffTemp[39] =0x00;
-    BuffTemp[40] =0x00;
-    BuffTemp[41] =0x00;
 
 
     Check(BuffTemp, 44);
@@ -542,17 +569,18 @@
     temp1 =((BuffTemp[4]<<8) | BuffTemp[5]);
     temp1=temp1&0xFFFF;
     
-    Gyro.Frq=(119120000/temp1)<<12;
+    Gyro.Frq=(122780000/temp1)<<12;
     
     temp2 =((BuffTemp[6]<<8) | BuffTemp[7]);
     temp2=temp2&0xFFFF;
     
-    Gyro.AmpPer=(((((Gyro.Frq>>12)*200)/16)*temp2)/7680000);
+
+    Gyro.AmpPer=((((((Gyro.Frq>>12)*200)/16)*temp2)/7675000)/2);
 }
 void CMD_M_Control_D8()///установка\сброс регистров управления
 {
     unsigned int bit,Pa;
-    unsigned int SR,V,A,Bit_num;
+    unsigned int SR,V,Bit_num;
     SR=0;
     V=0;
     A=0;
@@ -561,7 +589,7 @@
     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;
@@ -569,34 +597,82 @@
     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;
+				    	}
+   	 		 }
+       }   
+
+}
+void D8_Answer()
+{   
     
-    if(SR) 
+    
+   
+    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
     {
-    	 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;
-    	}
-   } 
-    BuffTemp[0] = Gyro.SOC_Out;      //DD
-    BuffTemp[1] = Gyro.My_Addres;    //00
-    BuffTemp[2] = Gyro.CMD_In;       //D8
-    BuffTemp[3] = A<<4;       
-    BuffTemp[4] = 0x0;
-    BuffTemp[5] = 0x0;
+    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;
@@ -616,12 +692,24 @@
     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];
-    Consol = temp&0x3;
+    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;
@@ -632,13 +720,15 @@
      Spi.DAC_A=(unsigned int)temp;
     }
     else{
-    DACF =(temp*K_DAC)+deltaDAC;
+    DACF =/*(*/temp/*K_DAC)+deltaDAC;*/;
     Spi.DAC_B =(unsigned int)(DACF) /*(unsigned int)(temp*K_DAC+deltaDAC)*/; // K_DAC);
     }
+   
 }
 
 void GLDStartDischarg(void)
-{
+{                  TimeDischarg=0;
+	   				Try=0;
 	   				switch(Gyro.My_Addres)
    						 {//смещение поджига и подсветки в зависимости от адреса ГЛД
   						  case 0:
@@ -663,6 +753,7 @@
 void Gph_W()
 {
  //Gyro.flagGph_W=3;
+
  	Out_G_photo(BuffTemp[4],BuffTemp[5]); 
  	   
 }
@@ -711,7 +802,7 @@
        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;           	 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
@@ -775,14 +866,18 @@
     else if(CountBuFFIn > (N-1))
      {
       ReadCon1(BuffTemp); 
+     
+	  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();		   					 break;
+      case 0xD8: 					CMD_M_Control_D8();	 D8_Answer();   		 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 0x0A:	                CMD_M_Stymul();  							 break;
       case 0xDD: 	TempParam=(BuffTemp[3]) & 0x9f; 							//Rate
                   switch(TempParam) {
   				  case  Rate1  :  CMD_Rate(); 			 	    				break;  
@@ -823,14 +918,15 @@
 
 void TechLog(void)
 {
- if (ReadCon (Time)) {
+ unsigned int temp=0;
+ 	if (ReadCon (Time))
+    {
 /////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////
 //////////////////////Выбор FlashMod///////////////////////////
 ////////////////////////////////////////////////////////////////
 
             if (Time[0] == 'B') Gyro.FlashMod=1;  
-            if (Time[0] == 'W') {Gyro.FlashMod=2;}
             if (Time[0] == 'R') {Gyro.FlashMod=3;}
             if (Time[0] == 'E') {Gyro.FlashMod=4;}
 ///////////////////////////////////////////////////////////////
@@ -846,65 +942,38 @@
                /* sprintf(Time,"%d\r\n", Spi.DAC_B);
                 WriteCon(Time);*/
              }        
-                if (Time[0] == 'l') {		// выдача технологическая
+                if (Time[0] == 'l') 
+                {		// выдача технологическая
                 Gyro.My_Addres			= GyroP.Str.My_Addres; 								 //  Gyro.My_Addres			= 0; 
-   				Gyro.GLD_Serial 		= GyroP.Str.GLD_Serial;	
-    			Gyro.Firmware_Version	= GyroP.Str.Firmware_Version;
-
-    			Gyro.FrqHZ				= GyroP.Str.FrqHZ;
+   				Gyro.GLD_Serial 		= GyroP.Str.GLD_Serial;	    
+    	    	Gyro.FrqHZ				= GyroP.Str.FrqHZ;
     			Gyro.Frq 				= GyroP.Str.FrqHZ<<16;
     			Gyro.FrqHZmin 			= GyroP.Str.FrqHZmin<<16;
     			Gyro.FrqHZmax			= GyroP.Str.FrqHZmax<<16;
     			Gyro.FrqChengSpeed		= GyroP.Str.FrqChengSpeed;
-    
+                Gyro.PLC_Gain			= GyroP.Str.PLC_Gain;
+                Gyro.PLC_Phase          = GyroP.Str.PLC_Phase;
     			Gyro.ModAmp				= GyroP.Str.ModAmp;
-    
+                Gyro.FrqPhase			= GyroP.Str.FrqPhase;
     			Gyro.AmpPer				= GyroP.Str.AmpPer;
     			Gyro.Amp    			= GyroP.Str.AmpPer<<16;
-    			Gyro.AmpSpeed 			= GyroP.Str.AmpSpeed;
+    		    Gyro.AmpSpeed 			= GyroP.Str.AmpSpeed;
     			Gyro.AmpPerDel			= GyroP.Str.AmpPerDel;
-    			Gyro.AmpTarget  		= GyroP.Str.AmpTarget;
+    			temp=((GyroP.Str.VB_Fdf_Hi<<16) | GyroP.Str.VB_Fdf_Lo);
+    			temp=temp/18.2;
+    			Gyro.AmpTarget=(unsigned int)(temp);
     			Gyro.AmpPerMin 			= GyroP.Str.AmpPerMin;
     			Gyro.AmpPerMax 			= GyroP.Str.AmpPerMax;
     			Gyro.AmpMin 			= GyroP.Str.AmpMin;
     			Gyro.AmpTD  			= GyroP.Str.AmpTD;
-    
-    			Gyro.TermoNKU			= GyroP.Str.TermoNKU<<2;
-    
-    			Spi.DAC_A				= GyroP.Str.DAC_A<<2;
-    			Spi.DAC_B 				= GyroP.Str.DAC_B<<2;
-
+                Spi.DAC_A = GyroP.Str.DAC_current_Work;
     			Gyro.Gain_Sin 			= GyroP.Str.Gain_Sin;
     			Gyro.Gain_Cos 			= GyroP.Str.Gain_Cos;
     			Out_G_photo(Gyro.Gain_Sin, Gyro.Gain_Cos); 
-                for(int i=0;i<26;i++)
-                {
-                sprintf(Time," %d=%d\r\n",i, GyroP.Array[i]);
-                WriteCon(Time);
                 }
-             }    
-            if (Time[0] == 'w')   TypeMod=2; 
-            if (Time[0] == 'a')   TypeMod=1;          
-            if (Time[0] == 's')   TypeMod=0; 
-       ////////////////////////////////////////////////////////////////////////////////   
-                      /*Запись лога регулировки периметра*/
-            if (Time[0] == 'g')   Gyro.LogPLC=1;  if(OLDDAC)   Spi.DAC_B=OLDDAC;                                //включит передачу
-            if (Time[0] == 'h')  {Gyro.LogPLC=2; Spi.DAC_B=19000; Gyro.PLC_Error2Mode = 1400; OLDDAC=Spi.DAC_B; Spi.DAC_B=19000;}                             //десперсионка
-            if (Time[0] == 'j')   Gyro.LogPLC=0;  if(OLDDAC)   Spi.DAC_B=OLDDAC;                              //регулировка без выдачиж
-
-            if (Time[0] == 'k')   Gyro.LogPLC = 0;         //Отключить передачу 
-
-      //////////////////////////////////////////////////////////////////////////////////////  
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-   ////////////////////////////////////////////////////выдача частоты в терминал длля записи лога///////////////////////////////////////////////////////////////////////////////////////////////////////
-   /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-             if (Gyro.PLC_Error2Mode) {		// выдача технологическая
-               // sprintf(Time,"\r\nPLC_Error2Mode");
-                WriteCon(Time);
-              }
-        }
+                 
+           
+      }
 }