|
|
RFM12Beschreibung der Funkmodule RFM01, RFM02 und RFM12. Benötigt werden in der Minimal-Version im FIFO-Modus nur die Anschlüsse nSEL, SDO, SDI und SCK, eben das komplette SPI-Interface. Der Zugriff auf das Sende- und Empfangs-FIFO ist per Software möglich, ebenso die Abfrage der Statusbits. Deshalb werden z. B. nIRQ und nFFS nicht unbedingt benötigt. nIRQ signalisiert unter anderem, dass das Modul bereit ist Daten zu empfangen. Wenn Daten empfangen wurden, kann dies über den FFIT-Pin abgefragt werden (falls die Füllschwelle eingestellt wurde). nFFS dient dazu das FIFO direkt anzusprechen (es ist quasi der Chipselect für das FIFO), davon wird in der Minimalversion aber kein Gebrauch gemacht. Der Pin muss daher auf high-Pegel gelegt werden! An CLK kann eine Frequenz von 1MHz bis 10MHz eingestellt werden. Hiermit kann dann z. B. der Mikrocontroller versorgt werden. Reset ist ein Open-Collector-Ausgang und gleichzeitig der Reset-Eingang. Er sollte daher entweder gar nicht, oder aber hochohmig angeschlossen werden. Im FIFO-Mode kann das Modul konfiguriert werden mit dem Empfang zu warten, bis die Daten 0x2DD4 empfangen wurden. Sobald dieses Bitmuster empfangen wurde, werden Daten in das FIFO geschrieben, bis man das FIFO abschaltet und die Mustererkennung neu startet. Als weitere Modi stehen unter anderem ein synchroner Modus zur Verfügung (no FIFO mode), in dem der Sender/Empfänger den Bittakt ausgibt, und synchron dazu die zu sendenden Daten einliest bzw. die empfangenen Daten ausgibt. Der SPI Bus ist trotzdem zur Initialisierung des Moduls notwendig. [Bearbeiten] Grundlagen[Bearbeiten] HF-seitiges FunktionsprinzipIch möchte hier etwas das Funktionsprinzip des RFM12 erläutern, da das Verständnis wichtig ist, um die Parameter Frequenzhub, Datenrate, Tiefpassfrequenz usw., daraus folgend Bandbreite und Kanalraster sinnvoll auswählen zu können. Schließlich ist ein sauberer Frequenzplan wichtig für die kollisionsfreie Funktion mehrerer gleichartiger Geräte. [Bearbeiten] (1)Betrachten wir zunächst die Amplitudenmodulation: Multiplikation im Zeitbereich bewirkt Faltung im Frequenzbereich. Das Ein- und Ausschalten eines hochfrequenten Trägers im Takt eines Datensignals ist eine Multiplikation und lässt rings um den Träger zwei Seitenbänder entstehen. Deren Breite ist jeweils die halbe Datenrate, sofern die Daten bandbegrenzt (also verschliffen) werden. Zur einfacheren Rekonstruktion verschleift man das Datensignal deutlich weniger; etwa ein 8-kBit/s-Signal auf 8 kHz (statt 4 kHz). Der RFM12 verschleift die Daten gar nicht. Ist das Datensignal gleichspannungsfrei (gleich viel +1 wie -1), verschwindet der Träger, und die gesamte Sendeleistung steckt in den Seitenbändern, also der gewünschten Information. Das hilft den Rauschabstand zu verbessern und/oder die Sendeleistung zu verringern (weniger Elektrosmog). [Bearbeiten] (2)Die Frequenzumtastung (FSK) wird gern als ein Sonderfall der Frequenzmodulation betrachtet. Bei Modulationsgrad η > 1 (der RFM12 kann eh' nichts anderes demodulieren) kann man das Ganze auch als doppelte Amplitudenmodulation interpretieren: Hier wird die Bandbreitenverschwendung offensichtlich, aber im 433-MHz-Band ist ja genug Platz dafür. FM-Signale lassen sich viel leichter verstärken als AM-Signale: man braucht sie nur durch einen (Energie sparenden, digitalen) Begrenzerverstärker zu schicken. Da die Sendedaten nicht bandbegrenzt werden (der Träger wird hart umgeschaltet) entstehen theoretisch unendlich breite Seitenbänder, die in einer sinc-Funktion (= sin(x)/x) abfallen. Das ist möglicherweise der Grund, warum die meisten Beispiele genau in der Mittenfrequenz des 433-MHz-Bandes, nämlich 433,92 MHz, funken und so die übrigen Störer geradezu magisch anziehen. Die Störung außerhalb der Zulassungsgrenzen (433,05 .. 434,79 MHz) ist so definitiv minimal. Beim wesentlich breiteren amerikanischen 915-MHz-Band ist's deutlich entschärfter. [Bearbeiten] (3)Die Demodulation erfolgt beim RFM12 im Basisband. Es wird also keine Zwischenfrequenz (wie die 10,7 MHz beim analogen UKW-Rundfunk) verwendet. Das FSK-Signal wird (wahrscheinlich) mit der Mittenfrequenz multipliziert, und heraus kommt dieses Bild: Danach kommt das Signal durch den einstellbaren Tiefpass. Diesen dimensioniert man so, dass der Frequenzhub plus die Nutzsignalbandbreite durchpasst. Die Multiplikation erfolgt zweimal, mit dem Träger und dem 90° verschobenen Träger. Mit dieser sogenannten I/Q-Demodulation kann man recht viel machen, so AM, FM und PM demodulieren. Die Funktion im RFM12 ist etwa so: Das gesendete FSK-Signal wird um die Mittenfrequenz gefaltet, somit entsteht eine Differenzfrequenz, unabhängig davon, ob gerade die obere oder untere Frequenz empfangen wird. Sozusagen Spiegelfrequenzdämpfung = 0. Damit könnte man ohne I/Q gar nichts anfangen. Das Ergebnis der I/Q-Demodulation ist ein umlaufender (komplexer) Zeiger. Die Drehzahl ist gleich der Differenzfrequenz, der Umlaufsinn ist jedoch bei der unteren (Spiegel-)Frequenz anderherum! Man muss also nur noch die Drehrichtung detektieren, genauso wie bei Inkrementalgebern. Das ist einfach ein D-Flip-Flop. Die beteiligten Schaltfrequenzen liegen im Frequenzbereich des Tiefpasses, also im kHz-Bereich. [Bearbeiten] (4)Typischerweise gibt es einen Unterschied zwischen der Sende- und Empfangsfrequenz von ein paar kHz. Entsprechend einer Quarzabweichung im Bereich von 10 ppm oder 1 s pro Tag. Dann ergibt sich folgendes Bild: Die eingebaute AFC misst die beiden Frequenzen je nach empfangenem Bit (= Frequenzhub = Umlaufsinn hinter dem I/Q-Demodulator), und regelt so, dass die beiden Frequenzen etwa gleich sind. Sie werden also getrennt per Frequenzzähler gemessen. Die AFC-Schaltung kann nur in 2,5-kHz-Schritten arbeiten, demnach den Frequenzversatz um 5 kHz ändern. Die AFC dient also vor allem dazu, dass das Empfangssignal immer schön durch den Tiefpass passt. Daher muss man bei der Auswahl der Tiefpass-Eckfrequenz auch die zu erwartende Quarzabweichung mit einrechnen. Diese ist aber im 433-MHz-Bereich noch nicht so relevant. [Bearbeiten] (5)Der ARSSI-Anschluss (analog received signal strength indicator, svw. Feldstärke) hat laut Datenblatt (RFM12B Seite 3) die folgende Kennlinie: Dieser Anschluss ist bei den RFM12-Modulen nicht herausgeführt, aber an einem der SMD-Kondensatoren leicht abgreifbar. Beispielsweise kann man damit AM oder ASK (Amplitude Shift Keying) demodulieren. [Bearbeiten] FAQ[Bearbeiten] Soll ich 433 oder 868 MHz nehmen?Wähle das für deine Anwendung kleinere der beiden Übel: Bei 433 MHz sind i.d.R. mehr Störer unterwegs und bei 868 MHz sind die maximale Belegungsdauer bzw. das listen-before-talk (LBT) Verfahren gemäß Allgemeinzuteilung zu beachten. Siehe auch im Forum [1] und [2]. [Bearbeiten] SPI-InterfaceAlle Zeiten in ns. Die angegebenen Bits im Datenblatt (RFM12B Seite 13) sind falsch! So wie hier ist es richtig.
[Bearbeiten] Kann man auf SPI verzichten?
[Bearbeiten] Kann man SEL permanent auf LOW halten?Jein.
[Bearbeiten] Was passiert, wenn man bei aktivem SEL mehr als 16 Takte ausgibt?Ist er (Empfängerfreigabe) gesetzt, kann man so die Empfangs-FIFO auslesen. Ab da ist die maximale SCK-Taktfrequenz von 2,5 MHz einzuhalten, sonst kommt Murks. Ist die FIFO nicht entsprechend gefüllt, kommt ebenfalls Murks. Insofern holt das Kommandopräfix 0xB0 die FIFO-Bits nur 8 Takte nach vorn. Ist er gelöscht ist das Verhalten undokumentiert. Wahrscheinlich erscheint RGIT an SDO, und das Senderegister wird nach je 8 Takten mit einem Byte gefüllt (wie beim Kommandopräfix 0xB8 oder bei Benutzung von FFS). [Bearbeiten] Sollte man RES mit dem Reset-Anschluss des Mikrocontrollers verbinden?Jein.
Also: Im Allgemeinen ja, bei Mondfahrzeugen oder Omas Fernbedienung in 'zig Kilometer Entfernung würde ich davon erst mal abraten. [Bearbeiten] Die günstigste Beschaltung für (optionale) 250 kBit/s?Hier für ATtiny2313 sowie alle ATmega via UART: Keine permanente Bitsynchronisation; eine höhere Bitfehlerrate (BER) durch zeitliche Fehlerkennung des Startbits muss in Kauf genommen werden.
[Bearbeiten] CLK-Ausgang bleibt bei 1 MHz
[Bearbeiten] RFM12 empfängt ein paar Bytes, dann nur Müll
Die Status-Bits helfen hier beim Debuggen. SPI sollte auf maximaler Transferrate stehen. [Bearbeiten] RFM empfängt nur Müllhttp://www.mikrocontroller.net/topic/73560#605528 Deine Module verhalten sich normal. Man muß mit den Gain- und AFC-Bits eine ganze Weile spielen, bis die Module korrekt laufen (kommt auf die Anwendung an). Fakt ist: der Empfänger empfängt ständig Datenmüll als Rauschen. Wenn der FIFO durch die Präambel getriggert wird, sind die Daten im FIFO ziemlich korrekt, wenn alles "gut" eingestellt ist. Der FIFO sollte per Interrupt dann auch sofort abgeholt werden, da sonst das nächste Byte das alte direkt überschreibt. Jeder zusammenhängende Datensatz (mehrere Bytes an einem Stück) muß von einer Präambel eingeleitet werden. Nach dem kompletten Einlesen eines Datensatzes muß der FIFO abgeschaltet, wieder eingeschaltet und für den Empfang der nächsten Präambel neu scharf gemacht werden. (FifoFill bit) [Bearbeiten] RFM hängt sich aufWenn man die AFC nicht begrenzt, also keinen Wertebereich vorgibt, die eine maximale Abweichung korrigiert wird passiert es nach einer Weile, dass sich der Empfänger aufhängt, die Offsetbits im Status werden maximal und dann geht gar nichts mehr, er hängt fest. edit: Leider bringt die Beschränkung der AFC auf Minimum bei mir keine Verbesserung. Zumindest ist obige Aussage nicht allgemein gültig. Siehe auch
[Bearbeiten] Kommunikation mit RFM funktioniert nur sporadisch
[Bearbeiten] Interrupt nIRQ klappt nicht bei 868MHzWenn bei der Verwendung der 868er Module die üblichen Sourcen (dasLabor, etc) verwendet werden, müssen einige Änderungen gemacht werden, die sich leicht finden lassen. Ohne weiteres funktionierte der blockierende Empfang, der Interruptbetriebene (nIRQ) machte in mindestens einem Fall Probleme. Hier half die Anpassung des FIFO IT Level . In vorhandenen Sourcen ist 0xCA83 zu finden, eine Änderung auf 0xCAF3 hilft dabei. Bei Interruptbetrieb ist darauf zu achten, dass wirklich auf jeden Interrupt reagiert wird. Solange ein Interrupt nicht behandelt wird bleibt nIRQ auf LOW! Durch das Lesen des Statusregisters können alle Interrupts ausser FFIT und RGIT "gelöscht" werden. Für FFIT ist das FIFO zu lesen und für RGIT das TxRegister zu beschreiben. [Bearbeiten] Was passiert, wenn ich beim Senden die Daten nicht schnell genug liefere?Es kommt zum Interrupt wegen Latch-Unterlauf. Der Sender wiederholt die letzten beiden Bytes im Wechsel. Er wird nicht abgeschaltet. Die maximale erlaubte Latenzzeit zwischen Auftreten des Interrupts und Einschreiben des letzten der 8 Bits beträgt 8 Bitzeiten. [Bearbeiten] Was passiert, wenn ich beim Empfang die Daten nicht schnell genug abhole?Es kommt zum Interrupt wegen FIFO-Überlauf. Logisch wäre, die ältesten Bits werden verworfen. Laut Doku wird hingegen das weitere Schreiben der FIFO unterbunden, bis die FIFO hinreichend geleert ist und das Synchronwort (typisch 0x2DD4) erneut erscheint. Vorausgesetzt, der Interrupt ist bei FIFO-Füllstand 8 Bit gesetzt (Voreinstellung), beträgt die maximale Latenzzeit zwischen Auftreten des Interrupts und Abholen des ersten Bits aus der FIFO 7 Bitzeiten, für jedes weitere Bit eine Bitzeit mehr. Bei derart knapper Kalkulierung muss der Interrupteingang pegelgetriggert sein! Bei Verwendung eines flankengetriggerten Interrupts (Pin-Change-Interrupt) sollte die Interruptbedienungsroutine (ISR) die Pegeltriggerung simulieren, indem der Kode so lange in einer Schleife ausgeführt wird, bis der Interrupteingang inaktiv geworden ist. [Bearbeiten] Was passiert, wenn der Empfangsdatenstrom abbricht?DQD wird inaktiv. Das kann man mittels Status-Read abfragen. Oder mit dem Extra-Ausgang VDI. Die Erkennung ist jedoch mehr oder weniger verzögert und kann nicht als echte Endekennung herangezogen werden. Der Empfang, die Taktrückgewinnung und das Daten-Schieben laufen einfach in der vorgegebenen Baudrate weiter! Man braucht sich daher nicht um Inter-Character-Timeouts zu kümmern; Daten kommen immer. Die Datenlänge muss demnach in das Übertragungsprotokoll eingebaut werden, typischerweise:
Die Wahl der maximalen Paketlänge ist gemeinsam mit der Baudrate ein wichtiges Kriterium für das zeitliche Verhalten des gesamten Funkprotokolls. [Bearbeiten] RegisterVon https://www.mikrocontroller.net/attachment/24947/RFM12.txt Dieses Dokument beschreibt die Nutzung des RFM12 TRX Moduls! WICHTIG Dieses Dokument wurde aus mehreren Quellen zusammengestellt, und kann Fehler enthalten! Es können Abweichungen in Bezug auf RF01 / RF02 / RF12 / RFM01 / RFM02 und andere Module auftreten! Es wurde das Datenblatt vom RFM12B und RF12 von www.hoperf.com als Basis genuzt. Zusätzlich wurden diese Informationen mit Hilfe von Forums-Nutzern (https://www.mikrocontroller.net/topic/71682) weiter vervollständigt! WICHTIG Hinweis: Die LNA-Eingangsimpedanz beträgt 250Ω, und muss beim Anschluss einer 50-Ohm-Antenne entsprechend angepasst werden, um das Rauschen zu minimieren! -- (Auf den Pollin-Modulen bereits vorhanden) WICHTIG Vor der Einstellung der Konfiguration sollte dem RFM12-Modul ausreichend Zeit für seine Power-On-Sequenz gegeben werden. Manche Module brauchen dazu nur 10ms, manche aber 100ms. Ist die Power-on Zeit zu kurz, können durchaus einige Konfigurationswerte gesetzt sein, andere aber nicht. Das Datenblatt zum RFM12B schreibt 100 ms vor (wenn auch durch die Blume). [Bearbeiten] BlockdiagrammDie angegebenen Pin-Nummern beziehen sich auf das (bei Pollin erhältliche) SMD-Modul.
[Bearbeiten] Grundkonfiguration (Configuration Setting 80xx)
Bei el = 0 erscheinen die Daten an DATA und der Takt an DCLK. [Bearbeiten] Komponentenauswahl (Power Management 82xx)
er bzw. et schalten alle zum Empfangen bzw. Senden benötigten Module (Quarz-Oszillator, PLL-Sythesizer, Basisband-Block) ein auch wenn ebb, es oder ex nicht gesetzt sind. er hat Vorrang vor et. Durch separates Einschalten von ebb, ex oder es kann aber die Startzeit für den Empfänger bzw. den Sender verkürzt werden. Am nützlichsten ist dies für ex, da die Hochlaufzeit des Quarzes mit einigen Millisekunden deutlich länger ist als die der anderen Komponenten (unter 1 ms). Wird der WakeUp-Timer verwendet ist ew nach jedem Aufwecken zu löschen und wieder zu setzen. Ist dc = 0, läuft der Quarzoszillator unabhängig von ex weiter, solange eine Unterbrechungsanforderung (Interrupt) vorliegt. Daher müssen Interrupts unbedingt bedient werden, damit der RFM12 den Oszillator abschalten kann. Der Taktausgang liefert nach einem Status-Lesen, gefolgt vom Abschaltkommando des Quarzes (ex = 0) noch einige (192) Taktimpulse, um den angeschlossenen Prozessor ein paar Befehle bis zum Schlafmodus ausführen zu lassen. [Bearbeiten] Taktgenerator-Einstellungen (PLL Setting CCxx, nur RFM12B)
[Bearbeiten] Unterspannungs-Detektor und Taktausgangsteiler (LowBatt / µC Clock Control C0xx)
[Bearbeiten] Frequenzeinstellung (Frequency Setting Axxx)Bestimmt die Sende- und Empfangsfrequenz.
F = f11 .. f0 = Bestimmt den Offsetwert der Frequenz.
Als Basis gilt das eingestellte Band im Grundeinstellungs-Kommando.
Voreingestellt ist F = 1664 = 0x680.
Zulässig sind nur 96 ≤ F ≤ 3903. Falsche Werte werden beim Einschreiben ignoriert. f = 10 MHz * C1 * (C2 + F/4000) (gilt für 10-MHz-Quarz)
Gesendet wird mit einem (weiter unten) einstellbaren Frequenzhub. Empfangen wird mit der hiermit einstellbaren Mittenfrequenz, zuzüglich einem AFC-Offset. [Bearbeiten] Bitrate (Data Rate C6xx)
Die theoretisch maximale Bitrate von 250 kBit/s muss zu Fuß ohne FIFO-Beteiligung sowohl generiert als auch eingelesen werden. Dafür benutzt man am ehesten eine im Mikrocontroller eingebaute RS-232-Schnittstelle und verzichtet auf die elegante Taktrekonstruktion, nimmt einfach das Startbit. Einige wenige Mikrocontroller enthalten eine Serialisierungseinheit für magnetische Speichermedien, Infrarot- oder Funkstrecken, die dafür bestens geeignet ist. Die Anzahl der notwendigen Bitwechsel (1-0 oder 0-1) im Datenstrom bzw. deren Ausbleiben ist davon abhängig, wie sehr sich die Baudraten auf Sender- und Empfängerseite unterscheiden und ob eine langsame oder schnelle Taktsynchronisierung eingestellt wurde. Wenn sich zwei RFM12-Module gegenüber stehen, ist die Taktregenerierung kaum ein Problem; laut Datenblatt dürften bei einer Quarzabweichung von 10-5 430 Bytes ohne Bitwechsel korrekt erfasst werden Die hier eingestellte Bitrate wirkt sowohl auf den Sender als auch den Empfänger, hat aber keinen Einfluss auf bestimmte, davon abhängige Parameter wie Frequenzhub, Sender- und Empfängerbandbreite. Dies muss nach folgender Empfehlung eingestellt werden:
Kurios: Die maximale Bitrate beim Senden mittels Senderegister beträgt 172 kBit/s; hier darf der Teilerwert r = 1 sein. Empfangen kann man damit nicht, jedenfalls nicht mit der FIFO. [Bearbeiten] Empfängersteuerung (Receiver Control 9xxx 9000 .. 97FF)Bestimmt Eigenschaften des Empfänger-Traktes, insbesondere die Bandbreite des Tiefpasses.
[Bearbeiten] Synchronmuster (Synchron Pattern 0xCExx, nur RFM12B)
[Bearbeiten] Empfangsdatenrekonstruktion (Data Filter C2xx)
Die maximale Bitrate für die Verwendung des Digitalfilters (und damit der FIFO und Taktrekonstruktion) beträgt 115 kBit/s. Das Digitalfilter ist eine digitale Implementation eines RC-Filters, gefolgt von einem hysteresebehafteten Komparator. Dessen Zeitkonstante wird automatisch an die programmierte Bitrate angepasst. Die maximale Bitrate für die Verwendung des Analogfilters beträgt 250 kBit/s. Zu seiner Nutzung ist ein Kondensator an CFIL ④ zu beschalten. Der intern wirksame Widerstand hat 10 kΩ.
Der „Datenqualitätsmesser“ (Data Quality Detector) ist eine digitale Signalverarbeitungsstufe, die das Demodulatorsignal abgreift. Er wird automatisch aktiviert, sobald der Empfänger läuft, und stellt den Empfang eines FSK-Signals fest. Der einstellbare Schwellwert entscheidet, wie sauber das Empfangssignal sein muss, damit es als gültiges Signal erkannt wird. Wenn der intern berechnete DQD-Wert für mindestens 5 HIGH-Bits und mindestens 5 LOW-Bits größer als der Schwellwert ist, dann ist das resultierende Ausgangssignal HIGH. Der Schwellwert q sollte nach folgender Vorschrift gewählt werden:
[Bearbeiten] FIFO-Steuerung (FIFO and RESET Mode CAxx)Legt Eigenschaften der Empfänger-FIFO fest
Zum Neustart der Synchronmustererkennung bei durchlaufendem Empfänger (er = 1) sollte ff auf 0 und danach wieder auf 1 gesetzt werden. Bei der Synchronmustererkennung darf kein Bitfehler auftauchen, d.h. es wird eine Hammingdistanz von 0 erwartet. [Bearbeiten] Automatische Frequenznachregelung (Automatic Frequency Control, AFC C4xx)
Der Automatik-Modus a = 10 sollte bevorzugt verwendet werden, wenn mehrere RFM12-Transceiver angesprochen werden sollen, etwa in einem Peer-to-Peer-Netzwerk oder als Zentralknoten in einem sternförmigen Netzwerk. Der Modus a = 11 ist zu bevorzugen, wenn nur eine Gegenstelle angesprochen wird, also bei nur 2 Teilnehmern oder Endpunkte in einem sternförmigen Netzwerk. Das Ergebnis der AFC kann man im Statusregister verfolgen und ggf. eine dauerhafte Korrektur per Ziehkondensator vornehmen und im EEPROM des Mikrocontrollers ablegen. Dabei sollte es eine Instanz im Funknetz geben, welche eine per Frequenzmesser abgeglichene Quarzfrequenz ausweist und diese im Funknetz als solche propagiert. [Bearbeiten] Senderkonfiguration (TX Configuration 9800 oder 9900)
[Bearbeiten] Zeitgeber für Wake-Up (Wake-Up Timer Exxx .. Fxxx)Bestimmt die Zeitperiode der zyklischen Einschaltung des WakeUp-Timers. Nach Ablauf der Zeitperiode erfolgt ein WKUP-Interrupt, der zum Aufwecken eines Mikrocontrollers verwendet werden kann.
Bei Wake-Up-Interrupt ist ew nach jedem Zyklus zu löschen und wieder zu setzen. Vor der ersten Benutzung sollte einmal ein „Dummy-Lauf“ mit einer kurzen Zeitperiode absolviert werden, d.h. der Interrupt sollte einmal ausgelöst werden. Danach kann die gewünschte Wake-Up-Zeit eingestellt werden. Ohne den „Dummy-Lauf“ kann es zu unverständlichen Interrupts kommen. Der Zeitgeber rekalibriert sich bei jedem Hochlauf am Quarzoszillator und benötigt dafür 0,5 ms (nach der Quarz-Hochlaufzeit von bis zu 7 ms). Im Datenblatt zum RFM12B ist ein zuzurechnender Faktor von 1,03 angegeben, der aber in der gleichsam angegebenen Genauigkeit von 10 % untergeht. Ist also Quatsch, selbst wenn man der beim RFM12 angegebenen 5 % glaubt. [Bearbeiten] Software-Reset (0xFE00)Das Kommando 0xFE00 löst einen Software-Reset aus. Die Wirkung ist vermutlich wie bei Power-On-Reset (also Interrupt aktiv). Der Befehl ist im Datenblatt für den RFM12 nicht beschrieben, scheint aber wie beim RFM12B zu wirken. Der Befehl funktioniert nur im high-sensitive reset mode. Nach dem Befehl muss wie beim POR eine Wartezeit von 100ms eingehalten werden. [Bearbeiten] Automatisch zyklischer Empfänger (Low Duty-Cycle C8xx)Neben der Möglichkeit des zyklischen Aufweckens eines angeschlossenen Mikrocontrollers besteht beim RFM12 auch die Möglichkeit, den Empfänger kurzzeitig zu aktivieren ohne den Controller zu wecken, und den Mikrocontroller erst bei gültigem Signal (etwa vom Ausgang VDI ⑪ oder bei Synchronmusterempfang) zu wecken. Somit kann der Empfänger autonom eine feste Frequenz bei geringem Stromverbrauch überwachen. Mit dem Wake-Up-Timer wird die Periodendauer (mithin die Einschaltfrequenz) des Empfängers eingestellt (bspw. alle 500 ms), und mit dem hier einstellbaren Wert wird bestimmt, wie lange der Empfänger dann aktiv sein soll (bspw. 30 % von 500 ms = 150 ms. Werden während der Einschaltdauer gültige Daten empfangen, bleibt der Empfänger bis zum Ende von DQD aktiv. Wird dabei schließlich ein Synchronmuster erkannt und die FIFO gefüllt, gibt es einen FIFO-Interrupt. Der WakeUp Timer muß zur Nutzung des Low Duty Cycles weder aktiviert sein, noch muss er in jedem Zyklus zurückgesetzt werden.
Normalerweise muss die Sendeseite ein permanentes oder eng gelücktes Signal über die gesamte Periodendauer ausstrahlen, damit der Empfänger davon Notiz nehmen kann. Um sowohl beim Sender als auch beim Empfänger Strom sparen zu können, ist es hilfreich, wenn die Wachzeiten der Gegenseite in etwa bekannt sind. Dazu sind hinreichend genau gehende Wake-Up-Zeitgeber erforderlich. Dies wird beim RFM12 bewerkstelligt, indem der Timer beim Einschalten an der Quarzfrequenz abgeglichen wird, um Streuungen zu minimieren. Ein deutlich exakteres Arbeiten ist möglich, wenn auch aufwändiger, wenn man auf den Zeitgeber des RFM12 verzichtet und statt dessen eine 32-kHz-basierte Uhrenquarzzeitbasis des Mikrocontrollers verwendet, typischerweise am asynchronen Oszillator am Timer2 eines ATmega-Controllers. [Bearbeiten] Empfänger-FIFO lesen (RX FIFO Read B000)
Dieses Kommando löst die Rückgabe eines Datenbytes (synchron mit dem 8. Bit) aus. Es ist nötig, dass das ef-Bit (RX-FIFO) im Configuration Setting gesetzt wurde, um diese Funktion nutzen zu können!
___ _ __
SEL \________________________________________________________________________________/ \___|?|__________________
_ _ _ _ _ _ _ _ __ __ __ __ __ __ __ __ _ _ _ _
SCK ___/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \_______|?|__/ \_/ \_/ \_/ \_
_____ _______ ggf. reduzierte Schiebetaktfrequenz _______ ____ _______
SDI _/ \___/ 0xB0 \_______________________________________________________________/_______|?|/ \___/ 0xB0 \_
________________________________ _____ _____ _____ _____ _____ _____ _____ _____ _ ____________________
SDO -________________________________X_____X_____X_____X_____X_____X_____X_____X_____X_---___/↑
FFIT (sollte HIGH sein) D7 D6 D5 D4 D3 D2 D1 D0 D? └─Interrupt
D? = FIFO ist vom Fall-Through-Typ; ungültig oder nächstes Datenbit wenn nicht leer
|?| = warten bis SDO = HIGH (nicht auf die L-H-Flanke, diese könnte ausbleiben!)
--- = Tristate, der Bus-Holder hält den Ausgang auf den letzten Pegel fest
Bei entsprechender Füllstands-Einstellung kann man hiermit auch mehr (bspw. 9 Bit) oder weniger (bspw. 7 Bit oder auch jedes Bit einzeln) abholen. Da das Senderegister auf 8 Bit festgelegt ist, hat das meistens keinen Sinn. Die Taktfrequenz darf für das FIFO-Auslesen maximal 2,5 MHz betragen. Alternativ kann das Auslesen der FIFO ohne den [Bearbeiten] Senderegister schreiben (TX Register Write B8xx)Dieses Kommando schreibt Daten in den TX-Puffer. Wenn der Sender aktiv ist, wird dieses gesendet, sobald das andere Register leer ist. el muss eingeschaltet sein.
(Senden Funktioniert nur wenn zuvor der Status abgefragt wurde - Nö!)
___ _ _
SEL \_________________________________________________________________|?|_________________________________|?|________________________________/
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
SCK __/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \__/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_|?|_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_|?|_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \__
__ ___________ ___ ___ ___ ___ ___ ___ ___ _____ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
SDI _/ \___/ = B 8 \____________/___X___X___X___X___X___X___X_____|?|X___X___X___X___X___X___X___X___X|?|X___X___X___X___X___X___X___X___\_
__________________________________________ ___________ ___________
SDO - = RGIT \\\\\____________________/ \\\\\___________________/ \\\\\__________________-
|?| = warten bis SDO ① wieder HIGH wird, bspw. per Interrupt
Datenbytes können, bei aktiv LOW gehaltenem SEL ⑭, bei HIGH an SDO ① nachgeschoben werden, ohne das Präfixbyte Alternativ kann das Einschreiben der Daten mittels FFS ③ erfolgen. Die beiden Senderegister werden beim Power-On-Reset und beim Ausschalten von et mit Solange der Sender ausgeschaltet ist, kann man durch Einschreiben zweier anderer Bytes eine andere Präambel (Takteinlauf) beim Einschalten des Senders erzwingen. Um das Aussenden des passenden Synchronmusters (typ.
Um den korrekten Moment zum Ausschalten des Senders zu finden, ist es am günstigsten, am Ende ein Dummy-Byte (typischerweise [Bearbeiten] Status lesen (Status Read 0000)Dieses Kommando löst die Rückgabe des Statusregisters aus. Im wesentlichen werden damit Interruptanforderungen gelöscht. Das Null-Bit im MSB entscheidet hierbei, dass Statusbits geliefert werden. (Vermutlich sind die anderen Sende-Bits don't care, also egal.) Wie auch sonst erscheint das erste Bit ganz ohne Takt SCK ⑬ nach der fallenden Flanke von SEL ⑭.
Wie weiter oben betrachtet kann man mit weiteren Takten die Empfangs-FIFO auslesen.
Einen Interrupt bei FIFO-Unterlauf (Auslesen von zu vielen Bits) scheint es nicht zu geben. Beachte: Solange irgendein Interrupt aktiv ist sowie der Taktausgang aktiv ist (dc=0), kann der RFM12 nicht in den Schlafmodus wechseln, und der Quarzoszillator läuft durch. Grundsätzlich sollte bei jedem Interrupt eine Statusabfrage (über die Interruptquelle) erfolgen und danach die Ursache getilgt werden. Bei Verwendung eines flankengetriggerten Interrupt-Eingangs (etwa Pin-Change) läuft man Gefahr, nicht alle Interrupts zu bedienen! Hier sollte pegelgetriggerter Interrupt simuliert werden, indem der Kode in einer Schleife so lange ausgeführt wird, bis der Eingang inaktiv (HIGH) ist. Die AFC-Werte sind nur glaubhaft, wenn nicht gerade eine automatische AFC läuft. (Da fehlt wohl ein Puffer.) Um hiermit korrekte AFC-Werte zu lesen, sollte die AFC-Berechnung vor dem Status-Lesen ausgeschaltet werden (Bit en = 0). Mit vagabundierender Spannung bei deaktiviertem Pull-Up-Widerstand an SDO ① braucht man nicht rechnen, da (laut Datenblatt) dieser Ausgang mit Bus-Hold ausgestattet ist. So bezeichnet man eine hochohmige Rückführung eines nichtinvertierenden Eingangstreibers, die den Eingang im zuletzt vorgefundenen Spannungspegel hält (tatsächlich ein Flipflop-Effekt). [Bearbeiten] Einstellungen für maximale ReichweiteFür eine maximale Reichweite eignen sich folgende Einstellungen:
Und vor allem: Eine gute (Richt-) Antenne. [Bearbeiten] Quarzfrequenz ändernIm Datenblatt wird die Verwendung eines 10 MHz-Quarzes empfohlen. Man darf die Frequenz aber nach oben und unten variieren, wie Messungen mit einem DDS-Generators anstelle des Quarzes zeigen: PLL-Einrast-Tabelle. Eine Tabelle: Quarzfrequenzen von 8,5-11 MHz zeigt die damit erreichbaren Frequenzen. Quarze für 3. oder auch 5.Oberton sollten auch auf ihrer Grundfrequenz verwendbar sein, dafür bieten sich u.a. CB-Funk- und 10m-Amateurbandquarze an. Den Einfluß der vier unteren Bits im Configuration Setting Register und des mp-Bits (Modulations-Polarität?) auf die PLL-Frequenz zeigt diese Kapazitäts-Tabelle. Pro Stufe sind es hier etwa 4 kHz, das kann je nach Quarz schwanken. Möglicherweise ist so auch Schmalband-FSK möglich, ohne Änderung des PLL-Teilers. Was können wir damit anfangen? Neben dem regulären Einsatz auf den beiden zugelassenen Bändern 433 und 868 MHz sind das unter anderem (bitte weitere Ideen einfügen):
[Bearbeiten] Antennen-AnpaßnetzwerkSoll das RFM12 auf anderen Frequenzen betrieben werden, ist nur eine Änderung des Antennennetzwerks nötig. Das Datenblatt bietet knappe aber ausreichende Informationen. Zwischen Pin 12 und 13 liegt eine Spannungsquelle, die ihre maximale Sendeleistung in eine komplexe Last nach der Tabelle "Note4" abgibt. Das bedeutet, ihr Innenwiderstand ist konjugiert-komplex zu dieser Last, also dieselben Zahlenwerte, nur mit Minuszeichen vor dem "j". Das Anpassnetzwerk läßt sich auf zwei Bauteile reduzieren: von der Antenne ausgehend, die als reeller 50Ω- Widerstand angenommen wird, ist ein Kondensator in Reihe geschaltet. C8 und C9 (in der Tabelle C9 und C10 bezeichnet) liegen in Reihe und sind gleich groß, dürfen also in einem Kondensator mit der halben Kapazität zusammengefasst werden. Dann liegt noch L1 parallel zur Quelle, L3 hat mehr als den 20-fachen Wert und kann vernachlässigt werden. Das ganze läßt sich im Smith-Diagramm gut darstellen. Von der Antenne im Mittelpunkt ausgehend bewegen wir uns mit dem Serien-C Cs auf einem Kreisbogen nach unten (kapazitive Halbebene) auf den Punkt "Unendlich" rechts außen zu. Ungefähr senkrecht unter dem Zielpunkt, hier für 433 MHz gezeichnet, biegen wir ab auf eine Kreisbahn für die Parallelinduktivität Lp. Sie führt in die obere (induktive) Halbebene auf den Nullpunkt links zu. Der genaue Schnittpunkt beider Kreise kann "mit Zirkel und Lineal" oder einem der Hochfrequenz-Berechnungsprogramme ermittelt werden. Die Kreise für Lp oder Cp sind im Smith-Diagramm nicht eingezeichnet , um die Übersicht zu wahren. Man könnte ein gespiegeltes Diagramm darüberlegen, aber stattdessen spiegelt man die Kurve am Diagramm-Mittelpunkt (dünne blaue Kurven). Am Rand kann man jetzt die auf 50Ω (bzw. 1/50Ω für die gespiegelte Kurve) normierten Blindwiderstände ablesen. Für Cs lesen wir eine Differenz zwischen Start und Zielpunkt von etwa Xc=(3,2-0) * 50Ω ab, für Lp sind es (0,25 +0,32) = 0,57*(1/50Ω). Damit erhalten wir Cs=1/(2*Pi*f*Xc)=2,3 pF das war wie gesagt die halbe Kapazität der beiden hintereinandergeschalteten Kondensatoren, Tabellenwert ist 4,7pF und Lp=1/(2*Pi*f*0,57*(1/50))= 32,2 nH, der Tabellenwert ist 27nH. Im RF12 wird ein um zwei Bauteile (im Bild C2 und L1 genannt) erweitertes Netzwerk empfohlen, das macht man um eine breitbandigere Anpassung zu erreichen. [Bearbeiten] BetriebsspannungAchtung nicht alle Module sind für 5V geeignet, alle Typen mit "B" am Ende sind nur für 3,3V. Man muß dann entweder den Mikrocontroller ebenfalls mit 3,3V betreiben, oder Pegelwandler verwenden. [Bearbeiten] MessungenDrei Messungen am RFM12 zeigen den Einfluß von Eingangpegel, Frequenzhub und Mittenfrequenz auf das Ausgangssignal, gemessen am Filterkondensator CFIL. Zwei weitere Kurven zeigen die ARSSI-Spannung (Anschluß am Kondensator in der Ecke) und die damit gemessene Filterkurve. Was folgt aus diesen Messungen?
Die AFC-Messdauer ist im Datenblatt nicht genannt, eine schnelle Abfrage des ATGL-Bit im Statusregister im "Auto-AFC" - Modus liefert minimale Pulsbreiten von ca. 250..270 µs, entsprechend einer Messfolgefrequenz von 4 kHz (schneller oder präziser AFC-Modus?) - leider nicht ausreichend um 9600 Baud Schmalband-FM zu demodulieren. Im Auto-Modus werden zwei Messungen zusammengefasst, damit beträgt die Updaterate sogar nur 2 kHz. Weitere Messung: ab etwa ± 10 kHz Hub synchronisiert sich das ATGL-Bit auf der Mittenfrequenz mit einem bis zu 1,8...2 kHz FM-modulierten Signal. Neue Idee: "Dithering und FM-Flankendemodulator": [Bearbeiten] Bezugsquellen[Bearbeiten] Links
Folgende Links sind mit Vorsicht zu genießen, da die Datenblätter teilweise fehlerbehaftet sind. Es empfiehlt sich, direkt mit dem Datenblatt des RF12 (das ist das IC auf dem Modul) zu arbeiten. Dieses ist so gut wie fehlerfrei.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||