#include #include #include #include void photons_init(void) { ADCSRA |= (1 << ADEN); } void photons_stop(void) { ADCSRA &= ~(1 << ADEN); } uint8_t photons_measure(void) { // save old state uint8_t old_right = led_state(RIGHT); uint8_t old_left = led_state(LEFT); // all leds off led_off(RIGHT); led_off(LEFT); // set to ground for discharge DDRC |= 1 << 3; PORTC &= ~(1 << 3); // wait for discharge wait_ms(1); // set direction to input for measurement DDRC &= ~(1 << 3); // collect some photons wait_ms(1); // start measurement // TODO: why can't i move this to the initialization? ADMUX = (1 << REFS0) | (1 << ADLAR); ADCSRA |= (1 << ADPS2) | (1 << ADPS1); ADMUX = (ADMUX & ~(0x1F)) | 3; ADCSRA |= (1 << ADSC); // wait for measurement to finish while (ADCSRA & (1 << ADSC)) test_stop_app(); uint8_t res = ADCH; // restore state PORTC |= 1 << 3; DDRC |= 1 << 3; led_set(RIGHT, old_right); led_set(LEFT, old_left); // done return res; }