X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=firmware%2Fadc.c;h=123dddd4dee4f319c5f536ccd3a5e817ed77c433;hb=47e678a90062fa2dbc6cb8f9e5efc81072f5dcc5;hp=dc35d6b8e8b56681c608cd128178f26323e3b5f8;hpb=c93c2e8aa2dde30ae4f1fb65a02b42677e70babe;p=bike-lights.git diff --git a/firmware/adc.c b/firmware/adc.c index dc35d6b..123dddd 100644 --- a/firmware/adc.c +++ b/firmware/adc.c @@ -5,16 +5,16 @@ /* ADC numbering: PWM LEDs first, then ambient light sensor, battery sensor */ static unsigned char adc_mux[] = { // pwmleds should be first - // 0: pwmled 0: 1.1V, ADC3 (PA4), single-ended - _BV(REFS1) | _BV(MUX1) | _BV(MUX0), - // 1: pwmled 1: 1.1V, ADC0,1 (PA0,1), gain 1 or 8 - _BV(REFS1) | _BV(MUX3) | _BV(MUX2), - // 2: pwmled 2: 1.1V, ADC2,1 (PA2,1), gain 20 or 32 + // 0: pwmled 1: 1.1V, ADC0,1 (PA0,1), gain 20 + _BV(REFS1) | _BV(MUX3) | _BV(MUX1) | _BV(MUX0), + // 1: pwmled 2: 1.1V, ADC2,1 (PA2,1), gain 20 _BV(REFS1) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1), - // 3: ambient light: 1.1V, ADC4 (PA5), single-ended + // 2: pwmled 3: 1.1V, ADC4 (PA5), single-ended _BV(REFS1) | _BV(MUX2), - // 4: batt voltage: 1.1V, ADC5 (PA6), single-ended + // 3: ambient light: 1.1V, ADC5 (PA6), single-ended _BV(REFS1) | _BV(MUX2) | _BV(MUX0), + // 4: batt voltage: 1.1V, ADC6 (PA7), single-ended + _BV(REFS1) | _BV(MUX2) | _BV(MUX1), }; #define AMBIENT_ADC N_PWMLEDS @@ -39,9 +39,9 @@ static void start_next_adc() // all ADCs have been handled current_adc = LAST_ADC; + // TODO: kick the watchdog here. return; found: - // ADCSRB |= _BV(GSEL); // gain 8 or 32 ADMUX = adc_mux[current_adc]; // set up mux, start one-shot conversion adc_ignore = 1; // ignore first reading after mux change ADCSRA |= _BV(ADSC); @@ -56,11 +56,11 @@ void init_adc() | _BV(ADPS1) | _BV(ADPS0) // CLK/8 = 125 kHz // | _BV(ADPS2) // CLK/16 = 62.5 kHz ; - ADCSRB |= _BV(GSEL); // gain 8 or 32 + // ADCSRB |= _BV(GSEL); // gain 8 or 32 // Disable digital input on all bits used by ADC - DIDR0 = _BV(ADC0D) | _BV(ADC1D) | _BV(ADC2D) | _BV(ADC3D) - | _BV(ADC4D) | _BV(ADC5D); + DIDR0 = _BV(ADC0D) | _BV(ADC1D) | _BV(ADC2D) + | _BV(ADC4D) | _BV(ADC5D) | _BV(ADC6D); ADCSRA |= _BV(ADSC); @@ -72,6 +72,12 @@ void init_adc() ADCSRA |= _BV(ADIE); // enable IRQ } +void susp_adc() +{ + ADCSRA = 0; + DIDR0 = 0; +} + ISR(ADC_vect) { // IRQ handler uint16_t adcval = ADCW; @@ -91,7 +97,8 @@ ISR(ADC_vect) { // IRQ handler pwmled_adc(current_adc, adcval); if (current_adc == AMBIENT_ADC) ambient_adc(adcval); - // TODO battery sense, etc. + if (current_adc == BATTERY_ADC) + battery_adc(adcval); start_next_adc(); }