Index: trunk/firmware_v2/Core/Src/adc.c
===================================================================
--- trunk/firmware_v2/Core/Src/adc.c	(revision 28)
+++ trunk/firmware_v2/Core/Src/adc.c	(revision 29)
@@ -67,5 +67,5 @@
   if (HAL_ADC_Init(&hadc1) != HAL_OK)
   {
-    Error_Handler();
+	  Error_Handler();
   }
 
Index: trunk/firmware_v2/SES/PowerPro.emProject
===================================================================
--- trunk/firmware_v2/SES/PowerPro.emProject	(revision 28)
+++ trunk/firmware_v2/SES/PowerPro.emProject	(revision 29)
@@ -57,5 +57,6 @@
     <configuration
       Name="Debug_24V"
-      c_preprocessor_definitions="SYSTEM_VOLTAGE_24V" />
+      c_preprocessor_definitions="SYSTEM_VOLTAGE_24V"
+      gcc_optimization_level="Debug" />
     <configuration
       Name="Debug_48V"
Index: trunk/firmware_v2/SES/inc/button.h
===================================================================
--- trunk/firmware_v2/SES/inc/button.h	(revision 28)
+++ trunk/firmware_v2/SES/inc/button.h	(revision 29)
@@ -16,4 +16,5 @@
 button_state_t BUTTON_GetMode(void);
 void BUTTON_SetModeOff(void);
+void BUTTON_SetModeAuto(void);
 
 #endif
Index: trunk/firmware_v2/SES/inc/mode_secondaryprotection.h
===================================================================
--- trunk/firmware_v2/SES/inc/mode_secondaryprotection.h	(revision 28)
+++ trunk/firmware_v2/SES/inc/mode_secondaryprotection.h	(revision 29)
@@ -2,5 +2,5 @@
 #define __MODE_SECONDARYPROTECTION_H
 
-void MODE_SECONDARYPROTECTION_Exec(void);
+void MODE_SECONDARYPROTECTION_Exec(int am);
 
 
Index: trunk/firmware_v2/SES/inc/mode_secondaryprotection_plus.h
===================================================================
--- trunk/firmware_v2/SES/inc/mode_secondaryprotection_plus.h	(revision 28)
+++ trunk/firmware_v2/SES/inc/mode_secondaryprotection_plus.h	(revision 29)
@@ -2,5 +2,5 @@
 #define __MODE_SECONDARYPROTECTION_PLUS_H
 
-void MODE_SECONDARYPROTECTION_PLUS_Exec(void);
+void MODE_SECONDARYPROTECTION_PLUS_Exec(int am);
 
 
Index: trunk/firmware_v2/SES/inc/modeswitch.h
===================================================================
--- trunk/firmware_v2/SES/inc/modeswitch.h	(revision 28)
+++ trunk/firmware_v2/SES/inc/modeswitch.h	(revision 29)
@@ -8,9 +8,11 @@
 {
   MODE_MAINSWITCH = 0, 
-  MODE_MAINSWITCH_SECONDARYPROTECTION,
-  MODE_MAINSWITCH_SECONDARYPROTECTION_PLUS,
-  MODE_MAINSWITCH_LVP_OVP,
-  MODE_MAINSWITCH_LVP, 
-  MODE_MAINSWITCH_OVP,
+  MODE_MAINSWITCH_SECONDARYPROTECTION = 1,
+  MODE_MAINSWITCH_SECONDARYPROTECTION_PLUS = 2,
+  MODE_MAINSWITCH_SECONDARYPROTECTION_AUTO_RETRY = 3,
+  MODE_MAINSWITCH_SECONDARYPROTECTION_PLUS_AUTO_RETRY = 4,
+  MODE_MAINSWITCH_LVP_OVP = 5,
+  MODE_MAINSWITCH_LVP = 6, 
+  MODE_MAINSWITCH_OVP = 7,
   
 } MODESWITCH_mode_t;
Index: trunk/firmware_v2/SES/src/button.c
===================================================================
--- trunk/firmware_v2/SES/src/button.c	(revision 28)
+++ trunk/firmware_v2/SES/src/button.c	(revision 29)
@@ -83,2 +83,7 @@
   buttonState = BUTTON_OFF;
 }
