2008-03-14 Martin Thomas <mthomas@rhrk.uni-kl.de>
[avr_bc100.git] / BaseTinyFirmware / GCC / statefunc.c
index 9df2b5c93ea086c8c0d2611d1f8cec4141e571d5..ef1464dcab714766f0addf4d6fb0261e04cec53b 100644 (file)
@@ -103,7 +103,7 @@ unsigned char Initialize(unsigned char inp)
        // Clear on-chip EEPROM.\r
        for (page = 0; page < 4; page++)        {\r
                for (i = 0; i < 32; i++) {\r
-                  eeprom_write_byte(&BattEEPROM[page][i], 0);\r
+                       eeprom_write_byte(&BattEEPROM[page][i], 0);\r
                }\r
        }\r
 \r
@@ -113,13 +113,16 @@ unsigned char Initialize(unsigned char inp)
        ADC_Init();\r
        Time_Init();\r
 \r
+       // Enable interrupts\r
+       sei();\r
+\r
        // Attempt to get ADC-readings (also gets RID-data) from both batteries.\r
        for (i = 0; i < 2; i++) {\r
                EnableBattery(i);\r
                ADC_Wait();\r
                BatteryStatusRefresh();\r
        }\r
-    \r
+\r
        DisableBatteries();\r
        \r
        BattActive = 0;               // We have to start somewhere..\r
@@ -166,7 +169,7 @@ unsigned char BatteryControl(unsigned char inp)
        // Get ADC-readings, try to read EPROM, and start prequalification\r
        // of any uncharged battery.\r
        for (i = 0; i < 2; i++) {\r
-          if (eeprom_read_byte(&BattControl[i]) & BIT_BATTERY_ENABLED) {      \r
+               if (eeprom_read_byte(&BattControl[i]) & BIT_BATTERY_ENABLED) {\r
                        EnableBattery(i);\r
                        ADC_Wait();\r
 \r
@@ -174,7 +177,7 @@ unsigned char BatteryControl(unsigned char inp)
                                if (!BattData.Charged) {\r
                                        BatteryDataRefresh();\r
 \r
-                                       return(ST_PREQUAL);       \r
+                                       return(ST_PREQUAL);\r
                                }\r
                        }\r
                }\r
@@ -246,7 +249,7 @@ void Doze(void)
        ADCS.Flag = FALSE;\r
        \r
        do {\r
-       } while (ADCS.Flag == FALSE);    \r
+       } while (ADCS.Flag == FALSE);\r
        \r
        WDTCR = (1<<WDP3)|(1<<WDP0);            // 8.0 seconds at 5 volts VCC.\r
        WDTCR |= (1<<WDIF)|(1<<WDIE)|(1<<WDE);  // Clear flag and enable watchdog.\r
@@ -313,7 +316,7 @@ unsigned char Error(unsigned char inp)
 \r
                                case  ERR_NO_BATTERIES_ENABLED:\r
                                        // Clear if any battery gets enabled.\r
-                                  if ((eeprom_read_byte(&BattControl[0]) & BIT_BATTERY_ENABLED) || (eeprom_read_byte(&BattControl[1]) & BIT_BATTERY_ENABLED)) {\r
+                                       if ((eeprom_read_byte(&BattControl[0]) & BIT_BATTERY_ENABLED) || (eeprom_read_byte(&BattControl[1]) & BIT_BATTERY_ENABLED)) {\r
                                                        ErrorFlags &= ~i;\r
                                        }\r
                                break;\r
@@ -378,6 +381,10 @@ void SetErrorFlag(unsigned char Flag)
  */\r
 unsigned char JumperCheck(void)\r
 {\r
+       unsigned char sreg_saved;\r
+       unsigned int adcs_rawVBAT_tmp, adcs_VIN_tmp, adcs_VBAT_tmp;\r
+       signed int adcs_IBAT_tmp;\r
+\r
         DisableBatteries();       // Disconnect, or loads may be destroyed!\r
         \r
         PWM_Start();              // Start PWM (controls the buck charger).\r
@@ -388,14 +395,22 @@ unsigned char JumperCheck(void)
        do {\r
                // If the PWM output voltage saturates the ADC, stop PWM output and\r
                // report a failure.\r
-               if (ADCS.rawVBAT == 1023) {\r
+               sreg_saved = SREG;\r
+               cli();\r
+               adcs_rawVBAT_tmp = ADCS.rawVBAT;\r
+               adcs_VBAT_tmp = ADCS.VBAT;\r
+               adcs_VIN_tmp = ADCS.VIN;\r
+               adcs_IBAT_tmp = ADCS.IBAT;\r
+               SREG = sreg_saved;\r
+\r
+               if (adcs_rawVBAT_tmp == 1023) {\r
                        PWM_Stop();\r
                        return(FALSE);\r
                }\r
 \r
                // If the absolute difference between measured (VIN - VBAT) and the\r
                // typical value are below our set maximum, everything is OK.\r
-               if (abs((signed int)(ADCS.VIN - VIN_VBAT_DIFF_TYP - ADCS.VBAT)) <\r
+               if (abs((signed int)(adcs_VIN_tmp - VIN_VBAT_DIFF_TYP - adcs_VBAT_tmp)) <\r
                                     VIN_VBAT_DIFF_MAX ) {\r
                                 \r
                        PWM_Stop();\r
@@ -403,7 +418,7 @@ unsigned char JumperCheck(void)
                }\r
 \r
                // Charge current is too high -> check load and jumper J405 and J406.\r
-               if (abs(ADCS.IBAT) > 100) {\r
+               if (abs(adcs_IBAT_tmp) > 100) {\r
                        PWM_Stop();\r
                        return(FALSE);\r
                }\r
@@ -415,7 +430,7 @@ unsigned char JumperCheck(void)
                        return(FALSE);\r
                }\r
                \r
-      // Wait for ADC conversions to complete\r
+               // Wait for ADC conversions to complete\r
                ADC_Wait();\r
        } while (Time_Left(TIMER_GEN));\r
        \r