Index: trunk/firmware_v2/SES/src/chip_temperature.c
===================================================================
--- trunk/firmware_v2/SES/src/chip_temperature.c	(revision 23)
+++ trunk/firmware_v2/SES/src/chip_temperature.c	(revision 24)
@@ -25,5 +25,5 @@
 uint32_t calTemperatureSensor30Value;  // Kalibrierungswert für den Temperatursensor auf dem STM32G0 (Werksmäßig im SCB Bereich gespeichert wird beim Programmstart ausgelesen)
                                                  // Daten Temperaturanzeige µProzessor
-
+int32_t temp;
 //	--- LOKALE FUNKTIONS PROTOTYPEN ----------------------------------------------
 
@@ -56,9 +56,9 @@
 }
 
-int CHIP_TEMPERATURE_Exec(uint32_t chiptemperature)
+void CHIP_TEMPERATURE_Exec(uint32_t adcValue)
 {
-    int32_t temp;
+    
     //Aktuelle Spannung am Temp Sensor
-    temp = (3300 * (uint32_t)chiptemperature) / 65536;
+    temp = (3300 * (uint32_t)adcValue) / 65536;
 
 
@@ -67,7 +67,12 @@
     temp = temp / 2.530; //2,53mV/°C
     temp = temp + 25; //30000 da Erste Kalibrierpunkt bei 25°C --> 25
-	return temp;
-    //Durch 10 teilen, damit es in 16 Bit signed modbus register passt
+
 }
+
+int CHIP_TEMPERATURE_GetTemp(void)
+{
+  return temp;
+}
+
 
 //------------------------------------------------------------------------------
Index: trunk/firmware_v2/SES/src/main.c
===================================================================
--- trunk/firmware_v2/SES/src/main.c	(revision 23)
+++ trunk/firmware_v2/SES/src/main.c	(revision 24)
@@ -32,4 +32,5 @@
 #include "relais.h"
 #include "leds.h"
+#include "fan.h"
 #include "chip_temperature.h"
 #include "modeswitch.h"
@@ -141,4 +142,14 @@
 
 
+	
+extern uint32_t frequency, ic_overflows;
+  ic_overflows = 0U;
+  __HAL_TIM_SetCounter(&htim16, 0U);
+
+  HAL_TIM_Base_Start_IT(&htim16);
+  HAL_TIM_IC_Start_IT(&htim16, TIM_CHANNEL_1);
+  int oldcaptureValue=0;
+
+
   /* USER CODE END 2 */
 
