Code:
return ADCH*256 + ADCL;
Bei einem solchen Konstrukt ist in keiner Weise sichergestellt, dass die beiden Register in der richtigen Reihenfolge gelesen werden. Mach daraus einfach ein simples "return ADCW;".