Hier noch zwei Funktionen...

Gehd bei ATMEGA8535, 32, 128.... und andere wo die Register passen.

Macht X Dummy-Messungen, dann aus x Messungen den Mittelwert

Code:
void ADC_init(void) { 
    ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); 
} 

uint16_t ADC_wert(uint8_t mux) { 
	uint8_t i;
	uint8_t ii;
	uint16_t result;
	uint16_t ergebnis;
	ergebnis = 0;
	//    +------------ Dummy-Check ------------+
	i = 5;										// i x Dummy-Check
	while(i){
		ADMUX = mux;    						// Kanal waehlen
		ADCSRA |= (1<<ADSC);            		// eine Wandlung "single conversion"
		while(!(ADCSRA & (1<<ADIF)));   		// auf Abschluss der Konvertierung warten (ADIF-bit)
		result = ADCL + (ADCH << 8);			// Wandlungsergebnisse erfassen
		result = 0;								// Zurücksetzen
		i--;
	}
	//    +------------- Ermittlung ------------+
	i = 8;
	ii = i;										// Schnitt aus i Ergebnissen
	while(i){
		ADMUX = mux;    						// Kanal waehlen
		ADCSRA |= (1<<ADSC);            		// eine Wandlung "single conversion"
		while(!(ADCSRA & (1<<ADIF)));   		// auf Abschluss der Konvertierung warten (ADIF-bit)
		result = ADCL + (ADCH << 8);			// Wandlungsergebnisse erfassen
		ergebnis = ergebnis + result;			// Aufaddieren
		i--;
	}
	//    +-------- Umrechnung & Ausgabe -------+
	ergebnis = ergebnis / ii ;
	return ergebnis;
}