@@ -166,7 +177,7 @@
 	{
 	  msCounter = 0;
-      temperature = CHIP_TEMPERATURE_Exec(adcData[4]);
-	  
-	  if (temperature > 50)
+      CHIP_TEMPERATURE_Exec(adcData[4]);
+	  temperature=CHIP_TEMPERATURE_GetTemp();
+	  if ( temperature > 50)
 	  {  
 		  pwm++;
@@ -178,60 +189,13 @@
 		if (pwm > 0) pwm--;
 	  }
-	  SetFANSpeed(pwm);
-
-
-	  if (temperature > 80)
-	  {
-		  
-          
-          BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
-		  LEDS_GN_Off();
-          LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_TEMP, LED_RT_ON_TIME_WARN_TEMP, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
-          printf("Temperature too high!\n");
-          
-	  }
-
-	  // Starting measuring frequency of the FAN tacho output
-	  static unsigned stage;
-	  extern uint32_t freq, ic_overflows;
-
-	  switch (stage)
-	  {
-		  case 0:
-			  ic_overflows = 0U;
-			  __HAL_TIM_SetCounter(&htim16, 0U);
-			  HAL_TIM_Base_Start_IT(&htim16);
-			  HAL_TIM_IC_Start_IT(&htim16, TIM_CHANNEL_1);
-			  //printf("IC started\n");
-			  stage++;
-			  break;
-		  
-		  case 1: stage++; break;
-		  case 2: stage++; break;
-		  case 3: stage++; break;
-		  case 4: stage++; break;
-		  case 5: stage++; break;
-		  case 6:
-			  //printf("F = %u\n", freq);
-			  if (!freq)
-			  {
-				  static unsigned zeroFreqCnt;
-
-				  zeroFreqCnt++;
-				  // Checking if we set last time non-zero FAN-speed, but
-				  // tacho-sensor signal is absent more than 15 sec.
-				  if (zeroFreqCnt > 3U && GetLastSpeed())
-				  {
-					  SetFANSpeed(0U);
-					  // ACHTUNG! Der Lüfter ist kaputt!
-				  }
-			  }
-			  stage = 0;
-			  break;
-	  }
+	 
+	  FAN_SetSpeed(pwm);
 
 	  uin = VOLTAGE_MEAS_GetUin();
 	  uout = VOLTAGE_MEAS_GetUout();
-	  printf("uin= %d, uout=%d, temp=%d, pwm=%d, fan=%d\r\n", uin, uout, temperature,pwm,freq);
+	  uint32_t rpm;
+	  rpm = frequency / 2;
+	  rpm = rpm * 60;
+	  printf("uin= %d, uout=%d, temp=%d, pwm=%d, fan=%d\r\n", uin, uout, temperature,pwm,rpm);
 	  
 	  
@@ -242,27 +206,27 @@
     switch (MODESWITCH_GetMode())
     {
-      case MODE_MAINSWITCH:
+      case MODE_MAINSWITCH: //0
         MODE_MAINSWITCH_Exec();
       break;
 
-      case MODE_MAINSWITCH_SECONDARYPROTECTION:
+      case MODE_MAINSWITCH_SECONDARYPROTECTION://1
         MODE_SECONDARYPROTECTION_Exec();
       break;
 
-      case MODE_MAINSWITCH_SECONDARYPROTECTION_PLUS:
+      case MODE_MAINSWITCH_SECONDARYPROTECTION_PLUS://2
         MODE_SECONDARYPROTECTION_PLUS_Exec();
       break;
 
-	  case MODE_MAINSWITCH_LVP_OVP:
-     //   MODE_LVP_OVP_Exec();
-      break;
-
-      //case MODE_MAINSWITCH_LVP:
-      //  MODE_LVP_Exec();
-      //break;
-
-      //case MODE_MAINSWITCH_OVP:
-      //  MODE_OVP_Exec();
-      //break;
+	  case MODE_MAINSWITCH_LVP_OVP://3
+        MODE_LVP_OVP_Exec();
+      break;
+
+      case MODE_MAINSWITCH_LVP://4
+        MODE_LVP_Exec();
+      break;
+
+      case MODE_MAINSWITCH_OVP://5
+        MODE_OVP_Exec();
+      break;
 
 
Index: trunk/firmware_v2/SES/src/mode_lvp.c
===================================================================
--- trunk/firmware_v2/SES/src/mode_lvp.c	(revision 23)
+++ trunk/firmware_v2/SES/src/mode_lvp.c	(revision 24)
@@ -1,22 +1,5 @@
 
-// Dieser Modus ist ein Hauptschaltermodus mit Secondary Protection 
-// Secondary Protection löst aus, wenn OVP und LVP wegfällt.
-// OVP und LVP fällt wegbei:
-// - Sehr tiefe Entladung
-// - Sehr hohe Spannung
-// - Übertemperatur
-// - je nach Liproeinstellung möglicherweise auch wenn sowohl Untertemperaturschutz für Ladung und für Last erreicht ist
-// - je nach Liproeinstellung möglicherweise auch wenn sowohl Überttemperaturschutz für Ladung und für Last erreicht ist
-// - Die letzten beiden Positionen können vielleicht ungewollt sein.
-
-// OVP UND LVP Signal gleichzeitig:
-// Es wurde eine Verzögerung von ca. 30 Sekunden implementiert. So kann noch problemlos ein Testjumper auf die Lipro gesteckt werden und die 
-// einzelnennen Funktionen zu prüfen. Außerdem ist es eventuell für die Prametrierung hilfreich, wenn nicht sofort ausgeht
-// Auch wäre es hilfreich um zum Beispiel die Ursache über Modbus abfragen heruas zu bekommen
-
-// 
-// Fault Input:
-// Hier ohne Verzögerung um schnell auf kurzschluss reagieren zu können
-// Ansonsten wie Modus 0
+// Wie LVP||OVP Modul
+// Jedoch hier nur LVP
 
 
@@ -29,5 +12,5 @@
 #include "leds.h"
 #include "buzzer.h"
-
+#include "chip_temperature.h"
 
 
@@ -47,5 +30,5 @@
 {
   int faultInput;
-  int lvpInput;
+
 
   if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
@@ -58,10 +41,4 @@
   }
 
-  if (HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_SET)
-  {
-    lvpInput = 1;
-  }else {
-    lvpInput = 0;
-  }
 
   
@@ -76,5 +53,5 @@
       BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
       LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
-      printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
+      printf("LVP_SM_Off: NEW_STATE: LVP_ON\n");
       smState = LVP_ON;
 
@@ -87,5 +64,5 @@
       //LEDS_RT_Blink_Start(LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_GN_OFF_TIME); //Fehler Anzeigen
 	  LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_FAULT_INPUT, LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
-      printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
+      printf("LVP_SM_Off: NEW_STATE: LVP_ERROR_FAULT_INPUT\n");
       smState =LVP_ERROR;
     }
@@ -102,5 +79,5 @@
       LEDS_GN_On();
       LEDS_RT_BlinkCode_Start(BLINK_CODE_WARN_MANUAL, LED_RT_ON_TIME_WARN_MANUAL_MODE, LED_RT_OFF_TIME, LED_RT_OFF_TIME * 5); //Fehler Anzeigen
-      printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
+      printf("NEW_STATE: LVP_MANUAL_ON\n");
       smState = LVP_MANUAL_ON;
   }
