Ich weiß nicht, was du mit Takt meinst. Hier kommen ja nicht zwei Signale wie bei I2C (SCL und SDA). Es kommt nur eine Bitfolge, die irgendwie getaktet ist. Bei RS232 muss man die Taktrate kennen, damit man die Konvertierung durchführen kann. Wenn hier ein ähnliches Signal kommt, bleibt dir höchstens, die Längen der High und Low Zeiten zu analysieren.
Wenn du keine Ahnung hast, was da kommt, würde ich so vorgehen:
Ausgang des TSOP1736 an einen externen Interrupt Eingang des 2561 legen, z.B. PinE.7.
Dann etwa so:
Code:
$regfile = "m2561def.dat" ' specify the used micro
$crystal = 16000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Dim Impuls_laenge(1000) As Byte
Dim Code_found As Byte
Dim I As Word
Dim Impuls As Word
Dim Laenge As Word
Config Timer0 = Timer , Prescale = 8 'hier den Timer eintragen (8-bit)
On Ovf0 Tim0_isr
Enable Timer0
Const Timer0_startwert = 56 'bei mir 16000000/8/(256-56) entspricht 10Khz
Timer0 = Timer0_startwert 'Auflösung reicht und gefundene Werte entsprechen immer 100µs
Config INT7 = Change
On INT7 Int7_isr
Enable Interrupts
Enable INT7
Impuls = 1
Code_found = 0
Do
If Code_found = 1 Then
Code_found = 0
For I = 1 To Impuls
Print Impuls_laenge(i)
Next I
Impuls = 1
End If
Loop
End
Int7_isr:
Impuls_laenge(impuls) = Laenge
If Impuls < 1000 Then
Incr Impuls
End If
Return
Tim0_isr:
Timer0 = Timer0_startwert
Incr Laenge 'bei jedem Überlauf um 1 erhöhen
If Laenge = 500 Then 'Kein Impuls für 50ms
Code_found = 1 'Auswertung im Hauptprogramm starten
End If
Return
D.h., du lässt einen Timer mit 10KHz überlaufen und zählst die Anzahl (Laenge).
Kommt ein Flankenwechsel am INT7, speicherst du die Anzahl in einem Array. Wenn für mindestens 50ms kein Flankenwechsel kommt, gibst du alle Wert aus und setzt alles auf 0 zurück.
Lesezeichen