+
+void BUTTON_SetModeAuto(void)
+{
+  buttonState = BUTTON_AUTO;
+}
Index: trunk/firmware_v2/SES/src/main.c
===================================================================
--- trunk/firmware_v2/SES/src/main.c	(revision 28)
+++ trunk/firmware_v2/SES/src/main.c	(revision 29)
@@ -216,20 +216,28 @@
 
       case MODE_MAINSWITCH_SECONDARYPROTECTION://1
-        MODE_SECONDARYPROTECTION_Exec();
+        MODE_SECONDARYPROTECTION_Exec(0);
       break;
 
       case MODE_MAINSWITCH_SECONDARYPROTECTION_PLUS://2
-        MODE_SECONDARYPROTECTION_PLUS_Exec();
-      break;
-
-	  case MODE_MAINSWITCH_LVP_OVP://3
+        MODE_SECONDARYPROTECTION_PLUS_Exec(0);
+      break;
+
+      case MODE_MAINSWITCH_SECONDARYPROTECTION_AUTO_RETRY://3
+        MODE_SECONDARYPROTECTION_Exec(1);
+      break;
+
+      case MODE_MAINSWITCH_SECONDARYPROTECTION_PLUS_AUTO_RETRY://4
+        MODE_SECONDARYPROTECTION_PLUS_Exec(1);
+      break;
+
+	  case MODE_MAINSWITCH_LVP_OVP://5
         MODE_LVP_OVP_Exec();
       break;
 
-      case MODE_MAINSWITCH_LVP://4
+      case MODE_MAINSWITCH_LVP://6
         MODE_LVP_Exec();
       break;
 
-      case MODE_MAINSWITCH_OVP://5
+      case MODE_MAINSWITCH_OVP://7
         MODE_OVP_Exec();
       break;
Index: trunk/firmware_v2/SES/src/mode_secondaryprotection.c
===================================================================
--- trunk/firmware_v2/SES/src/mode_secondaryprotection.c	(revision 28)
+++ trunk/firmware_v2/SES/src/mode_secondaryprotection.c	(revision 29)
@@ -41,6 +41,17 @@
 } SECONDARYPROTECTION_state_t;
 
+typedef enum SECONDARYPROTECTION_ErrorState_enum 
+{
+  ERROR_NONE,
+  ERROR_EXTERNAL_FAULT, //z.B Kurzschluss
+  ERROR_TEMPERATURE,
+  ERROR_VOLTAGE_DROP,
+  ERROR_LVP_AND_OVP,	  //z.B. kritische Überspannung, tiefeEntladung
+} SECONDARYPROTECTION_ErrorState_t;
+
 
 static SECONDARYPROTECTION_state_t smState;
+static SECONDARYPROTECTION_ErrorState_t smError;
+static int autoRetryMode;
 
 
@@ -79,4 +90,5 @@
       printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
       smState = SECONDARYPROTECTION_ON;
+	  smError = ERROR_NONE;
 
     }
@@ -90,4 +102,5 @@
       printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
       smState =SECONDARYPROTECTION_ERROR;
+	  smError = ERROR_EXTERNAL_FAULT;
     }
   }
@@ -105,4 +118,5 @@
       printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
       smState = SECONDARYPROTECTION_MANUAL_ON;
+	  smError = ERROR_NONE;
   }
 
@@ -120,10 +134,14 @@
   if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
   {    
-	HAL_Delay(1); // Verzögerung 1ms damit eventuell noch zuerst durch smartPro der Strom gestoppt werden kann
-	if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
-	{
 	  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 = SECONDARYPROTECTION_ERROR;
+	  smError = ERROR_EXTERNAL_FAULT;
   }
   else
@@ -176,7 +194,53 @@
 	  printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
 	  smState = SECONDARYPROTECTION_ERROR;  
+	  smError = ERROR_VOLTAGE_DROP;
 	  VOLTAGE_MEAS_ResetCounter(); // Damit Fehlerzähler bei Neustart auf 0
   }
 
