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