- PORTB &= ~_BV( PB5 );
-
- _delay_ms(1000);
- eeprom_write_byte(&dbg[0], TCNT1);
- eeprom_write_byte(&dbg[1], OCR1C);
- eeprom_write_byte(&dbg[2], OCR1D);
- eeprom_write_byte(&dbg[3], TIFR);
- eeprom_write_byte(&dbg[4], TCCR1B);
- DDRA |= _BV( PA0 );
- while( 1 ) {
- PORTA |= _BV( PA0 );
- _delay_ms(2000);
- PORTA &=~ _BV( PA0 );
- _delay_ms(2000);
- }
+ PORTB &= ~(_BV( PB5 ) | _BV( PB1 ) | _BV( PB3 ));
+
+ // led_off();
+ // TIMSK |= _BV(TOIE1);
+}
+
+#if 0
+static void inline pwm_handler()
+{
+ // TIMSK &= ~_BV(TOIE1);
+ // OCR1D = pwmval;
+}
+
+ISR(TIMER1_OVF_vect)
+{
+ pwm_handler();
+}
+#endif
+
+/* ------------ A/D Converter ----------- */
+
+static void inline init_adc()
+{
+ ADCSRA = _BV(ADEN) // enable
+ | _BV(ADPS1) | _BV(ADPS0) // CLK/8 = 125 kHz
+ // | _BV(ADPS2) // CLK/16 = 62.5 kHz
+ ;
+ ADMUX = _BV(REFS1) // 1.1V internal reference
+ | _BV(MUX4)|_BV(MUX3) // port ADC5-6, gain 1
+ ;
+ // ADCSRB = _BV(REFS2);
+ ADCSRB |= _BV(GSEL);
+ // Disable digital input on all bits used by ADC
+ DIDR0 = _BV(ADC5D)|_BV(ADC6D) | _BV(AREFD);
+ ADCSRA |= _BV(ADIE);
+}
+
+static void inline adc_handler()
+{
+ uint16_t new_pwm = led_modes[led_mode].pwmval;
+ uint16_t old_pwm = new_pwm;
+ uint16_t adc_exp = led_modes[led_mode].expected;
+
+ adcval = ADCW;
+ adccount++;
+
+ // log_word(((adcval & 0x3FC) << 6) | pwmval);
+
+ if (!led_is_on)
+ return;
+
+ // ADCSRA &= ~(_BV(ADIE) | _BV(ADIF));
+
+ if (led_mode_changed) {
+ led_mode_changed = 0;
+ goto set_pwm;
+ }
+
+ log_word(((adcval & 0xFF) << 8) | old_pwm);
+
+ if (2*adcval > 5*adc_exp) { // >2.5x expected, lower significantly
+ new_pwm = 2*old_pwm/3;
+ } else if (3*adcval > 4*adc_exp) { // >1.33x expected, lower a bit
+ new_pwm = old_pwm - 1;
+ } else if (4*adcval < 3*adc_exp) { // 0.75x expected, raise a bit
+ new_pwm = old_pwm + 1;
+ }
+
+ if (new_pwm > 0x60) { // odpojeno?
+ new_pwm = 0x60;
+ }
+ if (new_pwm < 2) { // zkrat?
+ new_pwm = 2;
+ }
+
+set_pwm:
+ if (new_pwm != old_pwm) {
+ led_modes[led_mode].pwmval = new_pwm;
+ OCR1D = new_pwm;
+ }
+ // ADCSRA |= _BV(ADSC);
+}
+
+ISR(ADC_vect)
+{
+ adc_handler();
+}
+
+int main(void)
+{
+ _delay_ms(1500);
+ init_log();
+
+ init_pwm();
+ init_adc();
+ init_tmr();
+
+ led_on();
+ debug_setstate(3);
+
+ sei();
+ while (1)
+ ; // sleep_mode();
+
+#if 0
+ while (1) {
+ PORTA |= _BV( PA0 );
+ _delay_ms(200);
+ PORTA &=~ _BV( PA0 );
+ _delay_ms(200);
+ }
+#endif