Forum: Mikrocontroller und Digitale Elektronik FSK-Funkübertragung, Startsequenz erkennen


von Stefan (Gast)


Lesenswert?

Hallo,

ich möchte für einen (schon vorhandenen) 433MHz-Sender einen Empfänger
bauen, genauer gesagt die Basisbanddekodierung dazu (das eigentliche
Empfangen übernimmt ein Standardmodul von den üblichen Verdächtigen).
Der Sender sendet in FSK, zuerst einige Male abwechselnd 0 und 1, dann
kommt ein 16-bit Startsignal, dann die Daten (feste Länge) plus CRC.
Eine 0 wird direkt als Frequenzerniedrigung und eine 1 als
Frequenzerhöhung übertragen. Alles soweit kein Problem, ich überlege
mir nur gerade ein möglichst effektives Verfahren, das Startsignal zu
erkennen. Ich weiss noch nicht, ob das Ganze letztlich in einem uC oder
in programmierbarer Logik umgesetzt wird, aber prinzipiell ist meine
erste Idee: Die Rohdaten werden mit einem vielfachen des Sendetakts
abgetastet (z.B. 4 fach), und in ein Schieberegister geschoben, das
ebenso mit dem 4-fachen Takt schiebt. Die Daten im SR werden bitweise
mit einem konstanten Bitfeld UND-verknüpft, das das Startsignal enthält
(natürlich auch "vervierfacht", also z.B. aus 011 wird 0000 1111
1111). Nun werden in der UND-Verknüpfung einfach die gesetzten Bits
gezählt. Überschreitet die Anzahl einen festgelegten Wert, gilt das
Startsignal als erkannt, und man kann die weiteren Bits durch Abtastung
nach jeweils 4 Takten empfangen. Kann das so funktionieren? Geht es auch
noch intelligenter/einfacher?

Gruß,
Stefan

von Martin (Gast)


Lesenswert?

Hallo,

ich mache die 0-1 Erkennung immer mit einem Timer - da kannst du ganz
gut eine gewisse hysterese einbauen (zB alle impulsbreiten von
80..120us). Dann werden die 0-1 Folgen in einen Ringbuffer geschrieben
und dort wird ständig nach der Präambel (01010101) und dem Startwert
gesucht (zB 3F). Dann die Daten aufzeichnen und CRC prüfen bzw
Fehlerkorrektur anwenden (das spart ne Menge doppelter Übertragungen
bei einer duplex Verbindung).


Martin

von Stefan (Gast)


Lesenswert?

Hallo Martin,

danke für deine Antwort. Also wenn ich es recht verstanden habe, misst
du mit nem Timer einfach immer die Zeiten zwischen zwei Pegelwechseln,
schiebst diese dann in nen Ringbuffer und wertest sie aus (mit einer
gewissen Hysterese). Soweit alles klar. Wenn nun die Startsequenz
erkannt wurde, wie liest du die einzelnen Datenbits aus? Den Ringbuffer
weiterlaufen lassen und aus den gemessenen Zeiten die Bits
rekonstruieren?

Gruß,
Stefan

von Martin (Gast)


Lesenswert?

Hallo Stefan,

