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
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
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
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
Hallo Martin, jetzt ist alles klar, vielen Dank! So werde ich es auch machen. Gruß, Stefan
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
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
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
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
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
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.
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
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 :-).
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
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
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.