PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : HFS 300 und HFS 301 Funkübertragung



RCO
02.11.2004, 13:55
Ja ein weiterer Thread zu dem Thema Funk.
Liegt aber einfach daran, dass ich mittlerweile einige dieser Dinger von ELV besitze, und sie nicht einfach in die Tonne kloppen will.
Mein Problem besteht darin, dass ich trotz der ausgeschriebenen "8 dBm" keine wirklich hohen Reichweiten mit diesen Dingern erziehle.
Deshalb würde ich gerne wissen, wie ich das ganze optimieren könnte.
Meine bisherige beschaltung:

Sender HFS 300:
Sowohl Data-Input als auch die positive Spannungs werden gemeinsam geschaltet mit hilfe eines BC548C und über den TX meines AVRs mit 2400 BAUD.
Empfänger: HFS 301:
Einfach an Masse und VCC (5V) und Data-Out an RX.

Was hier schon nicht ganz optimal ist, ist die Übertragungsrate von 2400 BAUD, da eigentlich nur Signale bis 2000 Hz übertragen werden, allerdings funktioniert das ganze bei 1200 Baud auch nciht besser.
2. Sender wird mit 5 statt 3V betrieben ;-)

Im Datenblatt stand, das man bei serieller Übertragung den Kondesnator c9 gegen einen anderen (680nF) austauschen soll. Jetzt weiß ich nicht, ob es eine weitere Veränderung was bringen würde, alledings funktiniert es ohne diese Veränderung kaum, eher garnicht!

Ich fürchte, dass vermutlich niemand hier Erfahrung mit dieser Art von Modulen hat, aber ich wollte mal nix unversucht lassen.

MFG Moritz

x-ryder
02.11.2004, 14:30
Hi,

Ich bekomme die Teile nächstens auch und ich weiß zwar nix so direkt darüber aber ich könnte mal mitausprobieren...

Martin

RCO
02.11.2004, 16:08
Wie du bekommst die Teile, hast du so nen Bausatz, oder hast du die Einzelnd bestellt?

x-ryder
02.11.2004, 17:07
Ne ich hab die ausm Thread von Verkaufen/Kaufen/Jobs gekauft (nur Funkmodule).

35 Euro für ne Bidirektionale Funkverbindung.

Aber müsste man nicht eher (um die Baudrate bei 2400baud erhöhen zu können) den Kondensator verkleinern?

Martin

RCO
02.11.2004, 17:40
Ich hab keine AHnung, was der Kondesnator bewirkt, aber ich kann mal schreiben, was im beigelegten Blätchen dazu steht:


Im Auslieferungszustand ist das Empfangsmodul auf eine möglichst kurze einschwingzeit optimiert (ca. 25 ms), womit der gepulste Betrieb in Verbindung mit uC-systemen möglich ist. Die untere Grenzfrequenz beträgt 2 kHz.
Soll das Empfangsmodul in Verbindung mit Encoder/Decoderbausteinen wie [...] betrieben werden, muss die untere Grenzfrequenz reduziert werden, da sich im Datenprotokoll dieser Bausteine längere Pausen befinden. Dazu ist der Kondensator C9 vorischtig gegen den beiliegenden 680nF-Kondensator auszutauschen. Damit reduziert sich die untere Grenzfrequenz auf ca. 50 Hz.

