In Deiner Read Routine fehlt das Semikolon hinter der while Schleife! Du liest vier mal einen ungültigen Wert ein.

Kleiner Tip: Bei if's und Schleifenkonstrukten verwende ich immer einen Block dahinter, das spart die Fehlersuche und Kollegen die mit Deinem Code arbeiten müssen werden es Dir danken.
Code:
while( ADCSRA & (1<<ADSC) )
{
     ; // wait until conversion complete
}
result += ADCH;