WDT-based timing instead of ADC-based
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Fri, 10 May 2013 14:58:03 +0000 (16:58 +0200)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Fri, 10 May 2013 14:58:03 +0000 (16:58 +0200)
This will allow us to use power-down sleep when neither ADC nor PWM
is used.

projects/step-up/adc.c
projects/step-up/buttons.c
projects/step-up/lights.h
projects/step-up/main.c
projects/step-up/wdt.c

index 326588a..ea30935 100644 (file)
@@ -11,7 +11,7 @@
 #define NUM_ADCS       2
 
 volatile static unsigned char current_adc;;
-static unsigned char need_battery_adc;
+volatile unsigned char need_battery_adc;
 static uint16_t adc_sum, read_zero, drop_count, read_count, n_reads_log;
 volatile uint16_t jiffies;
 
@@ -126,30 +126,9 @@ void susp_adc()
        DIDR0 = 0;
 }
 
-static void inline adc_based_timer()
-{
-       static unsigned char count;
-
-       if (++count < 40) // about 100 Hz jiffies
-               return;
-
-       count = 0;
-       ++jiffies;
-
-       if ((jiffies & 0x007F) == 1) { // about every 1s
-               need_battery_adc = 1;
-       }
-       if ((jiffies & 0x0007) == 0) {
-               patterns_next_tick();
-       }
-       timer_check_buttons();
-}
-
 ISR(ADC_vect) { // IRQ handler
        uint16_t adcval = ADCW;
 
-       adc_based_timer();
-
        if (read_zero) {
                setup_mux(current_adc);
                read_zero = 0;
index b03a816..a253797 100644 (file)
@@ -7,9 +7,9 @@
 #include "lights.h"
 
 #define WAKEUP_LIMIT   5       // times 100 ms
-#define SHORT_PRESS_MIN        10      // in jiffies (100 Hz ticks)
-#define SHORT_PRESS_MAX 50
-#define LONG_PRESS_MIN 100
+#define SHORT_PRESS_MIN        2       // in jiffies (16 Hz ticks)
+#define SHORT_PRESS_MAX 5
+#define LONG_PRESS_MIN 10
 static uint16_t button_start;
 static unsigned char prev_state;
 
@@ -67,7 +67,7 @@ void timer_check_buttons()
        } else if (!cur && prev) {            // --- just released ---
                uint16_t duration = jiffies - button_start;
 
-               if (duration > SHORT_PRESS_MIN && duration < SHORT_PRESS_MAX) {
+               if (duration >= SHORT_PRESS_MIN && duration < SHORT_PRESS_MAX) {
                        short_press();
                } else if (duration > LONG_PRESS_MIN) {
                        // set_status_led(button, NULL);
index 6318c56..6cf5a30 100644 (file)
@@ -20,7 +20,7 @@ void inline log_word(uint16_t word) { }
 
 /* adc.c */
 #define PWMLED_ADC_SHIFT 1 /* 1<<1 measurements per single callback */
-extern volatile uint16_t jiffies;
+extern volatile unsigned char need_battery_adc;
 void init_adc();
 void susp_adc();
 
@@ -76,6 +76,7 @@ pattern_t *status_led_pattern_select();
 void set_error(unsigned char err);
 
 /* wdt.c */
+extern volatile uint16_t jiffies;
 void init_wdt();
 void susp_wdt();
 
index 1ac5403..e514102 100644 (file)
@@ -71,7 +71,6 @@ int main(void)
        sei();
 #if 1
        while (1) {
-               wdt_reset();
                sleep_mode();
        }
 #endif
index 050c0c5..9cfa08e 100644 (file)
@@ -6,7 +6,8 @@
 
 void init_wdt()
 {
-       wdt_enable(WDTO_1S);
+       wdt_enable(WDTO_60MS);
+       WDTCR |= _BV(WDIE);
 }
 
 void susp_wdt()
@@ -14,3 +15,13 @@ void susp_wdt()
        wdt_disable();
 }
 
+ISR(WDT_vect) {
+       ++jiffies;
+
+       if (jiffies & 0x000F) {
+               need_battery_adc = 1; // about every 1s
+       }
+
+       patterns_next_tick();
+       timer_check_buttons();
+}