#include "header.h" // Table 14-6. Port C Pins Alternate Functions // - PC0 -> ADC0 (ADC Input Channel 0) // -> PCINT8 (Pin Change Interrupt 8) // // 24.2 : The ADC generates a 10-bit result which is presented in the ADC Data Registers, ADCH and ADCL // // START A CONVERSTION in single conversion mode : // - disabling the Power Reduction ADC bit, PRADC // - writing a logical one to the ADC Start Conversion bit, ADSC void adc_init(uint8_t prescaler_value) { ADMUX = (1 << REFS0); // Table 24-3 : set voltage reference, AVCC with external capacitor at AREF pin ADCSRA = (1 << ADEN); // 24.9.2 : enable ADC ADCSRA |= ADC_PRESCALE_SET(prescaler_value); // Table 24-5 : prescaler ADC } uint16_t adc_read(uint8_t channel) { CLEAR(PRR, PRADC); // 24.3 : ensure power reduction is disabled for ADC, (10.11.3 : PRR – Power Reduction Register) ADMUX = (ADMUX & 0b11110000) | (channel & 0b1111); // Table 24-4 : Select ADC channel, (Table 14-6 : alternate function for RV1 on PC0 -> ADC0) // ADMUX |= (1 << ADLAR); // Enable left adjust result ADCSRA |= (1 << ADSC); // 24.9.2 : Start conversion, ADSC: ADC Start Conversion while (ADCSRA & (1 << ADSC)); // Wait for completion return ADCH; // TODO: p247, read ADCH when left adjusted to only read 8 bits }