X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=bike-lights.git;a=blobdiff_plain;f=firmware%2Fadc.c;h=ef714777011f1af24d171bb44cdd0d6461ac6b0e;hp=f55a42792570670e464c1e66d035b809b6ecc298;hb=c30006aaf666f7cff3a6ab949c613c2f8cc6163b;hpb=6193f6a3200efa660bbbe406e317fe7fa0473de0 diff --git a/firmware/adc.c b/firmware/adc.c index f55a427..ef71477 100644 --- a/firmware/adc.c +++ b/firmware/adc.c @@ -19,13 +19,13 @@ struct { { 0, 1, PWMLED_ADC_SHIFT }, // pwmled 1 { 0, 1, PWMLED_ADC_SHIFT }, // pwmled 2 { 0, 1, PWMLED_ADC_SHIFT }, // pwmled 3 - { 0, 1, 3 }, // ambient + { 0, 1, AMBIENT_ADC_SHIFT }, // ambient { 0, 1, 0 }, // battery { 0, 1, 0 }, // gain20 { 0, 1, 0 }, // buttons }; -volatile static unsigned char current_adc; +volatile static unsigned char current_adc, current_slow_adc; 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; @@ -65,14 +65,26 @@ static void setup_mux(unsigned char n) static void start_next_adc() { - if (current_adc > 0) { - current_adc--; + if (current_adc == 0) { + if (current_slow_adc > N_PWMLEDS) { + // read one of the non-PWMLED ADCs + current_adc = --current_slow_adc; + } else { + // no more non-PWMLEDs to do, start with PWMLEDs + current_adc = N_PWMLEDS-1; + } + } else if (current_adc >= N_PWMLEDS) { + // one of the non-PWMLED ADCs just finished, skip to PWMLEDs. + current_adc = N_PWMLEDS-1; } else { - // TODO: kick the watchdog here. - current_adc = NUM_ADCS; - return; + // next PWMLED + current_adc--; } +#if 0 + log_byte(0x90 + current_adc); // debug ADC switching +#endif + adc_sum = 0; // we use the last iteration of zero_count to set up the MUX // to its final destination, hence the "1 +" below: @@ -98,12 +110,14 @@ static void start_next_adc() ADCSRA |= _BV(ADSC); } -void timer_start_adcs() +void timer_start_slow_adcs() { - if (current_adc == NUM_ADCS) // Don't start if in progress - start_next_adc(); - else - log_byte(0x99); // overrun + if (current_slow_adc > N_PWMLEDS) { // Don't start if in progress + log_byte(0x80 + current_slow_adc); + } else { + current_slow_adc = NUM_ADCS; + // TODO: kick the watchdog here + } } /* @@ -129,7 +143,8 @@ static uint16_t read_adc_sync() void init_adc() { unsigned char i; - current_adc = NUM_ADCS; + current_slow_adc = NUM_ADCS; + current_adc = 0; ADCSRA = _BV(ADEN) // enable | _BV(ADPS1) | _BV(ADPS0) // CLK/8 = 125 kHz