Tatsache ist allerdings, dass die Übertragung bei dem System mit dem ausgetauschten Kondensator immerhin einigermaßen klappt, bei den anderen eben schlecht bis garnicht. Könnte natürlich sein, dass 2 kaputt un der eine heil sind. Könnte auch sein, dass man die dann irgendwie initialiseren muss...
Leider weiß ich nicht, welchen Wert der kondensator im Auslieferungszustand hat, um sagen zu können, ob man ihn vergrößert oder verkleinert hat :-(

MFG Moritz

x-ryder
02.11.2004, 18:00
Ich bekomme das warscheinlich morgen, also kann ich dann mal sagen wie das funzt normalerweise mit der reichweite und so bei 2400baud.

Das Typ von dem ich das habe hat die alle extra nochmal mit nem Oszi getestet!!!

Martin

stageliner
02.11.2004, 18:01
Hallo,
ich will ja keinen Pesimismus verbreiten, aber bei einer maximalen Bandbreite von 2000 Hz und dazu noch AM scheint mir eine Datenübertragung von 1200 Baud schwer realisierbar. Diese Dinger sind zwar schön klein und kompakt aber eben nur für einfache Datenübertragung mit kleiner Geschwindigkeit gebaut. Es würde mich freuen wenn ich mich irre!!!!!
Wenn ihr einen Oszi am Datenausgang des Empfängers anschliesst und am Dateneingang des Senders mit euerem Controllersystem ein Rechteck Sgnal anlegt dessen Frequenz ihr verändern könnt, werdet ihr sehr schnell sehen wo die Grenze der Module ist. (Kanal 1 Sendesignal Kanal 2 Empfangssignal) Eventuelle Dateninvertierung und Verzögerungen sind dann auch zu sehen
RCO, du schreibst, dass du die Versorgungsspannung gemeinsam mit den Daten schaltest. Ist es denn nicht so, dass erst die Versorgungsspannung eingeschaltet wird und dann über die Datenleitung moduliert wird?
Stageliner

x-ryder
02.11.2004, 18:06
das mit dem gemeinsam schalten finde ich denn doch auch merkwürdig aber was die baudrate betrifft liegst du echt falsch.

bei 1200 baud iss das ne frequenz von 1,2kHz und das verträgt das teil sicherlich noch.

Martin

Dino Dieter
02.11.2004, 18:27
Hallo

Das Modul läßt ja eine Modulationfrequenz von 2 KHz zu. Da du deine Daten aber mit Manchester Code aufbereiten solltest, sonst wirst du keine vernüftigen Übertragungen zustande bringen, sinkt die Nettodatenrate nochmal um 50 % . Dann kommt noch eine Prämbel zum einschwingen des Empfängers hinzu, eine Fehlerüberprüfung wäre auch nicht schlecht.

Also wirst du auf eine Datenrate von vielleicht 600 BAUD kommen. Ist nicht viel, aber reicht doch für die meisten Fälle vollkommen aus. Wäre froh, wenn ich so schnell schreiben könnte.

Siehe auch folgeneden Link.

http://home.t-online.de/home/holger.klabunde/rc5send.htm#rc5_433mhz

Ein 3 Volt Modul, mit 5 Volt zu betreiben, ist auf die Dauer auch nicht der bringer.

MFG
Dieter

RCO
02.11.2004, 22:08
@ Dino-Dieter ;-):
Homepage kenne ich schon, hab sogar schon mal mit dem Holger e-mail-Kontakt wegen der Module aufgenommen, allerdings ist das schon ne Zeit her und mitlerweile bin ich doch etwas reicher an Wissen.

@all:

Also es ist ja nicht so, dass es mit 2400 Baud nicht funktioniert, es läuft schon, und ich ewrde jetzt gleich nochmal ein wenig testen. Die Daten kommen schon korrekt an, nur leider etwas selten, aber dafür, dass ich einen Buchstaben sende, 1 sec. pause mache und wieder sende, kommt doch immerhin noch was an. Ich muss auch sagen, dass es nach dem Zusammenlegen von Versorgungsspannung und Datensignal besser klappt. Übrigens macht einer im "Billig-Funk-Set von Conrad" o.ä., genauso. Zwischen der Datensicherheit von 1200 zu 2400 Baud konnte ich nicht viele Unterschiede feststellen.

Ne Manchesterkodierung wäre sicher was feines, aber wie erzeugen?

Aber bevor ich hier noch irgendwas falsches erzähle, warte ich lieber erstmal ab, auf nen andren Erfahrungsbericht.

MFG Moritz

x-ryder
02.11.2004, 22:42
Ne Manchesterkodierung wäre sicher was feines, aber wie erzeugen?

