Fix ADC index overflow

Use bitmap bitcount to map pin number to adc_values array  index. Old
code fails for TEMP_AMBIENT_PIN and VOLT_BED_PIN
This commit is contained in:
Petr Ledvina 2018-07-17 17:10:07 +02:00
parent 3f92630fd1
commit fd332c1ff1
2 changed files with 17 additions and 6 deletions

View file

@ -10,6 +10,17 @@
extern "C" { extern "C" {
#endif //defined(__cplusplus) #endif //defined(__cplusplus)
/*
http://resnet.uoregon.edu/~gurney_j/jmpc/bitwise.html
*/
#define BITCOUNT(x) (((BX_(x)+(BX_(x)>>4)) & 0x0F0F0F0F) % 255)
#define BX_(x) ((x) - (((x)>>1)&0x77777777) - (((x)>>2)&0x33333333) - (((x)>>3)&0x11111111))
#define ADC_PIN_IDX(pin) BITCOUNT(ADC_CHAN_MSK & ((1 << (pin)) - 1))
#if BITCOUNT(ADC_CHAN_MSK) != ADC_CHAN_CNT
# error "ADC_CHAN_MSK oes not match ADC_CHAN_CNT"
#endif
extern uint8_t adc_state; extern uint8_t adc_state;
extern uint8_t adc_count; extern uint8_t adc_count;

View file

@ -1538,17 +1538,17 @@ extern "C" {
void adc_ready(void) //callback from adc when sampling finished void adc_ready(void) //callback from adc when sampling finished
{ {
current_temperature_raw[0] = adc_values[TEMP_0_PIN]; //heater current_temperature_raw[0] = adc_values[ADC_PIN_IDX(TEMP_0_PIN)]; //heater
current_temperature_raw_pinda = adc_values[TEMP_PINDA_PIN]; current_temperature_raw_pinda = adc_values[ADC_PIN_IDX(TEMP_PINDA_PIN)];
current_temperature_bed_raw = adc_values[TEMP_BED_PIN]; current_temperature_bed_raw = adc_values[ADC_PIN_IDX(TEMP_BED_PIN)];
#ifdef VOLT_PWR_PIN #ifdef VOLT_PWR_PIN
current_voltage_raw_pwr = adc_values[VOLT_PWR_PIN]; current_voltage_raw_pwr = adc_values[ADC_PIN_IDX(VOLT_PWR_PIN)];
#endif #endif
#ifdef AMBIENT_THERMISTOR #ifdef AMBIENT_THERMISTOR
current_temperature_raw_ambient = adc_values[TEMP_AMBIENT_PIN]; current_temperature_raw_ambient = adc_values[ADC_PIN_IDX(TEMP_AMBIENT_PIN)];
#endif //AMBIENT_THERMISTOR #endif //AMBIENT_THERMISTOR
#ifdef VOLT_BED_PIN #ifdef VOLT_BED_PIN
current_voltage_raw_bed = adc_values[VOLT_BED_PIN]; // 6->9 current_voltage_raw_bed = adc_values[ADC_PIN_IDX(VOLT_BED_PIN)]; // 6->9
#endif #endif
temp_meas_ready = true; temp_meas_ready = true;
} }