Posted on Leave a comment

Baseline ADC Readings Through Serial on AtMega328p

I hope this is legal putting this here. This is modified code from the Make: AVR Programming book. If you wanting to hop from Arduino to C Programming, this book is INCREDIBLE! Seriously, just freakin’ buy it.

This code measures a voltage coming into PC0 and spits it out through the serial monitor. The scaling isn’t right, but adjusting the voltage on PC0 with a potentiometer delivers reasonable results.


// ************ ADC works well enough   
//p.135  AVR Programming Make Book Mostly ********************
// The scaling is screwy, but I can adjust a potentiometer 
//and get reasonable 8-bit data
// ADC is reading PC0.  

#include <avr/io.h>
#include <util/delay.h>
#include "pinDefines.h"
#include "USART.h"

static inline void initADC0(void) {
	ADMUX |= (1 << REFS0);  // reference voltage
	ADCSRA |= (1 << ADPS1) | (1 << ADPS0); // ADC clock prescaler /8
	ADCSRA |= (1 << ADEN);  // enable ADC	
}

int main(void){
	// Inits
	uint16_t adcValue;
	//uint8_t i;
	initADC0();
	initUSART();
	printString("Hello!\r\n");
	
	while (1) {
		ADCSRA |= (1 << ADSC);  // start ADC conversion
		loop_until_bit_is_clear(ADCSRA, ADSC);  
                // wait until finished
		adcValue = ADC; // Read ADC in
		
		_delay_ms(50);
		transmitByte(adcValue);
		_delay_ms(1000);
		
	}  // end big loop
	
	return(0);
}
Leave a Reply

Your email address will not be published. Required fields are marked *