#include void adc_init(void) { uint16_t dummyResult; // AVCC with external capacitor at AREF pin ADMUX = _BV(REFS0); // set frequency prescaler to 64 ADCSRA = _BV(ADPS2) | _BV(ADPS1); // enable ADC ADCSRA |= _BV(ADEN); // make a dummy read out ADCSRA |= _BV(ADSC); while (ADCSRA & _BV(ADSC) ) { } // we have to read, otherwise the next result is not available dummyResult = ADCW; } uint16_t adc_read_single(const uint8_t channel) { // strip all MUX bits, keep the 3 msb (REFS1, REFS0, ADLAR) ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); ADCSRA |= _BV(ADSC); while (ADCSRA & _BV(ADSC) ) { } return ADCW; } uint16_t adc_read_avg(const uint8_t channel, const uint8_t nsamples) { uint16_t sum = 0; uint8_t count = nsamples % 60; for (uint8_t i=0; i