DDRB |= _BV(PB4);
- TCCR1 = _BV(CS10); // clk/1 = 1 MHz
- // TCCR1 = _BV(CS11) | _BV(CS13); // clk/512 = 2 kHz
+ // TCCR1 = _BV(CS10); // clk/1 = 1 MHz
+ TCCR1 = _BV(CS11) | _BV(CS13); // clk/512 = 2 kHz
GTCCR = _BV(COM1B1) | _BV(PWM1B);
OCR1C = 255;
- OCR1B = 0;
+ OCR1B = steps[0];
+ TIMSK = _BV(OCIE1B) | _BV(TOIE1);
+}
+
+volatile unsigned char adc_type, adc_drop;
+
+ISR(TIM1_OVF_vect)
+{
+ adc_drop = 2;
+ adc_type = 1;
+ ADCSRA |= _BV(ADSC);
+}
+
+ISR(TIM1_COMPB_vect)
+{
+ adc_drop = 2;
+ adc_type = 0;
+ ADCSRA |= _BV(ADSC);
}
static void set_pwm(unsigned char pwm)
{
power_adc_enable();
- ADCSRA = _BV(ADEN) | _BV(ADPS1) | _BV(ADPS0); // clk/8 = 125 kHz
+ ADCSRA = _BV(ADEN) | _BV(ADPS1) | _BV(ADPS0) | _BV(ADIE); // clk/8 = 125 kHz
ADMUX = _BV(REFS1) | _BV(MUX1) | _BV(MUX0); // 1.1V ref., PB3 single-ended
DIDR0 = _BV(ADC3D);
}
+volatile uint16_t batt_on, batt_off;
+
+ISR(ADC_vect)
+{
+ uint16_t adcw = ADCW;
+
+ if (adc_drop) {
+ adc_drop--;
+ ADCSRA |= _BV(ADSC);
+ return;
+ }
+
+ if (adc_type == 0) {
+ if (batt_off) {
+ batt_off += adcw - (batt_off >> 5);
+ } else {
+ batt_off = adcw << 5;
+ }
+ } else {
+ if (batt_on) {
+ batt_on += adcw - (batt_on >> 5);
+ } else {
+ batt_on = adcw << 5;
+ }
+ }
+}
+
static void status_led_init()
{
DDRB |= _BV(PB2);
blink_on_time = 0;
blink_off_time = 2;
blink_counter = 10;
+#if 0
+ log_byte(0xbb);
+ log_byte(batt_on >> 7);
+ log_byte(batt_off >> 7);
+#endif
}
}
power_down();
-#if 0
- ADCSRA |= _BV(ADSC);
- while (!(ADCSRA & _BV(ADIF)))
- ;
- log_word(ADCW);
- ADCSRA |= _BV(ADSC);
- while (!(ADCSRA & _BV(ADIF)))
- ;
- log_word(ADCW);
- log_flush();
-#endif
sei();
// we try to be completely IRQ-driven, so just wait for IRQs here
wdt_timer_fired = 0;
timer_check_buttons();
timer_blink();
+ log_flush();
}
}
}