so: (es geht sogar schon getestet)


$regfile = "m8def.dat"
$crystal = 7372800

Declare Function M2b(byval Minput As Word) As Byte
Declare Function B2m(byval Binput As Byte) As Word

Dim W As Byte
Dim W2 As Word
Dim I As Byte
Dim I2 As Byte
Dim S As String * 16

W = M2b(&B0110011001100110)
W2 = B2m(&B01010101)

Function M2b(byval Minput As Word) As Byte

For I = 0 To 15 Step 2
I2 = I / 2
Select Case Minput.i
Case 1 : M2b.i2 = 0
Case 0 : M2b.i2 = 1
End Select
Next

End Function

Function B2m(byval Binput As Byte ) As Word

For I = 7 To 0 Step -1
Select Case Binput.i
Case 0 : S = S + "01"
Case 1 : S = S + "10"
End Select
Next

B2m = Binval(s)

End Function

End

jaja ich fühl mich schon mies wegen dem benutzten String aber liefert mir ne bessere Möglichkeit ich hatte nu kein bock mehr :cheesy:

Martin

RCO
02.11.2004, 22:51
:shock: Soviel kappier ich davon leider nicht, noch nciht.
Also ich habs jetzt mal mit folgenden Scripts getestet:


$baud = 1200
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2 , E = Portb.3 , Rs = Portb.4 ' Natürlich so wie es wirklich angeschlossen ist (4-Bit-Modus)
Config Lcd = 16 * 2
Config Portb = Input
Ein Alias Portb.0
Initlcd
Display On
Cursor Off
Cls
Dim A As Byte

Do
Home
A = Waitkey()
If A = 49 Then
Lcd "IN: 1"
End If
If A = 50 Then
Lcd "IN: 2"
End If
Loop


$baud = 1200
Do
Print "1"
Print "1"
Waitms 200
Print "2"
Print "2"
waitms 200
Loop

Das ganze funktioniert jetzt, da doppeltes senden etc. ganz gut, immerhin empfange ich das signal in der Etage über mier und auf meiner Etage, jedenfalls bis auf zwei stellen die vermutlich einfach ungünstig liegen, weil man dann schräg durch ne Stahlbetonmauer durch muss. Außerdem muss man sagen, dass mein Zimmer eine art Funkloch ist ;-)

wenn man die Signale jetzt 5mal sendet würde das für ne Fernbedienung reichen, aber leicher nicht für ne vernünfitge/stabile serielle verbindung.

Leider habe ich das Manchester-script noch nciht ganz kappiert, aber werde mich Morgen nochmal damit beschäftigen.

MFG Moritz

RCO
04.11.2004, 11:44
OK hab mir deinen Code nochmal angesehen und jetzt auch kappiert wie er arbeitet, hätte ich selber nie hinbekommen, deshalb danke.
Aber wenn man es sich mal genau anschaut merkt man doch, dass es eigentlich einfach ist, wenn man die ganzen befehle kennen würde...

Danke, und berichte mal wie es um deine Übertragung steht.
Ich habe nochmal mit dem Autor der Seite, die von Dino-Dieter empfohlen wurde geredet und der hat mir dann gesagt, dass er einen Asutausch des KOndensators nciht empfiehlt, und das er es auf 75 Meter inklusive Wände etc. gebracht hat (Rekord), allerdings mit häufigem senden, der gleichen Daten, klingt vielversprechend.

Ich werde dein Prog mal ausprobieren, aber vermutlich erst am Wochenende, keine Zeit...

MFG Moritz

RCO
04.11.2004, 14:18
Hm, jetzt stellt sich mir wieder ne neue Frage. Ich weiß jetzt zwar, wie ich aus nem Manchester Word nen Byte mache, aber wie bringe ich den AVR dazu dieses eine Word aus dem ganzen geflackere rauszulesen?

Vermutlich muss ich ja erst ein byte einlesen, dann ganz schnell das nächste, aber wie/wann soll ich damit anfangen?