ich schreibe es mal etwas genauer einfach daher: ich benutze einen
externen int. wenn der nen flankenwechsel macht gucken was im timer
steht. merken und vom letzt gemerkten wert abziehen (überlauf
beachten!). dann feststellen ob es überhaupt ein passender wert ist (zB
500us sind bei mir zuviel. 50us zuwenig). dann nur 01- Folgen im
Ringbuffer speichern (meine telegramme sind 150bit lang da geht es im
kleinen internen ram. so jetzt bei jedem neuen bit gucken ob ein
passendes telegramm im buffer steht (erst nach präambel und
startsequenz suchen. dann crc machen- immer rückwirkend für 150bit).
aber achtung: bei dieser methode hast du eine gewisse verzögerung da du
ja erst alle daten im puffer sammelst.
fürs erste etwas klarer geworden?

Martin

von Stefan (Gast)


Lesenswert?

Hallo Martin,

jetzt ist alles klar, vielen Dank! So werde ich es auch machen.

Gruß,
Stefan

von olli (Gast)


Lesenswert?

hallo,
ich bin ein anfänger und möchte mich mit funkübertragung beschäftigen.
habe schon paar sachen gelesen und gehört.
bin gerade auf eure diskussion gestossen und frage mich wie das mit den
übertragen bzw. mehr mit den startbits funktioniert und worauf es hier
ankommt.wo werden die ganzen befehle gespeichert, bzw die routinen die
das ausführen?
wozu brauche ich diese startbits?
wahrscheinlich um den empfänger zu sagen, dass etwas empfangen werden
soll, klar. verstehe aber jetzt nicht wie martin es mit dem timer meint
bzw. was stefan vor hat. kann mir das jemand erklären, dass ich es
verstehe? bitte, bitte.

was ich bisher für mein verständnis zur funkübertragung gelesen habe
ist die crc geschichte und... worüber ihr spricht ist doch quasi ein
treiber mit hilfe des treibers kann ich dann erst die daten schicken,
nicht wahr?
wo kann ich infos finden wo beschrieben wird wie ich so was kreieren
kann, worauf man achten soll usw.

ach, noch eine verständigungs frage zum crc, habt ihr euch ein eigenen
generator polynom geschaffen oder den 04c11db7 genommen?
kann man dieses polynom einfach nehmen oder muss man ein polynom
erschaffen, das auf die eigenen daten passt, bzw. ist es hardware
abhängig?

mfg
olli

von Martin (Gast)


Lesenswert?

Hallo Olli,

0x04c11db7 ist das Generatorpolynom von CRC32. Ich benutze CRC16.
Und der Rest war einfach zu viele Fragen. Habe auch nicht verstanden
was du mit Treiber meinst.
Ich habe hier kurz meinen Ansatz zur relativ einfachen FSK Decodierung
beschrieben wenn man schon ein passendes HF front end hat welches einem
einen TTL Ausgang zur Verfügung stellt (das ist bei den meisten ISM
Modulen Von Mr C oder Mr Reichelt der Fall).
Vielleicht noch ein kleiner Kommentar zum Senden: unbedingt die
Gleichstromfreiheit beachten und Manchester verwenden. Ich habe das am
Anfang mal nicht getan und dann singt die Reichweite drastisch.


Martin

von Stefan (Gast)


Lesenswert?

Hallo Olli,

hier ne kurze Erklärung zu dem Verfahren:
Die Präambel (010101010-Folge) vor den eigentlichen Daten brauchst du
aus folgendem Grund:
Der Empfänger (egal ob nun FSK, also frequenzmoduliert oder ASK, also
amplitudenmoduliert) liefert intern zunächst einmal ein analoges
demoduliertes Signal. Um daraus digitale Daten zu gewinnen, muss dieser
Analogwert mit einem Vergleichswert verglichen werden. Das macht der
Empfänger mit einem Komparator, an dessen Ausgang die digitalen Daten
rauskommen. Um Störeinflüsse zu verhindern, wird dieser Vergleichswert
durch ein Tiefpassfilter aus dem empfangenen Analogwert gebildet.
Idealerweise soll der Vergleichswert genau in der Mitte zwischen dem
Analogwert für "1" und "0" liegen.
Beispielsweise liefert der Empfänger für "0" 1V und für "1" 4V.
Wird nun einen 0101010101-Folge empfangen, bildet der Tiefpass daraus
den Mittelwert von (1V+4V)/2=2,5V. Durch dieses Folge zu Beginn jeder
Sendung wird also der Vergleichswert fest eingestellt.
Die Startsequenz braucht man, um den eigentlichen Beginn des
Datentelegramms festzustellen (wann kommt das erste Bit der
Nutzdaten?).

Gruß,
Stefan

von Stefan (Gast)


Lesenswert?

Ups, sorry fürs Doppelposting!

Stefan

von olli (Gast)


Lesenswert?

ok,
danke für die informationen und sorry für die fragen, aber ich möchte
das ganze verstehen und bin noch nicht so lange dabei.

also mit treiber meinte ich quasi ein programm, dass das system steuert
bzw. regelt z.b. das mit dem timer (was auch immer der macht) muss doch
irgendwie programmiert werden, oder?
ihr spricht von dekodierung das ist doch bestimmt ein prog das
irgendwas tut, was, weiss ich bis jetzt noch nicht so ganz. könnt ihr
mir vielleicht ein beispiel code zeigen, was da so passiert, ist das
ein prog das die daten verwaltet, sprich puffert usw.? wo wird das prog
ausgeführt...?

ein komperator ist doch ein parallel A/D wandler.
was ich nicht verstehe ist bzw. noch nie von gehört habe ist FSK und
ASK, frequenzmoduliert heisst doch das man die frequenz im rhythmus der
zu übertragenden daten (frequenz), deiner übertragungsfrequenz
verändert, nicht wahr? meine frage wäre wie ihr das anstellt.

mfg
olli

von Martin (Gast)


Lesenswert?

Hallo Olli,

FSK: zB 1200Hz == 1 und 1800HZ == 0.
An die Sender und Empfänger schliesst du einfach einen Mikrocontroller
an. so sieht zB so ein Sender aus:
http://www.stecom.com/datasheet/datasheet_display.php


Martin

von Neki (Gast)


Lesenswert?

Hallo Olli,

so wie es aussieht solltest Du Dich vielleicht erst mal mit den
Grundlagen der Microkontrollerprogrammierung ausseinander setzen.
Denn viele von den "Treibern" die Du meinst sind Funktionen die von
dem Microcontroller zur Verfügung gestelllt werden.

Der Timer von dem hier die Rede ist wird vom auch Microkontroller zur
Verfügung gestellt.
Der Timer ist einfach ein Register in dem in einem bestimmten Takt der
Wert, der Registers, incrementiert wird. Erreicht der Timer sein
maximum beginnt dieser wieder bei null. Je nach Microcontroller gibt es
die Möglichkeit den Timer auch per hand auf null zu setzten, oder die
Taktfrequenz für den Timer zu modifizieren.

FSK bedeute Frequency Shift Keying. Beim FSK verfahren wird für die
Übertragung von einer 0 und einer 1 eine jeweils andere Frequenz
benutzt.
Das Codieren und Decodieren übernimmt dabei der Microcontroller.
Normalerweise hat der Microcontroller einen FSK Pin an den man einfach
die Daten in 1 und 0 Form schickt. Der Microcontroller schickt diese
dann raus.

Wichtig bei dem Senden der Daten an den Transmitterchip ist die
Übertragungsfrequenz, denn diese muss der des Empfängers entsprechen.

Da bei den meisten Microcontrollern die Pins mehrfach belegt sind
müssen diese am Anfang maskiert werden, dazu muß das jeweilige bit für
die gewünschte Funktion im jeweiligen Register gesetzt werden. Welches
Register das ist und wie viele Register es gibt steht im Datenblatt des
jeweiligen Microcontrollers.

von olli (Gast)


Lesenswert?

hallo,
habt ihr vielleicht gute links wo ich mich schnell darüber informieren
kann?

aber was macht der timer den genau?
wenn ich martins antwort lese,

ich mache die 0-1 Erkennung immer mit einem Timer - da kannst du ganz
gut eine gewisse hysterese einbauen (zB alle impulsbreiten von
80..120us). Dann werden die 0-1 Folgen in einen Ringbuffer geschrieben
und dort wird ständig nach der Präambel (01010101) und dem Startwert
gesucht (zB 3F). Dann die Daten aufzeichnen und CRC prüfen bzw
Fehlerkorrektur anwenden.

verstehe ich jetzt darunter, dass der timer die funktion hat ständig zu
prüfen ob was geschickt worden ist?

danke für eure hilfe!

mfg
olli

von Neki (Gast)


Lesenswert?

So wie es aussieht ist nicht mit nicht mit schnell informieren getan.
Denn deinen Fragen zu folge fehlt Dir der gesammte Hintergrund.
Welchen Microcontroller benutzt Du und welche IDE?
Assembler oder C?

Also den Timer musst Du Dir wie eine vorzeichenlose Variable vorstellen
die Du immer weiter hochzählst, pro takt einmal. Wenn Du am ende der
Kapazität angekommen bist, wird die Überlaufflag gesetzt und das ganze
geht von vorn los.
Den Timer brauchst Du um Zeiten zu messen, wenn dein Microcontroller
mit 10 MHz läuft.
Heißt das, daß eine Instruktion 200ns dauert. Wenn kein Prescaler
(divisor) eingeschaltet ist, ist das die Zeit die der timer braucht um,
um eins hoch zu zählen.
Wenn Du jetzt alle 20µs etwas prüfen willst nimmst Du den Inhalt des
Timers und füllst diesen in eine Variable und addierst 20000 drauf
(200ns *100=20000ns=20µs) und wartest bis der Timer gleich dem
berechneten Wert ist.
Die Änderung des Pegels wird im allgemeinen durch einen Interrupt
festgestellt. Je nach MC geht das etwas anders von statten. Der MSP430
z.B. hat einen 8 Bit Eingangspuffer wenn dieser Voll ist wird der
interrupt ausgelöst und man kann die empfangenen Daten verarbeiten.

Martin benutzt hier einen Timer um festzustellen ob es sich bei den
empfangenen Daten nur um Rauschen handelt oder ob es sich um einen
plausiblen Wert handelt.

Zumindest wenn ich es richtig verstanden habe :-).

