// 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
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
// 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
if (!BattData.Charged) {\r
BatteryDataRefresh();\r
\r
- return(ST_PREQUAL); \r
+ return(ST_PREQUAL);\r
}\r
}\r
}\r
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
\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
*/\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
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
}\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
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