Dir ist klar, was der Unterschied ist zwischen
Code:
while (x=0);
{
}
und
Code:
while (x==0)
{
}
???

Dein momentanes Programm ist äquivalent hierzu:
Code:
#include <avr/io.h>

void main(void)
{
	PORTB = (1<< PB4);
	DDRB  = (1<< DDB4);
	OCR0  = 0xff;
	TCCR0 = (1 << WGM00) | (1 << WGM01) | (1<< COM01) | (1<< CS00) | (1<< CS01) | (1<< CS01);

	OCR0 = OCR0 + 1;

	if (OCR0 = 0xff) 
		OCR0 = 0x00;

} // Ende main, landet in exit() (Endlosschleife)
Das wiederum ist nicht anderes als
Code:
#include <avr/io.h>

void main(void)
{
	PORTB = (1<< PB4);
	DDRB  = (1<< DDB4);
	OCR0  = 0xff;
	TCCR0 = (1 << WGM00) | (1 << WGM01) | (1<< COM01) | (1<< CS00) | (1<< CS01) | (1<< CS01);

	OCR0 = OCR0 + 1;
	OCR0 = 0xff;
	OCR0 = 0x00;

} // Ende main, landet in exit() (Endlosschleife)
Dein OCR0 ist also immer 0. Mach die den Unterschied klar zwischen = und == und ein überflüssiger ; hat schon so manche Schleife ausgeknockt. Beides und noch mehr steht in Fallstricke bei der C-Programmierung