Index: trunk/fw_g473rct/SES/src/ads1260.c
===================================================================
--- trunk/fw_g473rct/SES/src/ads1260.c	(revision 71)
+++ trunk/fw_g473rct/SES/src/ads1260.c	(revision 73)
@@ -51,5 +51,5 @@
 #include "iwdg.h"
 //      --- EXTERNE VARIABLEN --------------------------------------------------------
-
+extern CRC_HandleTypeDef hcrc;
 //      --- LOKALE DEFINES - bitte hier dokumentieren --------------------------------
 
@@ -116,10 +116,10 @@
 #define CHOP_MODE_RESET_MASK                     ~(0b11 << 5)/*Default*/
 
-#define CONVERSION_MODE_REGISTER                                  (CHOP_MODE_REGISTER)
+#define CONVERSION_MODE_REGISTER				  (CHOP_MODE_REGISTER)
 #define CONVERSION_MODE_CONTINIOUS                (0 << 4)/*Default*/
 #define CONVERSION_MODE_PULSE                     (1 << 4)
 #define CONVERSION_MODE_RESET_MASK               ~(1 << 4)
 
-#define CONVERSION_START_DELAY_REGISTER                           (CHOP_MODE_REGISTER)
+#define CONVERSION_START_DELAY_REGISTER           (CHOP_MODE_REGISTER)
 #define CONVERSION_START_DELAY_0u                 (0b0000 << 0)
 #define CONVERSION_START_DELAY_50u                (0b0001 << 0)/*Default*/
@@ -173,4 +173,9 @@
 #define POS_INPUT_MUX_SELECT_AIN3                 (0b0100 << 4)
 #define POS_INPUT_MUX_SELECT_AIN4                 (0b0101 << 4)
+#define POS_INPUT_MUX_SELECT_AIN5                 (0b0110 << 4)
+#define POS_INPUT_MUX_SELECT_AIN6                 (0b0111 << 4)
+#define POS_INPUT_MUX_SELECT_AIN7                 (0b1000 << 4)
+#define POS_INPUT_MUX_SELECT_AIN8                 (0b1001 << 4)
+#define POS_INPUT_MUX_SELECT_AIN9                 (0b1010 << 4)
 #define POS_INPUT_MUX_SELECT_INT_TEMP_SENSOR_POS  (0b1011 << 4)
 #define POS_INPUT_MUX_SELECT_INT_AVDD_DIV4_POS    (0b1100 << 4)
@@ -185,4 +190,9 @@
 #define NEG_INPUT_MUX_SELECT_AIN3                 (0b0100 << 0)
 #define NEG_INPUT_MUX_SELECT_AIN4                 (0b0101 << 0)
+#define NEG_INPUT_MUX_SELECT_AIN5                 (0b0110 << 0)
+#define NEG_INPUT_MUX_SELECT_AIN6                 (0b0111 << 0)
+#define NEG_INPUT_MUX_SELECT_AIN7                 (0b1000 << 0)
+#define NEG_INPUT_MUX_SELECT_AIN8                 (0b1001 << 0)
+#define NEG_INPUT_MUX_SELECT_AIN9                 (0b1010 << 0)
 #define NEG_INPUT_MUX_SELECT_INT_TEMP_SENSOR_NEG  (0b1011 << 0)
 #define NEG_INPUT_MUX_SELECT_INT_AVDD_DIV4_NEG    (0b1100 << 0)
@@ -201,4 +211,6 @@
 int32_t avgValWithOffsetCommonModeOffsetTemperatureCorrection;
 double current;
+double batteryvoltage;
+double shuntVoltage;
 double currentWithGainCorrection;
 double currentWithGainAndGainShuntTempCorrection;
@@ -230,5 +242,5 @@
 static void ADS_1260_SetInternalReference(SPI_HandleTypeDef * hspi);
 static void ADS_1260_SetExternalReference(SPI_HandleTypeDef * hspi);
-static void ADS_1260_InputMuxSelect(SPI_HandleTypeDef * hspi, uint8_t muxSelect);
+static void ADS_1260_InputMuxSelect(SPI_HandleTypeDef * hspi, uint8_t muxSelect, uint8_t crcmode);
 static void ADS_1260_SetChopMode(SPI_HandleTypeDef * hspi, uint8_t chopMode);
 static void ADS_1260_ActivateStatusData(void);
@@ -237,4 +249,5 @@
 static uint32_t ADS1260_ProcessCurrent(int32_t current);
 volatile uint32_t newCurrentValue=0;
+volatile uint32_t channelInProgress; // 0 = current, 1 = voltage battery
 //static uint32_t ADS1260_ProcessVoltage(int32_t voltage, sys_data_t * data);
 //static uint32_t ADS1260_ProcessTemperature(int32_t temperature, sys_data_t * data);
@@ -383,22 +396,60 @@
 * @retval       kein
 */
-static void ADS_1260_InputMuxSelect(SPI_HandleTypeDef * hspi, uint8_t muxSelect)
-{
-  // Write
-  uint8_t spiData[3] = {(REGISTER_WRITE_COMMAND + INPUT_MUX_REGISTER), muxSelect, 0};
-  //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET);
-  HAL_SPI_TransmitReceive(hspi, spiData, spiData, 2, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT);
-  //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET);
-  // Read
-  spiData[COMMAND_POS] = (REGISTER_READ_COMMAND + INPUT_MUX_REGISTER);
-  //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET);
-  HAL_SPI_TransmitReceive(hspi, spiData, spiData, 3, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT);
-  //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET);
-  // Verifie
-  if(spiData[RECEIVE_DATA_POS] != muxSelect)
-  {
-    printf("ERROR ADS_1260_InputMuxSelect\n");
-//    while(1);
-  }
+static void ADS_1260_InputMuxSelect(SPI_HandleTypeDef * hspi, uint8_t muxSelect,uint8_t crcmode)
+{
+  if (crcmode==0)
+  {
+    // Write
+    uint8_t spiData[3] = {(REGISTER_WRITE_COMMAND + INPUT_MUX_REGISTER), muxSelect, 0};
+    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET);
+    HAL_SPI_TransmitReceive(hspi, spiData, spiData, 2, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT);
+    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET);
+    // Read
+    spiData[COMMAND_POS] = (REGISTER_READ_COMMAND + INPUT_MUX_REGISTER);
+    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET);
+    HAL_SPI_TransmitReceive(hspi, spiData, spiData, 3, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT);
+    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET);
+    // Verifie
+    if(spiData[RECEIVE_DATA_POS] != muxSelect)
+    {
+      printf("ERROR ADS_1260_InputMuxSelect\n");
+    }
+  }
+  else
+
+  {
+
+    // Write
+    uint8_t spiDataIn[6];
+	spiDataIn[0] = REGISTER_WRITE_COMMAND + INPUT_MUX_REGISTER;
+	spiDataIn[1] = muxSelect;
+	spiDataIn[2] = HAL_CRC_Calculate(&hcrc, (uint32_t*) spiDataIn, 2);
+	spiDataIn[3] = 0;
+
+	uint8_t spiDataOut[6] = {0,0,0,0,0,0};
+    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET);
+    HAL_SPI_TransmitReceive(hspi, spiDataIn, spiDataOut, 4, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT);
+    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET);
+    
+	// Read back mux register 
+    spiDataIn[0] = (REGISTER_READ_COMMAND + INPUT_MUX_REGISTER);
+	spiDataIn[1] = arbitraryByte;
+	spiDataIn[2] = HAL_CRC_Calculate(&hcrc, (uint32_t*) spiDataIn, 2);
+	spiDataIn[3] = 0;
+	spiDataIn[4] = 0;
+	spiDataIn[5] = 0;
+
+
+
+    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_RESET);
+    HAL_SPI_TransmitReceive(hspi, spiDataIn, spiDataOut, 6, DEFAULT_ADS1260_TRANSMIT_RECEIVE_TIMEOUT);
+    //HAL_GPIO_WritePin(ADC_SPI1_NSS_GPIO_Port, ADC_SPI1_NSS_Pin, GPIO_PIN_SET);
+    // Verifie
+    if(spiDataOut[4] != muxSelect)
+    {
+      printf("ERROR ADS_1260_InputMuxSelect\n");
+	}
+  }
+
 }
 
