Forum: HF, Funk und Felder RFM12 - Reale Sendefrequenz


von Tobias F. (colonel2601)


Angehängte Dateien:

Lesenswert?

Hallo,
hat hier schon mal jemand bei den beliebten RFM12-Modulen die reale 
Sendefrequenz ermittelt?
Ich habe mehrere Module der 868-MHz-Variante, die sich alle gleich 
verhalten.

Wenn ich das Freq-Kommando 0xA320 zum RFM12 sende, sollte doch die 
Frequenz 864.000 MHz eingestellt werden (nach der Formel aus dem 
RF12-Datenblatt f = 10*C1*(C2+F/4000), F= 320h = 800dez). Mit meinem 
Spectrum Analyzer messe ich aber eine Frequenz bei 860.000 MHz (siehe 
Screenshot im Anhang, Center-Freq des Analyzers auf 860MHz, Span auf 
10MHz, im Zero-Span-Modus finde ich die gleiche Signalhöhe bei 860MHz, 
und deutlich weniger bei 864MHz).

Der Spectrum Analyzer HM5014-2 ist nicht kalibriert, die 
(Un-)Genauigkeit inkl. Alterungsdrift sollte bei ein paar ppm liegen, 
also nicht im MHz-Bereich. EinsLive wird übrigens korrekt bei 105.5MHz 
angezeigt, aber das ist ja leider keine Aussage für den höheren 
Frequenzbereich des Analyzers ;-)

Einer macht hier also Murks, entweder die RFM-Module oder der Analyzer, 
ich kann nur nicht herausfinden, wer das ist.

Daher meine Frage: Wie sind eure Erfahrungen mit den RFM12-Modulen? Das 
sie untereinander funktionieren, steht ja außer Frage. Aber wie sieht's 
in Kombination mit anderer HW aus? Habt ihr schon mal Messungen der 
Center-Freq. durchgeführt?

Gruß,
colonel2601

von Holger S. (holli_1)


Lesenswert?

Schon mal an die FSK-Modulation gedacht?

von Jupp (Gast)


Lesenswert?

Also ich lese da 864MHz ab, Wie kommst Du auf 860MHz Sendefrequenz?

von Tobias F. (colonel2601)


Lesenswert?

Jo, danke erstmal für die schnellen Antworten.

@Holger: Ja, habe ich, aber die FSK-Modulation ist auf +/-45kHz 
eingestellt, die wird man auf dem Bild vermutlich nur mit Phantasie 
erkennen können, da der "Frequenzbuckel" genau in der Mitte eine 
Absenkung aufweist, die Maxima liegen leicht rechts und links der 
Center-Freq.

@Jupp: Mache ich was falsch? Die Center-Freq. des Spectrum-Analysers ist 
auf 860 MHz eingestellt, der Span auf 10MHz, ergo wird auf dem 
Bildschirm doch der Bereich von 855 .. 865 MHz dargestellt, und das 
Signalmaximum liegt doch ziemlich exakt in der Mitte, geschätzt 0.2MHz 
daneben, also ganz genau gemessen bei 860.2 MHz, oder? Das würde ich ja 
noch als Abweichung durchgehen lassen, aber nicht die 4 MHz zu den 
eingestellten 864MHz...

Grüße, und weiter ratlos,
Tobias

von Tobias F. (colonel2601)


Lesenswert?

Desweiteren:
- Das Signal kommt wirklich von meinem Sender. Schalte ich diesen aus, 
so zeigt der Spectrum Analyzer nur noch Grundrauschen an. Ich habe den 
Test gemacht, um sicherzugehen, dass ich nicht irgendeinem Fremdsender 
hinterherjage...
- Die Kommunikation mit dem RFM12-Modul läuft über Hardware-SPI eines 
Atmel ATXMEGA32, z.B. das Kommando zum Setzen unterschiedlicher 
Taktteilerfaktoren (1.0MHz, 2.0MHz, 2.5MHz) funktioniert problemlos.
- Setze ich die Frequenz auf 864 MHz (Kommando A320), messe ich ca. 860 
MHz. Setze ich die Frequenz auf 868 MHz (Kommando A640), so messe ich 
ca. 865 MHz. Der Frequenzoffset zwischen gesetzter und gemessener Freq. 
ist also nicht konstant.
- Die Änderung der Lastkapazität für den 10 MHz Quarz von Minimum 
(8.5pF) auf Maximum (16.0pF) erzeugte keine(!) Änderung in der 
Sendefrequenz. Sollte sich die TX-Frequenz nicht ändern, wenn ich die 
Lastkapazität des Quarzoszillators ändere, da die TX-Frequenz über eine 
PLL aus dem Quarztakt generiert wird? Oder ist der Oszillator so stabil?

