Hallo
Der TSOP benötigt ca. 6-10 Pegelwechsel der Trägerfrequenz bevor er seinen Eingang umschaltet. Wenn ich mich recht erinnere wird sein Ausgang Low wenn das Trägersignal erkannt wird. Hier wird vermutlich nicht viel Unterschied zwischen den Lesungen entstehen können:
If Tsop = 1 Then
If Tsop = 1 Then
Ich löse das meist mit einer Hilfsvariablen die in der ACS-Funktion auf die Anzahl der zu wartenden Schwingungen gesetzt und in der ISR runtergezählt wird:
Code:
$regfile = "m128def.dat"
$framesize = 42
$swstack = 32
$hwstack = 32
$crystal = 14745600
$baud = 19200
Tsop Alias Portd.2
Config Tsop = Input
Ir Alias Porte.3
Config Ir = Output
Irledleft Alias Portd.3
Config Irledleft = Output
Irledright Alias Portd.5
Config Irledright = Output
Irledleft = 1
Irledright = 1
Declare Sub Acslow()
Declare Sub Acsmid()
Declare Sub Acshigh()
Declare Sub Acsoff()
Declare Function Acsleft() As Byte
Declare Function Acsright() As Byte
Dim Acspwm As Byte
Dim Pulsanzahl As Byte
Config Timer2 = Timer , Prescale = 8
Acspwm = 225
Timer2 = Acspwm
On Ovf2 On_ovf2
Enable Ovf2
Enable Interrupts
Call Acshigh()
Do
If Acsright() = 0 Then
Print 0
End If
Loop
End
Sub Acslow()
Acspwm = 225
End Sub
Sub Acsmid()
Acspwm = 228
End Sub
Sub Acshigh()
Acspwm = 231
End Sub
Sub Acsoff()
Irledleft = 1
Irledright = 1
End Sub
Function Acsleft()
Irledleft = 0
Irledright = 1
Pulsanzahl = 20
While Pulsanzahl > 0
Wend
Acsleft = Tsop
Irledleft = 1
Irledright = 1
End Function
Function Acsright()
Irledleft = 1
Irledright = 0
Pulsanzahl = 20
While Pulsanzahl > 0
Wend
Acsright = Tsop
Irledleft = 1
Irledright = 1
End Function
On_ovf2:
Timer2 = Acspwm
Toggle Ir
If Pulsanzahl > 0 Then Pulsanzahl = Pulsanzahl -1
Return
Das ist allerdings ungetestet. Ob der TSOP mehr Impulse benötigt, wenn die Frequenz nicht genau passt, kann ich nicht sagen. Wenn ich mich nicht verrechnet habe sollten ca. 25 Timertakte zwischen den ISR-Aufrufen etwa 36kHz ergeben.
Gruß
mic
Lesezeichen