@@ -613,17 +664,17 @@
 static uint32_t ADS1260_ProcessCurrent(int32_t newval)
 {
-   static signed long avgsum = 0;
-   static int meas_counter;
-   if (meas_counter < INT32_MAX) meas_counter++;
-   int32_t avgval;
+   //static signed long avgsum = 0;
+   //static int meas_counter;
+   //if (meas_counter < INT32_MAX) meas_counter++;
+   //int32_t avgval;
 
    // Filterlängen in 2er-Potenzen --> Compiler optimiert
-   avgsum -= avgsum/ BATTERY_CURRENT_FILTER;
-   avgsum += newval;
-   avgval = avgsum / BATTERY_CURRENT_FILTER;
-   sys_data.s.values.battryCurrentRaw = avgval;
+   //avgsum -= avgsum/ BATTERY_CURRENT_FILTER;
+   //avgsum += newval;
+   //avgval = avgsum / BATTERY_CURRENT_FILTER;
+  sys_data.s.values.battryCurrentRaw = newval;
   /**********************Offset Kompensation:*******************************/
   // Offset abziehen
-  avgValWithOffsetCompensation = avgval - sys_data.s.parameter.batteryCurrentOffset;
+  avgValWithOffsetCompensation = newval - sys_data.s.parameter.batteryCurrentOffset;
   // Temperaturabhängiges Offset abziehen
   // in ADC Messwerten mal Abweichung von Referenttemperatur
@@ -739,6 +790,6 @@
 
 
-  if (meas_counter > (BATTERY_CURRENT_FILTER *10)) // Nur aktualiseren, wenn es schon ausreichend Messwerte gab
-  {
+//  if (meas_counter > (BATTERY_CURRENT_FILTER *10)) // Nur aktualiseren, wenn es schon ausreichend Messwerte gab
+//  {
     // höchster und niedrigster Stromwert werden gespeichert
     if(sys_data.s.values.batteryCurrent > sys_data.s.values.batteryCurrentMax)
@@ -750,5 +801,5 @@
       sys_data.s.values.batteryCurrentMin = sys_data.s.values.batteryCurrent;
     }
-  }
+//  }
   
   newCurrentValue=1;
@@ -757,4 +808,43 @@
 }
 
+static uint32_t ADS1260_ProcessBatteryVoltage(int32_t newval)
+{
+   static signed long avgsum = 0;
+   static int meas_counter;
+   if (meas_counter < INT32_MAX) meas_counter++;
+   //int32_t avgval;
+
+   // Filterlängen in 2er-Potenzen --> Compiler optimiert
+   //avgsum -= avgsum/ BATTERY_CURRENT_FILTER;
+   //avgsum += newval;
+   //avgval = avgsum / BATTERY_CURRENT_FILTER;
+
+  /**********************Offset Kompensation:*******************************/
+  // Offset abziehen
+
+
+  batteryvoltage = ((newval * (double) 1.5 * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / (double)0x800000);
+  sys_data.s.values.batteryVoltage = (batteryvoltage * 1000) -  sys_data.s.parameter.batteryVoltageOffset;
+
+  //printf("battery voltage = %.4d V\n", (int32_t) (batteryvoltage*1000));
+
+
+
+
+
+
+
+
+  return 0;
+}
+
+static uint32_t ADS1260_ProcessShuntVoltage(int32_t newval)
+{
+
+  shuntVoltage = ((newval * (double) 1.5 * SHUNT_VOLTAGE_VOLTAGE_DIVIDER ) / (double)0x800000);
+  sys_data.s.values.shuntVoltage = (shuntVoltage * 1000) -  sys_data.s.parameter.shuntVoltageOffset;
+
+  return 0;
+}
 
 //      --- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------
@@ -788,13 +878,13 @@
   /* 6*/ ADS_1260_SetDataRate(&hspi3, DATA_RATE_20);
   //  /* 7*/ ADS_1260_SetDigitalFilter(&hspi1, FILTER_SINC4);
-  /* 8*/ ADS_1260_SetConversionMode(&hspi3, CONVERSION_MODE_CONTINIOUS);
+  /* 8*/ ADS_1260_SetConversionMode(&hspi3, CONVERSION_MODE_PULSE);
          // langsamer
          ADS_1260_SetChopMode(&hspi3, CHOP_MODE_CHOP_MODE);
-         ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN2 + NEG_INPUT_MUX_SELECT_AIN3);
+         ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN2 + NEG_INPUT_MUX_SELECT_AIN3,0);
 
          ADS_1260_ActivateStatusData();
 		 HAL_IWDG_Refresh(&hiwdg);
-         ADS_1260_ActivateLock();
-		 HAL_IWDG_Refresh(&hiwdg);
+       //  ADS_1260_ActivateLock();
+	//	 HAL_IWDG_Refresh(&hiwdg);
 
   /*10*/ //ADS_1260_SelfOffsetCalibration(&hspi1);
@@ -804,4 +894,5 @@
          ADS1260_StartConversion();
 		 HAL_IWDG_Refresh(&hiwdg);
+		 channelInProgress=0;
 }
 