Noch ratloser,
Tobias (und nun gute Nacht ;-)

von Holger S. (holli_1)


Lesenswert?

Ich habe letztens mal einen RFM12 gemessen, allerdings statisch d.h. 
Sender eingeschaltet und dann am FSK-Pin gewackelt. Da konnte man schön 
die Änderung der Frequenz durch die FSK-Modulation sehen. Die 
Mittenfrequenz war genau wo sie sein sollte. Schon mal ein anderes Modul 
getestet oder die Quarzfrequenz gemessen? Oder ist eine andere Referenz 
für den Spektrumanalysator zum Vergleichen verfügbar?

von Adi (Gast)


Lesenswert?

Ein einfacher Test um rauszufinden ob dein Speci die Frequenz richtig 
anzeigt wäre folgender:
Nimm die Funkfernbedienung deines Autos - die arbeitet ziemlich 
wahrscheinlich auf 433,92MHz (zumindest war das bislang bei allen 
Funkschlüsseln so, die ich vermessen habe - die Frequenz lässt sich 
ansonsten aber bestimmt googlen). Stell den Speci auf diese Frequenz und 
drücke den Knopf (sicherheitshalber den für Versperren, nicht dass du 
den Wagen unbemerkt aufsperrst und dir die Jungs in Schwarz das Navi 
klauen ;-)). Und dann siehst du ja, ob dein Speci dir die Wahrheit sagt 
:-)


Die etwas aufwändigere Variante - bzw die Grundidee von Holger:
Laut RFM12 Datasheet kann das TRX Modul auch einen Clock ausgeben (ich 
nehme an dass du da auch 10MHz rausbekommst). Ich würde mal versuchen 
diese 10MHz dem Spectrum Analyzer als externe Referenz anzubieten 
(eventuell musst du das Signal dazu etwas aufbereiten).

Viel Erfolg
Adi

von Holger S. (holli_1)


Angehängte Dateien:

Lesenswert?

Ich habe aus Spaß mal mit einem HMO1024 Oszi am RFM12 gemessen. Und es 
zeigt sogar etwas an. Eingestellt auf 435 MHz und 240 kHz FSK, mit 
FSK-Pin einmal auf low und high. Wie man sieht ist alles da wo es sein 
soll.

von Franzl F. (Firma: Elektroniker) (franzl-f)


Lesenswert?

Tobias Franke schrieb:
> Die Kommunikation mit dem RFM12-Modul läuft über Hardware-SPI eines
> Atmel ATXMEGA32

Können die ATXmega jetzt 16Bit SPI? SPI Takt zu hoch? Funktioniert das 
Empfangen mit einem RFM12 Einwandfrei?

von Tobias F. (colonel2601)


Angehängte Dateien:

Lesenswert?

Hi, und danke für die Tipps.

@Adi:
Ich habe das ganze Haus nach einem passenden Sender durchsucht, irgendwo 
im höheren 100er-MHz-Band, aber keinen mit genau bekannter Frequenz 
gefunden. Einfach zu kompliziert gedacht.
Mein Opel-Schlüssel sendet auf 433.92MHz, was auch der Spectrum Analyzer 
genau anzeigt. Demnach ist der Analyzer in Ordnung, und meine Module 
senden auf der falschen Frequenz Mist

@Holger:
Danke für die Screenshots, die Aufnahmen sind wirklich sehr deutlich, 
das Modul macht zumindest, was es soll.

@Franzl:
Nein, auch die ATXMega machen nur 8-Bit-SPI. Ich sende erst das 
High-Byte, dann das Low-Byte. Da ich den Chip-Select manuell vorher und 
nachher schalte, sollte das gehen. Weil ich die Ausgangsfrequenz des 
CLK-Pins umschalten kann (getestet: 1MHz, 2MHz, 2.5MHz), bin ich davon 
ausgegangen, dass sowohl das Kommando als auch die Parameter korrekt 
übertragen werden. Aber ich werd's mir gleich nochmal auf dem Oszi 
ansehen.
Den Empfang habe ich noch nicht getestet, da habe ich das 
Henne-Ei-Problem. Ich wollte erstmal sichergehen, dass der Sender das 
macht, was er soll...

Da zwischen den Freq.-Einstellungen (864 & 868 MHz) und den Messungen 
(860 & 865MHz) kein linear steigender Zusammenhang besteht, gehe ich 
weder von einem Berechnungsfehler noch einem Quarz- oder PLL-Problem 
aus, evtl. ist wirklich die SPI-Übertragung nicht ganz korrekt...