@@ -113,6 +90,6 @@
 {
   int faultInput = 0;
-  int lvpInput = 0;
-  static int lvpInputTimeCounter = 0;
+  static int lvpInput = 0;
+  static int lvpTimeCounter = 0;
   static int oldtime;
 
@@ -126,24 +103,83 @@
   }
   
-  if (HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_RESET)
+  if ((HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_SET) ||  (HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_SET))
   {
     if (HAL_GetTick() != oldtime)
     {
-      lvpInputTimeCounter++;
-      if (lvpInputTimeCounter > 30000)
+      if (lvpTimeCounter < 5000) lvpTimeCounter++;
+      if (lvpTimeCounter >= 5000)
       {
-        lvpInput = 0;
-        lvpInputTimeCounter=0;
+        lvpInput = 1;
+        lvpTimeCounter=0;
       }
       oldtime = HAL_GetTick();
     }
   }
-  else 
-  {
-    lvpInputTimeCounter = 0;
-    lvpInput = 1;
+
+  if (HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_RESET) 
+  {
+//    if (HAL_GetTick() != oldtime)
+//    {
+//      lvpAndOvpInputTimeCounter++;
+//      if (lvpAndOvpInputTimeCounter > 30000)
+//      {
+        lvpInput = 0;
+        lvpTimeCounter=0;
+//      }
+//      oldtime = HAL_GetTick();
+//    }
   }
 
   
+
+
+  //Prüfe auf Fehlermode
+  if (faultInput == 1)
+  {
+    RELAIS_ResetPuls();
+    BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
+    LEDS_GN_Off();
+    LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_FAULT_INPUT, LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
+    BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
+    printf("FAULT INPUT EVENT DETECTED!\n");
+    printf("NEW_STATE: LVP_ERROR\n");
+    smState = LVP_ERROR;
+  }
+
+    if (CHIP_TEMPERATURE_GetTemp() > 80)
+  {
+	RELAIS_ResetPuls();
+	BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
+	LEDS_GN_Off();
+	LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_TEMP, LED_RT_ON_TIME_WARN_TEMP, LED_GN_OFF_TIME, LED_GN_OFF_TIME *5); //Fehler Anzeigen
+	BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
+	printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
+	smState = LVP_ERROR;          
+  }
+
+
+  //LVP oder OVP hat stattgefunden, und Relais ist ein, dann aus
+  if ((lvpInput == 1) && (RELAIS_GetState() == 1)) 
+  {
+    RELAIS_ResetPuls();
+    BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
+    LEDS_GN_Off();
+    LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_OVP_LVP, LED_RT_ON_TIME_WARN_OVP_AND_LVP_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
+    printf("LVP OFF!\n");
+    printf("NEW_STATE: LVP_Auto On, Relais off\n");
+    
+  }
+
+  //KEIN LVP und keine OVP Abschaltung, Relais ist aber noch aus, dann einschalten
+  if ((lvpInput == 0) && (RELAIS_GetState() == 0))
+  {
+    RELAIS_SetPuls();
+    BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Warnung
+    LEDS_GN_Off();
+    LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
+    printf("LVP ON!\n");
+    printf("NEW_STATE: LVP_OVP_Auto On, Relais on\n");
+    
+  }
 
   // Prüfe Wechsel in off mode