+
+
+  if (lvpAndOvpInput == 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
+    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");
+    smState = SECONDARYPROTECTION_ERROR;
+	smError = ERROR_LVP_AND_OVP;
+  }
+
+  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;          
+	smError = ERROR_TEMPERATURE;
+  }
+
+
+
+}
+
+static void SECONDARYPROTECTION_SM_ManualOn(void)
+{
+
+  int faultInput = 0;
+
+
+  if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
+  {    
+	  faultInput = 1;
+  }
+  else
+  {
+    faultInput = 0;
+  }
 
   if (faultInput == 1)
@@ -190,63 +254,5 @@
     printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
     smState = SECONDARYPROTECTION_ERROR;
-  }
-
-  if (lvpAndOvpInput == 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
-    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");
-    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;          
-  }
-
-
-
-}
-
-static void SECONDARYPROTECTION_SM_ManualOn(void)
-{
-
-  int faultInput = 0;
-
-
-  if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
-  {    
-	HAL_Delay(500); // Verzögerung 500ms damit eventuell noch zuerst durch smartPro der Strom gestoppt werden kann
-	if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
-	{
-	  faultInput = 1;
-	}
-
-  }
-  else
-  {
-    faultInput = 0;
-  }
-
-  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 = SECONDARYPROTECTION_ERROR;
+	smError = ERROR_EXTERNAL_FAULT;
   }
 
@@ -262,4 +268,5 @@
     printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
     smState = SECONDARYPROTECTION_OFF;
+	smError = ERROR_NONE;
   }
 
@@ -270,4 +277,6 @@
   int faultInput;
   int lvpAndOvpInput;
+  static uint32_t retry_counter = 0;
+  static uint32_t oldTimeMSTick;
 
   if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
@@ -293,4 +302,5 @@
       printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
       smState = SECONDARYPROTECTION_ON;
+	  smError = ERROR_NONE;
     }
     else
@@ -314,16 +324,30 @@
       printf("NEW_STATE: SECONDARYPROTECTION_MANUAL_ON\n");
       smState = SECONDARYPROTECTION_MANUAL_ON;
-  }
-
-
-
-}
-
-
-
-void MODE_SECONDARYPROTECTION_Exec(void)
-{
-
-  
+	  smError = ERROR_NONE;
+  }
+
+
+  if (autoRetryMode == 1) {
+
+    if (oldTimeMSTick != HAL_GetTick())
+    {
+  	oldTimeMSTick = HAL_GetTick();
+  	retry_counter++;
+    }
+
+    if  (retry_counter > 3600000)  // 10 Minuten * 60 * 1000 = 600000 || 60 * 60 * 1000 =3600000
+    {
+  	BUTTON_SetModeAuto();
+  	retry_counter=0;
+    }
+  }
+}
+
+
+
+void MODE_SECONDARYPROTECTION_Exec(int am)
+{
+
+	autoRetryMode = am;
 
   switch (smState)
Index: trunk/firmware_v2/SES/src/mode_secondaryprotection_plus.c
===================================================================
--- trunk/firmware_v2/SES/src/mode_secondaryprotection_plus.c	(revision 28)
+++ trunk/firmware_v2/SES/src/mode_secondaryprotection_plus.c	(revision 29)
@@ -35,7 +35,17 @@
 } SECONDARYPROTECTION_state_t;
 
+typedef enum SECONDARYPROTECTION_ErrorState_enum 
+{
+  ERROR_NONE,
+  ERROR_EXTERNAL_FAULT, //z.B Kurzschluss
+  ERROR_TEMPERATURE,
+  ERROR_VOLTAGE_DROP,
+  ERROR_LVP_AND_OVP,	  //z.B. kritische Überspannung, tiefeEntladung
+} SECONDARYPROTECTION_ErrorState_t;
+
 
 static SECONDARYPROTECTION_state_t smState;
-
+static SECONDARYPROTECTION_ErrorState_t smError = ERROR_NONE;
+static int autoRetryMode;
 
 static void SECONDARYPROTECTION_SM_Off(void)