Ich geh' jetzt mal messen...

von Simon K. (simon) Benutzerseite


Lesenswert?

Wie sieht denn deine Berechnung in Software aus? Möglicherweise ein 
Rundungsfehler oder sogar Ungenauigkeit durch Verwendung von 
Gleitkomma-Datentypen.

von Tobias F. (colonel2601)


Lesenswert?

Hi Simon,
ich berechne nicht in SW, ich gebe Konstanten über SPI an das 
RFM12-Modul. Die Formel lautet vereinfacht (mit C1=2 und C2=43 schon 
eingesetzt): f=860+F/200. F ist die Konstante, die ich per Kommando 
vorgeben, entweder 800 oder 1600, das ergibt f (in MHz) von 864 MHz bzw. 
868 MHz (bzw. sollte es ergeben ;-)

Hardware-SPI war im ATXMega auf 1MHz Taktfrequenz eingestellt, die Daten 
wurden bei der fallenden Flanke ausgegeben, weil der RF12 diese bei der 
steigenden einsychronisiert. Zig µs vorher wurde nCS auf low gezogen, 
später wieder auf high. Aufgrund der 2 8-Bit-SPI-Transfers (und meinem 
aktuellen bescheidenen Takt von 1MHz) gab es ein langes Gap zwischen dem 
MSB und dem LSB des 16-Bit-Transfers. Außerdem war der Clock am Anfang 
und am Ende high, das ergab sich aus dem HW-SPI, da ja bei der fallenden 
Flanke die Daten generiert werden sollen, deshalb fängt er mit der 
fallenden Flanke an und hört mit der steigenden Flanke auf. Da Setup- 
und Hold-Zeiten im Datenblatt nur auf die steigende Flanke bezogen 
waren, habe ich mir nichts dabei gedacht.

Naja, ich hab's jetzt mal auf SW-SPI umgestrickt, Freq. jetzt nur noch 
30kHz, das sollte wohl zu schaffen sein, mit CLK am Anfang und Ende low. 
Wenn morgen der Spectrum Analyzer noch nicht zur Reparatur ist (nur 
mechanisch ;-), werde ich's in der Firma nochmal nachmessen. Die 
Ausgangsfrequenz von CLK lässt sich zumindest wie gewohnt einstellen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Tobias Franke schrieb:
> Da ich den Chip-Select manuell vorher und
> nachher schalte, sollte das gehen.

Das ist bei SPI immer so.  Insofern gibt's auch nie ein Problem
mit 16-bit-SPI.

von Tobias F. (colonel2601)


Angehängte Dateien:

Lesenswert?

Hallo,
erstmal D A N K E !!!

Die Umstellung auf Software-SPI hat's gebracht, die Frequenzen liegen 
nun genau da, wo sie sein sollen (siehe Screenshots).
Woran es nun genau liegt, kann ich noch nicht sagen, ich werde noch ein 
bißchen testen, um es herauszufinden, aber es funktioniert schon mal 
**freu**
Dann muß ich doch nicht alle Module von meinen Boards herunterreißen...

Grüße,
Tobias

von Tobias F. (colonel2601)


Lesenswert?

Na, und schon gefunden.

Wenn ich bei meinem Software-SPI nach dem 16ten Bit den CLK auf high 
stehen lasse, dann wird die falsche Frequenz eingestellt.
Setze ich dagegen CLK am Ende auf low, bevor nSEL wieder auf high 
gesetzt wird, so wird die korrekte Frequenz erzeugt.

Seltsam ist nur, dass der Kommando-Code (also die MSBits) in beiden 
Fällen richtig erkannt wird, die Frequenz wird ja in beiden Fällen 
geändert. Und das ich mit beiden Varianten den Ausgangstakt auf 1MHz, 
2MHz usw. korrekt setzen kann.

Evtl. hat die interne PLL ein Schieberegister, welches noch die fallende 
CLK-Flanke braucht, um die Daten zu übernehmen, während die anderen 
Konfigurationsregister diese nicht benötigen.

Also, nochmal besten Dank an alle, die mir nützliche Anregungen gegeben 
haben. Das Problem sehe ich hiermit als gelöst an ;-)

von Simon K. (simon) Benutzerseite


Lesenswert?

Ich würde einfach mal darauf tippen, dass du den falschen SPI Mode 
benutzt (hast).

von Malte _. (malte) Benutzerseite


Lesenswert?

