Hallo

ich hab mir jetzt das Datenblatt vom Mega16 nicht angeschaut, aber ich nehme mal an Int0 ist PD3?
Dann zuerst mal was soll dieser Teil:

Code:
char cSREG;
 cSREG = SREG; // Statusregister puffern in Variable cSREG //

SREG = cSREG;    // Statusregister aus Variable cSREG retten //
du änderst das Statusregister doch gar nicht? warum also diese Zwischenspeicherung. Außerdem kann (normalerweise?) eine ISR doch eh nicht von einem anderen Interrupt unterbrochen werden (oder hab ich da was falsch verstanden?).

Dann zu deinem eigentlichen Problem. Du benutzt ja eine Variable, die du hoch bzw. runter zählst.
Ich würde es so machen (bzw. habe es so gemacht). Eine Variable, die die Impulse zählt und eine zweite, die die Richtung dazu angibt. (ich habe das ganze für eine Motorenregelung benutzt, wobei der Regler mit 100Hz aufgerufen wurde, sodass die kleine Ungenauigkeit (wenn der Motor von einer Laufrichtung zur nächsten Wechselt) nicht so schlimm ist).

Machs doch einfach so: Setzt den Interrupt Port auf steigene Flanke. Dann zählst du bei jedem Interrupt die Zählvariable hoch und überprüfst ob der zweite Port high oder low ist. Jenachdem setzt du dann deine Richtungsvariable auf 1 oder 0 (oder wie auch immer). Alternativ um die Genauigkeit zu steigern (von der Impulsanzahl) kannst du natürlich auch den Interrupt bei steigender und fallender Flanke auslösen, beide Impulse zählen. (du könntest sogar noch den 2. Port als Interruptport nehmen und von diesem auch noch die Impulse zählen. dadurch hast du dann insgesamt viermal so viele Impulse pro Motordrehung.)