Hi,
ich meine mal gelesen zu haben, dass die AVR's 'pipelining' betreiben.
http://de.wikipedia.org/wiki/Pipeline_%28Prozessor%29

soll heißen, dass der AVR beim einlesen des ADCSRA evtl. auf einen alten stand von ADCSRA zugreift. Bin mir allerdings nicht 100% sicher. Hier im RNetz kennt sich sicher jemand besser aus und kann erklären warum dass in diesem Fall nicht zutrifft.

Aber schalt mal die Optimirung aus und probier das:
Code:
ADCSRA |= (1<<ADIF); //reset Flag
;
;
;
;
while (!(ADCSRA & (1<<ADIF))){}
mfg ch