Tobias F. schrieb:
> Wenn ich bei meinem Software-SPI nach dem 16ten Bit den CLK auf high
> stehen lasse, dann wird die falsche Frequenz eingestellt.
> Setze ich dagegen CLK am Ende auf low, bevor nSEL wieder auf high
> gesetzt wird, so wird die korrekte Frequenz erzeugt.

Danke! Der Hinweis auf die Verwendung von Software statt Hardware und 
die extra Wartezeit am Ende hat auch bei mir den RFM12 endlich zum 
funktionieren gebracht.

Falls noch jemand beim Suchen nach einer Lösung über diesen Thread 
stolpern sollte:
1
//on PORTC:
2
#define RFM12_NINT 3
3
#define RFM12_SELECT 4
4
#define RFM12_MOSI 5
5
#define RFM12_MISO 6
6
#define RFM12_CLK 7
7
#define RFM12_RESET 5
8
//on PORTB:
9
#define RFM12_NIRQ 1
10
11
#if 0
12
//user hardware (not working)
13
uint16_t rfm12_command(uint16_t data) {
14
  uint16_t indata;
15
  PR_PRPC &= ~PR_SPI_bm;
16
  PORTC.OUTCLR = (1<<RFM12_SELECT);
17
  PORTC.PIN6CTRL = PORT_OPC_TOTEM_gc; //now the RFM12 drives the pin
18
  SPIC.CTRL = SPI_ENABLE_bm | SPI_MASTER_bm | SPI_MODE_0_gc | SPI_PRESCALER_DIV4_gc;
19
  SPIC.INTCTRL = SPI_INTLVL_OFF_gc;
20
  //Reading status + reading data = clear status bits
21
  SPIC.STATUS;
22
  SPIC.DATA;
23
  //shift out data
24
  SPIC.DATA = data >> 8;
25
  while (!SPIC.STATUS); //wait for shift of first byte
26
  indata = SPIC.DATA << 8;
27
  SPIC.DATA = data && 0xFF;
28
  while (!SPIC.STATUS); //wait for shift of second byte
29
  indata |= SPIC.DATA;
30
  PORTC.OUTSET = (1<<RFM12_SELECT);
31
  PORTC.PIN6CTRL = PORT_OPC_PULLUP_gc; //RFM12 is high impedance again
32
  //PR_PRPC |= PR_SPI_bm;
33
  return indata;
34
}
35
#else
36
//use software (working)
37
uint16_t rfm12_command(uint16_t outdata) {
38
  uint16_t indata = 0;
39
  PORTC.OUTCLR = (1<<RFM12_CLK);
40
  PORTC.OUTCLR = (1<<RFM12_SELECT);
41
  PORTC.PIN6CTRL = PORT_OPC_TOTEM_gc; //now the RFM12 drives the pin
42
  //shift out and get data
43
  uint8_t i;
44
  /* The RFM12 samples the pin on the rising clock edge and changes the
45
     Pin on the falling clock edge. The first bit is there before any clock.
46
  */
47
  for (i = 0; i < 16; i++) {
48
    indata <<= 1;
49
    //write data
50
    if (outdata & 0x8000) {
51
      PORTC.OUTSET = (1<<RFM12_MOSI);
52
    } else {
53
      PORTC.OUTCLR = (1<<RFM12_MOSI);
54
    }
55
    _delay_us(2.0);
56
    //rise clock
57
    PORTC.OUTSET = (1<<RFM12_CLK);
58
    //read data
59
    if (PORTC.IN & (1<<RFM12_MISO)) {
60
      indata |= 1;
61
    }
62
    _delay_us(2.0);
63
    //clock to low
64
    PORTC.OUTCLR = (1<<RFM12_CLK);
65
    outdata <<= 1;
66
  }
67
  _delay_us(2.0); //give some time to the RFM12 for sampling
68
  PORTC.OUTSET = (1<<RFM12_SELECT);
69
  PORTC.PIN6CTRL = PORT_OPC_PULLUP_gc; //RFM12 pin is high impedance again
70
  return indata;
71
}
72
#endif

von Michael U. (amiga)


Lesenswert?

Hallo,

ich kann mich erinnern, daß meine RFM-Module alle mit Software-SPI 
laufen, weil es damals (2009) irgendwelche Probleme mit dem Timings des 
Hardware-SPI und den RFM-Modulen gab.

Weil Software-SPI lief habe ich es bis heute so weiter verwendet...

Gruß aus Berlin
Michael

von Tobias F. (colonel2601)


Lesenswert?

Hey, freut mich, dass der 5 Jahre alte Thread noch gefunden wurde und 
geholfen hat.

Grüße,
Tobias

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.