Ok, gehen wir das mal Schritt für Schritt durch:
- bei einer Taktfrequenz von 1MHz und Prescaler 1 zählt der Zähler jede µs einen Schritt hoch.
- Um auf 1 Sekunde zu kommen, bräuchtest Du also 1.000.000 Schritte.
- Der Zähler geht nur bis 65.536. 1.000.000 / 65.536 = 15.259
- Du brauchst also mindestens einen Prescaler von 16, um mit dem Zähler auf 1s zu kommen. 16 gibt's aber nicht, das nächste ist 64. Damit zählt der Counter also alle 64µs einen Schritt hoch. 1s / 64µs = 15.625. Damit hätten wir also schon mal den Vergleichswert.

- Nun gibt es mehrere Möglichkeiten, den Timer für Deine Aufgabe einzustellen. Oft wird es so gemacht, dass der Timer im Normalmodus läuft und auf den Maximalwert - Vergleichswert vorgeladen wird und dann mit dem Overflow-Interrupt die gewünschte Aktion ausgeführt wird. Oder man lässt den Timer von 0 an laufen, setzt das OCR Register auf den Vergleichswert und löst damit den Compare-Interrupt aus. Diese beiden Methoden haben jedoch den Nachteil, dass man im Interrupt das Zählerregister manuell entweder auf den Vorladewert oder auf Null setzten muss.
- Die sinnvollste Alternative ist es, den CTC-Modus zu verweden. Hierbei wird ebenfalls der Compare-Interrupt genutzt, allerdings setzt sich der Timer selbständig wieder auf 0 zurück, wenn der Interrupt ausgelöst wird.

So sähe das Programm für den CTC-Modus aus:
Code:
int main(void)
{
	//Timer initialisieren
	TCCR1A = 0x00;
	TCCR1B = 0x0B;		//Prescaler 64, CTC-Mode
	OCR1A = 15625;		//Vergleiswert setzten
	TIMSK = (1<<OCIE1A);	//OC-Interrupt aktivieren
	sei();

	while (1)
	{
		//Hier passiert nix
		//geht alles über Interrupts
		asm volatile ("nop");
	}

	return 0;
}

ISR(TIMER0_COMPA_vect)
{
	PORTC ^= (1<<5);	//Invertiert den Zustand an der LED  (PORTC 5)
}

return 0;
}
Gruß,
askazo