Index: trunk/firmware/Src/adc.c
===================================================================
--- trunk/firmware/Src/adc.c	(revision 6)
+++ trunk/firmware/Src/adc.c	(revision 26)
@@ -36,19 +36,19 @@
   */
   hadc1.Instance = ADC1;
-  hadc1.Init.ClockPrescaler = LL_ADC_CLOCK_SYNC_PCLK_DIV4;
+  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
-  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
+  hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED; //More channnels
   hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
   hadc1.Init.LowPowerAutoWait = DISABLE;
   hadc1.Init.LowPowerAutoPowerOff = DISABLE;
   hadc1.Init.ContinuousConvMode = ENABLE;
-  hadc1.Init.NbrOfConversion = 8;
+  hadc1.Init.NbrOfConversion = 1;
   hadc1.Init.DiscontinuousConvMode = DISABLE;
   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
   hadc1.Init.DMAContinuousRequests = ENABLE;
-  hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
-  hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5;
+  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
+  hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5; //bei79,5 ist das gezappelt in der fast voltage eindeutig höher
   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5;
   hadc1.Init.OversamplingMode = ENABLE;
@@ -65,5 +65,5 @@
   //Messung Common Mode Voltage (Shunt Spannung - gegen Batterie Minus)
   sConfig.Channel = ADC_CHANNEL_0;
-  sConfig.Rank = ADC_REGULAR_RANK_1;
+  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
@@ -75,6 +75,4 @@
   //Messung Batteriespannung Plus
   sConfig.Channel = ADC_CHANNEL_1;
