]> www.fi.muni.cz Git - tinyboard.git/commitdiff
Merge branch 'master' of ssh://anxur.fi.muni.cz/~kas/html/git/tinyboard
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Fri, 10 May 2013 20:14:12 +0000 (22:14 +0200)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Fri, 10 May 2013 20:14:12 +0000 (22:14 +0200)
 especially if it merges an updated upstream into a topic branch.

projects/step-up/Makefile
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 [new file with mode: 0644]

index 0e9b7284342ecac985eacf5c476a4d396b7a5603..07bb15180295615c1e861df1f1c0a25d2d2113a6 100644 (file)
@@ -1,7 +1,7 @@
 
 PROGRAM=lights
 SRC=main.c logging.c pwm.c adc.c pwmled.c pattern.c buttons.c control.c \
-       battery.c
+       battery.c wdt.c
 OBJ=$(SRC:.c=.o)
 
 
index 326588a1253d5dc8cbba468d918cf87432852e08..ea309357a429ad988b26960e3e1c381bda7248a9 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 b03a8162600314684e77aa14884f9d331726aa96..a25379734db3fa868770d873edbc230c2633cebd 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 7a268ef161d6c9ae122810379f58b3a6448b2644..2980cd3678b06c0eba88c649ebdcea8c6a56f1de 100644 (file)
@@ -20,12 +20,14 @@ 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;
+extern volatile unsigned char adc_running;
 void init_adc();
 void susp_adc();
 
 /* pwm.c */
 #define PWM_MAX 0xFF
+extern volatile unsigned char pwm_running;
 void init_pwm();
 void susp_pwm();
 void pwm_off();
@@ -75,6 +77,11 @@ pattern_t *status_led_pattern_select();
 #define ERR_PWMLED  2
 void set_error(unsigned char err);
 
+/* wdt.c */
+extern volatile uint16_t jiffies;
+void init_wdt();
+void susp_wdt();
+
 /* main.c */
 void power_down();
 
index 69657a8a70052d37b5b4cdd1545febfeba8ad456..c1ee381453a334bf43493ddb93e287f9fa2bea62 100644 (file)
@@ -11,11 +11,10 @@ static void hw_setup()
 {
        power_all_disable();
 
-       wdt_enable(WDTO_1S);
-
        init_battery();
        init_pwm();
        init_adc();
+       init_wdt();
 
        init_buttons();
 
@@ -30,9 +29,10 @@ static void hw_suspend()
 {
        susp_pwm();
        susp_adc();
+       susp_wdt();
+
        susp_buttons();
 
-       wdt_disable();
        power_all_disable();
 }
 
@@ -71,8 +71,18 @@ int main(void)
        sei();
 #if 1
        while (1) {
-               wdt_reset();
-               sleep_mode();
+               cli();
+               if (pwm_running) {
+                       set_sleep_mode(SLEEP_MODE_IDLE);
+               } else if (adc_running) {
+                       set_sleep_mode(SLEEP_MODE_ADC);
+               } else {
+                       set_sleep_mode(SLEEP_MODE_PWR_DOWN);
+               }
+               // keep BOD active, no sleep_bod_disable();
+               sei();
+               sleep_cpu();
+               sleep_disable();
        }
 #endif
 
diff --git a/projects/step-up/wdt.c b/projects/step-up/wdt.c
new file mode 100644 (file)
index 0000000..9cfa08e
--- /dev/null
@@ -0,0 +1,27 @@
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/wdt.h>
+
+#include "lights.h"
+
+void init_wdt()
+{
+       wdt_enable(WDTO_60MS);
+       WDTCR |= _BV(WDIE);
+}
+
+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();
+}