Index: trunk/fw_g473rct/SES/src/esr.c
===================================================================
--- trunk/fw_g473rct/SES/src/esr.c	(revision 38)
+++ trunk/fw_g473rct/SES/src/esr.c	(revision 55)
@@ -14,5 +14,7 @@
 
 
-extern uint16_t adc12Data[SAMPLE_ARRAY_SIZE][2];
+extern uint16_t adc1Data[SAMPLE_ARRAY_SIZE];
+extern uint16_t adc2Data[SAMPLE_ARRAY_SIZE];
+extern uint16_t adc4Data[SAMPLE_ARRAY_SIZE];
 
 
@@ -109,6 +111,6 @@
     for (x=0; x < SAMPLE_ARRAY_SIZE; x++)
     {
-      sys_data.s.values.current_buffer[(SAMPLE_ARRAY_SIZE-1)-x] = adc12Data[x][0];
-      sys_data.s.values.voltage_buffer[(SAMPLE_ARRAY_SIZE-1)-x] = adc12Data[x][1];
+      sys_data.s.values.current_buffer[(SAMPLE_ARRAY_SIZE-1)-x] = adc1Data[x];
+      sys_data.s.values.voltage_buffer[(SAMPLE_ARRAY_SIZE-1)-x] = adc2Data[x];
     }
 
@@ -134,20 +136,26 @@
 
   //Suche Min und max werte im Array
-  int32_t minU=INT32_MAX;
-  int32_t maxU=0;
+  int32_t minUBatt=INT32_MAX;
+  int32_t maxUBatt=0;
+  int32_t minUOut=INT32_MAX;
+  int32_t maxUOut=0;
   int32_t minI=INT32_MAX;
   int32_t maxI=0;
   int32_t minIPos = -1;
   int32_t maxdIPos = -1;
-  int32_t minUPos = -1;
-  int32_t maxUPos = -1;
+  int32_t minUBattPos = -1;
+  int32_t maxUBattPos = -1;
+  int32_t minUOutPos = -1;
+  int32_t maxUOutPos = -1;
 
   //Suche min und max werte
   for (x=0; x < SAMPLE_ARRAY_SIZE; x++)
   {
-     if (adc12Data[x][0] < minI)  { minI = adc12Data[x][0]; minIPos  = x; }
-     if (adc12Data[x][0] >= maxI) { maxI = adc12Data[x][0]; maxdIPos = x; }  
-     if (adc12Data[x][1] < minU)  { minU = adc12Data[x][1]; minUPos = x; }
-     if (adc12Data[x][1] > maxU)  { maxU = adc12Data[x][1]; maxUPos = x; }
+     if (adc1Data[x] < minI)  { minI = adc1Data[x]; minIPos  = x; }
+     if (adc1Data[x] >= maxI) { maxI = adc2Data[x]; maxdIPos = x; }  
+     if (adc2Data[x] < minUBatt)  { minUBatt = adc2Data[x]; minUBattPos = x; }
+     if (adc2Data[x] > maxUBatt)  { maxUBatt = adc2Data[x]; maxUBattPos = x; }
+	 if (adc4Data[x] < minUOut)  { minUOut = adc4Data[x]; minUOutPos = x; }
+     if (adc4Data[x] > maxUOut)  { maxUOut = adc4Data[x]; maxUOutPos = x; }
   }
 
@@ -161,5 +169,6 @@
   //Funktioniert nur bei Synchroner Messug von Strom und Spannung
   //int32_t dU = maxU - minU;
-  int32_t dU = adc12Data[maxdIPos][1]  - adc12Data[minIPos][1];
+  int32_t dUBatt = adc2Data[maxdIPos]  - adc2Data[minIPos];
+  int32_t dUOut =  adc4Data[maxdIPos]  - adc4Data[minIPos];
 
   //Umrechnung in mV / mA
@@ -167,6 +176,6 @@
   dI = dI * (sys_data.s.parameter.batteryCurrentGainCorrectionFaktor / 1000000.0);
 
-  dU = dU  * (double )VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER / BATTERY_VOLTAGE_ADC_RESOLUTION ;
-  
+  dUBatt = dUBatt  * (double )VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER / BATTERY_VOLTAGE_ADC_RESOLUTION ;
+  dUOut  = dUOut  * (double )VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER / BATTERY_VOLTAGE_ADC_RESOLUTION ;
 
   //Minimale Belastung Prüfen ob es genügent Änderungen gab
@@ -188,7 +197,7 @@
   //printf("dI change!\r\n");
 
