@kugelfisch
Dein Ansatz ist im Prinzip schon richtig.
Man stellt den Interrupt ( ICP, INTx ) auf steigende Flanke.
Wird der Interrupt ausgelöst wird der Timer ( bzw. das ICR ) ausgelesen und der Wert abgespeichert. Gleichzeitig wird das Interrupt sensing auf "fallende Flanke" umgestellt.
Tritt dan der Interrupt bei fallender Flanke wiederum auf, liest man den Timer ( ICR ) erneut aus und zieht den vorher abgespeicherten Wert ab.
Das Interrupt Sensing wird für die nächste Messung dann wieder auf "steigende Flanke" gestellt.
Wenn man unsigned Variablen benutzt ist auch die Berechnung bei Überlauf der Timers kein Problem.
Den Timer ( TCNT1 ) per Software auf 0 zu setzen kann u.U. einen Messfehler verursachen.

Ich nehm für solche Sachen gerne den Timer1 mit einem Quarz von 8MHz und einem Prescaler von 8 her, weil dann die Werte direkt in µs ausgegeben werden.

Ein weiteres Problem könnte noch sein, das eine Einspritzdüse während eines Zündvorganges mehrmals mit unterschiedlichen Zeiten einspritzen kann.
Das könnte man eventuell dadurch lösen, das man einen Drehzahlsensor anbringt und die Einspritzzeiten einer Umdrehung aufaddiert.

Grundsätzlich gilt für so eine Zeitmessung, wie für alle Interrupts, die Interruptroutinen so kurz wie möglich zu halten.
Eventuell wäre Assembler sinnvoll.