================================================================= = Datenübertragung per Funk mit BILLIGEN Sende/Empfangs-Modulen = ================================================================= 22.05.2005 von Holger Klabunde hk@holger-klabunde.de Es gab eine Menge Anfragen zu diesem NICHT einfachen Thema ! Deshalb hier eine Zusammenfassung meiner Antworten, bzw. "Wie hat Holgi das eigentlich gemacht ?". Die meisten gehen von folgender Grundlage aus: Ich sende, dann kommt ein 1-Pegel aus meinem Empfänger. Ich sende nicht, dann kommt ein 0-Pegel aus meinem Empfänger. Am besten sollte natürlich die serielle Schnittstelle des Prozessors zum Einsatz kommen damit das ganze so schön einfach wird wie bei einer Kabelverbindung. ************************************** * Das vergiss besser gleich wieder ! * ************************************** Warum ? Es wäre schön wenn die Hersteller solcher Funkmodule die gleichen Anforderungen stellen würden. Aber wie immer ist BILLIG angesagt. Bei einfachen Funkmodulen hat man nicht die Möglichkeit dem Absender mitzuteilen das Daten korrekt empfangen wurden. Es geht nur in eine Richtung. Bidirektional geht nur mit Transceivern. Alle Empfangsmodule die ich kenne bleiben nicht auf 0 wenn kein Träger vom Sender da ist. Entweder es kommt rauschen aus dem Ausgang oder ein FSK-Signal. Man muss sich schon etwas Mühe geben um die eigenen Daten aus diesen Störsignalen rauszupulen. Doch auch wenn ein Dauerträger gesendet wird erzeugen die meisten Empfänger irgendwann Rauschen am Ausgang weil sie nicht dazu entworfen wurden Gleichspannungssignale zu übertragen. Wenn man jetzt die serielle Schnittstelle zum empfangen benutzt, würde dieses Rauschen einen Datenstrom mit zufälligen Werten produzieren. So ganz nebenbei kann man den Prozessor mit solchen Empfängern auch nicht aus dem Sleep Modus aufwecken wenn eine Übertragung kommt. Der würde dauernd aufwachen. Die einfache Sendemethode Träger=1, kein Träger=0 funktioniert also nicht besonders gut. Besser ist eine Manchester Codierung. Die Information wird dabei nicht durch einen Pegel, sondern einen Pegelwechsel übertragen: ¯|_ = 0 Bit _|¯ = 1 Bit Das kann man natürlich auch umgekehrt definieren. Die Flanke sitzt genau in der Mitte des Bits. Jedes Bit hat eine konstante Breite. Vorsicht ! Hinzu kommen noch Flanken die den gewünschten Flankenwechsel vorbereiten. Also nicht JEDER Pegelwechsel enthält eine Information. Beispiel 0 1 1 0 0 (0-1 stehen über der auswertbaren Flanke) ¯|__|¯|_|¯¯|_|¯|_ Beim Manchester Code werden mehrere Nullen durch ständige Pegelwechsel übertragen: 0 0 0 0 0 0 ¯|_|¯|_|¯|_|¯|_|¯|_|¯|_ ........... Vorteil: Es sind immer Pegelwechsel da und der Empfänger produziert KEIN Rauschen (solange er in Reichweite ist !). Das nächste Problem: Wie erkenne ich den Anfang meiner Daten ? Nehmen wir noch einmal das Beispiel von oben: 0 1 1 0 0 (0-1 stehen über der auswertbaren Flanke) ¯|__|¯|_|¯¯|_|¯|_ Wie man sieht können Puls- und Pausenpegel maximal eine Bitzeit lang sein. Wenn ein Puls oder eine Pause länger ist als eine Bitzeit hat man einen Bitfehler. Bei meinen Programmen benutze ich ein zu langes Bit um den Anfang meiner Daten zu erkennen. Ein gewollter Bitfehler als Startbit: | V _|¯|_|¯¯¯|__|¯|_|¯¯|_|¯|_ Wenn man diesen Bitfehler gefunden hat kann man anfangen die Daten zu empfangen. Man tastet die Übertragung einfach in festen Zeitabständen mit Hilfe eines Timers ab. Jedes Bit hat ja konstante Breite. Pro Bit werden zwei Abtastungen vorgenommen. Eine vor der Flanke und eine hinter der Flanke. Idealerweise 1/4 Bitzeit vor und hinter der Flanke. Wenn man zu dicht an die Flanken kommt besteht die Gefahr eines Bitfehlers. Wenn man zu viele Bits an einem Stück überträgt rutscht die Abtastung irgendwann über die Flanken. Mehr als 4 Bytes sollte man deshalb nicht an einem Stück übertragen. Jede Abtastung wird auf Bitfehler geprüft. Nur 01 und 10 dürfen vorkommen. 00 und 11 stellen Bitfehler/Störungen dar. Dann wird die Abtastung bei mir komplett neu gestartet. Wenn man hohe Reichweiten erzielen will kommt man nach meinen Erfahrungen nicht darum herum die Daten mindestens zweimal zu übertragen. Meine Programme akzeptieren zur Sicherheit einen Code nur wenn er zweimal empfangen wurde. Wenn mehrere Wände im Weg sind kann es erforderlich sein die Wiederholrate auf wesentlich mehr als zwei Übertragungen zu erhöhen. Ich hatte schon Fälle wo man nur mit 30 Wiederholungen zum gewünschten Ergebnis kam ! Letzter Tip: ============ Ein gutes Zweikanal-Speicheroscilloscpe ist die Mindestausstattung um drahtlose Übertragungen zu programmieren. Ohne Oszi wird die Fehlersuche zum Ratespiel !