Taktmessung mit dem Mega

Hallo Experten,
ich habe einen Arduino Mega 2560 und möchte damit einen Encoder auslesen. Ich habe einen einkanal Encoder mit Indexscheibe.
Ich habe es aber leider nicht geschafft die Zeit zwischen zwei Interrupts richtig zu messen. In meiner Not habe ich statt des Encoders einen Signalgenerator angeschlossen. Bei einer TTL Frequenz von 61 Hz und einer Auswertung der Steigenden und fallenden Flanke, bekomme ich eine Taktzeit von ca. 1300 micros() theoretisch sollten das aber 8196,72 micros sein.
Hier ist mein Code:

volatile unsigned long dt; //Delta t
unsigned long t=0; //Laufzeit t
unsigned long icount; //Laufzeit t
unsigned long lastout;

void setup(){
Serial.begin(9600); // initialize the serial port:
attachInterrupt(1,CHAInt,CHANGE); // Interrupt 0 führt CHAInt aus mit wechslende Flanken
}
void loop()
{
if (millis()-lastout>1000){
lastout=millis();
cli();
unsigned long dtout=dt;
unsigned long icountout= icount;
sei();

Serial.print("dt:");
Serial.println(dtout);
//Serial.print("icount:");
//Serial.println(icountout);
}
}

extern volatile unsigned long timer0_overflow_count;

void CHAInt(){
unsigned long Tm = ((timer0_overflow_count<<8)+TCNT0)<<2;
dt=Tm-t;
++icount;
t=Tm;
++icount;
}

Kann mir jemand helfen?

Helfen nicht, aber fragen ( damit du überhaupt ne Antwort kriegst ) :

Ich sehe nicht, wie du die beiden Flanken unterscheidest. Bist du sicher, dass 0 und 1 gleich lang sind ?

Ich schätze mal, dass 8) eigentlich 8 ) heisst und die ganze Zeile eigentlich
  unsigned long Tm = micros(); 
bedeuten soll. Geht es damit auch nicht ?

Mit micros() geht es leider auch nicht.
Die Flanlen werden beim jedem wechsel ausgewertet.
"attachInterrupt(1,CHAInt,CHANGE); "

Vielen Dank für eure Anregungen

Vielen Dank Michael_x für die Anregung,
ich habe CHANGE gegen RISING geändert, werte also nur noch steigende Flanken aus, und das Ergebnis sind die Erwarteten 16393 micros. Also scheint etwas mit der CHANGE Auswertung nicht zu stimmen.
Das bringt mich jetzt ein stückchen weiter.

unsigned long t=0;  //Laufzeit t
unsigned long icount;  //Laufzeit t

müsste so lauten:

volatile unsigned long t=0;  //Laufzeit t
volatile unsigned long icount;  //Laufzeit t

Alle Variablen, die Du in einem Interrupt Handler veränderst, müssen volatile deklariert sein, sonst kann der Compiler Optimierungen durchführen, die Dein Ergebnis verfälschen könnten.