MFG Moritz

(Ja, im Moment für ich Selbstgespräche ;-) )

x-ryder
04.11.2004, 14:32
könnte man, wenn man den sender dazu bringt ein langen impuls vorauszuschicken, mit bitwait machen

Martin

RCO
05.11.2004, 08:51
Das habe ich schonmal gehört, dass man dann absichtlich einen Bit-Fehler produziert, allerdings kann ich mit darunter nix vorstellen, wie würde man sowas umsetzen?

x-ryder
05.11.2004, 17:40
du schickst: 1 (normal) und dann dein signal mit manchester

und beim empfänger guckste mit nem int am besten wann am modul ne 1 anliegt und empfängst ab dann mit input z.b.

06.11.2004, 10:59
Beim Empfang von Funksignalen besteht das Problem, das Nutzsignal vom Rauschen zu unterscheiden. Zum Verständnis: Wenn man mit einem Radio ein Band (UKW manchmal auch als FM bezeichnet, oder KW oder MW manchmal auch als AM bezeichnet) manuell durchläuft, hört man manchmal nur Rauschen, oder Rauschen überlagert mit einem Sender oder auch nur einen Sender.

Zum Erkennen des Nutzsignals kann man den Abstand der Flanken messen. Liegt der Abstand der Flanken innerhalb einer Toleranz, ist das Signal ein Nutzsignal, sonst ein Rauschen.

Die Erkennung des Nutzsignals kann per Polling erfolgen oder über Interrupt (Interruptauslösung, wenn Empfängerausgang eine Flanke ausgibt).

Leider kenne ich nur damit aus, wie man mit einem normalen Port des AVRs eine Funkstrecke betreibt. Dafür läuft die Funkstrecke mit jeden beliebigen AVR! Im folgenden beschreibe ich, wie man mit normalen Ports eine Funkstrecke aufbaut:

Du mußt ein Protokoll festlegen. In dem festgelegt wird, aus wievielen Bits das Paket besteht, ob Start- oder und Stopbits verwendet werden, ob Paritätsbits verwenden werden, wenn ja in welcher Bitposition, ob eine Prüfsumme verwendet wird usw. Die Bits werden manchesterkodiert.

Anhand des Protokolls kann du den Empfänger sagen, was er mit den einzelnen gültigen Bits machen soll.

z.B.:

Ein Paket besteht aus 12 Highs, einem Startbit und einem Datenbyte.
Die 12 Highs dienen als Einschwingung.
Das Startbit ist ein Low.
Das Datenbyte wird so festgelegt:
MSB LSB
Bit Bit Bit Bit Bit Bit Bit Bit
7 6 5 4 3 2 1 0
--------------------------------------> Zeit

Zuerst wird also das MSB gesendet.


Der Empfängerausgang von ELV HFS 301 ist 1bittig. Man zählt die Highs, die aufeinander folgen. Sind es 10 oder gar 12, dann könnte das folgende Bit ein Startbit sein. Ist dieses Bit ein Low, so ist man einigermaßen sicher, dass man das Startbit erkannt hat. Die folgenden gültigen Bits schiebt man in ein 8Bit-Register. Beachte, das 1. Byte ist MSB. Ist das Register voll, hat man dann das Datenbyte, das man an ein Port schicken könnte.

Zum Thema Reichweitenoptimierung:
Fakt 1: Je größer der Abstand zwischen Sender u. Empfänger, umso größer das Rauschen;
Fakt2: Je schwächer das Funksignal, umso schwieriger ist die Einschätzg des Empfängers, was Nutzsignal und was Rauschen ist.
Fakt3: Funkbedingungen sind nicht immer gleich, weil das Rauschen ein chaotisches Signal ist.


1. Möglichkeit
Paket viele Male senden. Irgendwann wird der Empfänger ein Paket erfolgreich empfangen. Fragt sich nur wann.

2. Möglichkeit
Den Flankenabstand vergrößern. Senkt aber die Datenrate.