@@ -73,4 +83,5 @@
       printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
       smState = SECONDARYPROTECTION_ON;
+	  smError = ERROR_NONE;
 
     }
@@ -83,5 +94,7 @@
 	  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");
-      smState =SECONDARYPROTECTION_ERROR;
+      smState = SECONDARYPROTECTION_ERROR;
+	  smError = ERROR_EXTERNAL_FAULT;
+	
     }
   }
@@ -121,4 +134,21 @@
   }
   
+
+  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 = SECONDARYPROTECTION_ERROR;
+	smError = ERROR_EXTERNAL_FAULT;
+	return;
+  }
+
+
+
   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))
   {
@@ -152,4 +182,5 @@
     printf("NEW_STATE: SECONDARYPROTECTION_OFF\n");
     smState = SECONDARYPROTECTION_OFF;
+	smError = ERROR_NONE;
   }
 
@@ -165,19 +196,9 @@
 	  printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
 	  smState = SECONDARYPROTECTION_ERROR;  
+	  smError = ERROR_VOLTAGE_DROP;
 	  VOLTAGE_MEAS_ResetCounter(); // Damit Fehlerzähler bei Neustart auf 0
   }
 
 
-  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 = SECONDARYPROTECTION_ERROR;
-  }
 
   if (lvpAndOvpInput == 1)
@@ -191,4 +212,5 @@
     printf("NEW_STATE: SECONDARYPROTECTION_ERROR\n");
     smState = SECONDARYPROTECTION_ERROR;
+	smError = ERROR_LVP_AND_OVP;
   }
 
@@ -202,4 +224,5 @@
 	printf("NEW_STATE: MAINSWITCH_ERROR, Temp too high\n");
 	smState = SECONDARYPROTECTION_ERROR;          
+	smError = ERROR_TEMPERATURE;
   }
 
@@ -228,4 +251,6 @@
   int faultInput;
   int lvpAndOvpInput;
+  static uint32_t retry_counter = 0;
+  static uint32_t oldTimeMSTick;
 
   if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)       
@@ -241,8 +266,9 @@
 
   //Prüfe auf Wechsel des Modus AUTO / SM ON
-  if (BUTTON_GetMode() == BUTTON_AUTO)
+  if (BUTTON_GetMode() == BUTTON_AUTO) 
   {
     if (faultInput == 0) 
     {
+	  retry_counter = 0;
       RELAIS_SetPuls();
       BUZZER_Beep(BUZZER_ON_TIME_CONFIRM);
@@ -251,4 +277,5 @@
       printf("NEW_STATE: SECONDARYPROTECTION_ON\n");
       smState = SECONDARYPROTECTION_ON;
+	  smError = ERROR_NONE;
     }
     else
@@ -260,4 +287,18 @@
   }
 
+  if (autoRetryMode == 1) {
+
+    if (oldTimeMSTick != HAL_GetTick())
+    {
+  	oldTimeMSTick = HAL_GetTick();
+  	retry_counter++;
+    }
+
+    if  (retry_counter > 3600000)  // jede stunde
+    {
+  	BUTTON_SetModeAuto();
+  	retry_counter = 0;
+    }
+  }
   //Prüfe auf Wechsel in MANUAL ON Mode
   //Keine Fehlerüberprüfungen. In diesem Modus werdem alle Alarme ignoriert.
@@ -280,8 +321,8 @@
 
 
-void MODE_SECONDARYPROTECTION_PLUS_Exec(void)
-{
-
-  
+void MODE_SECONDARYPROTECTION_PLUS_Exec(int am)
+{
+
+  	autoRetryMode = am;
 
   switch (smState)
Index: trunk/firmware_v2/SES/src/modeswitch.c
===================================================================
--- trunk/firmware_v2/SES/src/modeswitch.c	(revision 28)
+++ trunk/firmware_v2/SES/src/modeswitch.c	(revision 29)
@@ -4,5 +4,5 @@
 
 
-MODESWITCH_mode_t mode;
+static MODESWITCH_mode_t mode;
 
 MODESWITCH_mode_t MODESWITCH_ReadMode(void)
