Ich würd sagen, Du hast da einen Denkfehler im Programm.

if (flanke == 1)
{
start = TCNT1;
MCUCR |= (1<<ISC01); //INT0 auf fallende Flanke stellen
flanke = 0;
}

if (flanke == 0)
{
stop = TCNT1;
MCUCR |= (1<<ISC00) | (1<<ISC01); //INT0 auf Steigende Flanke stellen (Löst Interrupt bei steigendet Flanke an INT0 aus
flanke = 1;
z1++;

Wenn die flanke 1 ist wird die if Anweisung ausgeführt und am Ende flanke=0 gesetzt.
dadurch wird aber sofort wieder die zweite if anweisung für flanke == 0 ausgeführt.
Du müsstest also von der ersten if anweisung aus die zweite überspringen, sonst wird ser Interrupt immer nur bei der steigenden Flanke ausgeführt.

Mal ne Frage - Testet ihr sowas nicht mit dem AVR - Studio aus ?
Da wär Dir das sofort aufgefallen.
Ich halt auch die Verwendung des Timers 0 für gefährlich.
Wenn der Interrupt 0 kurz vor einem Überlauf des Timers 0 aktiv wird, kann der Timer 0 schon wieder auf 0 stehen, ohne aber das externe Überlauf register zu erhöhen. Was dann einen Messfehler von 0,256 ms zur Folge hat.
Ich würd den Timer 1 frei laufen lassen, solange du nicht am TCNT 1 register rummanipulierst, kannst Du diesen Timer sogar noch für andere Aufgaben verwenden und du hast eine zuverlässige 16Bit Auswertung.
Die Impulswerte können durch subtraktion in der INT 0 Routine ermittelt werden.