@@ -155,42 +191,10 @@
     LEDS_GN_Off();
     LEDS_RT_Off();
-    printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
+    printf("NEW_STATE: LVP_OFF\n");
     smState = LVP_OFF;
-  }
-
-  //Prüfe auf Fehlermode
-  if (faultInput == 1)
-  {
-    RELAIS_ResetPuls();
-    BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
-    LEDS_GN_Off();
-    LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_FAULT_INPUT, LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
-    BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
-    printf("FAULT INPUT EVENT DETECTED!\n");
-    printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
-    smState = LVP_ERROR;
-  }
-
-  if ((lvpInput == 0) && ( RELAIS_GetState() == 1))
-  {
-    RELAIS_ResetPuls();
-    BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
-    LEDS_GN_Off();
-    BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
-    printf("LVP FALLING EVENT DETECTED!\n");
-    printf("NEW_STATE: LVP OFF\n");
-  }
-
-
-  //Einkommentieren für auto Reconnect
-  //if ((lvpInput == 1) && ( RELAIS_GetState() == 0))
-  //{
-  //  RELAIS_SetPuls();
-  //  BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Warnung
-  //  LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
-  //  BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
-  //  printf("BMS SECONDARY PROTECTION FAULT EVENT DETECTED (LVP & OVP )!\n");
-  //  printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
-  //}
+	//Damit beim drücken auf on erstmal eingeschaltet wird
+	lvpTimeCounter=0;
+	lvpInput = 0;
+  }
 
 
@@ -259,5 +263,5 @@
       LEDS_RT_Off();
       LEDS_RT_BlinkCode_Start(BLINK_CODE_WARN_MANUAL, LED_RT_ON_TIME_WARN_MANUAL_MODE, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
-      printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
+      printf("NEW_STATE: LVP_MANUAL_ON\n");
       smState = LVP_MANUAL_ON;
   }
@@ -277,5 +281,5 @@
   {
     case LVP_OFF:
-      LVP_SM_Off();
+     LVP_SM_Off();
     break;
 
Index: trunk/firmware_v2/SES/src/mode_lvp_ovp.c
===================================================================
--- trunk/firmware_v2/SES/src/mode_lvp_ovp.c	(revision 23)
+++ trunk/firmware_v2/SES/src/mode_lvp_ovp.c	(revision 24)
@@ -29,4 +29,5 @@
 #include "leds.h"
 #include "buzzer.h"
+#include "chip_temperature.h"
 
 
@@ -46,5 +47,5 @@
 {
   int faultInput;
-  int lvpOROvpInput;
+
 
   if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
@@ -57,12 +58,5 @@
   }
 
-  if ((HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_RESET) ||  (HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_RESET))
-  {
-    lvpOROvpInput = 1;
-  }else {
-    lvpOROvpInput = 0;
-  }
-
-  
+
 
 
@@ -75,5 +69,5 @@
       BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
       LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
-      printf("NEW_STATE: LVP_OVP_ON\n");
+      printf("LVP_OVP_SM_Off: NEW_STATE: LVP_OVP_ON\n");
       smState = LVP_OVP_ON;
 
@@ -86,5 +80,5 @@
       //LEDS_RT_Blink_Start(LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_GN_OFF_TIME); //Fehler Anzeigen
 	  LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_FAULT_INPUT, LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
-      printf("NEW_STATE: LVP_OVP_ERROR\n");
+      printf("LVP_OVP_SM_Off: NEW_STATE: LVP_OVP_ERROR_FAULT_INPUT\n");
       smState =LVP_OVP_ERROR;
     }
