//#define NUM_ADCS ZERO_ADC
#define NUM_ADCS 2
-volatile static unsigned char current_adc;;
-volatile unsigned char need_battery_adc;
+volatile static unsigned char current_adc;
+volatile unsigned char adc_enabled;
+volatile unsigned char need_battery_adc, need_pwmled_adc;
static uint16_t adc_sum, read_zero, drop_count, read_count, n_reads_log;
volatile uint16_t jiffies;
drop_count = 1;
read_count = 1;
n_reads_log = 0;
- } else {
+ } else if (need_pwmled_adc) {
current_adc = 0;
read_zero = 0;
drop_count = 1;
read_count = 1 << PWMLED_ADC_SHIFT;
n_reads_log = PWMLED_ADC_SHIFT;
+ } else {
+ ADCSRA &= ~_BV(ADEN);
+ power_adc_disable();
+ adc_enabled = 0;
+ return;
+ }
+ if (!adc_enabled) {
+ power_adc_enable();
+ ADCSRA |= _BV(ADEN);
+ adc_enabled = 1;
}
adc_sum = 0;
void init_adc()
{
need_battery_adc = 0;
+ need_pwmled_adc = 0;
current_adc = 0;
+ adc_enabled = 1;
power_adc_enable();
ACSR |= _BV(ACD); // but disable the analog comparator
{
ADCSRA = 0;
DIDR0 = 0;
+ power_adc_disable();
+ adc_enabled = 0;
}
ISR(ADC_vect) { // IRQ handler
rv = 7;
}
+#if 0
if (rv == 1 && !initial_readings)
set_error(ERR_BATTERY);
+#endif
#if 0
log_byte(0xbb);
/* adc.c */
#define PWMLED_ADC_SHIFT 1 /* 1<<1 measurements per single callback */
extern volatile unsigned char need_battery_adc;
-extern volatile unsigned char adc_running;
+extern volatile unsigned char need_pwmled_adc;
+extern volatile unsigned char adc_enabled;
void init_adc();
void susp_adc();
/* pwm.c */
#define PWM_MAX 0xFF
-extern volatile unsigned char pwm_running;
+extern volatile unsigned char pwm_enabled;
void init_pwm();
void susp_pwm();
void pwm_off();
#if 1
while (1) {
cli();
- if (pwm_running) {
+ if (pwm_enabled) {
set_sleep_mode(SLEEP_MODE_IDLE);
- } else if (adc_running) {
+ } else if (adc_enabled) {
set_sleep_mode(SLEEP_MODE_ADC);
} else {
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}
+
+ sleep_enable();
// keep BOD active, no sleep_bod_disable();
sei();
sleep_cpu();
* Counts from 0 to 0xFF, without OCR1C compare.
*/
-static unsigned char pwm_enabled;
+volatile unsigned char pwm_enabled;
static void inline enable_pll()
{
DDRB &= ~_BV(PB4);
PLLCSR &= ~(_BV(PLLE) | _BV(PCKE));
+ power_timer1_disable();
pwm_enabled = 0;
}
OCR1B = stride;
if (!pwm_enabled) {
+ power_timer1_enable();
enable_pll();
DDRB |= _BV(PB4);
pwm_enabled = 1;
if (mode) {
state = ST_ON;
mode_changed = 1;
+ need_pwmled_adc = 1;
pwm_set(pwm_val);
} else {
state = ST_OFF;
+ need_pwmled_adc = 0;
pwm_off();
}
}
if (pwm_val >= PWM_MAX
|| (pwm_val > (2*PWM_MAX/3) && adcval < 0x08)) {
pwmled_err();
+ need_pwmled_adc = 0;
return;
}
ISR(WDT_vect) {
++jiffies;
+ if (pwm_enabled) {
+ need_pwmled_adc = 1;
+ }
+
if (jiffies & 0x000F) {
need_battery_adc = 1; // about every 1s
}
patterns_next_tick();
timer_check_buttons();
+ if (!adc_enabled)
+ start_next_adc(); // only if not running
}