+static uint16_t adc_sum, zero_count, drop_count, read_count, n_reads_log;
+#define ADC1_GAIN20_OFFSET_SHIFT 6
+static uint16_t adc1_gain20_offset;
+
+
+static void setup_mux(unsigned char n)
+{
+ /* ADC numbering: PWM LEDs first, then others, zero at the end */
+ switch (n) {
+ case 0: // pwmled 1: 1.1V, ADC0,1 (PA0,1), gain 20
+ ADMUX = _BV(REFS1) | _BV(MUX3) | _BV(MUX1) | _BV(MUX0);
+ break;
+ case 1: // pwmled 2: 1.1V, ADC2,1 (PA2,1), gain 20
+ ADMUX = _BV(REFS1) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
+ break;
+ case 2: // pwmled 3: 1.1V, ADC4 (PA5), single-ended
+ ADMUX = _BV(REFS1) | _BV(MUX2);
+ break;
+ case AMBIENT_ADC: // ambient light: 1.1V, ADC5 (PA6), single-ended
+ ADMUX = _BV(REFS1) | _BV(MUX2) | _BV(MUX0);
+ break;
+ case BATTERY_ADC: // batt voltage: 1.1V, ADC6 (PA7), single-ended
+ ADMUX = _BV(REFS1) | _BV(MUX2) | _BV(MUX1);
+ break;
+ case ADC1_GAIN20: // gain stage offset: 1.1V, ADC1,1, gain 20
+ ADMUX = _BV(REFS1) | _BV(MUX3) | _BV(MUX2) | _BV(MUX0);
+ break;
+ case BUTTON_ADC: // buttons: 1.1V, ADC3, single-ended
+ PORTA |= _BV(PA3); // +5V to the voltage splitter
+ ADMUX = _BV(REFS1) | _BV(MUX1) | _BV(MUX0);
+ break;
+ case ZERO_ADC: // zero: 1.1V, ADC1 (PA1), single-ended
+ ADMUX = _BV(REFS1) | _BV(MUX0);
+ break;
+ }
+}