@@ -112,5 +106,5 @@
 {
   int faultInput = 0;
-  int lvpOROvpInput = 0;
+  static int lvpOROvpInput = 0;
   static int lvpAndOvpInputTimeCounter = 0;
   static int oldtime;
@@ -125,24 +119,10 @@
   }
   
-  if ((HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_RESET) ||  (HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_RESET))
+  if ((HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_SET) ||  (HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_SET))
   {
     if (HAL_GetTick() != oldtime)
     {
-      lvpAndOvpInputTimeCounter++;
-      if (lvpAndOvpInputTimeCounter > 30000)
-      {
-        lvpOROvpInput = 0;
-        lvpAndOvpInputTimeCounter=0;
-      }
-      oldtime = HAL_GetTick();
-    }
-  }
-
-  if ((HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_SET) &&  (HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_SET))
-  {
-    if (HAL_GetTick() != oldtime)
-    {
-      lvpAndOvpInputTimeCounter++;
-      if (lvpAndOvpInputTimeCounter > 30000)
+      if (lvpAndOvpInputTimeCounter < 5000)lvpAndOvpInputTimeCounter++;
+      if (lvpAndOvpInputTimeCounter >= 5000)
       {
         lvpOROvpInput = 1;
@@ -153,17 +133,20 @@
   }
 
+  if ((HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin) == GPIO_PIN_RESET) &&  (HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_RESET))
+  {
+//    if (HAL_GetTick() != oldtime)
+//    {
+//      lvpAndOvpInputTimeCounter++;
+//      if (lvpAndOvpInputTimeCounter > 30000)
+//      {
+        lvpOROvpInput = 0;
+        lvpAndOvpInputTimeCounter=0;
+//      }
+//      oldtime = HAL_GetTick();
+//    }
+  }
+
   
 
-  // Prüfe Wechsel in off mode
-  if (BUTTON_GetMode() == BUTTON_OFF)
-  {
-    //Ausschalten muss immer möglich sein
-    RELAIS_ResetPuls();
-    BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Bestätigung
-    LEDS_GN_Off();
-    LEDS_RT_Off();
-    printf("NEW_STATE: LVP_OVP_OFF\n");
-    smState = LVP_OVP_OFF;
-  }
 
   //Prüfe auf Fehlermode
@@ -180,5 +163,18 @@
   }
 
-  if (lvpOROvpInput == 0)
+    if (CHIP_TEMPERATURE_GetTemp() > 80)
+  {
+	RELAIS_ResetPuls();
+	BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
+	LEDS_GN_Off();
+	LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_TEMP, LED_RT_ON_TIME_WARN_TEMP, LED_GN_OFF_TIME, LED_GN_OFF_TIME *5); //Fehler Anzeigen
+	BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
+	printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
+	smState = LVP_OVP_ERROR;          
+  }
+
+
+  //LVP oder OVP hat stattgefunden, und Relais ist ein, dann aus
+  if ((lvpOROvpInput == 1) && (RELAIS_GetState() == 1)) 
   {
     RELAIS_ResetPuls();
@@ -186,10 +182,11 @@
     LEDS_GN_Off();
     LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_OVP_LVP, LED_RT_ON_TIME_WARN_OVP_AND_LVP_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
-    printf("LVP OR OVP FALLING!\n");
+    printf("LVP OR OVP OFF!\n");
     printf("NEW_STATE: LVP_OVP_Auto On, Relais off\n");
     
   }
 
-  if (lvpOROvpInput == 1)
+  //KEIN LVP und keine OVP Abschaltung, Relais ist aber noch aus, dann einschalten
+  if ((lvpOROvpInput == 0) && (RELAIS_GetState() == 0))
   {
     RELAIS_SetPuls();
@@ -197,8 +194,24 @@
     LEDS_GN_Off();
     LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
-    printf("LVP AND OVP RISING!\n");
+    printf("LVP AND OVP ON!\n");
     printf("NEW_STATE: LVP_OVP_Auto On, Relais on\n");
     
   }