-  sConfig.Rank = ADC_REGULAR_RANK_2;
-  sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
   {
@@ -85,6 +83,4 @@
   //Messung Neu : Vref
   sConfig.Channel = ADC_CHANNEL_2;
-  sConfig.Rank = ADC_REGULAR_RANK_3;
-  sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
   {
@@ -94,6 +90,4 @@
   //Fast current Plus
   sConfig.Channel = ADC_CHANNEL_3;
-  sConfig.Rank = ADC_REGULAR_RANK_4;
-  sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
   {
@@ -103,10 +97,16 @@
   //Fast current Minus
   sConfig.Channel = ADC_CHANNEL_4;
-  sConfig.Rank = ADC_REGULAR_RANK_5;
-  sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
-  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
-  {
-    Error_Handler();
-  }
+  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+
+
+  sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
+  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+
 
 
@@ -115,6 +115,4 @@
   //ovp sense
   sConfig.Channel = ADC_CHANNEL_8;
-  sConfig.Rank = ADC_REGULAR_RANK_6;
-  sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
   {
@@ -124,24 +122,15 @@
   //lvp sense
   sConfig.Channel = ADC_CHANNEL_9;
-  sConfig.Rank = ADC_REGULAR_RANK_7;
-  sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
-  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
-  {
-    Error_Handler();
-  }
-
+  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
 
   //Temp Meas
   sConfig.Channel = ADC_CHANNEL_10;
-  sConfig.Rank = ADC_REGULAR_RANK_8;
-  sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
-  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
-  {
-    Error_Handler();
-  }
-
-
-
-
+  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
 }
 
Index: trunk/firmware/Src/battery_voltage.c
===================================================================
--- trunk/firmware/Src/battery_voltage.c	(revision 6)
+++ trunk/firmware/Src/battery_voltage.c	(revision 26)
@@ -53,5 +53,5 @@
 
   //Umrechung auf Eingangsspannung am Gerät mit Teiler
-  sys_data.s.values.batteryVoltage = (avgvalP * (uint64_t)sys_data.s.values.realVdd * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / 655360.0;
+  sys_data.s.values.batteryVoltage = (avgvalP * (uint64_t)sys_data.s.values.realVdd * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / 65536;
 
   
@@ -75,5 +75,5 @@
   //Berechnung schnellen Wert ohne Glättung:
   //Umrechung auf Eingangsspannung am Gerät mit Teiler
-  sys_data.s.values.fast_voltage = (newvalP * (uint64_t)sys_data.s.values.realVdd * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / 655360.0;
+  sys_data.s.values.fast_voltage = (newvalP * (uint64_t)sys_data.s.values.realVdd * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / 65536;
 
 
Index: trunk/firmware/Src/eeprom.c
===================================================================
--- trunk/firmware/Src/eeprom.c	(revision 6)
+++ trunk/firmware/Src/eeprom.c	(revision 26)
@@ -48,6 +48,4 @@
   int32_t	  detectedCapacity;
   int32_t	  detectedEnergy;
-  //int32_t	  mAh_AutoMode;
-  //int32_t	  mWh_AutoMode;
   int64_t	  mAs_AutoMode;								// 160-163	Helps to restore current SoC after Reset or Shutdown
   int64_t	  mWs_AutoMode;								// 164-167	Helps to restore current SoC after Reset or Shutdown
@@ -298,12 +296,12 @@
 	/* tBatFull					*/											2,				// t-batt full 2 Sekunden
 	/* uBatFull					*/											14000,			// 14Volt Ubatt full
-	/* uBatEmpty				*/											11312,			// 11,312V Ubatt Empty
+	/* uBatEmpty				*/											12500,			// 11,312V Ubatt Empty
 	/* 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
 
-	/* lvpStart	*/															11200,			// uint16_t lvpStart; Spannung ab der die LOW Voltage Protection aktiv wird in mV
-	/* lvpStop	*/															12000,			// uint16_t lvpStop; Spannung ab der die LOW Voltage Protection wieder inaktiv wird
-	/* ovpStart	*/															60000,			// uint16_t  ovpStart; Spannung ab der die OVER Voltage Protection aktiv wird in mV
-	/* ovpStop	*/															56000,			// uint16_t  ovpStop; Spannung ab der die OVER Voltage Protection wieder inaktiv wird
+	/* 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	*/															15000,			// 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
 
 #if (DEVICETYPE == 500)
Index: trunk/firmware/Src/fast_current.c
===================================================================
--- trunk/firmware/Src/fast_current.c	(revision 6)
+++ trunk/firmware/Src/fast_current.c	(revision 26)
@@ -20,9 +20,5 @@
 
 
-  // Formel zur Berechnen der Eingangsspannung
-  // Da ein Spannungteiler mit Offset genutzt wird muss die gemessene Spannung korrigiert werden
-  // R14 bis R19 sind die Wiederstände auf der Platine die Formel findet sich unter folgendem Link:
-  // https://www.mikrocontroller.net/articles/Spannungsteiler#Spannungsteiler_mit_Offset.2C_passiv
-  // Widerstände auf der Platine sind um den Faktor 1000 größer 
+
 #define I_SENSE_GAIN    40.0
 
@@ -80,9 +76,10 @@
   double diff;
   diff = (int32_t) newvalP - (int32_t) newvalM; 
-  diff = (diff * sys_data.s.values.realVdd)  / 655350.0;
+  diff = (diff * sys_data.s.values.realVdd)  / 65536;
 
   //Umrechung auf Strom
-  sys_data.s.values.fast_current = (diff / I_SENSE_GAIN) /  SHUNT_RESISTOR;
-
+  double temp_current;
+  temp_current = (diff / I_SENSE_GAIN) /  SHUNT_RESISTOR;
+  sys_data.s.values.fast_current = temp_current * (sys_data.s.parameter.batteryCurrentGainCorrectionFaktor / 1000000.0);
  
 }
Index: trunk/firmware/Src/main.c
===================================================================
--- trunk/firmware/Src/main.c	(revision 6)
+++ trunk/firmware/Src/main.c	(revision 26)
@@ -31,6 +31,5 @@
 /* USER CODE BEGIN Includes */
 #include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
+
 #include "sysdata.h"
 #include "chip_temperature.h"
@@ -74,5 +73,5 @@
 modbus_t modbusData;
 
-static volatile uint32_t adcData[8];
+static volatile uint32_t adcData[9];
 static RTC_TimeTypeDef     Time;
 static uint32_t conversionCounter;
@@ -126,4 +125,8 @@
   }
 
+  //Wenn Speichernutzung größer 50% (debug) nötig??
+  //https://community.st.com/t5/stm32-mcus-products/hard-fault-with-stm32g0b1-and-lvgl/td-p/777366
+  __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
+
   /* USER CODE END 1 */
 
@@ -194,9 +197,9 @@
 
   // STM32G0 Chiptemperatur Kalibrierung
-  //CHIP_TEMPERATURE_Calibration(/*&sys_data*/);
+  CHIP_TEMPERATURE_Calibration(/*&sys_data*/);
 
   // ADC auf STM32G0 starten
   HAL_ADCEx_Calibration_Start(&hadc1);
-  HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcData, 8);
+  HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcData, 9);
 
   // Power up Sequenz fr INA240 Strommessverstrker
@@ -315,5 +318,5 @@
 
       // Ausgabe der Temperatur des STM32G0
-      //CHIP_TEMPERATURE_Exec( adcData[7]);
+      CHIP_TEMPERATURE_Exec( adcData[8]);
 
       SHUNT_TEMPERATURE_Exec(adcData[7]);
Index: trunk/firmware/Src/ref_voltage.c
===================================================================
--- trunk/firmware/Src/ref_voltage.c	(revision 6)
+++ trunk/firmware/Src/ref_voltage.c	(revision 26)
@@ -39,5 +39,5 @@
    uint32_t avgval;
    // Filterlängen in 2er-Potenzen --> Compiler optimiert 
-   avgsum -= avgsum/REF_FILTER;
+   avgsum -= avgsum / REF_FILTER;
    avgsum += newval;
    avgval = avgsum / REF_FILTER;
@@ -45,8 +45,8 @@
   // Messung Externe Spannung basierend auf 3,3V Versorgungsspannung
   // Nur für Debug Zwecke
-  sys_data.s.values.voltageVref =  (avgval * 330 * 100) / 65535;
+  sys_data.s.values.voltageVref =  (avgval * 3300) / 65536;
   
   // Ermittlung Vdd als Referenz
-  sys_data.s.values.realVdd =  30000L * 65535 / avgval;;
+  sys_data.s.values.realVdd =  3000L * 65536 / avgval;;
 }
 /*************************** End of file ****************************/
Index: trunk/firmware/Src/self_discharge.c
===================================================================
--- trunk/firmware/Src/self_discharge.c	(revision 6)
+++ trunk/firmware/Src/self_discharge.c	(revision 26)
@@ -1,7 +1,7 @@
-
+#include <stdio.h>
 #include "sysdata.h"
 #include "self_discharge.h"
 
-#define HOLD_TIME   ( 3 * 3600 ) // 3 stunde
+#define HOLD_TIME (10800 ) //10800 = 3 stunde
 #define SD_FILTER 64
 
@@ -10,5 +10,5 @@
 
   const double batt_float_voltage_tol = 0.03;
-  const double batt_voltage_holding_tol = 10;
+  const int32_t batt_voltage_holding_tol = 10;
   int32_t max_u = sys_data.s.parameter.uBatFull * ( 1 + batt_float_voltage_tol);
   int32_t min_u = sys_data.s.parameter.uBatFull * ( 1 - batt_float_voltage_tol);
@@ -48,4 +48,5 @@
     u_hold = 0;
     holding_counter = 0;
+	//printf("self_discharge: fail voltage too  high!\n");
     return -2;
   }
@@ -56,5 +57,16 @@
     u_hold = 0;
     holding_counter = 0;
+	//printf("self_discharge: fail voltage too  low!\n");
     return -2;
+  }
+
+
+  if (sys_data.s.values.batteryCurrent < sys_data.s.parameter.extraDischargeStrom_mA)
+  {
+	//Abbruch Ladegerät wurde entfernt, wir müssen mindesten den Lipro Strom messen
+    u_hold = 0;
+    holding_counter = 0;
+	//printf("self_discharge: fail current too small!\n");
+    return -3;
   }
 
