From: Jan "Yenya" Kasprzak Date: Fri, 10 May 2013 20:14:12 +0000 (+0200) Subject: Merge branch 'master' of ssh://anxur.fi.muni.cz/~kas/html/git/tinyboard X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=tinyboard.git;a=commitdiff_plain;h=0174f645d64fbb6e1280c2bb225273f429dff187;hp=678dd60ed95c50064bf8266f71ecf1b026dc3877 Merge branch 'master' of ssh://anxur.fi.muni.cz/~kas/html/git/tinyboard especially if it merges an updated upstream into a topic branch. --- diff --git a/projects/step-up/Makefile b/projects/step-up/Makefile index 0e9b728..07bb151 100644 --- a/projects/step-up/Makefile +++ b/projects/step-up/Makefile @@ -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) diff --git a/projects/step-up/adc.c b/projects/step-up/adc.c index 326588a..ea30935 100644 --- a/projects/step-up/adc.c +++ b/projects/step-up/adc.c @@ -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; diff --git a/projects/step-up/buttons.c b/projects/step-up/buttons.c index b03a816..a253797 100644 --- a/projects/step-up/buttons.c +++ b/projects/step-up/buttons.c @@ -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); diff --git a/projects/step-up/lights.h b/projects/step-up/lights.h index 7a268ef..2980cd3 100644 --- a/projects/step-up/lights.h +++ b/projects/step-up/lights.h @@ -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(); diff --git a/projects/step-up/main.c b/projects/step-up/main.c index 69657a8..c1ee381 100644 --- a/projects/step-up/main.c +++ b/projects/step-up/main.c @@ -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 index 0000000..9cfa08e --- /dev/null +++ b/projects/step-up/wdt.c @@ -0,0 +1,27 @@ +#include +#include +#include + +#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(); +}