ADC (Analog to Digital Converter)

  ADMUX|=(1<<REFS0);//AVCC with external capacitor at AREF pin
  ADCSRA|=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  ADCSRA|=(1<<ADEN);
 uint16_t read_adc(uint8_t ch)
{
 uint8_t channel;
 channel=0xff&ch;  // Filter channel
 ADMUX=(ADMUX & 0xc0); //Clear all channel
 ADMUX|=channel;//Analog Channel Selection
 ADCSRA|=(1<<ADSC);//ADC Start Conversion
while(ADCSRA &(1<<ADSC))
 {
   ;//do nothing until conversion finished
 }
 return (ADCW);
}
 void adc_init(void)
{
ADMUX |=(1<<REFS0);								//AVCC with external capacitor at AREF pin
ADCSRA |=(1<<ADPS2)|(1<<ADPS1);					//F_ADC=F_CPU/64
ADCSRA |=(1<<ADEN);								//ADC Enable
ADCSRA |=(1<<ADIE);								//ADC Interrupt Enable
sei();												//Global Interrupt Enable
}
 void adc_value(uint8_t Ch)
{
uint8_t channel;
channel=0xff&Ch;									//Filter Channel
ADMUX=(ADMUX & 0XC0);								//Clear all channel						
ADMUX |=channel;									//Analog Channel Selection
ADCSRA |= (1<<ADSC);								//ADC Start Conversion
}
 #include<avr/io.h>
 #include<util/delay.h>
 #include<avr/interrupt.h>
 #include"adc.h"
 uint16_t value;
int main(void)
{
  DDRD=0xFF; 						//PORTD for output
  adc_init();						//ADC Initilization
  while(1)
	{
	  adc_value(0);				//Read ADC Channel 0
	  PORTD=(uint8_t)value;		//PORTD=ADCL
	}
 return 0;
}
ISR(ADC_vect)
{
  value=ADCW;
}