]> www.fi.muni.cz Git - bike-lights.git/commitdiff
Watchdog-based timing
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Mon, 20 May 2013 22:34:06 +0000 (00:34 +0200)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Mon, 20 May 2013 22:34:06 +0000 (00:34 +0200)
TODO: remove the sub-LSB PWM scaling, add deeper sleep states.

firmware/buttons.c
firmware/main.c
firmware/tmr.c

index 017a56c6560632fa2a1afe5280fdb966dab05a1f..80ecce603c65503ad940ad05b6edab7b98bb099e 100644 (file)
@@ -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);
                }
index 393f47dff68b6a475625983726a7a47cae3dcf6b..0e3395779e9c7a2c84afd71d912ef4b64868bb9f 100644 (file)
@@ -3,14 +3,11 @@
 #include <avr/sleep.h>
 #include <avr/interrupt.h>
 #include <avr/power.h>
-#include <avr/wdt.h>
 
 #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
index d53981a6b8d1dccfcc1655993d2568988559ee87..d1f1b2300bfe7e05233481948947fea330130b77 100644 (file)
@@ -1,44 +1,29 @@
 #include <avr/io.h>
 #include <avr/interrupt.h>
+#include <avr/wdt.h>
 
 #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();
 }