Ich gehe mal davon aus, dass Du ein Empfänger-Signal auswertest, d.h. der zu messende Impuls ist High, und dazwischen kommen etwa 20ms Low.

Dadurch, dass Du als Interrupt-Kriterium "Change" gewählt hast, wird der Timer0-Wert nicht nur nach der H/L-Flanke überprüft, sondern eben auch nach jeder L/H-Flanke, d.h. auch nach jeder Pause. Und die sind ja nun mal deutlich länger als 2ms!

Versuch´s doch mal so:


Code:
...
...
Config INT0=Change
...
...


Servowert:
 
 If PINB.2=0 then
    If Timer0 < 9 Then               
       Portb.4 = 1                   
       Portb.3 = 0
    Else
       Portb.4 = 0
       Portb.3 = 1
    End If                                                             
 End if 
         
Timer0=0
Return
Damit wird die Überprüfung nur nach einem H/L-Wechsel ausgeführt, d.h. nur am Ende des eigentlichen Impulses. Sicher führen noch 999 andere Wege nach Rom, aber das wäre am nähesten an Deinem Code dran!

P.S.: In Deiner Anwendung mit dem Mega8 und LCD-Display dürfte genau das selbe passiert sein: Die Variable A hatte abwechselnd immer den Wert der Impulslänge und den der Pausenlänge. Den Wert der Pausenlänge hatte sie aber nur während des Impulses, d.h. für 1-2ms. Und das ist definitiv so kurz, dass es weder ein LCD anzeigen noch das menschliche Auge wahrnehmen kann. Deshalb hat man nur das gesehen, was die meiste Zeit angezeigt wurde - die Impulsdauer.

Ich hoffe, Du hast trotz meiner vielleicht etwas wirren Worte verstanden was ich meine