@@ -810,10 +901,15 @@
 {
   HAL_GPIO_WritePin(ADC_START_CONV_GPIO_Port, ADC_START_CONV_Pin, GPIO_PIN_SET);
+
+  	//Vorbereitung aufg nächsten Start
+ 
 }
 
 void ADS1260_ReadConversion(void)
 {
-    extern CRC_HandleTypeDef hcrc;
+    
     convert_union_t convert;
+	 HAL_GPIO_WritePin(ADC_START_CONV_GPIO_Port, ADC_START_CONV_Pin, GPIO_PIN_RESET);
+
 
     //                                                    CRC2
@@ -831,5 +927,5 @@
         uint8_t STATUS_reg = spiDataOut[4];
 
-        if ((STATUS_reg & (1 << STATUS_LOCK)) && (STATUS_reg & (1 << STATUS_DRDY)) && !(STATUS_reg & (1 << STATUS_CRCERR)) && !(STATUS_reg & (1 << STATUS_REFL_ALM)))
+        if ( (STATUS_reg & (1 << STATUS_DRDY)) && !(STATUS_reg & (1 << STATUS_CRCERR)) && !(STATUS_reg & (1 << STATUS_REFL_ALM)))
         {
             // Rohwerte Byteswitch
@@ -864,5 +960,24 @@
     }
 
-    ADS1260_ProcessCurrent(value);
+	if (channelInProgress==0)
+	{
+	  ADS1260_ProcessCurrent(value);
+	  ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN4 + NEG_INPUT_MUX_SELECT_AIN5,1);
+	  channelInProgress=1;
+	}
+	else if (channelInProgress==1)
+	{
+	  ADS1260_ProcessBatteryVoltage(value);
+	  ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN6 + NEG_INPUT_MUX_SELECT_AIN7,1);
+	  channelInProgress=2;
+	}
+	else if (channelInProgress==2)
+	{
+	  ADS1260_ProcessShuntVoltage(value);
+	  ADS_1260_InputMuxSelect(&hspi3, POS_INPUT_MUX_SELECT_AIN2 + NEG_INPUT_MUX_SELECT_AIN3,1);
+	  channelInProgress=0;
+	}
+
+	ADS1260_StartConversion();
 }
 
@@ -1041,3 +1156,14 @@
 }
 
+void ADS1260_BatteryVoltageZeroCal(void)
+{
+  sys_data.s.parameter.batteryVoltageOffset = sys_data.s.values.batteryVoltage + sys_data.s.parameter.batteryVoltageOffset ;
+}
+
+void ADS1260_ShuntVoltageZeroCal(void)
+{
+  sys_data.s.parameter.shuntVoltageOffset = sys_data.s.values.shuntVoltage + sys_data.s.parameter.shuntVoltageOffset ;
+}
+
+
 //-----------------------------------------------------------------------------
Index: trunk/fw_g473rct/SES/src/battery_voltage.c
===================================================================
--- trunk/fw_g473rct/SES/src/battery_voltage.c	(revision 71)
+++ 	(revision )
@@ -1,121 +1,0 @@
-/******************************************************************************
-*
-* @file    battery_voltage.c
-* @author  ECS, Falko Jahn
-* @version V1.0.0
-* @date    2020-05-01
-* @brief
-*
-******************************************************************************/
-
-//	--- INCLUDES -----------------------------------------------------------------
-#include "battery_voltage.h"
-#include "main.h"
-#include "sysdata.h"
-#include "stdlib.h"
-#include "stdio.h"
-
-//	--- EXTERNE VARIABLEN --------------------------------------------------------
-
-//	--- LOKALE DEFINES - bitte hier dokumentieren --------------------------------
-
-#define BATTERY_VOLTAGE_FILTER  32
-
-
-//	--- LOKALE TYPE DEFS - bitte hier dokumentieren-------------------------------
-
-//	--- DEFINITIONEN GLOBALER VARIABLEN - Bitte in Header dokumentieren ----------
-extern ADC_HandleTypeDef hadc2;
-//	--- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------
- int32_t BATTERY_VOLTAGE_adc_offset =0;
- int32_t last_adc_value = 0 ;
-//	--- LOKALE FUNKTIONS PROTOTYPEN ----------------------------------------------
-void ADC2_SetOffset(uint32_t channel, int16_t offset);
-//	--- LOKALE FUNKTIONEN - bitte hier dokumentieren -----------------------------
-
-//	--- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------
-
-
-void BATTERY_VOLTAGE_Exec(int32_t newVal)
-{
-  static int measCounter;
-  static unsigned long avgSum = 0;
-  int32_t avgVal;
-  last_adc_value = newVal;
-  if (measCounter < INT32_MAX) measCounter++;
-
-
-  // Filterlängen in 2er-Potenzen --> Compiler optimiert
-  //avgSum -= avgSum / BATTERY_VOLTAGE_FILTER;
-  //avgSum += newVal;
-  //avgVal =  avgSum / BATTERY_VOLTAGE_FILTER;
-
-  
-
-
-  //Umrechung auf Eingangsspannung am Gerät mit Teiler
-  sys_data.s.values.batteryVoltage = ((newVal-BATTERY_VOLTAGE_ADC_OFFSET) * VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / BATTERY_VOLTAGE_ADC_RESOLUTION;
-
-  
-
-
-  //Max und Minwert
-  if (measCounter > BATTERY_VOLTAGE_FILTER * 10)
-  {
-    if (sys_data.s.values.batteryVoltage > sys_data.s.values.batteryVoltageMax)
-    {
-      sys_data.s.values.batteryVoltageMax = sys_data.s.values.batteryVoltage;
-    }
-    if (sys_data.s.values.batteryVoltage < sys_data.s.values.batteryVoltageMin)
-    {
-      sys_data.s.values.batteryVoltageMin = sys_data.s.values.batteryVoltage;
-    }
-  }
-
-
-
-  //Berechnung schnelle Wert ohne Glättung:
-  //Umrechung auf Eingangsspannung am Gerät mit Teiler
-  //sys_data.s.values.fast_voltage = ((newVal-BATTERY_VOLTAGE_ADC_OFFSET) * VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / BATTERY_VOLTAGE_ADC_RESOLUTION;
-
-
-
-}
-
-    ADC_ChannelConfTypeDef sConfig = {0};
-
-void BATTERY_VOLTAGE_ZeroCal(void)
-{
-  BATTERY_VOLTAGE_adc_offset = last_adc_value - BATTERY_VOLTAGE_ADC_OFFSET;
-  
-
-
-
-
-    // 1. ADC2 stoppen und sicherstellen, dass er deaktiviert ist
-    HAL_ADC_Stop(&hadc2);
-
-  uint16_t offset_value = abs(BATTERY_VOLTAGE_adc_offset);
-
-  if (BATTERY_VOLTAGE_adc_offset < 0 )
-  {
-   ADC2->OFR1 = (ADC_OFR1_OFFSET1_EN | 
-                 (3 << ADC_OFR1_OFFSET1_CH_Pos) | 
-				 (1 << ADC_OFR1_OFFSETPOS_Pos) |
-                 (offset_value  ));
-  }
-  else 
-  {
-   ADC2->OFR1 = (ADC_OFR1_OFFSET1_EN | 
-                 (3 << ADC_OFR1_OFFSET1_CH_Pos) | 
-				 (0 << ADC_OFR1_OFFSETPOS_Pos) |
-                 (offset_value  ));
-  }
-
-  // 5. ADC2 wieder für die Wandlung starten
-  HAL_ADC_Start(&hadc2);
-}
-
-
-
-/*************************** End of file ****************************/
Index: trunk/fw_g473rct/SES/src/battery_voltage_fast.c
===================================================================
--- trunk/fw_g473rct/SES/src/battery_voltage_fast.c	(revision 73)
+++ trunk/fw_g473rct/SES/src/battery_voltage_fast.c	(revision 73)
@@ -0,0 +1,56 @@
+/******************************************************************************
+*
+* @file    battery_voltage.c
+* @author  ECS, Falko Jahn
+* @version V1.0.0
+* @date    2020-05-01
+* @brief
+*
+******************************************************************************/
+
+//	--- INCLUDES -----------------------------------------------------------------
+#include "battery_voltage_fast.h"
+#include "main.h"
+#include "sysdata.h"
+#include "stdlib.h"
+#include "stdio.h"
+#include "tim.h"
+//	--- EXTERNE VARIABLEN --------------------------------------------------------
+
+//	--- LOKALE DEFINES - bitte hier dokumentieren --------------------------------
+
+
+
+//	--- LOKALE TYPE DEFS - bitte hier dokumentieren-------------------------------
+
+//	--- DEFINITIONEN GLOBALER VARIABLEN - Bitte in Header dokumentieren ----------
+extern ADC_HandleTypeDef hadc2;
+extern __IO int32_t adc2Data[SAMPLE_ARRAY_SIZE] __attribute__((section(".RAM1_CRC")));
+//	--- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------
+
+
+
+//	--- LOKALE FUNKTIONS PROTOTYPEN ----------------------------------------------
+
+//	--- LOKALE FUNKTIONEN - bitte hier dokumentieren -----------------------------
+
+//	--- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------
+
+
+void BATTERY_VOLTAGE_FAST_Exec(int32_t newVal)
+{
+  //Umrechung auf Eingangsspannung am Gerät mit Teiler
+  sys_data.s.values.batteryVoltageFast = ((newVal - BATTERY_VOLTAGE_FAST_ADC_OFFSET) * (int64_t)VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER / BATTERY_VOLTAGE_FAST_ADC_RESOLUTION) - sys_data.s.parameter.batteryVoltageFastOffset;
+
+ }
+
+
+void BATTERY_VOLTAGE_FAST_ZeroCal(void)
+{
+  sys_data.s.parameter.batteryVoltageFastOffset = sys_data.s.values.batteryVoltageFast + sys_data.s.parameter.batteryVoltageFastOffset ;
+}
+
+
+
+
+/*************************** End of file ****************************/
Index: trunk/fw_g473rct/SES/src/chip_temperature.c
===================================================================
--- trunk/fw_g473rct/SES/src/chip_temperature.c	(revision 71)
+++ trunk/fw_g473rct/SES/src/chip_temperature.c	(revision 73)
@@ -72,5 +72,5 @@
 }
 
