From 90ffd122f4387d18e8d7cf7d2a507c719409d4e5 Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Tue, 21 May 2013 00:34:06 +0200 Subject: [PATCH] Watchdog-based timing TODO: remove the sub-LSB PWM scaling, add deeper sleep states. --- firmware/buttons.c | 10 +++++++--- firmware/main.c | 6 ------ firmware/tmr.c | 31 ++++++++----------------------- 3 files changed, 15 insertions(+), 32 deletions(-) diff --git a/firmware/buttons.c b/firmware/buttons.c index 017a56c..80ecce6 100644 --- a/firmware/buttons.c +++ b/firmware/buttons.c @@ -7,6 +7,10 @@ #include "lights.h" #define WAKEUP_LIMIT 5 // times 100 ms +#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[3]; union { unsigned char all; @@ -166,16 +170,16 @@ static void handle_button(unsigned char button, unsigned char cur, } else if (cur && prev) { // --- is still pressed --- uint16_t duration = jiffies - button_start[button]; - if (duration > 160) { + if (duration >= LONG_PRESS_MIN) { set_status_led(button, on1_pattern); // acknowledge long press } } else if (!cur && prev) { // --- just released --- uint16_t duration = jiffies - button_start[button]; - if (duration > 6 && duration < 60) { + if (duration >= SHORT_PRESS_MIN && duration < SHORT_PRESS_MAX) { short_press(button); - } else if (duration > 160) { + } else if (duration > LONG_PRESS_MIN) { set_status_led(button, NULL); long_press(button); } diff --git a/firmware/main.c b/firmware/main.c index 393f47d..0e33957 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -3,14 +3,11 @@ #include #include #include -#include #include "lights.h" static void hw_setup() { - wdt_enable(WDTO_1S); - init_battery(); init_pwm(); init_adc(); @@ -34,8 +31,6 @@ static void hw_suspend() susp_gpio(); susp_ambient(); susp_buttons(); - - wdt_disable(); } void power_down() @@ -76,7 +71,6 @@ int main(void) sei(); #if 1 while (1) { - wdt_reset(); sleep_mode(); } #endif diff --git a/firmware/tmr.c b/firmware/tmr.c index d53981a..d1f1b23 100644 --- a/firmware/tmr.c +++ b/firmware/tmr.c @@ -1,44 +1,29 @@ #include #include +#include #include "lights.h" volatile uint16_t jiffies; -#define PATTERN_DIV 10 // clk/10 -static unsigned char pattern_div; void init_tmr() { - TCCR0A = _BV(WGM00); - TCCR0B = _BV(CS02) | _BV(CS00); // CLK/1024 = 1 kHz - OCR0A = 5; // 200 Hz - TIMSK |= _BV(OCIE0A); - - jiffies = 0; - pattern_div = PATTERN_DIV; + WDTCR = _BV(WDIE) | _BV(WDP1); // interrupt mode, 64 ms } void susp_tmr() { - TCCR0A = TCCR0B = 0; - TIMSK &= ~_BV(OCIE0A); - TIFR = 0; + wdt_disable(); } -ISR(TIMER0_COMPA_vect) -{ +ISR(WDT_vect) { ++jiffies; - pwm_timer(); - - if (--pattern_div == 0) { - timer_check_buttons(); - patterns_next_tick(); - timer_start_slow_adcs(); - pattern_div = PATTERN_DIV; - } + timer_check_buttons(); + patterns_next_tick(); + timer_start_slow_adcs(); - if ((jiffies & 0x7FFF) == 0) + if ((jiffies & 0x7FF) == 0) ambient_log_min_max(); } -- 2.39.3