-  if (abs(dU) < min_dU) {
-    return -2;
-  }
+  //if (abs(dU) < min_dU) {
+  //  return -2;
+  //}
 
   //printf("dU change!\r\n");
@@ -204,16 +213,14 @@
   for (x=0; x < (SAMPLE_ARRAY_SIZE-1); x++)
   {
-    dIx = adc12Data[x+1][0] - adc12Data[x][0]; 
+    dIx = adc1Data[x+1] - adc1Data[x]; 
     if (dIx > dIMax) { dIMax = dIx; dIMaxPos = x; } 
   }
 
-  //if ((dIMaxPos < 5 ) || (dIMaxPos > (SAMPLE_ARRAY_SIZE-5) ))
-  //{
-//	return -3;
- // }
+  
 
 
   //ESR berechnen!
-  sys_data.s.values.esr_fast = ( (double)dU / (double) dI) * 10000;
+  sys_data.s.values.esr_fast = ( (double)dUBatt / (double) dI) * 10000;
+  sys_data.s.values.esr =	   ( (double)dUOut  / (double) dI) * 10000;
   last_refresh = sys_data.s.values.onTime;
 	
@@ -221,6 +228,6 @@
   for (x=0; x < SAMPLE_ARRAY_SIZE; x++)
   {
-	sys_data.s.values.current_buffer_fast[x] = (int32_t) adc12Data[x][0] - FAST_CURRENT_ADC_OFFSET  ;
-	sys_data.s.values.voltage_buffer_fast[x] = (int32_t) adc12Data[x][1] - BATTERY_VOLTAGE_ADC_OFFSET ;
+	sys_data.s.values.current_buffer_fast[x] = (int32_t) adc1Data[x] - FAST_CURRENT_ADC_OFFSET  ;
+	sys_data.s.values.voltage_buffer_fast[x] = (int32_t) adc2Data[x] - BATTERY_VOLTAGE_ADC_OFFSET ;
   }
 
Index: trunk/fw_g473rct/SES/src/main.c
===================================================================
--- trunk/fw_g473rct/SES/src/main.c	(revision 38)
+++ trunk/fw_g473rct/SES/src/main.c	(revision 55)
@@ -265,6 +265,4 @@
     {
       ADS1260_ConversionFinished(); 
-      ESR_Exec();
-
       newCurrentValue = 0;
 
Index: trunk/fw_g473rct/SES/src/outputs.c
===================================================================
--- trunk/fw_g473rct/SES/src/outputs.c	(revision 38)
+++ trunk/fw_g473rct/SES/src/outputs.c	(revision 55)
@@ -45,4 +45,83 @@
 }
 