-void CHIP_TEMPERATURE_Exec(uint32_t chiptemperature)
+void CHIP_TEMPERATURE_Exec(int32_t chiptemperature)
 {
     double voltage;
Index: trunk/fw_g473rct/SES/src/eeprom.c
===================================================================
--- trunk/fw_g473rct/SES/src/eeprom.c	(revision 71)
+++ trunk/fw_g473rct/SES/src/eeprom.c	(revision 73)
@@ -61,6 +61,12 @@
   uint32_t	  currentGain;
 
+
   int32_t	  currentOffsetFast;
   uint32_t	  currentGainFast;
+
+  int32_t	  batteryVoltageOffset;
+  int32_t	  batteryVoltageFastOffset;
+  int32_t	  shuntVoltageOffset;
+  int32_t	  shuntVoltageFastOffset;
 
   int64_t	  mAsCounter;
@@ -209,4 +215,9 @@
 	/* currentGainFast  */													1000000,		//uint32_t  currentGain;
 
+	/* batteryVoltageOffset */												0,
+	/* batteryVoltageFastOffset */											0,
+	/* shuntVoltageOffset	*/												0,
+	/* shuntVoltageFastOffset	*/											0,
+
 	/* mAsCounter		*/													0,				// mAsCounter
 	/* detectedCapacity	*/													-1,				// detectedCapacity
@@ -223,11 +234,11 @@
 	/* iBatFull					*/											10,				// I-batt full 10%, 10A bei 100Ah akku
 	/* tBatFull					*/											2,				// t-batt full 2 Sekunden
-#if defined SYSTEM_VOLTAGE_12V
+#if defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_12V
 	/* uBatFull					*/											14000,				// 14V olt Ubatt full, Neu: Bei 0: Erkung von Lipro LVP als 0% 
 	/* uBatEmpty				*/											12400,				// 11,312V Ubatt Empty
-#elif defined SYSTEM_VOLTAGE_24V
+#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_24V
 	/* uBatFull					*/											28000,				// 14V olt Ubatt full, Neu: Bei 0: Erkung von Lipro LVP als 0% 
 	/* uBatEmpty				*/											24800,				// 11,312V Ubatt Empty
-#elif defined SYSTEM_VOLTAGE_48V
+#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_48V
 	/* uBatFull					*/											56000,				// 14V olt Ubatt full, Neu: Bei 0: Erkung von Lipro LVP als 0% 
 	/* uBatEmpty				*/											49600,				// 11,312V Ubatt Empty
@@ -239,10 +250,10 @@
 	/* socCalcMode				*/											1,				// SoC calculation mode: 0(default)
 	/* cellRatedDischargeTime	*/											2,				// cell rated current discharge time [C/x]. For example, if 40Ah cell is rated as 0.5c, then rated discharge time is 2
-#if defined SYSTEM_VOLTAGE_12V
+#if defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_12V
 	/* lvpStart	*/															12000,			// uint16_t lvpStart; Spannung ab der die LOW Voltage Protection aktiv wird in mV
 	/* lvpStop	*/															12500,			// uint16_t lvpStop; Spannung ab der die LOW Voltage Protection wieder inaktiv wird
 	/* ovpStart	*/															14800,			// uint16_t  ovpStart; Spannung ab der die OVER Voltage Protection aktiv wird in mV
 	/* ovpStop	*/															14000,			// uint16_t  ovpStop; Spannung ab der die OVER Voltage Protection wieder inaktiv wird
-#elif defined SYSTEM_VOLTAGE_24V
+#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_24V
 	/* lvpStart	*/															24000,			// uint16_t lvpStart; Spannung ab der die LOW Voltage Protection aktiv wird in mV
 	/* lvpStop	*/															25000,			// uint16_t lvpStop; Spannung ab der die LOW Voltage Protection wieder inaktiv wird
@@ -250,5 +261,5 @@
 	/* ovpStop	*/															28000,			// uint16_t  ovpStop; Spannung ab der die OVER Voltage Protection wieder inaktiv wird
 
-#elif defined SYSTEM_VOLTAGE_48V
+#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_48V
 	/* lvpStart	*/															48000,			// uint16_t lvpStart; Spannung ab der die LOW Voltage Protection aktiv wird in mV
 	/* lvpStop	*/															50000,			// uint16_t lvpStop; Spannung ab der die LOW Voltage Protection wieder inaktiv wird
@@ -284,9 +295,9 @@
 	/* uBatEmptyCompStartTemp	*/											50,				// 5°C We start calculating uBatEmpty compensations only when cell temperature is lower than this value
 	/* uBatEmptyCompStopTemp	*/											-200,			// -20°C We stop calculating uBatEmpty compensations when cell temperature is lower than this value
-#if defined SYSTEM_VOLTAGE_12V
+#if defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_12V
 	/* uBatEmptyCompStopVolt	*/											10000,			// 10V uBatEmpty voltage at temperatures lower than -20°C
-#elif defined SYSTEM_VOLTAGE_24V
+#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_24V
 /* uBatEmptyCompStopVolt	*/												20000,			// 10V uBatEmpty voltage at temperatures lower than -20°C
-#elif defined SYSTEM_VOLTAGE_48V
+#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_48V
 /* uBatEmptyCompStopVolt	*/												40000,			// 10V uBatEmpty voltage at temperatures lower than -20°C
 #else
@@ -298,12 +309,12 @@
 	/* Battery Empty Detection Mode*/										1,				// Auto, from BMS
 	/* AUX MODE */															AUX_MODE_HEATER,// Heizung
-#if defined SYSTEM_VOLTAGE_12V
+#if defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_12V
 	/* AUX SETPOINT ON */													13600,			// Erkennung Ladegerät ab 13,6V
-#elif defined SYSTEM_VOLTAGE_24V
+#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_24V
 	/* AUX SETPOINT ON */													27200,			// Erkennung Ladegerät ab 13,6V
-#elif defined SYSTEM_VOLTAGE_48V
+#elif defined DEFAULT_PARAMETER_SYSTEM_VOLTAGE_48V
 	/* AUX SETPOINT ON */													54400,			// Erkennung Ladegerät ab 13,6V
 #else
-#error No valid device type
+  #error "No valid default voltage for factory parameter"
 #endif
 	/* AUX SETPOINT OFF */													100,			// Batterie Entladung wird erkannt bei -100mA
@@ -396,4 +407,9 @@
   eepromData.changedData.currentOffsetFast											= data->s.parameter.batteryCurrentOffsetFast;
   eepromData.changedData.currentGainFast											= data->s.parameter.batteryCurrentGainCorrectionFaktorFast;
+  eepromData.changedData.batteryVoltageOffset										= data->s.parameter.batteryVoltageOffset;
+  eepromData.changedData.batteryVoltageFastOffset									= data->s.parameter.batteryVoltageFastOffset;
+  eepromData.changedData.shuntVoltageOffset											= data->s.parameter.shuntVoltageOffset;
+  eepromData.changedData.shuntVoltageFastOffset										= data->s.parameter.shuntVoltageFastOffset;
+  
   
   eepromData.changedData.batteryCurrentGainRefTempShunt								= data->s.parameter.batteryCurrentGainRefTempShunt;
@@ -510,4 +526,8 @@
   dataToStore->changedData.currentGainFast = data->s.parameter.batteryCurrentGainCorrectionFaktorFast;
 
+  dataToStore->changedData.batteryVoltageOffset = data->s.parameter.batteryVoltageOffset;
+  dataToStore->changedData.batteryVoltageFastOffset = data->s.parameter.batteryVoltageFastOffset;
+  dataToStore->changedData.shuntVoltageOffset = data->s.parameter.shuntVoltageOffset;
+  dataToStore->changedData.shuntVoltageFastOffset = data->s.parameter.shuntVoltageFastOffset;
 
   // AH COUNTER Einstellungen
@@ -615,4 +635,8 @@
   data->s.parameter.batteryCurrentGainCorrectionFaktorFast						= dataToStore->changedData.currentGainFast;
 
+  data->s.parameter.batteryVoltageOffset										= dataToStore->changedData.batteryVoltageOffset;	
+  data->s.parameter.batteryVoltageFastOffset									= dataToStore->changedData.batteryVoltageFastOffset;
+  data->s.parameter.shuntVoltageOffset											= dataToStore->changedData.shuntVoltageOffset;	
+  data->s.parameter.shuntVoltageFastOffset											= dataToStore->changedData.shuntVoltageFastOffset;
   //Einstellungenm für AH counter
   data->s.parameter.cef															= dataToStore ->changedData.cef;
Index: trunk/fw_g473rct/SES/src/esr.c
===================================================================
--- trunk/fw_g473rct/SES/src/esr.c	(revision 71)
+++ trunk/fw_g473rct/SES/src/esr.c	(revision 73)
@@ -4,9 +4,11 @@
 #include "esr.h"
 #include <stdlib.h>
+#include <stdio.h>
 #include "main.h"
-#include "battery_voltage.h"
+#include "battery_voltage_fast.h"
 #include "fast_current.h"
-#include "stdio.h"
 
+#define I_MULTIPLIER  ((int64_t) VREF / FAST_CURRENT_SHUNT_RESISTOR /  FAST_CURRENT_I_SENSE_GAIN /  FAST_CURRENT_ADC_RESOLUTION)
+#define U_MULTIPLIER  ((int64_t) VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER / BATTERY_VOLTAGE_FAST_ADC_RESOLUTION )
 
 int32_t current_buffer[SAMPLE_ARRAY_SIZE];  
@@ -14,110 +16,8 @@
 
 
-extern uint32_t adc1Data[SAMPLE_ARRAY_SIZE];
-extern uint32_t adc2Data[SAMPLE_ARRAY_SIZE];
-extern uint32_t adc4Data[SAMPLE_ARRAY_SIZE];
+extern int32_t adc1Data[SAMPLE_ARRAY_SIZE];
+extern int32_t adc2Data[SAMPLE_ARRAY_SIZE];
+extern int32_t adc4Data[SAMPLE_ARRAY_SIZE];
 
-
-//int16_t ESR_Exec(void)
-//{
- 
-
-//  static int32_t last_refresh;
-//  int x;
-
-//  //Anzeige vor wieviel Sekunden zuletzt aktualisiert wurd.
-//  sys_data.s.values.esrCalcTime = sys_data.s.values.onTime - last_refresh;
-
-//  for (x=SAMPLE_ARRAY_SIZE-1; x>0; x--)
-//  {
-//    current_buffer[x] = current_buffer[x-1];
-//    voltage_buffer[x] = voltage_buffer[x-1];
-//  }
-
-//  // Neue Werte ins array aufnehmen
-//  current_buffer[0] = sys_data.s.values.batteryCurrent;
-//  voltage_buffer[0] = sys_data.s.values.batteryVoltage;
-
-
-//  //Suche Min und max werte im Array
-//  int32_t minU=INT32_MAX;
-//  int32_t maxU=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;
-
-//  //Suche min und max werte
-//  for (x=0; x < SAMPLE_ARRAY_SIZE; x++)
-//  {
-//     if (abs(current_buffer[x]) < minI)  { minI = abs(current_buffer[x]); minIPos  = x; }
-//     if (abs(current_buffer[x]) >= maxI) { maxI = abs(current_buffer[x]); maxdIPos = x; } 
-//     if (abs(voltage_buffer[x]) < minU)  { minU = abs(voltage_buffer[x]); minUPos = x; }
-//     if (abs(voltage_buffer[x]) > maxU)  { maxU = abs(voltage_buffer[x]); maxUPos = x; }
-//  }
-
-  
-//  //Suche Zeitpunkt der größten Änderung in I
-
-//  //Delta berechnen
-//  int32_t dI = abs (maxI - minI);
-//  int32_t dU = abs (maxU - minU);
-
-//  //Minimale Belastung Prüfen ob es genügent Änderungen gab
-//  // 1/20 des Nennstroms
-//  // Bei 100Ah Batterie mit 0,5 Std discharge --> 50A --> /20 =2,5 A
-//  int32_t min_dI;
-//  min_dI = sys_data.s.parameter.cellCapacity /  sys_data.s.parameter.cellRatedDischargeTime; //Nennlaststrom  in mA
-//  min_dI = min_dI / 20 ;
-
-//  int32_t min_dU = 25;
-  
-//  if( dI < min_dI)
-//  {
-  
-//    return -1;
-//  }
-
-//  printf("1)dI change!\r\n");
-
-//  if (dU < min_dU) {
-//    return -2;
-//  }
-
-//  //printf("dU change!\r\n");
-
- 
-//  int32_t dIMax=-1;
-//  int32_t dIx=-1;;
-//  int32_t dIMaxPos=-1;
- 
-//  for (x=0; x < (SAMPLE_ARRAY_SIZE-1); x++)
-//  {
-//    dIx = abs(current_buffer[x+1] - current_buffer[x]); 
-//    if (dIx > dIMax) { dIMax = dIx; dIMaxPos = x; } 
-//  }
-
-
-
-//  if (dIMaxPos == SAMPLE_ARRAY_SIZE / 2)
-//  {
-//    //ESR berechnen!
-//    sys_data.s.values.esr = ( (double)dU / (double) dI) * 1000;
-//    last_refresh = sys_data.s.values.onTime;
-
-
-//    for (x=0; x < SAMPLE_ARRAY_SIZE; x++)
-//    {
-//      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];
-//    }
-
-
-    
-//  }
-//  return 0;
-//}
 
 
@@ -125,5 +25,5 @@
 {
  
-    printf("esr\r\n");
+  //  printf("esr\r\n");
   static int32_t last_refresh;
   int x;
@@ -137,11 +37,11 @@
   //Suche Min und max werte im Array
   int32_t minUBatt=INT32_MAX;
-  int32_t maxUBatt=0;
+  int32_t maxUBatt=INT32_MIN;
   int32_t minUOut=INT32_MAX;
-  int32_t maxUOut=0;
+  int32_t maxUOut=INT32_MIN;
   int32_t minI=INT32_MAX;
-  int32_t maxI=0;
+  int32_t maxI=INT32_MIN;
   int32_t minIPos = -1;
-  int32_t maxdIPos = -1;
+  int32_t maxIPos = -1;
   int32_t minUBattPos = -1;
   int32_t maxUBattPos = -1;
@@ -149,33 +49,53 @@
   int32_t maxUOutPos = -1;
 
+
+  //Entferne Offset
+  for (x=0; x < SAMPLE_ARRAY_SIZE -1; x++)
+  {
+	adc1Data[x] = adc1Data[x] - FAST_CURRENT_ADC_OFFSET;
+	adc2Data[x] = adc2Data[x] - BATTERY_VOLTAGE_FAST_ADC_OFFSET;
+	adc4Data[x] = adc4Data[x] - BATTERY_VOLTAGE_FAST_ADC_OFFSET;
+  }
+
+
+
   //Suche min und max werte
   for (x=0; x < SAMPLE_ARRAY_SIZE -1; x++)
   {
-     if (adc1Data[x] < minI)  { minI = adc1Data[x]; minIPos  = x; }
-     if (adc1Data[x] >= maxI) { maxI = adc1Data[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; }
+     if (adc1Data[x] <= minI)  { minI = adc1Data[x]; minIPos  = x; }
+     if (adc1Data[x] >= maxI) { maxI = adc1Data[x]; maxIPos = 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; }
   }
-
-  
 
 
   //Delta berechnen
-  int32_t dI = maxI - minI;
-  
-  //Nehme nicht mehr die gesamte maximale Differenz der Spannungen, sondern nehme das delt U wo auch das Delta I gemessen wurde
-  //Funktioniert nur bei Synchroner Messug von Strom und Spannung
-  //int32_t dU = maxU - minU;
-  int32_t dUBatt = adc2Data[maxdIPos]  - adc2Data[minIPos];
-  int32_t dUOut =  adc4Data[maxdIPos]  - adc4Data[minIPos];
+  int32_t dI;
+  int32_t dUBatt;
+  int32_t dUOut;
+
+  if (maxIPos > minIPos)
+  {
+	dI = maxI - minI;
+	//Nehme nicht mehr die gesamte maximale Differenz der Spannungen, sondern nehme das delt U wo auch das Delta I gemessen wurde
+	//Funktioniert nur bei Synchroner Messug von Strom und Spannung
+	//int32_t dU = maxU - minU;
+	dUBatt= adc2Data[maxIPos]  - adc2Data[minIPos];
+	dUOut=  adc4Data[maxIPos]  - adc4Data[minIPos];
+  }
+  else
+  {
+	dI = minI - maxI;
+	dUBatt= adc2Data[minIPos]  - adc2Data[maxIPos];
+	dUOut=  adc4Data[minIPos]  - adc4Data[maxIPos];
+  }
+
 
   //Umrechnung in mV / mA
-  dI = dI * ((double) VREF / FAST_CURRENT_SHUNT_RESISTOR /  FAST_CURRENT_I_SENSE_GAIN /  FAST_CURRENT_ADC_RESOLUTION);
-  dI = dI * (sys_data.s.parameter.batteryCurrentGainCorrectionFaktor / 1000000.0);
-
-  dUBatt = dUBatt  * (double )VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER / BATTERY_VOLTAGE_ADC_RESOLUTION ;
-  dUOut  = dUOut  * (double )VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER / BATTERY_VOLTAGE_ADC_RESOLUTION ;
+  dI = dI * I_MULTIPLIER;
+  dUBatt = dUBatt  * U_MULTIPLIER;
+  dUOut  = dUOut  * U_MULTIPLIER;
 
   //Minimale Belastung Prüfen ob es genügent Änderungen gab
@@ -184,5 +104,5 @@
   int32_t min_dI;
   min_dI = sys_data.s.parameter.cellCapacity /  sys_data.s.parameter.cellRatedDischargeTime; //Nennlaststrom  in mA
-  min_dI = min_dI / 100 ;
+  min_dI = min_dI / 10 ;
  
 
@@ -195,6 +115,28 @@
   }
 
-  printf("2)dI change!\r\n");
 
+
+ 
+ int absMax = abs(maxI);
+ int absMin = abs(minI);
+
+ //Suche die Spitze
+  //if (absMax > absMin){
+	 // //Der größte absolut wert steht in maxI
+	 // //schauen ob die spitze nicht am Anfang oder Ende des arrays ist
+	 // if ((maxIPos < 10) || (maxIPos > 53))
+	 // {
+		//return -3;
+	 // }
+	  
+  //}
+  //else 
+  //{
+
+	 // if ((minIPos < 10) || (minIPos > 53))  
+	 // {
+		//return -3;
+	 // }
+  //}
   //if (abs(dU) < min_dU) {
   //  return -2;
@@ -204,23 +146,33 @@
 
  
-  int32_t dIMax=-1;
-  int32_t dIx=-1;;
-  int32_t dIMaxPos=-1;
+//  int32_t dIMax=-1;
+//  int32_t dIx=-1;;
+//  int32_t dIMaxPos=-1;
  
 
 
   //Finde Position der flanke
-  for (x=0; x < (SAMPLE_ARRAY_SIZE-1); x++)
-  {
-    dIx = adc1Data[x+1] - adc1Data[x]; 
-    if (dIx > dIMax) { dIMax = dIx; dIMaxPos = x; } 
-  }
+//  for (x=0; x < (SAMPLE_ARRAY_SIZE-2); x++)
+//  {
+//    dIx = adc1Data[x+1] - adc1Data[x]; 
+//    if (dIx > dIMax) { dIMax = dIx; dIMaxPos = x; } 
+//  }
 
-  
+  sys_data.s.values.neg_I_peak = (minI ) * I_MULTIPLIER / 10;
+  sys_data.s.values.pos_I_peak = (maxI ) * I_MULTIPLIER / 10 ;
+
+  sys_data.s.values.neg_U_Batt_peak = (minUBatt ) * U_MULTIPLIER / 10;
+  sys_data.s.values.pos_U_Batt_peak = (maxUBatt ) * U_MULTIPLIER / 10;
+  sys_data.s.values.neg_U_Shunt_peak = (minUOut ) * U_MULTIPLIER / 10;
+  sys_data.s.values.pos_U_Shunt_peak = (maxUOut ) * U_MULTIPLIER / 10;
+
+  sys_data.s.values.neg_I_Buffer_pos = minIPos;
+  sys_data.s.values.pos_I_Buffer_pos = maxIPos;
+
 
 
   //ESR berechnen!
-  sys_data.s.values.esr_fast = ( (double)dUBatt / (double) dI) * 1000;
-  sys_data.s.values.esr =	   ( (double)dUOut  / (double) dI) * 1000;
+  sys_data.s.values.esr_batt =		( (double)dUBatt / (double) dI) * 1000;
+  sys_data.s.values.esr_shunt =	    ( (double)dUOut  / (double) dI) * 1000;
   last_refresh = sys_data.s.values.onTime;
 	
@@ -228,9 +180,13 @@
   for (x=0; x < SAMPLE_ARRAY_SIZE; x++)
   {
-	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 ;
+	sys_data.s.values.current_buffer[x] =		 adc1Data[x]  ;
+	sys_data.s.values.voltage_buffer_batt[x] =	 adc2Data[x] ;
+	sys_data.s.values.voltage_buffer_shunt[x] =  adc4Data[x]  ;
   }
 
 
+  //Auswertung darf nur erfolgen wenn Singulares Erreigniss nicht am Anfang oder Ende des Buffers erfolgt.
+  //Also z.B. bei der Belastung mit elektronischer Last. Da ansonsten eventuell nicht der Beginn der Kurve mit aufgezeichnet wird
+  //printf("delta I: %d, deltaUBatt=%d, deltaUOut=%d,posMax=%d; posMin=%d, esr1=%d, esr2=%d \r\n",dI,dUBatt,dUOut,maxIPos, minIPos,sys_data.s.values.esr_batt,sys_data.s.values.esr_shunt);
 
 
Index: trunk/fw_g473rct/SES/src/fast_current.c
===================================================================
--- trunk/fw_g473rct/SES/src/fast_current.c	(revision 71)
+++ trunk/fw_g473rct/SES/src/fast_current.c	(revision 73)
@@ -32,15 +32,15 @@
 
 //	--- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------
-void CurrentOffsetCal(uint32_t newVal)
+void CurrentOffsetCal(int32_t newVal)
 {
   sys_data.s.parameter.batteryCurrentOffsetFast = newVal-FAST_CURRENT_ADC_OFFSET;
 }
 
-void CurrentGainCal(uint32_t newVal)
+void CurrentGainCal(int32_t newVal)
 {
   double correction;
   double valWithoutGainCorrection;
 
-  valWithoutGainCorrection = ((int32_t) newVal - FAST_CURRENT_ADC_OFFSET - sys_data.s.parameter.batteryCurrentOffsetFast) * VREF ;
+  valWithoutGainCorrection = ( newVal - FAST_CURRENT_ADC_OFFSET - sys_data.s.parameter.batteryCurrentOffsetFast) * VREF ;
   valWithoutGainCorrection = valWithoutGainCorrection / FAST_CURRENT_ADC_RESOLUTION;
   valWithoutGainCorrection = valWithoutGainCorrection / FAST_CURRENT_I_SENSE_GAIN ;
@@ -51,10 +51,10 @@
 
 }
-void FAST_CURRENT_Exec(uint32_t newVal )
+void FAST_CURRENT_Exec(int32_t newVal )
 {
  
   //Umrechung auf Strom
   double temp_current;
-  temp_current = ((int32_t) newVal - FAST_CURRENT_ADC_OFFSET - sys_data.s.parameter.batteryCurrentOffsetFast) * VREF ;
+  temp_current = ( newVal - FAST_CURRENT_ADC_OFFSET - sys_data.s.parameter.batteryCurrentOffsetFast) * VREF ;
   temp_current = temp_current / FAST_CURRENT_ADC_RESOLUTION;
   temp_current = temp_current / FAST_CURRENT_I_SENSE_GAIN ;
Index: trunk/fw_g473rct/SES/src/int_bat_voltage.c
===================================================================
--- trunk/fw_g473rct/SES/src/int_bat_voltage.c	(revision 71)
+++ trunk/fw_g473rct/SES/src/int_bat_voltage.c	(revision 73)
@@ -35,5 +35,5 @@
 
 //	--- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------
-void INT_BAT_VOLTAGE_Exec(uint32_t newval)
+void INT_BAT_VOLTAGE_Exec(int32_t newval)
 {
   // Messung Externe Spannung basierend auf 3,3V Versorgungsspannung
Index: trunk/fw_g473rct/SES/src/outputs.c
===================================================================
--- trunk/fw_g473rct/SES/src/outputs.c	(revision 71)
+++ trunk/fw_g473rct/SES/src/outputs.c	(revision 73)
@@ -76,4 +76,6 @@
 void OUTPUTS_OverwriteChargeCtrl_Disabled(void)
 {
+
+
   GPIO_InitTypeDef GPIO_InitStruct = {0};
   GPIO_InitStruct.Pin = OVERWRITE_CHARGE_CTRL_Pin;
@@ -202,5 +204,9 @@
 				printf("OUTPUT LVP OK\n");
 				sys_data.s.values.lvpState = OUTPUTS_LVP_OK;
+#ifndef NO_TRISTATE_OUTPUTS
 				OUTPUTS_OverwriteDischargeCtrl_Disabled();
+#else
+				OUTPUTS_OverwriteDischargeCtrl_DischargeEnabled();
+#endif
 			}
 		}
@@ -295,5 +301,9 @@
 				printf("OUTPUT OVP OK\n");
 				sys_data.s.values.ovpState = OUTPUTS_OVP_OK;
-				OUTPUTS_OverwriteChargeCtrl_Disabled(); // externer steuerung 
+#ifndef NO_TRISTATE_OUTPUTS
+				OUTPUTS_OverwriteChargeCtrl_Disabled();
+#else
+				OUTPUTS_OverwriteChargeCtrl_ChargeEnabled();
+#endif
 			}
 		}
Index: trunk/fw_g473rct/SES/src/shunt_voltage.c
===================================================================
--- trunk/fw_g473rct/SES/src/shunt_voltage.c	(revision 71)
+++ 	(revision )
@@ -1,65 +1,0 @@
-/******************************************************************************
-*
-* @file    chipTemperature.c
-* @author  ECS, Joseph Zimmer
-* @version V1.0.0
-* @date    24-04-2019
-* @brief       
-*
-******************************************************************************/
-
-//	--- INCLUDES -----------------------------------------------------------------
-#include <stdio.h>
-#include "sysdata.h"
-#include "shunt_voltage.h"
-#include "adc.h"
-//	--- EXTERNE VARIABLEN -------------------------------------------------------- 
-
-//	--- LOKALE DEFINES - bitte hier dokumentieren --------------------------------
-#define ADC_RESOLUTION						  32768 //65536/2 da im differential mode
-#define ADC_OFFSET							  32768
-
-#if defined SYSTEM_VOLTAGE_12V
-  #define SHUNT_VOLTAGE_DIVIDER       6.0
-#elif defined SYSTEM_VOLTAGE_24V
-  #define SHUNT_VOLTAGE_DIVIDER       11.0
-#elif defined SYSTEM_VOLTAGE_48V
-  #define SHUNT_VOLTAGE_DIVIDER       21.0
-#else
-  #error "System voltage not defined"
-#endif
-
-
-
-//	--- LOKALE TYPE DEFS - bitte hier dokumentieren-------------------------------
-
-//	--- DEFINITIONEN GLOBALER VARIABLEN - Bitte in Header dokumentieren ----------
-
-//	--- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------
-
-//	--- LOKALE FUNKTIONS PROTOTYPEN ---------------------------------------------- 
-
-//	--- LOKALE FUNKTIONEN - bitte hier dokumentieren -----------------------------
-
-/*
-* @brief
-* @param	kein
-* @retval	kein
-*/
-
-//	--- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------
-
-
-
-//#define SHUNT_FILTER            128
-
-
-void SHUNT_VOLTAGE_Exec(int32_t newval)
-{
-   sys_data.s.values.shuntVoltage =  ((newval-ADC_OFFSET) * VREF * SHUNT_VOLTAGE_DIVIDER ) / ADC_RESOLUTION;
-
-}
-
-
-
-/*************************** End of file ****************************/
Index: trunk/fw_g473rct/SES/src/shunt_voltage_fast.c
===================================================================
--- trunk/fw_g473rct/SES/src/shunt_voltage_fast.c	(revision 73)
+++ trunk/fw_g473rct/SES/src/shunt_voltage_fast.c	(revision 73)
@@ -0,0 +1,62 @@
+/******************************************************************************
+*
+* @file    chipTemperature.c
+* @author  ECS, Joseph Zimmer
+* @version V1.0.0
+* @date    24-04-2019
+* @brief       
+*
+******************************************************************************/
+
+//	--- INCLUDES -----------------------------------------------------------------
+#include <stdio.h>
+#include "sysdata.h"
+#include "shunt_voltage_fast.h"
+#include "adc.h"
+#include "tim.h"
+//	--- EXTERNE VARIABLEN -------------------------------------------------------- 
+extern __IO int32_t adc4Data[SAMPLE_ARRAY_SIZE] __attribute__((section(".RAM1_CRC")));
+//	--- LOKALE DEFINES - bitte hier dokumentieren --------------------------------
+#define SHUNT_VOLTAGE_FAST_ADC_RESOLUTION						  65536 
+#define SHUNT_VOLTAGE_FAST_ADC_OFFSET							  32768
+
+
+
+
+//	--- LOKALE TYPE DEFS - bitte hier dokumentieren-------------------------------
+
+//	--- DEFINITIONEN GLOBALER VARIABLEN - Bitte in Header dokumentieren ----------
+
+//	--- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------
+
+
+//	--- LOKALE FUNKTIONS PROTOTYPEN ---------------------------------------------- 
+
+//	--- LOKALE FUNKTIONEN - bitte hier dokumentieren -----------------------------
+
+/*
+* @brief
+* @param	kein
+* @retval	kein
+*/
+
+//	--- GLOBALE FUNKTIONEN - bitte in Header dokumentieren------------------------
+
+
+
+
+
+void SHUNT_VOLTAGE_FAST_Exec(int32_t newval)
+{
+  sys_data.s.values.shuntVoltageFast =  ((newval - SHUNT_VOLTAGE_FAST_ADC_OFFSET) * (int64_t) (VREF) * SHUNT_VOLTAGE_VOLTAGE_DIVIDER / SHUNT_VOLTAGE_FAST_ADC_RESOLUTION) - sys_data.s.parameter.shuntVoltageFastOffset ;
+
+}
+
+void SHUNT_VOLTAGE_FAST_ZeroCal(void)
+{
+	sys_data.s.parameter.shuntVoltageFastOffset = sys_data.s.values.shuntVoltageFast  + sys_data.s.parameter.shuntVoltageFastOffset ;
+}
+
+
+
+/*************************** End of file ****************************/
Index: trunk/fw_g473rct/SES/src/sysdata.c
===================================================================
--- trunk/fw_g473rct/SES/src/sysdata.c	(revision 71)
+++ trunk/fw_g473rct/SES/src/sysdata.c	(revision 73)
@@ -29,6 +29,6 @@
 	sys_data.s.values.detectedEnergy = -1; //(int32_t)sys_data.s.parameter.battEnergy;
 
-	sys_data.s.values.esr = -1;
-	sys_data.s.values.esr_fast = -1;
+	sys_data.s.values.esr_batt = -1;
+	sys_data.s.values.esr_shunt= -1;
 
 	sys_data.s.values.selfDischarge = -1;