+
+  // Prüfe Wechsel in off mode
+  if (BUTTON_GetMode() == BUTTON_OFF)
+  {
+    //Ausschalten muss immer möglich sein
+    RELAIS_ResetPuls();
+    BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Bestätigung
+    LEDS_GN_Off();
+    LEDS_RT_Off();
+    printf("NEW_STATE: LVP_OVP_OFF\n");
+    smState = LVP_OVP_OFF;
+	//Damit beim drücken auf on erstmal eingeschaltet wird
+	lvpAndOvpInputTimeCounter=0;
+	lvpOROvpInput = 0;
+  }
+
 
 }
Index: trunk/firmware_v2/SES/src/mode_mainswitch.c
===================================================================
--- trunk/firmware_v2/SES/src/mode_mainswitch.c	(revision 23)
+++ trunk/firmware_v2/SES/src/mode_mainswitch.c	(revision 24)
@@ -13,4 +13,5 @@
 #include "leds.h"
 #include "buzzer.h"
+#include "chip_temperature.h"
 
 
@@ -119,4 +120,17 @@
   }
 
+  	  if (CHIP_TEMPERATURE_GetTemp() > 80)
+	  {
+        RELAIS_ResetPuls();
+        BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
+        LEDS_GN_Off();
+        LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_TEMP, LED_RT_ON_TIME_WARN_TEMP, LED_GN_OFF_TIME, LED_GN_OFF_TIME *5); //Fehler Anzeigen
+        BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
+        printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
+        smState = MAINSWITCH_ERROR;          
+	  }
+
+
+
 
 }
Index: trunk/firmware_v2/SES/src/mode_ovp.c
===================================================================
--- trunk/firmware_v2/SES/src/mode_ovp.c	(revision 23)
+++ trunk/firmware_v2/SES/src/mode_ovp.c	(revision 24)
@@ -1,22 +1,5 @@
 
-// Dieser Modus ist ein Hauptschaltermodus mit Secondary Protection 
-// Secondary Protection löst aus, wenn OVP und LVP wegfällt.
-// OVP und LVP fällt wegbei:
-// - Sehr tiefe Entladung
-// - Sehr hohe Spannung
-// - Übertemperatur
-// - je nach Liproeinstellung möglicherweise auch wenn sowohl Untertemperaturschutz für Ladung und für Last erreicht ist
-// - je nach Liproeinstellung möglicherweise auch wenn sowohl Überttemperaturschutz für Ladung und für Last erreicht ist
-// - Die letzten beiden Positionen können vielleicht ungewollt sein.
-
-// OVP UND LVP Signal gleichzeitig:
-// Es wurde eine Verzögerung von ca. 30 Sekunden implementiert. So kann noch problemlos ein Testjumper auf die Lipro gesteckt werden und die 
-// einzelnennen Funktionen zu prüfen. Außerdem ist es eventuell für die Prametrierung hilfreich, wenn nicht sofort ausgeht
-// Auch wäre es hilfreich um zum Beispiel die Ursache über Modbus abfragen heruas zu bekommen
-
-// 
-// Fault Input:
-// Hier ohne Verzögerung um schnell auf kurzschluss reagieren zu können
-// Ansonsten wie Modus 0
+// Wie OVP||OVP Modul
+// Jedoch hier nur OVP
 
 
@@ -29,5 +12,5 @@
 #include "leds.h"
 #include "buzzer.h"
-
+#include "chip_temperature.h"
 
 
@@ -47,5 +30,5 @@
 {
   int faultInput;
-  int ovpInput;
+
 
   if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
@@ -58,10 +41,4 @@
   }
 
-  if (HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_SET)
-  {
-    ovpInput = 1;
-  }else {
-    ovpInput = 0;
-  }
 
   
@@ -76,5 +53,5 @@
       BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
       LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
-      printf("NEW_STATE: LVP_ON\n");
+      printf("OVP_SM_Off: NEW_STATE: OVP_ON\n");
       smState = OVP_ON;
 