3. Möglichkeit
Die Toleranzgrenzen des Empfängers erhöhen. Erhöht aber die Wahrscheinlichkeit, Datenmüll zu empfangen. Abhilfe: Verwenden von Paritätsbits, Stopbits und Prüfsummen.

Ich hoffe mit meinem kleinen Beitrag, Dir geholfen zu haben.

MfG

Wolfram Hubert

RCO
06.11.2004, 14:48
Danke, das hört sich in der Theorie ja alles schön an, aber wie kann ich das umsetzen. Mir wäre natürlich schon viel daran gelgen die RS232-Schnittstelle nutzen zu können und nicht ein komplett neues Datenprotokoll mit Zeitfenster etc. schreiben zu müssen, das kann ich (noch) nciht.

Eine 1 zu senden und diese über einen Interrupt auszuwerten klingt logisch, aber die 1 muss doch eine bestimmte länge haben, ich will doch cniht bei jeder ein (schließlich flackert das ganze ja) einen Interrupt auslösen und vor allem, wie erkenne ich, dass diese ein eine "richtige" ist. Dadurch, dass sie besonders lang ist? Wie kriege ich des dann hin, im INterrupt die Länge eines Singans zu ermittlen und bei entsprechender länge sofort die nächsten 2 Bytes einzulesen?

MFG Moritz

RCO
08.11.2004, 16:43
Sorry, wenn ich jetzt nerve, aber ich denke viele Leute brauchen mal eine arbeitende PrintToManchseter... Funktion, also bitte helft mir.

Würde es so funktionieren (Empfänger)?
Und würde Bitwait nicht ständig ein Bit beim Flackern empfangen?


$baud = 2400

'#######################
'# LCD-Konfigurationen #
'#######################

Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2 , E = Portb.3 , Rs = Portb.4 ' Natürlich so wie es wirklich angeschlossen ist (4-Bit-Modus)
Config Lcd = 16 * 2
Initlcd
Display On
Cursor Off
Cls

'#######################
'# Variablen #
'#######################

Declare Function M2b(byval Minput As Word) As Byte
Dim A As Word
Dim B As Byte
Dim I As Byte
Dim I2 As Byte

'#######################
'# Hauptprogramm #
'#######################

Do
Home
Bitwait Portd.1 , Set
A = Inkey()
If A > 0 Then
B = M2b(a)
Lcd "IN: " ; Chr(b)
End If
Loop

'#######################
'# Funktion(en) #
'#######################

Function M2b(byval Minput As Word) As Byte

For I = 0 To 15 Step 2
I2 = I / 2
Select Case Minput.i
Case 1 : M2b.i2 = 0
Case 0 : M2b.i2 = 1
End Select
Next

End Function
End

MFG Moritz

RCO
08.11.2004, 16:52
Nein, leider klappt es nicht, es kommt die ganze Zeit nur Müll an.
Den Fehler im oberen Script hab ich verbessert, nicht POrtD.1 sondern D.0

MFG Moirtz

x-ryder
08.11.2004, 20:36
Dann musst du aber was falsch getestet haben bei mir klappts inner simu

RCO
09.11.2004, 09:11
Wie sähe denn ein entsprechendes Senderscript aus?
und noch eine Anmerkung zum Code, vielleicht wäre es sinnvoller statt:


Bitwait Portd.1 , Set

Bitwait Portd.1 , Reset

zu benutzen, denn sonst könnte es passieren, dass versucht wird den Eingang zu lesen, obwohl das Bit noch garnicht zurückgesetzt ist.

Allerdings liefert mir das ganze bei resset garnix.
Als Sender habe ich jetzt mal sowas benutzt:



$Baud = 1200
ddrb = 11111111
Dim A as word
A = &b101010010110101001 'Ergibts als Byte dann den CHR 1 oder 2
do
set Portb.1
waitms 10
reset portb.1
Print A
wait1
loop


Leider klappt das ganze nicht mla mit nem normalen Verbindungskabel...

MFG Moritz