Commit fbbdcc41 authored by Jan Kasprzak's avatar Jan Kasprzak
Browse files

WDT-based timing instead of ADC-based

This will allow us to use power-down sleep when neither ADC nor PWM
is used.
parent 75804664
Loading
Loading
Loading
Loading
+1 −22
Original line number Original line Diff line number Diff line
@@ -11,7 +11,7 @@
#define NUM_ADCS	2
#define NUM_ADCS	2


volatile static unsigned char current_adc;;
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;
static uint16_t adc_sum, read_zero, drop_count, read_count, n_reads_log;
volatile uint16_t jiffies;
volatile uint16_t jiffies;


@@ -126,30 +126,9 @@ void susp_adc()
	DIDR0 = 0;
	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
ISR(ADC_vect) { // IRQ handler
	uint16_t adcval = ADCW;
	uint16_t adcval = ADCW;


	adc_based_timer();

	if (read_zero) {
	if (read_zero) {
		setup_mux(current_adc);
		setup_mux(current_adc);
		read_zero = 0;
		read_zero = 0;
+4 −4
Original line number Original line Diff line number Diff line
@@ -7,9 +7,9 @@
#include "lights.h"
#include "lights.h"


#define WAKEUP_LIMIT	5	// times 100 ms
#define WAKEUP_LIMIT	5	// times 100 ms
#define SHORT_PRESS_MIN	10	// in jiffies (100 Hz ticks)
#define SHORT_PRESS_MIN	2	// in jiffies (16 Hz ticks)
#define SHORT_PRESS_MAX 50
#define SHORT_PRESS_MAX 5
#define LONG_PRESS_MIN	100
#define LONG_PRESS_MIN	10
static uint16_t button_start;
static uint16_t button_start;
static unsigned char prev_state;
static unsigned char prev_state;


@@ -67,7 +67,7 @@ void timer_check_buttons()
	} else if (!cur && prev) {            // --- just released ---
	} else if (!cur && prev) {            // --- just released ---
		uint16_t duration = jiffies - button_start;
		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();
			short_press();
		} else if (duration > LONG_PRESS_MIN) {
		} else if (duration > LONG_PRESS_MIN) {
			// set_status_led(button, NULL);
			// set_status_led(button, NULL);
+2 −1
Original line number Original line Diff line number Diff line
@@ -20,7 +20,7 @@ void inline log_word(uint16_t word) { }


/* adc.c */
/* adc.c */
#define PWMLED_ADC_SHIFT 1 /* 1<<1 measurements per single callback */
#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 init_adc();
void susp_adc();
void susp_adc();


@@ -76,6 +76,7 @@ pattern_t *status_led_pattern_select();
void set_error(unsigned char err);
void set_error(unsigned char err);


/* wdt.c */
/* wdt.c */
extern volatile uint16_t jiffies;
void init_wdt();
void init_wdt();
void susp_wdt();
void susp_wdt();


+0 −1
Original line number Original line Diff line number Diff line
@@ -71,7 +71,6 @@ int main(void)
	sei();
	sei();
#if 1
#if 1
	while (1) {
	while (1) {
		wdt_reset();
		sleep_mode();
		sleep_mode();
	}
	}
#endif
#endif
+12 −1
Original line number Original line Diff line number Diff line
@@ -6,7 +6,8 @@


void init_wdt()
void init_wdt()
{
{
	wdt_enable(WDTO_1S);
	wdt_enable(WDTO_60MS);
	WDTCR |= _BV(WDIE);
}
}


void susp_wdt()
void susp_wdt()
@@ -14,3 +15,13 @@ void susp_wdt()
	wdt_disable();
	wdt_disable();
}
}


ISR(WDT_vect) {
	++jiffies;

	if (jiffies & 0x000F) {
		need_battery_adc = 1; // about every 1s
	}

	patterns_next_tick();
	timer_check_buttons();
}