uint16_t buffer = ADC;

That's it. Wenn du nur ADCL liest klemmt der ADC, weil immer ein Register gelacht wird und der Wert sonst nicht mehr aktualisiert wird.