@@ -87,6 +64,6 @@
       //LEDS_RT_Blink_Start(LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_GN_OFF_TIME); //Fehler Anzeigen
 	  LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_FAULT_INPUT, LED_RT_ON_TIME_WARN_FAULT_INPUT, LED_RT_OFF_TIME, LED_RT_OFF_TIME *5); //Fehler Anzeigen
-      printf("NEW_STATE: LVP_ERROR\n");
-      smState = OVP_ERROR;
+      printf("OVP_SM_Off: NEW_STATE: OVP_ERROR_FAULT_INPUT\n");
+      smState =OVP_ERROR;
     }
   }
@@ -102,5 +79,5 @@
       LEDS_GN_On();
       LEDS_RT_BlinkCode_Start(BLINK_CODE_WARN_MANUAL, LED_RT_ON_TIME_WARN_MANUAL_MODE, LED_RT_OFF_TIME, LED_RT_OFF_TIME * 5); //Fehler Anzeigen
-      printf("NEW_STATE: LVP_MANUAL_ON\n");
+      printf("NEW_STATE: OVP_MANUAL_ON\n");
       smState = OVP_MANUAL_ON;
   }
@@ -113,6 +90,6 @@
 {
   int faultInput = 0;
-  int ovpInput = 0;
-  static int ovpInputTimeCounter = 0;
+  static int ovpInput = 0;
+  static int ovpTimeCounter = 0;
   static int oldtime;
 
@@ -126,36 +103,34 @@
   }
   
-  if (HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_RESET)
+  if ((HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_SET) ||  (HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_SET))
   {
     if (HAL_GetTick() != oldtime)
     {
-      ovpInputTimeCounter++;
-      if (ovpInputTimeCounter > 30000)
+      if (ovpTimeCounter < 5000) ovpTimeCounter++;
+      if (ovpTimeCounter >= 5000)
       {
-        ovpInput = 0;
-        ovpInputTimeCounter=0;
+        ovpInput = 1;
+        ovpTimeCounter=0;
       }
       oldtime = HAL_GetTick();
     }
   }
-  else 
-  {
-    ovpInputTimeCounter = 0;
-    ovpInput = 1;
+
+  if (HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin) == GPIO_PIN_RESET) 
+  {
+//    if (HAL_GetTick() != oldtime)
+//    {
+//      ovpAndOvpInputTimeCounter++;
+//      if (ovpAndOvpInputTimeCounter > 30000)
+//      {
+        ovpInput = 0;
+        ovpTimeCounter=0;
+//      }
+//      oldtime = HAL_GetTick();
+//    }
   }
 
   
 
-  // Prüfe Wechsel in off mode
-  if (BUTTON_GetMode() == BUTTON_OFF)
-  {
-    //Ausschalten muss immer möglich sein
-    RELAIS_ResetPuls();
-    BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Bestätigung
-    LEDS_GN_Off();
-    LEDS_RT_Off();
-    printf("NEW_STATE: LVP_OFF\n");
-    smState = OVP_OFF;
-  }
 
   //Prüfe auf Fehlermode
@@ -172,23 +147,52 @@
   }
 
