Welche Zeitspannen und Auflösungen möchtest du denn erreichen?

Ich würde folgendes empfehlen: Für kurze Periodendauern könntest du das Capture-Feature des Timers nehmen, z.b. Timer1, im Datenblatt ist die Konfiguration eigentlich ganz gut beschrieben. Wenn der aber über deine Maximalzeit rausspringt, dann musst du den Überlauf abfangen.
Andere Möglichkeit, die wohl flexibler ist:
Schnapp dir einen 8 oder 16Bit Timer, z.B. Timer0 oder Timer1, stell ihn auf nen Prescaler von 1 für die maximale Auflösung. Dann bindest du die avr\interrupt.h vom GCC ein und schaltest zwei Interrupts frei, einmal den Timer-Overflow und den externen Interrupt, wo dein Signal anliegen sollte. Nun zählt die Overflow-Interrupt-Routine einen Softwarezähler hoch, der Softwareteil bildet die Werte für z.B. 64-16. Bit, der Hardware Timer1 dann Bit 15-0 , somit hast du nen riesigen Wertebereich und damit lange Messzeiträume, bis ein Fehler durch Overflow passieren würde.
Der Interrupt entlastet dabei das Hauptprogramm und muss nicht mehr machen, als n Inkrement der großen Software-Variablen.
Der externe Interrupt muss als erstes den Timer abschalten, oder den Zählerstand sichern, damit die hohe Auflösung erhalten bleibt. Das dauert X Takte, die musst du vom Messergebnis abziehen. Wenn du wirklich willst, dass es genau ist, dann benutzt du priorisierte Interrupts. D.h. der Externe Interrupt darf ausgelöst werden, während der Timer-Interrupt läuft. Dazu gibt es in der GCC Doku einen Aufrufparameter, such einfach nach ISR.
Damit ist der Großteil der Zeitressourcen für z.B. Displayausgaben usw. frei. Einmal alle 65535 Takte wird der Overflow-Interrupt aufgerufen, und der andere erst, wenn die Messbedingung eintritt.
Die Hauptroutine muss dann nur den Timer1 löschen, den Externen Interrupt erlauben, dann den Timer1 starten. Ansonsten kann sie z.B. das Messergebnis umrechen, z.B. Zeit über bestimmte Strecke in Geschwindigkeit in m/s.