#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
static void setup_adc(void) {
ADMUX |= (1 << MUX1);
ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}
static int read_adc(void) {
ADCSRA |= (1 << ADSC);
while (!(ADCSRA & (1 << ADIF)));
ADCSRA &= ~(1 << ADIF);
return ADC;
}
static void setup_pwm(void) {
PLLCSR |= (1 << PCKE);
_delay_us(100);
DDRB |= (1 << PB1);
OCR1C = 0xff;
TCCR1 |= (1 << PWM1A) | (1 << COM1A1) | (1 << CS10);
TIMSK |= (1 << TOIE1);
}
int main(void) {
setup_adc()
setup_pwm();
for (;;) {
int out = 0;
out += read_adc();
out += read_adc();
out += read_adc();
out += read_adc();
out /= 4;
OCR1A = out;
}
return 0;
}
I2luY2x1ZGUgPGF2ci9pby5oPgojaW5jbHVkZSA8YXZyL2ludGVycnVwdC5oPgojaW5jbHVkZSA8YXZyL3NsZWVwLmg+CiNpbmNsdWRlIDx1dGlsL2RlbGF5Lmg+CgpzdGF0aWMgdm9pZCBzZXR1cF9hZGModm9pZCkgewogIEFETVVYIHw9ICgxIDw8IE1VWDEpOwogIEFEQ1NSQSB8PSAoMSA8PCBBREVOKSB8ICgxIDw8IEFEUFMyKSB8ICgxIDw8IEFEUFMxKSB8ICgxIDw8IEFEUFMwKTsKfQoKc3RhdGljIGludCByZWFkX2FkYyh2b2lkKSB7CiAgQURDU1JBIHw9ICgxIDw8IEFEU0MpOwogIHdoaWxlICghKEFEQ1NSQSAmICgxIDw8IEFESUYpKSk7CiAgQURDU1JBICY9IH4oMSA8PCBBRElGKTsKICByZXR1cm4gQURDOwp9CgpzdGF0aWMgdm9pZCBzZXR1cF9wd20odm9pZCkgewogIFBMTENTUiB8PSAoMSA8PCBQQ0tFKTsKICBfZGVsYXlfdXMoMTAwKTsKICBERFJCIHw9ICgxIDw8IFBCMSk7CiAgT0NSMUMgPSAweGZmOwogIFRDQ1IxIHw9ICgxIDw8IFBXTTFBKSB8ICgxIDw8IENPTTFBMSkgfCAoMSA8PCBDUzEwKTsKICBUSU1TSyB8PSAoMSA8PCBUT0lFMSk7Cn0KCmludCBtYWluKHZvaWQpIHsKICBzZXR1cF9hZGMoKQogIHNldHVwX3B3bSgpOwogIGZvciAoOzspIHsKICAJaW50IG91dCA9IDA7CiAgCW91dCArPSByZWFkX2FkYygpOwogIAlvdXQgKz0gcmVhZF9hZGMoKTsKICAJb3V0ICs9IHJlYWRfYWRjKCk7CiAgCW91dCArPSByZWFkX2FkYygpOwogIAlvdXQgLz0gNDsKICAJT0NSMUEgPSBvdXQ7CiAgfQogcmV0dXJuIDA7Cn0K