@@ -62,31 +74,34 @@
   if (holding_counter > HOLD_TIME)
   {
-    sys_data.s.values.selfDischarge = sys_data.s.values.batteryCurrent;
+    sys_data.s.values.selfDischarge = sys_data.s.values.batteryCurrent -  sys_data.s.parameter.extraDischargeStrom_mA;
   }
 
 
+  //Wenn ein gültiger Wert gemessen wurde, dann zu Mittelwert hinzufügen
+  if (sys_data.s.values.selfDischarge > 0)
+  {
 
-  // --- Mittelwert --- 
-  static uint32_t last_days;
-  static unsigned long avgsum = 0;
+    // --- Mittelwert --- 
+    static uint32_t last_days;
+    static unsigned long avgsum = 0;
 
-  // Converting seconds into days
-  uint32_t days = sys_data.s.values.onTime / (24U * 3600U);
+    // Converting seconds into days
+    uint32_t days = sys_data.s.values.onTime / (24U * 3600U);
 
-  // Alle 24 Stunden ein Wert zur Mittelwertberechnung hinzufügen
-  if (days != last_days)
-  {
-    last_days = days;
+    // Alle 24 Stunden ein Wert zur Mittelwertberechnung hinzufügen
+    if (days != last_days)
+    {
+      last_days = days;
     
-    uint32_t avgval;
-    // Filterlängen in 2er-Potenzen --> Compiler optimiert 
-    avgsum -= avgsum/SD_FILTER;
-    avgsum += sys_data.s.values.selfDischarge;
-    avgval = avgsum / SD_FILTER;
+      uint32_t avgval;
+      // Filterlängen in 2er-Potenzen --> Compiler optimiert 
+      avgsum -= avgsum/SD_FILTER;
+      avgsum += sys_data.s.values.selfDischarge;
+      avgval = avgsum / SD_FILTER;
 
-    sys_data.s.values.selfDischargeAvg = avgval;
+      sys_data.s.values.selfDischargeAvg = avgval;
+    }
+
   }
-
-
 
   
Index: trunk/firmware/Src/shunt_voltage.c
===================================================================
--- trunk/firmware/Src/shunt_voltage.c	(revision 6)
+++ trunk/firmware/Src/shunt_voltage.c	(revision 26)
@@ -51,5 +51,5 @@
    //avgval = avgsum / SHUNT_FILTER;
 
-   sys_data.s.values.shuntVoltage =  (newval * (uint64_t)sys_data.s.values.realVdd * SHUNT_VOLTAGE_DIVIDER ) / 655360.0;
+   sys_data.s.values.shuntVoltage =  (newval * (uint64_t)sys_data.s.values.realVdd * SHUNT_VOLTAGE_DIVIDER ) / 65536;
 
 }
Index: trunk/firmware/Src/stm32g0xx_it.c
===================================================================
--- trunk/firmware/Src/stm32g0xx_it.c	(revision 6)
+++ trunk/firmware/Src/stm32g0xx_it.c	(revision 26)
@@ -90,7 +90,8 @@
 {
   /* USER CODE BEGIN HardFault_IRQn 0 */
+  static volatile uint32_t cont=0;
 
   /* USER CODE END HardFault_IRQn 0 */
-  while (1)
+  while (cont == 0)
   {
     /* USER CODE BEGIN W1_HardFault_IRQn 0 */
Index: trunk/firmware/Src/sysdata.c
===================================================================
--- trunk/firmware/Src/sysdata.c	(revision 6)
+++ trunk/firmware/Src/sysdata.c	(revision 26)
@@ -35,6 +35,5 @@
 	sys_data.s.values.selfDischargeAvg = -1;
 
-	//sys_data.s.values.mWh_AutoMode = -sys_data.s.parameter.battEnergy;
-	//sys_data.s.values.mAh_AutoMode = -sys_data.s.parameter.cellCapacity;
+
 
 	sys_data.s.parameter.fw_revision_major     = 2;
