Hallo scrawl und alle anderen natürlich auch.

@scrawl
Nur mal kurz, warum das Sleep(), Msleep() und auch dein Warte() nicht in einer Interruptfunktion funktionieren.
Im Asuro wird eine Interruptfunktion in der Regel mit ISR(XXX_vect) oder SIGNAL (... ) (SIGNAL ist die alte Version von ISR) bekannt gegeben. Dies hat zur Folge, dass eine ISR erst beendet werden muss bevor eine andere ISR aufgerufen wird. Dies hatte schon Hubert.G geschrieben.

Wenn du also in deiner ISR(INT1_vect) bist und dort Warte() aufrufst, wird der Timer-Interrupt nicht mehr aufgerufen. Deshalb wird die Variable count72kHz, oder count36kHz bei neuerer Lib, nicht mehr weitergezählt. Dann aber kann Sleep() und somit auch dein Warte() nie mehr beendet werden.
Das alles stimmt aber nur dann, wenn man ISR() nur mit dem XXX_vect als Parameter aufruft. ISR geht aber auch so: ISR(XXX_vect, ISR_NOBLOCK). Dann aber spielt die Priorität der Interrupts eine Rolle, ob z.B. der Timer2 den Int0 unterbrechen darf. Wenn ja, dann kann Sleep auch im Tasteninterrupt benutzt werden. (Gehts, oder gehts nicht? Kapitel "Interrupt Vectors in ATmega8" bringt die Lösung.)

Vor einiger Zeit hatte ich hier mal aufgeführt, wie man Interrupts nutzt. (Zufällig entspricht mein Beispiel dort genau deinem hier bearbeiteten Problem.)
Ihr habt hier zwar genau die Lösung gefunden, aber vielleicht hilft dir das Geschreibsel ja zum Verständnis wenn es mal am Stück aufgeführt ist.

Gruß Sternthaler