+
+
+void OUTPUTS_OverwriteChargeCtrl_ChargeEnabled(void)
+{
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  GPIO_InitStruct.Pin = OVERWRITE_CHARGE_CTRL_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(OVERWRITE_CHARGE_CTRL_GPIO_Port, &GPIO_InitStruct);
+  HAL_GPIO_WritePin(OVERWRITE_CHARGE_CTRL_GPIO_Port, OVERWRITE_CHARGE_CTRL_Pin, OUTPUTS_CHARGE_ALLOWED);
+
+
+}
+
+
+void OUTPUTS_OverwriteChargeCtrl_ChargeDisabled(void)
+{
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  GPIO_InitStruct.Pin = OVERWRITE_CHARGE_CTRL_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(OVERWRITE_CHARGE_CTRL_GPIO_Port, &GPIO_InitStruct);
+
+  HAL_GPIO_WritePin(OVERWRITE_CHARGE_CTRL_GPIO_Port, OVERWRITE_CHARGE_CTRL_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
+
+
+}
+
+
+void OUTPUTS_OverwriteChargeCtrl_Disabled(void)
+{
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  GPIO_InitStruct.Pin = OVERWRITE_CHARGE_CTRL_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(OVERWRITE_CHARGE_CTRL_GPIO_Port, &GPIO_InitStruct);
+
+
+}
+
+
+void OUTPUTS_OverwriteDischargeCtrl_DischargeEnabled(void)
+{
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  GPIO_InitStruct.Pin = OVERWRITE_DISCHARGE_CTRL_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(OVERWRITE_DISCHARGE_CTRL_GPIO_Port, &GPIO_InitStruct);
+  HAL_GPIO_WritePin(OVERWRITE_DISCHARGE_CTRL_GPIO_Port, OVERWRITE_DISCHARGE_CTRL_Pin, OUTPUTS_DISCHARGE_ALLOWED);
+
+
+}
+
+
+void OUTPUTS_OverwriteDischargeCtrl_DischargeDisabled(void)
+{
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  GPIO_InitStruct.Pin = OVERWRITE_DISCHARGE_CTRL_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(OVERWRITE_DISCHARGE_CTRL_GPIO_Port, &GPIO_InitStruct);
+
+  HAL_GPIO_WritePin(OVERWRITE_DISCHARGE_CTRL_GPIO_Port, OVERWRITE_DISCHARGE_CTRL_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
+
+
+}
+
+
+void OUTPUTS_OverwriteDischargeCtrl_Disabled(void)
+{
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  GPIO_InitStruct.Pin = OVERWRITE_DISCHARGE_CTRL_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(OVERWRITE_DISCHARGE_CTRL_GPIO_Port, &GPIO_InitStruct);
+
+
+}
+
 /*
 * @brief        Prüfen ob LVP Signal abgeschaltet werden muss
@@ -69,5 +148,5 @@
 				printf("OUTPUTS_LVP_BATTERY_UNDERVOLTAGE\n");
 				sys_data.s.values.lvpState = OUTPUTS_LVP_BATTERY_UNDERVOLTAGE;
-				HAL_GPIO_WritePin(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
+				OUTPUTS_OverwriteDischargeCtrl_DischargeDisabled();
 			}
 			else if(sys_data.s.values.batteryCurrent < ((int32_t)sys_data.s.parameter.loadCurrentLimit*1000))
@@ -75,5 +154,5 @@
 				printf("OUTPUTS_LVP_OVERCURRENT\n");
 				sys_data.s.values.lvpState = OUTPUTS_LVP_OVERCURRENT;
-				HAL_GPIO_WritePin(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
+				OUTPUTS_OverwriteDischargeCtrl_DischargeDisabled();
 			}
 			else if(sys_data.s.values.shuntTemperature > sys_data.s.parameter.dischargeStopHighTemperatureStart)
@@ -81,5 +160,5 @@
 				printf("OUTPUTS_LVP_SHUNT_OVERTEMPERATURE\n");
 				sys_data.s.values.lvpState = OUTPUTS_LVP_SHUNT_OVERTEMPERATURE;
-				HAL_GPIO_WritePin(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
+				OUTPUTS_OverwriteDischargeCtrl_DischargeDisabled();
 			}
 			else if(sys_data.s.values.chipTemperature > sys_data.s.parameter.dischargeStopHighTemperatureStart)
@@ -87,5 +166,5 @@
 				printf("OUTPUTS_LVP_CHIP_OVERTEMPERATURE\n");
 				sys_data.s.values.lvpState = OUTPUTS_LVP_CHIP_OVERTEMPERATURE;
-				HAL_GPIO_WritePin(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
+				OUTPUTS_OverwriteDischargeCtrl_DischargeDisabled();
 			}
 			else if(sys_data.s.values.shuntTemperature < sys_data.s.parameter.dischargeStopLowTemperatureStart)
@@ -93,5 +172,5 @@
 				printf("OUTPUTS_LVP_SHUNT_UNDERTEMPERATURE\n");
 				sys_data.s.values.lvpState = OUTPUTS_LVP_SHUNT_UNDERTEMPERATURE;
-				HAL_GPIO_WritePin(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
+				OUTPUTS_OverwriteDischargeCtrl_DischargeDisabled();
 			}
 			else if(sys_data.s.values.chipTemperature < sys_data.s.parameter.dischargeStopLowTemperatureStart)
@@ -99,5 +178,5 @@
 				printf("OUTPUTS_LVP_CHIP_OVERTEMPERATURE\n");
 				sys_data.s.values.lvpState = OUTPUTS_LVP_CHIP_UNDERTEMPERATURE;
-				HAL_GPIO_WritePin(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
+				OUTPUTS_OverwriteDischargeCtrl_DischargeDisabled();
 			}
 		}
@@ -123,5 +202,5 @@
 				printf("OUTPUT LVP OK\n");
 				sys_data.s.values.lvpState = OUTPUTS_LVP_OK;
-				HAL_GPIO_WritePin(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_ENABLE_Pin, OUTPUTS_DISCHARGE_ALLOWED);
+				OUTPUTS_OverwriteDischargeCtrl_Disabled();
 			}
 		}
@@ -129,11 +208,14 @@
 	else if (sys_data.s.parameter.lvpMode == OUTPUTS_LVP_MODE_MANUAL_ON)
 	{
-		HAL_GPIO_WritePin(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_ENABLE_Pin, OUTPUTS_DISCHARGE_ALLOWED);
+		OUTPUTS_OverwriteDischargeCtrl_DischargeEnabled();
 	}
 	else if (sys_data.s.parameter.lvpMode == OUTPUTS_LVP_MODE_MANUAL_OFF)
 	{
-		HAL_GPIO_WritePin(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
-	}
-	else HAL_GPIO_WritePin(DISCHARGE_ENABLE_GPIO_Port, DISCHARGE_ENABLE_Pin, OUTPUTS_DISCHARGE_NOT_ALLOWED);
+		OUTPUTS_OverwriteDischargeCtrl_DischargeDisabled();
+	}
+	else 
+	{
+		OUTPUTS_OverwriteDischargeCtrl_DischargeDisabled();
+	}
 
 	lastMode = sys_data.s.parameter.lvpMode;
@@ -164,5 +246,5 @@
 				printf("OUTPUTS_OVP_BATTERY_OVERVOLTAGE\n");
 				sys_data.s.values.ovpState = OUTPUTS_OVP_BATTERY_OVERVOLTAGE;
-				HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
+				OUTPUTS_OverwriteChargeCtrl_ChargeDisabled();
 			}
 			else if(sys_data.s.values.batteryCurrent > ((int32_t) sys_data.s.parameter.chargeCurrentLimit * 1000))
@@ -170,5 +252,5 @@
 				printf("OUTPUTS_OVP_OVERCURRENT\n");
 				sys_data.s.values.ovpState = OUTPUTS_OVP_OVERCURRENT;
-				HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
+				OUTPUTS_OverwriteChargeCtrl_ChargeDisabled();
 			}
 			else if(sys_data.s.values.shuntTemperature > sys_data.s.parameter.chargeStopHighTemperatureStart)
@@ -176,5 +258,5 @@
 				printf("OUTPUTS_OVP_SHUNT_OVERTEMPERATURE\n");
 				sys_data.s.values.ovpState = OUTPUTS_OVP_SHUNT_OVERTEMPERATURE;
-				HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
+				OUTPUTS_OverwriteChargeCtrl_ChargeDisabled();
 			}
 			else if(sys_data.s.values.chipTemperature > sys_data.s.parameter.chargeStopHighTemperatureStart)
@@ -182,5 +264,5 @@
 				printf("OUTPUTS_OVP_CHIP_OVERTEMPERATURE\n");
 				sys_data.s.values.ovpState = OUTPUTS_OVP_CHIP_OVERTEMPERATURE;
-				HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
+				OUTPUTS_OverwriteChargeCtrl_ChargeDisabled();
 			}
 			else if(sys_data.s.values.shuntTemperature < sys_data.s.parameter.chargeStopLowTemperatureStart)
@@ -188,5 +270,5 @@
 				printf("OUTPUTS_OVP_SHUNT_UNDERTEMPERATURE\n");
 				sys_data.s.values.ovpState = OUTPUTS_OVP_SHUNT_UNDERTEMPERATURE;
-				HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
+				OUTPUTS_OverwriteChargeCtrl_ChargeDisabled();
 			}
 			else if(sys_data.s.values.chipTemperature < sys_data.s.parameter.chargeStopLowTemperatureStart)
@@ -194,5 +276,5 @@
 				printf("OUTPUTS_OVP_CHIP_UNDETEMPERATURE\n");
 				sys_data.s.values.ovpState = OUTPUTS_OVP_CHIP_UNDERTEMPERATURE;
-				HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
+				OUTPUTS_OverwriteChargeCtrl_ChargeDisabled();
 			}
 		}
@@ -213,5 +295,5 @@
 				printf("OUTPUT OVP OK\n");
 				sys_data.s.values.ovpState = OUTPUTS_OVP_OK;
-				HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_ALLOWED);
+				OUTPUTS_OverwriteChargeCtrl_Disabled(); // externer steuerung 
 			}
 		}
@@ -219,11 +301,14 @@
 	else if (sys_data.s.parameter.ovpMode == OUTPUTS_OVP_MODE_MANUAL_ON)
 	{
-		HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_ALLOWED);
+		OUTPUTS_OverwriteChargeCtrl_ChargeEnabled(); //ACHTUNG: Manual On 
 	}
 	else if (sys_data.s.parameter.ovpMode == OUTPUTS_OVP_MODE_MANUAL_OFF)
 	{
-		HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
-	}
-	else HAL_GPIO_WritePin(CHARGE_ENABLE_GPIO_Port, CHARGE_ENABLE_Pin, OUTPUTS_CHARGE_NOT_ALLOWED);
+		OUTPUTS_OverwriteChargeCtrl_ChargeDisabled();
+	}
+	else 
+	{
+	  OUTPUTS_OverwriteChargeCtrl_ChargeDisabled();
+	}
 
 	lastMode = sys_data.s.parameter.ovpMode;
