Also das komplette Analysieren Deines Programms ist mir jetzt zu mühsam.
Aber:
Ich setze den Befehl SLEEP (meist/immer) in der Mainloop ein. Das
sichert ab, das alle ISRs ordentlich verlassen wurden und alle Jobs (per
Jobflags) erledigt sind. Ich nutze SLEEP im Idle-Mode (meist) bereits
für ganz einfache Programme, wenn alle Jobs der Mainloop erledigt sind,
schicke ich den AVR schlafen. Der nächste Interrupt weckt ihn dann
wieder und vor dem nächsten Interrupt kann sowiso kein neuer Job (über
Jobflags) in Auftrag gegeben werden.
In Deinem Fall müsste beim Start des ADC der Sleep-Mode von Idle auf
ADC-Noise-red. umgeschaltet werden. Laut Datenblatt (Seite 41) sollte
der ADC bereits eingeschaltet, aber nicht gestartet sein, dann startet
er beim Aufruf von Sleep (wenn Mode ADC-Noise-red. voreingestellt ist)
automatisch. Ist der ADC-Interrupt korrekt initialisiert, dann wird der
AVR auch ordentlich geweckt. In der ADC-ISR muss der Sleepmode natürlich
sofort wieder auf Idle umgeschaltet werden, damit beim nächsten Sleep
ein Timer das Wecken schafft.
Übrigens: Während ACD-Sleep bleiben die Timer stehen (deren Takt wird ja
deaktiviert). Es kann durchaus möglich sein, dass eine Korrektur der
Timer erforderlich ist.
Ein Beispiel mit umschaltbarem Sleep-Mode findest Du hier:
http://www.hanneslux.de/avr/divers/index.html
Es ist allerdings nicht mit Tiny26 und auch nicht mit ADC-Noise-red.,
sondern mit Tiny15 und "Tiefschlaf" (Wecken per ext-Int).
...