Hallo

In der Hauptschleife auf die ISR zu warten ist nicht so optimal. Basierend auf dem Code von oben würde ich das etwa so angehen:
Code:
// Vier LEDs ansteuern mit Timer 0                                      21.3.2010 mic

#include <nibobee/iodefs.h>
#include <avr/interrupt.h>

volatile uint8_t p=0; // Auf diese Variable greift die ISR und das Programm zu!

int main(void)
{
   TCCR0 = (1<<CS02) | (1<<CS00);      // Normal Mode, kein OC0-Pin, prescaler /1024
   TIMSK |= (1<<TOIE0);                // Timer0 Overflow-Interrupt erlauben

	DDRB |= 0x0f;                       // alle Leds sind Ausgang
	PORTB &= ~0x0f;                     // und low
	enable_interrupts();

   while(1)
   {
		if(!p)
		{
			p=4*57; 								// alle 4 Sek. (atomar weil byte!)
			PORTB ^= 0x0f;                // alle LEDs umschalten
		}
		// nix zu tun
   }

}
ISR(TIMER0_OVF_vect)
{
   static uint8_t led0=0, led1=0, led2=0, led3=0;
   
   if(led0) led0--; else { PORTB ^= 1; led0=57; } 		// eine Sek.
   if(led1) led1--; else { PORTB ^= 2; led1=57/2; } 	// 1/2 Sek.
   if(led2) led2--; else { PORTB ^= 4; led2=57/3; } 	// 1/3 Sek.
   if(led3) led3--; else { PORTB ^= 8; led3=57/4; } 	// 1/4 Sek.
   if(p) p--;                                         // Usertimer :)
}
Das ist natürlich auch nur eine Möglichkeit von vielen...

Gruß

mic