Hallo, nach 4 Tagen ununterbrochener "Trail & Error" Arbeit an diesem Modul lege ich hier mal einen lauffähigen Code ab. Er ist zwar speziell auf mein Multi-Prozessorsystem zugeschnitten aber er soll auch mehr dazu dienen, die Feinheiten zu verstehen um eigene Projekte abzugleichen, denn diese Module haben es in sich, manches steht nirgendwo geschrieben - zB dass sie nur in den Receive bzw Transmit Mode gehen, wenn man nach der Init Routine einmal den Status abfragt. Im Wesentlichen handelt es sich um die Datei rfm12.c und die Aufrufe für den Empfang in main.c. Der Empfang findet im Interrupt statt, aufgelöst durch negative Flanke an nIRQ Pin des Moduls, ist Checksummengeschützt und hat eine Fehlerabfrage, die nahezu alle Funkfehler erkennt. Durch Erhöhen des RSSI Thresholds kann man die Fehlerrate senken auf Kosten der Reichweite. Sie liegt aber auch so bei nahezu 0%. Bisher noch ungeklärt: - Der Empfänger stürzt ab und zu ab, wenn das Signal an der Schwelle zur Erkennung liegt und viele Fehler auftreten. Er muss dann mit POR wieder aktiviert werden. Wozu der nRES Pin gt ist weiss ich noch nicht. - Das FFIT Bit wird nicht richtig gesetzt, wenn Fifo voll ist. Daher müssen alle Interrupts (Watchdog, Battery) abgeschaltet sein, sonst ist nicht sicher, dass es der Fifo war der ausgelöst hat. Viel Spass beim Studieren.
Nachtrag, da Editieren nicht funktioniert Tips für Erstnutzer: -Senden und Empfangen müssen "rennen", da dürfen keine aufwendigen Rechnnugen in den Routinen eingebaut werden der ausführende Prozessor sollte mindestens 1Mhz internen Clock haben um noch 4800 baud zu schaffen, ab 9600 wird es schon schwer auf den IRQ zu reagieren. Ein Buffer Underflow beim Senden lässt den Datensatz üngültig werden. - Das Modul ist getestet bis 4Mhz SPI Takt (250ns pro Bit), darüber verschluckt es sich. Das Datenblatt scheint da nicht zu stimmen, trotz terminierte SPI Bus und einwandfreien Flanken. - Nach dem datensatz müssen bei 9600 baud 3 Dummys eingefügt werden, 2 reichen nicht aus, da das Abschalten des Senderbits et die laufende Übertragung im Fifo unterbricht. Je langsamer die Datenrate umso mehr Dummys sollte man nachschicken. Schaltet man das ET Bit nicht ab wird Müll gesendet. Daher muss dem Empfänger auch mitgeteilt werden wieviele Datenbytes kommen, es gibt keine sichere Methode das Ende des datenstromes zu erkennen, ausser vielleicht dem DQD Flag, welches 0 wird, wenn der Träger abgeschaltet wird.
Christian Julius wrote: > - Der Empfänger stürzt ab und zu ab, wenn das Signal an der Schwelle zur > Erkennung liegt und viele Fehler auftreten. Das kann ich eigentlich nicht bestätigen, ich hatte solche Probleme noch nie, trotz tagelangen Funkübertragungen. > Wozu der nRES Pin gt ist weiss ich noch nicht. Das ist ein Reset Eingangspin (Open Collector mit Pullup), der beim POR Zusätzlich noch auf Low geht um andere ICs zu Resetten. > - Das FFIT Bit wird nicht richtig gesetzt, wenn Fifo voll ist. Im Status Register, oder der Pin ? > - Das Modul ist getestet bis 4Mhz SPI Takt (250ns pro Bit), darüber > verschluckt es sich. Das Datenblatt scheint da nicht zu stimmen, trotz > terminierte SPI Bus und einwandfreien Flanken. Das ist mir auch schon aufgefallen. Ich verwende SPI Modus 0: Daten bei stiegender Flanke einlesen, bei fallender Flanke ausgeben. Das Senden funktioniert auch bei höheren Datenraten, nur das Lesen vom Modul nicht.
Hallo, ich meine das Bit FFIT. Der Ausgang selbst hängt ja mit 10k an +. Ich wollte es eigentlich im IRQ benutzen, um sicherzustellen, dass der INT auch durch den Fifo ausgelöst wird und nicht durch eine andere IRQ Quelle. Aber es ist einfach nicht gesetzt. Das Modul stürzt wohl ab, es reagiert nicht mehr auf Daten wenn man den Sender mit Metallfolie immer weiter abschirmt bis so eben keine Daten mehr kommen. Woran das liegt weiss ich auch noch nicht genau. Ich überlege im IRQ einen Timeout zu installieren, der das Modul resettet, wenn die Daten nicht mehr kommen, obwohl der Datensatz nicht abgeschlossen ist. Wenn man nRES als externen Reset benutzen könnte. Was mich jetzt interessiert ist welche Einstellung der vielen Filter die optimale ist. Ich möchte die Applikation so haben, dass die beiden Module sich aufeinander abstimmen, also zb in der Sendeleitung reduzieren bzw. Eingangsempfindlichkeit, wenn sie nah zusammen sind. Nur welches Bit etc soll man dazu ausnutzen, eine Art Feldstärkeanzeige gibt es ja nicht, oder? Ansonsten das beste, was ich bisher hatte, die normalen Sender sind nervig mit ihrem verzerrten Code am Empfänger, der erste vermessen werden muss, bzw der Manchester Codierung. Hier liegt es nur an der Phantasie des Programierers was die Dinger alles können. Obwohl das BR-27 Modul was ich von der intal. Firma ITE habe bringt 15mW raus, damit gehts fast einen Kilometer weit mit einer abgestimmten Antenne aus dem Laden. Fehlt nur noch ein 1-Transistor Nachbrenner, der es auf ca 20mW bringt, dafür suche ich noch eine kleine Schaltung mit dimensioniertem Pi Filter. Was das Empfangen bei hohen Datenraten angeht, so liegt das mehr daran, dass der uC bei mir nicht schnell genug in den IRQ kommen kann, weil der noch das Display bedienen muss, wo ich alle IRQ abschalte. Bei einem Master mit 7 SPI Slaves gibt es sonst ein Durcheiander, ausserdem ist ein Byte nur rund 500us lang über 9600 baud. Da müsste ich den PIC auf 40 Mhz bringen aber dann kriegt er sporadisch einen internen Reset, wohl weil das Silizium der Rev 1 noch nicht ausgereift ist, der 4685 ist noch nagelneu und erheblich buggy laut Errata Sheet. In einer Anwendung würde ich dem RFM12 einen eigenen Controller spendieren, so wie mein IR Inteface es auch hat, dann geht die Recheneleistung nur auf diesen Slave über, der erstmal Daten sammeln kann bevor er sie dem Master weitergibt. Gruss, Christian
Christian Julius wrote: > ich meine das Bit FFIT. Der Ausgang selbst hängt ja mit 10k an +. Ich > wollte es eigentlich im IRQ benutzen, um sicherzustellen, dass der INT > auch durch den Fifo ausgelöst wird und nicht durch eine andere IRQ > Quelle. Aber es ist einfach nicht gesetzt. Seltsam. Bei wir funktioniert das wunderbar. Hast du den nFFS Pin über einen Pullup an 5V angeschlossen ? > Das Modul stürzt wohl ab, es reagiert nicht mehr auf Daten wenn man den > Sender mit Metallfolie immer weiter abschirmt bis so eben keine Daten > mehr kommen. Kann es sein, dass du die AFC ohne Begrenzung eingeschaltet hast, und das Modul auf eine andere Frequenz abdriftet ? > Was mich jetzt interessiert ist welche Einstellung der vielen Filter die > optimale ist. Ich möchte die Applikation so haben, dass die beiden > Module sich aufeinander abstimmen, also zb in der Sendeleitung > reduzieren bzw. Eingangsempfindlichkeit, wenn sie nah zusammen sind. Nur > welches Bit etc soll man dazu ausnutzen, eine Art Feldstärkeanzeige gibt > es ja nicht, oder? Im Datenblatt vom RF01 gibt es eine Tabelle was die optimalen Einstellungen ist. Meinen Versuchen nach ist eine höhere Modulationstiefe aber besser für eine hohe Reichweite. Das hängt vermutlich mit der Definition von "optimal" zusammen. Die Einstellungen im Datenblatt sind vermutlich ein Kompromiss zwischen Bandbeite und Reichweite. Wenn die Bandbreite aber egal ist, lässt sich die Reichweite etwas vergrößern. Im Datenblatt ist ein RSSI Pin erwähnt. Dieser ist mit dem vorderen der beiden Kondensatoren rechts am Modul verbunden (wenn die Antenne links ist). Wenn du an das Modul einen Verstärker anschließt, kann das Modul aber nur noch senden und nichts mehr empfangen ?
Benedikt K. wrote: > Christian Julius wrote: >> ich meine das Bit FFIT. Der Ausgang selbst hängt ja mit 10k an +. Ich >> wollte es eigentlich im IRQ benutzen, um sicherzustellen, dass der INT >> auch durch den Fifo ausgelöst wird und nicht durch eine andere IRQ >> Quelle. Aber es ist einfach nicht gesetzt. > > Seltsam. Bei wir funktioniert das wunderbar. Hast du den nFFS Pin über > einen Pullup an 5V angeschlossen ? Also, der FSK/DATA/nFFs ist mit 10k nach Plus, der DCLK/DCFIL/FFIT ist offen. Ist das falsch? > Kann es sein, dass du die AFC ohne Begrenzung eingeschaltet hast, und > das Modul auf eine andere Frequenz abdriftet ? Ich habe sie begrenzt auf 7bit, wenn man es nicht begrenzt driftet es ab, das habe ich auch bemerkt. Mit dieser Autokorrektur bin ich mir eh noch nicht klar, was da die beste Einstellung ist. Was macht dieses Strobe Bit eigentlich nd müssen OE und EN gesetzt sein im AFC Command? > Im Datenblatt vom RF01 gibt es eine Tabelle was die optimalen > Einstellungen ist. Meinen Versuchen nach ist eine höhere > Modulationstiefe aber besser für eine hohe Reichweite. Das hängt Was ist Modulationstiefe? Kenne des Ausdruck nicht. > vermutlich mit der Definition von "optimal" zusammen. Die Einstellungen > im Datenblatt sind vermutlich ein Kompromiss zwischen Bandbeite und > Reichweite. Wenn die Bandbreite aber egal ist, lässt sich die Reichweite > etwas vergrößern. > Im Datenblatt ist ein RSSI Pin erwähnt. Dieser ist mit dem vorderen der > beiden Kondensatoren rechts am Modul verbunden (wenn die Antenne links > ist). Es gibt auch ein RSSI Bit aber das floatet völlig. Der Pin ist ja nicht heausgeführt worden. Bliebe noch VDI. > Wenn du an das Modul einen Verstärker anschließt, kann das Modul aber > nur noch senden und nichts mehr empfangen ? Stimmt auch wieder, da müsste da ein neues Koppelnetzwerk dran, damit die Empfängerstufe nicht beschädigt wird beim Senden. Habe die beiden grad mal auf 19200 baud umgestellt, arbeiten einwandfrei. Aber wenn ich mich recht an die Vorlesungen erinnere muss man mti steigender Baudrate auch die Filterbandweiten anpassen. Da ich schon gerade einen Experten erwischt habe, kannst Du folgende Fragen beantworten: - Was hat es mit dem VDI Signal (fast, medium, slow) auf sich im "Receiver Control command"? - Was kann man mit "TX Configuration Command" anfangen? FSK modulation parameters.
Christian Julius wrote: > Also, der FSK/DATA/nFFs ist mit 10k nach Plus, der DCLK/DCFIL/FFIT ist > offen. Ist das falsch? Das ist OK. Ohne den Pullup funktioniert es nämlich nicht richtig. > Was macht dieses > Strobe Bit eigentlich nd müssen OE und EN gesetzt sein im AFC Command? Mit dem Strobe Bit kann man die AFC Messung manuell starten. OE aktiviert das Offset Register und EN die AFC Schaltung. Ich habe bei mir AFC auf automatisch mit kleinstem Bereich eingestellt. > - Was hat es mit dem VDI Signal (fast, medium, slow) auf sich im > "Receiver Control command"? Das liefert Infos darüber, ob ein gültiges Signal empfangen wird. Je nach Einstellung werden dazu verschiedene Kriterien verwendet (Signalstärke, Fehlerrate, Clockrecovery Lock). Wie man dieses Signal sinnvoll nutzen kann, ist mir aber unklar. Meiner Meinung nach ist dieses Signal überflüssig: Man schaltet einfach die Sync Wort Erkennung ein, und wenn das Modul der Meinung ist ein gültiges Sync Wort empfangen zu haben, empfängt man einfach ein Paket. Eine CRC sollte die fehlerhaften Pakete dann schon rauswerfen. > - Was kann man mit "TX Configuration Command" anfangen? FSK modulation > parameters. Damit stellst du die Modulation (Frequenzhub) und die Sendeleistung ein. Je nach Baudrate muss man die Modulation nämlich anpassen.
Hallo, das Rätsels Lösung für die niedrige SPI Rate ist auch gefunden, die darf bei Fifo Operationen nicht höher sen als f/4 also 2,5 Mhz. Steht als Note im Empfängerhandbuch, sehr klein gedruckt. Habe mir ja auch RFM01 und RFM02 gekauft. Leider scheinen die sehr anders zu sein, besonders der Sender. Wie man da Daten reinkriegt ohne CLK muss ich mir noch anschauen. Frage mich auch, ob noch jemand RFM12 von der Sammelbestellung übrig hat, denn Pollin knallt mir zuviel Marge da drauf, die RFM12 kosten ab 1k nur 2,80 Euro zzgl Zoll und MwSt. Jetzt fehlt nur noch eine sinnvolle Anwendung aber die Batterie -Managemrnt Modes scheinen mir etwas kompliziert zu sein. Gruss aus dem Gartenstuhl (WLAN ist was feines :-) Christian
RF01 ist noch relativ ähnlich dem RF12, der RF02 ist dagegen ohne FIFO ziemlich unterschiedlich, und vor allem etwas kompliziert in der Ansteuerung da die Daten Bit für Bit übergeben werden müssen. > Frage mich auch, ob noch jemand RFM12 von der Sammelbestellung übrig > hat, denn Pollin knallt mir zuviel Marge da drauf, die RFM12 kosten ab > 1k nur 2,80 Euro zzgl Zoll und MwSt. Stimmt nicht ganz: Bei der Sammelbestellung kostet ein RFM12 2,5€ inkl allem + Versand innerhalb D.
Und? Gibts noch Module zum kaufen? Oder sind die alle schon weg? RFM01 und 02 brauche ich ja nicht, wenn das 12 alles drauf hat.
Hi (Editieren geht grad mal wieder nicht) Habe das mit den Status Bits grad nochmal getestet und sie fortlaufend ausgelesen während des Empfangs. Stelle ich LNA Gain und RSSI auf MAX ein, dann floaten die Bits einfach nur beliebig herum. Stelle ich LNA eine Stufe herunter und RSSI ebenfalls, dann benehmen sie sich normal. Sehr seltsam..... denn der Empfang läuft auch auf maximaler Empfindlichkeit, da ich die Flag Bits dazu nicht brauche, aber leider auch einen FIFO Overflow nicht erkennen kann.
Hallo ich bin neu hier und habe vor eine Funkfernbedienung mit den RFM12 Modulen zu realisieren. Zur Zeit versuche ich die Module mit dem Hardware SPI des 16F877 anzusteuern, der Pic läuft mit 20Mhz. Initialisiert ist der SPI mit: setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_CLK_DIV_64); Wo ich das hier gerade so lese befürchte ich das der Pic vieleicht zu schwach ist :). Könnt ihr mir ein paar Tips zur Programmierung geben ? Ich möchte erstmal nur eine Funkverbindung von A-->B realisieren mit einer Geschwindigkeit von 19200 Baud und einem CRC um falsch empfangene Datenpackete zu erkennen. Bei dem Schaltplan ist noch zu sagen das ich die Platine in einem Joystik verbaut habe, daher auch die ganzen Taster und Achsen und am PortB hängt ein 4x20 Zeichen Display ;) Gruß Dirk edit der Dateianhang scheint leider nicht zu gehen.
Christian das ist ja mal ein schön ordentlicher Lochrasteraufbau, ich will aber nicht wissen wie das von unten aussieht ;-) Was soll dieses Kupferplättchen (oder was auch immer das ist) auf dem großen IC?
Hallo, der Code hat noch einige Fehler gehabt, inzwischen läuft es wirklich stabil, da mehr Fehlerabfänge drin sind. Das RFM12 stürzt nicht ab, soviel ist klar, was abstürzte war der Code. Wie die Platine unterdrunter aussieht sage ich lieber nicht :-) Aber alles schön geordnet. Der Kupferaufkleber auf dem uC ist mit einem feinen Drähtchen nach Masse verlegt, da sich in der EMV Kammer zeigte, dass ein 32 Mhz PIC jede menge Dreck rauswirft und sich das dadurch wesentlich verbessert. Die RTC nebenan zeigte ein etwas stolperndes Verhalten, je schneller ich den PIC taktete, desto falsche ging sie. Nun ist es gut.
@Christian könntest du vieleicht mal deinen Schaltplan posten? ich hab das RFM12 Modul zur Zeit wie in der Abbildung angeschlossen.
Hallo, Schaltplan gibt es nicht, alles im Kopf oder Skizzen niedergelegt. Das Modul ist nicht ganz richtig angeschlossen, an den FSK gehört ein Pull Up bei Verwendung des Fifo Stacks. Der int kann auch floaten bzw wird auf VDI Signal geschaltet. Gruss, Christian
@ Christian den FSK Pin habe ich auf einen µC Ausgang gelegt und schalte ihn bei der Initialisierung auf High Pegel. Ich hoffe das geht auch oder muss es ein Pull-up sein ? Gruß Dirk
Nein, geht ok, dem Pin ist es egal. Allerdings kann ich Dir sagen, dass wenn Du einen High Pin auf Masse legst das Modul ggf. kaputtgeht. Habe ich leider erfahren müssen, die sind nicht wohl nicht kurzschlussicher.
Danke für den Tipp hab der FSK Datenleitung vorsichtshalber mal ein 12K Widerstand in Reihe gegönnt, falls bei der Initialisierung des Modules mal was schief geht ;)
Hallo ich wollte nur mal Fragen ob vieleicht jemand den C-Code von Christian nur zum ansteuern des RFM12 umgeschrieben hat? Ich hab damit gerade mal angefangen und mir den Code mal etwas näher angeschaut und festgestellt das es doch schon recht kompliziert ist, da in dem code eine große Anzahl von SPI Geräten angesprochen werden. Nebenbei auch mal ein Lob an Christian, das was ich bis jetzt nachvollzogen habe ist sehr sauber programmiert! :)
Hi, hier die letzte, stabile Version mit optimalen Parametern, Timeout Check usw. Ich schreibe jedes Modul so, dass es nahezu ohne Änderungen in anderen Projekten wiederverwendet werden kann. Es wird nur ein SPI Gerät angesteuert, dazu dient "Chipselect", das kann man ersetzen. Die anderen 7 Slaves sind hier nicht von Bedeutung. Für AVR Nutzer natürlich sinnlos, deren Compiler ist ganz anders aufgebaut. Es geht auch mehr ums Prinzip, nicht darum jede Zeile zu übernehmen. Derzeit funken die beiden Rechner sich die Daten zu, man kann schnell zwischen Senden und Empfangen umschalten. Systemdaten: Takt: 16 und 32 Mhz fosc, PIC 18F4685 (96kb Flash). Das grundsätzliche Problem was ich derzeit noch habe ist, dass der Empfänger binnen weniger Mikrosekunden reagieren muss, wenn Daten kommen. Ich werde das wohl durch eine lange Präambel beheben, wo der Empfänger dann das DQD Bit abfragt was dann HIGH geht und sich darauf vorbereitet, dass bald Daten kommen werden, also andere Peripheriegeräte sperrt, die den Bus belegen könnten. Wollte erst für SPI einen Busarbiter spendieren aber dann wäre es zu kompliziert geworden.
Hallo, Ich versuche ihr Treiber in betrieb zu nehmen. Es fehlt aber das Unterprogramm ChipSelect()
Christian K. schrieb: - zB dass sie nur in den Receive bzw Transmit Mode gehen, wenn man nach der Init Routine einmal den Status abfragt. Ich habs noch nicht vollständig durchgetestet, aber es liegt am SDI Pin von der SPI Schnittstelle. SDI muss 0 sein um SDO abfragen zukönnen. Bei meinem MC ADUC841 bleibt SDI nach der Übertragung auf dem letzen Zustand stehen, was bedeutet ich muss eine 0 (oder jede gerade Zahl) verschicken (man kann auch den Status lesen) damit SDI vor der Abfrage vom SDO sicher auf Null ist (leider kann ich den SDI Pin nicht direkt ansteuern). Ob der IRQ Pin das gleiche Problem hat werde ich testen. Im Moment scheint das Senden von Daten zu funktionieren aber der Empfang geht gar nicht. Kein Pin reagiert. Bin aber erst zwei Tage dran. Was noch merkwürdig ist im Code vom Christian, das er immerwieder die Schnittstelle initialisiert RF_Init_SPI(). Einmal sollte doch genügen. Ansonsten sieht es meinem Programm erschreckent ähnlich. Gruss Taz
- Nachtrag zu meinem letzten Beitrag Das mit dem SDI Pin hat sich zerschlagen hatte andere Gründe. Kann ich aber nicht mehr nachvollziehen, zu viele Änderungen auf einmal. Habe jetzt eine lauffähige Version für den ADUC841 Mikrokontroller, in der man per Define zwischen Sender und Empfäger wählen muss. Meine Anwendung ist, ein Modul als Sender, ein anderes als Empfänger. Zudem habe ich noch ein Timingdiagramm vom Empfänger gemacht, falls es einen Interessiert. Ein Problem das hier auch schon erwähnt wurde war, das der Empfänger weiter Daten empfängt, wenn keine mehr gesendet werden. Dadurch wird ein RX-FIFO Overflow erzeugt und das Chip streikt. Erst ein ReadStatus löscht das Overflowbit und das Chip empfängt wieder. Bei mir im speziellen, wird nach 10 Zeichen der Interrupt gesperrt und die Zeichen ausgewertet. Aber das 11.Zeichen im RFM Chip löste auch noch einen Interrupt aus, der aber nicht abgearbeitet wurde da gesperrt. Lösung - nach 10 Zeichen ReadStatus für clear Overflowbit und ein clear InterruptFlag. Was noch eingebaut werden muss, ist eine Checksumme.Habe ich in dieser Testsoftware noch nicht drin, kommt als nächstes wenn es in die Anwendung geht (Gartenlicht an-aus). Da fällt mir ein dafür brauch ich keine Checksumme.
Einen schönen guten Tag auch, bin neu hier und hab mich mal n bischen mit dem pic und dem RFM auseinandergesetzt, bei der Programmierung hab ich mich sehr an eure Vorschläge gehalten, aber irgenwie ist da noch der wurm drine, ich selber benutz das RFM12 von Pollin. Ich wollte damit ein kleines spiel programmieren, um die Funkübertragung erstmal auszuprobieren. Wäre cool wenn mir jemand nen tipp geben kann wo ich scheisse gebaut hab. Außerdem nimmt er den PORTA als eingang nicht an, und ich weiß nicht wieso, aber ihr bestimmt:-) Mfg Karl
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.