PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitfolge aufzeichnen



jojo150272-A
25.06.2008, 11:29
Hallo Leute,

ich möchte eine Signalfolge in Binärer Form aufzeichnen.

Das eine Signal kommt von einem TSOP 1736, dass will ich aufzreichnen
als reine Bitfolge (101100010101.....). Die Geschwindigkeit ist
vermutlich 9600. Wie kann ich das Signal als Bitfolge (60-70 Bit lang)
aufzeichnen ? Wie bekomme ich die Geschwindigkeit des Signal herraus, bzw. wie lange die einzellnen Impulse sind.

Wie stelle ich das an? ](*,)

Als zweites habe ich einen Mikrocontroller der auch ein Signal wie oben
beschrieben sendet. Wie stelle ich das bei dem an ?

Genau so oder muß ich da was anderes machen ?

Ich verwende ein Atmel 2561 und programmiere in Bascom.


Ich brauche eure Hilfe. Ich weiß net mehr weiter.

Gruß Jörg

PS: Ich freue mich über jede Hilfe. Danke schon mal =D>

for_ro
25.06.2008, 18:40
Das eine Signal kommt von einem TSOP 1736, dass will ich aufzreichnen
als reine Bitfolge (101100010101.....). Die Geschwindigkeit ist
vermutlich 9600. Wie kann ich das Signal als Bitfolge (60-70 Bit lang)
aufzeichnen ?

Hallo,
du musst in jedem Fall die Länge der High/Low Phasen auswerten.
Wenn es sich um die Signale einer Fernbedienung handelt, musst du die Zeiten entsprechend der verwendeten Codierung (RC5, SIRCS...) umwandeln.
Eine Baudrate von 9600 ist eher unwahrscheinlich. Ein TSOP1736 empfängt eine Trägerfrequenz von 36KHz und du brauchst für einen Puls mindestens 6 Cycle mit mindestens ebenso langer Pause. Dies entspricht einer max. Übertragung von 3000 baud. Die meisten Fernbedienungscodes kommen nicht mal auf 1000 baud.

Gruß

Rolf

jojo150272-A
25.06.2008, 19:59
Hallo Rolf,

es handelt sich um kein normales Fernbedienungssignal. Es ist ein Sonderkram von einem Gerät, mit nem USB zu RX/TX umsetzer kann ich einige Protokolle mitlesen, aber da sie net in den RS232 Standard passen kommen die Signale manchmal Verstümmelt an. Deshalb möchte ich auch dieses Signal aufzeichnen und dann auch später mal senden.

Muß ich dafür einen Interupt verwenden ? Gibt es dafür ein Code Beispiel, oder kannst du mir eine Hilfestellung geben ?


Gruß Jörg

PS: Der sich auf die Lösung freut. =D>

for_ro
25.06.2008, 21:51
Hallo Jörg,
welchen Controller hast du denn zur Verfügung und kannst du bei dem einen externen Interrupt-Eingang nutzen?
Dann könnte ich dir aus einem FB-Empfänger, den ich mal gemacht habe, ein Stück rausschneiden, welches die Zeiten in ein Array schreibt und dann ausgibt.

Gruß

Rolf

PS: Puuh, noch mal Glück gehabt, wir sind im Endspiel.

jojo150272-A
26.06.2008, 09:21
Hallo Rolf,

ja da haben wir mal wieder Glück gehabt. Jetz wollen wir aber auch am Sonntag gewinnen. O:)

Ich verwende einen Atmega 2561, bei dem auf dem Port B das Display angeschlossen ist. Ich hätte also noch was frei in sachen Interupt.

Ich möchte das Signal so aufzeichnen das ich den Takt, sowie die Binäre folge des Signals aufzeichnen kann.

Wie gehe ich dieses Problem den an, wäre schon für einen Tip dankbar.

Gruß Jörg

PS: Der am Sonntag Europameister wird. O:)

for_ro
26.06.2008, 20:35
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:


$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.