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:
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!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
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![]()







Zitieren
Lesezeichen