Schau dir doch mal die erzeugte .lss Datei ( da steht der erzeugte Assemblercode drin ) an oder häng sie hier an. Es kann sein, dass GCC Warteschleifen wegoptimiert wenn sie "sinnlos" sind .
Eine Möglichkeit wäre die counter Variable als "volatile unsigned int counter;" zu deklarieren.

Meckert der Compiler eigentlich nicht, dass die Funktion "wait" nicht deklariert ist ??
Eigentlich gehört an den Anfang ein "void wait(unsigned int beats);" oder so was in der Art.

Noch ein paar allgemeine Anmerkungen:
Benutzt doch bitte:
#include <avr/io.h>
und zum Beispiel
PORTA = 0x50;

Die anderen Schreibweisen sind veraltet und werden irgendwann nicht mehr unterstüzt werden...

Und um noch was konstruktives beizutragen :
Code:
#include <avr/io.h>

#define	SYSCLK	4000000				// Taktfrequenz

void wait(unsigned int us);

int main(void) 
{

	DDRA = 0xff;
	
	while(1)
	{
		PORTA = 0x05;
		wait(100);
		PORTA = 0x06;
		wait(100);
		PORTA = 0x0A;
		wait(100);
		PORTA = 0x09;
		wait(100);
	}
}

/* Wartet us µSekunden */
void wait(unsigned int us) 
{
	unsigned int zaehler;
	
	while (us) 
	{
		zaehler = SYSCLK / 5000000;
		while (zaehler) 
		{
			asm volatile ("nop");
			zaehler--;
		}
		us--;
	}
}
MfG Kjion