void init_ADC(void);
void start_ADC(void);
uint16_t read_ADC(void);
void print_(uint16_t value);
void setup() {
Serial.begin(9600);
init_ADC();
}
void loop() {
start_ADC();
uint16_t x = read_ADC();
print_(x); // Print the ADC value
delay(1000); // Delay for 1 second
}
void init_ADC() {
volatile char *admux = (volatile char *)0x7C;
volatile char *adcsra = (volatile char *)0x7A;
*admux = 0x40; // Reference voltage: AVCC, ADC0 selected
*adcsra = 0x87; // ADC Enable, Prescaler = 128 (16 MHz / 128 = 125 KHz)
}
void start_ADC() {
volatile unsigned char *adcsra = (volatile unsigned char *)0x7A;
*adcsra = *adcsra | 0x40; // Start conversion by setting ADSC bit
}
uint16_t read_ADC() {
volatile char *adcsra = (volatile char *)0x7A;
volatile unsigned char *L = (volatile unsigned char *)0x78;
volatile unsigned char *H = (volatile unsigned char *)0x79;
uint16_t value;
while ((*adcsra & 0x10) == 0); // Wait for conversion to complete (ADIF flag)
value = (*H << 8) | *L; // Combine the upper and lower bits to get the 10-bit result
*adcsra = *adcsra | 0x10; // Clear the ADIF flag by writing a 1 to it
return value;
}
void print_(uint16_t value) {
Serial.println(value); // Print ADC value to Serial
}