von Martin (Gast)


Lesenswert?

Hallo Neki,

ja genau so ist es. Es wird mit dem Timer geprüft ob eine gültige
Bitlänge eingetroffen ist oder ob s nur zufälliges Rauschen ist.
Und ich gebe dir recht da scheinen eine Menge Grundlagen zu fehlen. Da
ist es immer schwierig einen Tipp zu geben da es anscheinend ne Menge
offene Baustellen gibt.


Martin

von olli (Gast)


Lesenswert?

hallo,
danke erstmal für eure hilfe.
könnt ihr mir vielleicht vorschlagen was ich mir mal dringend anschauen
sollte, links wären am besten, ansonsten themen nachden ich suchen
könnte.

@martin
du hast mal den link zu www.stecom.com gepostet, habe mir das
angeschaut aber aus dem was da stand konnte ich kein neues wissen bzw.
erkenntnis entnehmen. gibt es vielleicht dazu was auf deutsch?

mfg
olli

von olli (Gast)


Lesenswert?

@neki

du hast folgendes gepostet:

Den Timer brauchst Du um Zeiten zu messen, wenn dein Microcontroller
mit 10 MHz läuft.
Heißt das, daß eine Instruktion 200ns dauert. Wenn kein Prescaler
(divisor) eingeschaltet ist, ist das die Zeit die der timer braucht
um,
um eins hoch zu zählen.
Wenn Du jetzt alle 20µs etwas prüfen willst nimmst Du den Inhalt des
Timers und füllst diesen in eine Variable und addierst 20000 drauf
(200ns *100=20000ns=20µs) und wartest bis der Timer gleich dem
berechneten Wert ist.


verstehe nicht wie du auf die 200ns kommst, was heisst instruktion?

mfg
olli

hoffe nicht das ihr auch schon so genervt seit, wie manch andere hier
im forum, wenn ich mir die anderen sachen durch lese. schliesslich
kochen doch alle nur mit wasser.

von Neki (Gast)


Lesenswert?

oh mein Fehler es sind 100ns,
Herz=1/s das bedeutet 10Mhz= 1/10.000.000 s = 0,0000001 = 100 * 10 ^-9
= 100ns.

Instruktion heißt Anweisung oder Befehl.
Eine Instruktion ist ein Befehl den der MC ausgeführt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.