Das geht mit dem Timer0 ganz einfach.
Code:
#include <avr/interrupt.h>
volatile unsigned char zaehler;

// Im main einrichten
TCCR0=(1<<WGM1)|(1<<CS02); // CTC, prescaler /256 
OCR0=42;  // sollte mit dem Prescaler 1msec ergeben
TIMSK=(1<<OCIE0); // Output Comparematch Interrupt aktivieren
sei();  // Interrupt generell freigeben

//Interruptroutine
ISR(TIMER0_COMP_vect ){
zaehler++;
}
Die Variable zaehler wird jede 1msec um 1 erhöht