Ein Teil deiner Aufgabe erledigt folgender Code.

In timer.h werden Grundeinstellungen gemacht:
Interrupt-Rate und mit welcher Taktfrequenz gefahren wird.

timer.h:

Code:
#ifndef _TIMER_H_
#define _TIMER_H_

#define XTAL_PHI   8000000
#define INTERRUPTS_PER_SECOND   10000
#define INTERRUPTS_PER_MILLISECOND (INTERRUPTS_PER_SECOND / 1000) 

extern void init_timer1 (void);

#endif /* _TIMER_H_ */
In timer.c::init_timer1() wird Timer1 so initialisiert, daß er INTERRUPTS_PER_SECOND mal pro Sekunde einen Interrupt auslöst:

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

#include "timer.h"

void init_timer1()
{
    /* tmr1 is counter */
    TCCR1A = 0;
#if defined (__AVR_AT90S2313__)
    // Timer1 running on full MCU clock
	 // Clear on CompareMatch
    TCCR1B = _BV (CS10) | _BV (CTC1);
#elif defined (__AVR_ATmega8__)
	 // Mode #4 für Timer1 (Manual S. 97)
	 // und full MCU clock
    TCCR1A = 0;
    TCCR1B = _BV (WGM12) | _BV (CS10);
#else
#error Dont know how to setup timer1
#endif

	// set PoutputCompare to get desired Timer1 frequency
	OCR1A = (unsigned short) ((uint32_t) XTAL_PHI / INTERRUPTS_PER_SECOND);

	// output compare interrupt for timer 1
   timer_enable_int (_BV (OCIE1A));
}
Nach Aufruf von init_timer1() und sei() kannst du zB Zähler in der entsprechenden Interrupt-Routine erhöhen oder was dir sonst noch einfällt, und den in deiner main-loop abtesten/zurücksetzen, etc.

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

#include "timer.h"

SIGNAL (SIG_OUTPUT_COMPARE1A)
{
   ...
}
Der Rest ist eigener Gehirnschmalz...