Warum machst du den ADC nicht auch mit Interrupt, die Helligkeitsabfrage ist doch nicht wichtig. Starten würde ich sie mit dem Timer, wenn der ADC-Interrupt kommt nur ein Flag setzen, die Auswertung dann im main. So wie es jetzt ist startest du den ADC bei jedem while-Durchlauf und wartest bis die Convertion fertig ist. Du verlierst viel Zeit und wenn du noch so etwas machst ist es leicht möglich das du Timing-Probleme bekommst.