]> www.fi.muni.cz Git - tinyboard.git/blobdiff - projects/step-up/adc.c
Deeper sleep when idle
[tinyboard.git] / projects / step-up / adc.c
index ea309357a429ad988b26960e3e1c381bda7248a9..55cd8610ab441cacc7663ddc8e605dde49869d7c 100644 (file)
@@ -10,8 +10,9 @@
 //#define NUM_ADCS     ZERO_ADC
 #define NUM_ADCS       2
 
-volatile static unsigned char current_adc;;
-volatile unsigned char need_battery_adc;
+volatile static unsigned char current_adc;
+volatile unsigned char adc_enabled;
+volatile unsigned char need_battery_adc, need_pwmled_adc;
 static uint16_t adc_sum, read_zero, drop_count, read_count, n_reads_log;
 volatile uint16_t jiffies;
 
@@ -40,13 +41,23 @@ void start_next_adc()
                drop_count = 1;
                read_count = 1;
                n_reads_log = 0;
-       } else {
+       } else if (need_pwmled_adc) {
                current_adc = 0;
                read_zero = 0;
                drop_count = 1;
                read_count = 1 << PWMLED_ADC_SHIFT;
                n_reads_log = PWMLED_ADC_SHIFT;
+       } else {
+               ADCSRA &= ~_BV(ADEN);
+               power_adc_disable();
+               adc_enabled = 0;
+               return;
+       }
 
+       if (!adc_enabled) {
+               power_adc_enable();
+               ADCSRA |= _BV(ADEN);
+               adc_enabled = 1;
        }
 
        adc_sum = 0;
@@ -95,7 +106,9 @@ static uint16_t read_adc_sync()
 void init_adc()
 {
        need_battery_adc = 0;
+       need_pwmled_adc = 0;
        current_adc = 0;
+       adc_enabled = 1;
 
        power_adc_enable();
        ACSR |= _BV(ACD);       // but disable the analog comparator
@@ -124,6 +137,8 @@ void susp_adc()
 {
        ADCSRA = 0;
        DIDR0 = 0;
+       power_adc_disable();
+       adc_enabled = 0;
 }
 
 ISR(ADC_vect) { // IRQ handler