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
Lesezeichen