Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <avr/signal.h>

 uint8_t second=0;
 uint8_t secled=0;
 uint8_t minute=0;
 uint8_t hour=0;

SIGNAL (SIG_OVERFLOW1)
{
  	second ++;
	PORTD ^= (1<<PD0);
	if(second == 60)
	{
		second = 0;
		minute ++;
	};
	if(minute == 60)
	{
		minute = 0;
		hour ++;
	};
	if(hour == 24)
	{
		hour = 0;
	};

};


int main(void)
{
	DDRD = 0xff;
	DDRB = 0xff;
	OCR1AL = 0x8d;
	OCR1AH = 0x5b;
	TCNT1L = 0x73;
	TCNT1H = 0xa4;
	TIMSK |= (1 << TOIE1);
	TCCR1B |= (1<<CS10)|(1<<CS11); //64
	sei();
	while(1)
	{
	
	};

}
so funzts mit meinem ATMEGA16 und 6Mhz Quarz, ich weiß zwar nicht wa sbei dir falsch ist , aber vielleicht hilft dir mein code

EDIT//

wenn ich das richtig sehe benutzt du den Timeroverflow ja gar nicht das musst du soviel ich weiß mit dem SIGNAL (SIG_OVERFLOW1)
{;} machen , also alles was in der { } ist führt er aus sobald der timer neu anfängt