2008-03-14 Martin Thomas <mthomas@rhrk.uni-kl.de>
[avr_bc100.git] / BaseTinyFirmware / GCC / chargefunc.c
index 2194e569b7c462fad247a98abc72922e53cc8e1a..5f441b7f85dbc45970108c8fea68747f367c07ff 100644 (file)
@@ -28,6 +28,7 @@
  ******************************************************************************/\r
 \r
 #include <avr/io.h>\r
+#include <avr/interrupt.h>\r
 \r
 #include "enums.h"\r
 #include "structs.h"\r
@@ -81,9 +82,11 @@ unsigned char ConstantCurrent(void)
 {\r
        unsigned char error = FALSE,\r
                      wasStopped = FALSE;\r
+       unsigned char sreg_saved;\r
+       signed int adcs_avgIBAT_tmp;\r
        \r
        do      {\r
-      // Wait for ADC conversions to complete.\r
+               // Wait for ADC conversions to complete.\r
                ADC_Wait();\r
 \r
                // If Master has flagged for a charge inhibit, pause charging.\r
@@ -100,11 +103,16 @@ unsigned char ConstantCurrent(void)
                                // Timer variables are not reset by this.\r
                                Time_Start();\r
                        }\r
-         \r
+\r
+                       sreg_saved = SREG;\r
+                       cli();\r
+                       adcs_avgIBAT_tmp = ADCS.avgIBAT;\r
+                       SREG = sreg_saved;\r
+\r
                        // Adjust the charge current to within ChargeParameters.Current\r
                        // +/- BAT_CURRENT_HYST.\r
-                       if ((ADCS.avgIBAT < 0) ||\r
-                           (ADCS.avgIBAT < (ChargeParameters.Current - BAT_CURRENT_HYST))) {\r
+                       if ((adcs_avgIBAT_tmp < 0) ||\r
+                           (adcs_avgIBAT_tmp < (ChargeParameters.Current - BAT_CURRENT_HYST))) {\r
                                         \r
                                if(!PWM_IncrementDutyCycle()) {\r
 #ifdef ABORT_IF_PWM_MAX\r
@@ -115,8 +123,8 @@ unsigned char ConstantCurrent(void)
                                        error = TRUE;\r
 #endif\r
                                }\r
-                       } else if ((ADCS.avgIBAT >= 0) &&\r
-                                (ADCS.avgIBAT > (ChargeParameters.Current + BAT_CURRENT_HYST))) {\r
+                       } else if ((adcs_avgIBAT_tmp >= 0) &&\r
+                                (adcs_avgIBAT_tmp > (ChargeParameters.Current + BAT_CURRENT_HYST))) {\r
                                         \r
                                if(!PWM_DecrementDutyCycle()) {\r
 #ifdef ABORT_IF_PWM_MIN\r
@@ -155,6 +163,8 @@ unsigned char ConstantVoltage(void)
 {\r
        unsigned char error = FALSE,\r
                      wasStopped = FALSE;\r
+       unsigned char sreg_saved;\r
+       unsigned int adcs_VBAT_tmp;\r
        \r
        do{\r
                \r
@@ -178,9 +188,14 @@ unsigned char ConstantVoltage(void)
                                Time_Start();\r
                        }\r
                        \r
+                       sreg_saved = SREG;\r
+                       cli();\r
+                       adcs_VBAT_tmp = ADCS.VBAT;\r
+                       SREG = sreg_saved;\r
+\r
                        // Adjust the charge voltage to within ChargeParameters.Voltage\r
                        // +/- BAT_VOLTAGE_HYST.\r
-                       if (ADCS.VBAT < (ChargeParameters.Voltage - BAT_VOLTAGE_HYST)) {\r
+                       if (adcs_VBAT_tmp < (ChargeParameters.Voltage - BAT_VOLTAGE_HYST)) {\r
 \r
                                if(!PWM_IncrementDutyCycle()) {\r
 #ifdef ABORT_IF_PWM_MAX\r
@@ -191,7 +206,7 @@ unsigned char ConstantVoltage(void)
                                        error = TRUE;\r
 #endif\r
                                }\r
-                       } else if (ADCS.VBAT > (ChargeParameters.Voltage + BAT_VOLTAGE_HYST)) {\r
+                       } else if (adcs_VBAT_tmp > (ChargeParameters.Voltage + BAT_VOLTAGE_HYST)) {\r
 \r
                                if(!PWM_DecrementDutyCycle()) {\r
 #ifdef ABORT_IF_PWM_MIN\r
@@ -238,6 +253,9 @@ unsigned char ConstantVoltage(void)
 unsigned char HaltNow(void)\r
 {\r
        unsigned char i, halt = FALSE;\r
+       unsigned int adcs_rawNTC_tmp, adcs_VBAT_tmp;\r
+       signed int adcs_avgIBAT_tmp;\r
+       unsigned char sreg_saved;\r
        \r
        // Wait for a full ADC-cycle to finish.\r
        ADC_Wait();\r
@@ -247,14 +265,20 @@ unsigned char HaltNow(void)
        // (Gets overridden if either mains is failing, or the battery changes.)\r
        for (i = 0x01; i != 0; i <<= 1) {\r
                if (HaltParameters.HaltFlags & i) {\r
+                       \r
+                       sreg_saved = SREG;\r
+                       cli();\r
+                       adcs_VBAT_tmp = ADCS.VBAT;\r
+                       adcs_avgIBAT_tmp  = ADCS.avgIBAT;\r
+                       SREG = sreg_saved;\r
+                       \r
                        switch (i) {\r
                        // Is VBAT less than the recorded maximum?\r
                        case HALT_VOLTAGE_DROP:\r
-\r
                                // Update VBATMax if VBAT is higher. Evaluate for halt otherwise.\r
-                               if (ADCS.VBAT > HaltParameters.VBATMax) {\r
-                                       HaltParameters.VBATMax = ADCS.VBAT;\r
-                               } else if((HaltParameters.VBATMax - ADCS.VBAT) >= \r
+                               if (adcs_VBAT_tmp > HaltParameters.VBATMax) {\r
+                                       HaltParameters.VBATMax = adcs_VBAT_tmp;\r
+                               } else if((HaltParameters.VBATMax - adcs_VBAT_tmp) >= \r
                                          HaltParameters.VoltageDrop) {\r
                                        halt = TRUE;\r
                                }\r
@@ -264,7 +288,7 @@ unsigned char HaltNow(void)
                        // Has VBAT reached the maximum limit?\r
                        case HALT_VOLTAGE_MAX:  \r
                                \r
-                               if (ADCS.VBAT >= HaltParameters.VoltageMax) {\r
+                               if (adcs_VBAT_tmp >= HaltParameters.VoltageMax) {\r
                                        halt = TRUE;\r
                                }\r
                                break;\r
@@ -273,7 +297,7 @@ unsigned char HaltNow(void)
                        // Has IBAT reached the minimum limit?\r
                        case HALT_CURRENT_MIN:\r
                                \r
-                               if (ADCS.avgIBAT <= HaltParameters.CurrentMin) {\r
+                               if (adcs_avgIBAT_tmp <= HaltParameters.CurrentMin) {\r
                                        halt = TRUE;\r
                                }\r
                                break;\r
@@ -281,16 +305,20 @@ unsigned char HaltNow(void)
                                \r
                        // Is the temperature rising too fast?\r
                        case HALT_TEMPERATURE_RISE:\r
-\r
+                               \r
+                               sreg_saved = SREG;\r
+                               cli();\r
+                               adcs_rawNTC_tmp = ADCS.rawNTC;\r
+                               SREG = sreg_saved;\r
                                // If rawNTC has increased, the temperature has dropped.\r
                                // We can store this value for now, and start the timer.\r
                                // Otherwise, check if NTC has changed too fast.\r
-                               if (ADCS.rawNTC > HaltParameters.LastNTC) {\r
-                                       HaltParameters.LastNTC = ADCS.rawNTC;\r
+                               if (adcs_rawNTC_tmp > HaltParameters.LastNTC) {\r
+                                       HaltParameters.LastNTC = adcs_rawNTC_tmp;\r
                                        Time_Set(TIMER_TEMP,0,30,0);\r
                                        \r
                                // Is the increase in temperature greater than the set threshold?\r
-                               } else  if ((HaltParameters.LastNTC - ADCS.rawNTC) >=\r
+                               } else  if ((HaltParameters.LastNTC - adcs_rawNTC_tmp) >=\r
                                  (BattData.ADCSteps * HaltParameters.TemperatureRise)) {\r
                                        \r
                                        // If this happened within a timeframe of 30 seconds, the \r
@@ -299,7 +327,7 @@ unsigned char HaltNow(void)
                                        if (Time_Left(TIMER_TEMP))  {\r
                                                halt = TRUE;\r
                                        } else {\r
-                                               HaltParameters.LastNTC = ADCS.rawNTC;\r
+                                               HaltParameters.LastNTC = adcs_rawNTC_tmp;\r
                                                Time_Set(TIMER_TEMP,0,30,0);\r
                                        }\r
                                }\r
@@ -317,8 +345,8 @@ unsigned char HaltNow(void)
                                        if (HaltParameters.HaltFlags & HALT_FLAG_EXHAUSTION) {\r
                                                        PWM_Stop();\r
                                                        Battery_t tmp = eeprom_read_byte(&BattControl[BattActive]);\r
-                                                        tmp &= ~BIT_BATTERY_ENABLED; // Enabled = FALSE;\r
-                                                        eeprom_write_byte(&BattControl[BattActive], tmp);\r
+                                                                                        tmp &= ~BIT_BATTERY_ENABLED; // Enabled = FALSE;\r
+                                                                                        eeprom_write_byte(&BattControl[BattActive], tmp);\r
                                                        BattData.Exhausted = TRUE;\r
                                                        SetErrorFlag(ERR_BATTERY_EXHAUSTED);\r
                                                        ChargeParameters.NextState = ST_ERROR;\r