-  if ((ovpInput == 0) && ( RELAIS_GetState() == 1))
+    if (CHIP_TEMPERATURE_GetTemp() > 80)
+  {
+	RELAIS_ResetPuls();
+	BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
+	LEDS_GN_Off();
+	LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_TEMP, LED_RT_ON_TIME_WARN_TEMP, LED_GN_OFF_TIME, LED_GN_OFF_TIME *5); //Fehler Anzeigen
+	BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
+	printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
+	smState = OVP_ERROR;          
+  }
+
+
+  //OVP oder OVP hat stattgefunden, und Relais ist ein, dann aus
+  if ((ovpInput == 1) && (RELAIS_GetState() == 1)) 
   {
     RELAIS_ResetPuls();
     BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
-    LEDS_GN_Off();
-    BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
-    printf("OVP Falling )!\n");
-    printf("NEW_STATE: OVP AUTO, Relais off\n");
-  }
-
-  
-  if ((ovpInput == 1) && ( RELAIS_GetState() == 0))
+    LEDS_GN_Off();    
+    printf("OVP OFF!\n");
+    printf("NEW_STATE: OVP_Auto On, Relais off\n");
+    
+  }
+
+  //KEIN OVP und keine OVP Abschaltung, Relais ist aber noch aus, dann einschalten
+  if ((ovpInput == 0) && (RELAIS_GetState() == 0))
   {
     RELAIS_SetPuls();
     BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Warnung
-    LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME*5);
-    BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
-    printf("OVP RISING!\n");
-    printf("NEW_STATE: OVP AUTO, Relais off\n");
+    LEDS_GN_Off();
+    LEDS_GN_Blink_Start(LED_GN_ON_TIME_ON_MODE, LED_GN_OFF_TIME);
+    printf("OVP ON!\n");
+    printf("NEW_STATE: OVP_OVP_Auto On, Relais on\n");
+    
+  }
+
+  // Prüfe Wechsel in off mode
+  if (BUTTON_GetMode() == BUTTON_OFF)
+  {
+    //Ausschalten muss immer möglich sein
+    RELAIS_ResetPuls();
+    BUZZER_Beep(BUZZER_ON_TIME_CONFIRM); //Bestätigung
+    LEDS_GN_Off();
+    LEDS_RT_Off();
+    printf("NEW_STATE: OVP_OFF\n");
+    smState = OVP_OFF;
+	//Damit beim drücken auf on erstmal eingeschaltet wird
+	ovpTimeCounter=0;
+	ovpInput = 0;
   }
 
@@ -206,5 +210,5 @@
     LEDS_GN_Off();
     LEDS_RT_Off();
-    printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
+    printf("NEW_STATE: OVP_OFF\n");
     smState = OVP_OFF;
   }
@@ -215,5 +219,5 @@
 {
   int faultInput;
-  
+  int ovpAndOvpInput;
 
   if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
@@ -276,5 +280,5 @@
   {
     case OVP_OFF:
-      OVP_SM_Off();
+     OVP_SM_Off();
     break;
 
Index: trunk/firmware_v2/SES/src/mode_secondaryprotection.c
===================================================================
--- trunk/firmware_v2/SES/src/mode_secondaryprotection.c	(revision 23)
+++ trunk/firmware_v2/SES/src/mode_secondaryprotection.c	(revision 24)
@@ -30,4 +30,5 @@
 #include "buzzer.h"
 #include "voltage_meas.h"
+#include "chip_temperature.h"
 
 
@@ -198,4 +199,16 @@
   }
 
+  if (CHIP_TEMPERATURE_GetTemp() > 80)
+  {
+	RELAIS_ResetPuls();
+	BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
+	LEDS_GN_Off();
+	LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_TEMP, LED_RT_ON_TIME_WARN_TEMP, LED_GN_OFF_TIME, LED_GN_OFF_TIME *5); //Fehler Anzeigen
+	BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
+	printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
+	smState = SECONDARYPROTECTION_ERROR;          
+  }
+
+
 
 }
Index: trunk/firmware_v2/SES/src/mode_secondaryprotection_plus.c
===================================================================
--- trunk/firmware_v2/SES/src/mode_secondaryprotection_plus.c	(revision 23)
+++ trunk/firmware_v2/SES/src/mode_secondaryprotection_plus.c	(revision 24)
@@ -22,4 +22,5 @@
 #include "leds.h"
 #include "buzzer.h"
+#include "chip_temperature.h"
 #include "voltage_meas.h"
 
@@ -190,4 +191,16 @@
     smState = SECONDARYPROTECTION_ERROR;
   }
+
+  if (CHIP_TEMPERATURE_GetTemp() > 80)
+  {
+	RELAIS_ResetPuls();
+	BUZZER_Beep(BUZZER_ON_TIME_REJECT); //Warnung
+	LEDS_GN_Off();
+	LEDS_RT_BlinkCode_Start(BLINK_CODE_ERROR_TEMP, LED_RT_ON_TIME_WARN_TEMP, LED_GN_OFF_TIME, LED_GN_OFF_TIME *5); //Fehler Anzeigen
+	BUTTON_SetModeOff(); //Damit nicht von alleine wieder eingeschaltet wird
+	printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
+	smState = SECONDARYPROTECTION_ERROR;          
+  }
+
 
 
