Feinabgleich der Funkfrequenz

wozu Feinabgleich?

Die Genauigkeit der Trägerfrequenz (868,3MHz) ist recht kritisch, denn: KNX-RF spezifiziert einen minimalen FSK Hub von +/- 40kHz.

Damit eine FSK Demodulation möglich ist, dürfen die Trägerfrequenzen von Sender und Empfänger deutlich weniger als 40kHz auseinander liegen, pro Station bedeutet das <20kHz Abweichng. Um eine Reserve zu haben, sollte man <10kHz anstreben. 10kHz von 868Mhz sind 11,5 ppm, das runden wir mal auf 10 ppm ab. Die KNX-RF Spezufikation erlaubt zwar +/- 35 ppm, aber wie das sicher funktionieren soll, ist mir unklar. Vielleicht mit AFC.

Die Spezifikation des RFM23B macht keine Aussage über die Genauigkeit der Frequenz. Die RFM Module enthalten einen gewöhnlichen Quarzoszillator, und ich gehe von einer Genauigkeit von etwa 50 ppm aus. Dieser Quarzoszillator hat eine Frequenz vom 30MHz, die 868,3MHz werden daraus per Frequenzsynthese abgeleitet. Ein Trimmen dises Oszillators ist durch Beschreiben des Registers 9 im RFM23B möglich. Ferner haben die Module einen Ausgang, an dem die durch einen einstellbaren Faktor geteilte Oszillatorfrequenz anliegt. Die freebus-rf firmware stellt diesen Teiler so ein, dass 10MHz ausgegeben werden. Über diesen Ausgang wird der AVR getaktet. Am Besten man misst diese 10MHz mit einem entsprechend genauen Frequenzzähler am Ausgang GPIO2 vom RFM, bzw. XTAL1 (Pin 9) am ATMEGA.

Wenn man nur selbstgebaute freebus-rf Geräte benutzt, reicht es, wenn die Frequenz von allen Geräten gleich ist, auf den absolutwert kommt es dann nicht so sehr an. Dann reicht auch ein weniger genauer

Frequenzzähler

Eine nette Bauanleitung für einen Frequenzzähler findet man hier:

http://kl7r.ham-radio.ch/ik3oil/index.html

leider funktioniert dort der link zum hex file nicht, aber hier:

http://ironbark.bendigo.latrobe.edu.au/%7Erice/fm/FM003.HEX

Ich habe mir so einen gebaut, und er funktionierte auf Anhieb. Wenn man allerdings original KNX-RF Geräte mit einbeziehen will, dann muss man schon auf die richtige Frequenz abgleichen.

Vorgehensweise für den Abgleich mit Frequenzzähler

Weil man davon ausgehen muss, dass ein frisch aufgebautes freebus-rf Gerät zunächst per Funk nicht erreichbar ist, muss man den Abgleichwert über die ISP Schnittstelle in's EEPROM des controllers schreiben, und zwar auf Adresse 0x0110/0x0111. 0x0110 enthält den Wert, der in's Register 9 des RFM geladen wird, 0x111 den invertierten Wert davon. Nur wenn die beiden Inhalte komplementär sind, wird das RFM damit abgeglichen.

Dies geht z.B. mit dem avrdude im interaktiven terminal mode. Man startet avrdude mit dem Kommando (ggf andere parameter für den programmer):

avrdude -c usbasp -p m328p -P usb -t

dann meldet sich avrdude:

avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e950f

und wir bitten erstmal um Hilfe:

avrdude> help

ich erspare mir hier, die Ausgabe zu zeigen.

wir bitten ihn um Ausgabe der besagten eeprom Zellen

avrdude> dump eeprom 0x110 2

>>> dump eeprom 0x110 2
0110  55 aa                                             |U.              |

und schreiben was neues rein:

avrdude> write eeprom 0x110 0xa5 0x5a

>>> write eeprom 0x110 0xa5 0x5a

Man probiert also ein Bisschen herum, bis die Frequenz an Pin 9 des ATMEGA möglichst genau 10,000 000 MHz ist.
Ein guter Startwert bei mir war 0xD0 0x2F. Und immer schön das Komplement mitprogrammieren!

und mit was anderem als avrdude?

Da ich keine anderen programmer verwende, kann ich auch keine Anleitung für andere programmer geben. Wenn jemand diesbezüglich Hinweise geben kann, sind sie willkommen. Oder man wartet auf das Erscheinen des automatischen Abgleichs

Idee für einen automatischen Abgleich

Folgendes scheint einfach zu realisieren: Man baut ein rf controllerboard als Referenz für Abgleichzwecke. Dieses lädt man mit einer spezial firmware. Wenn man Zugriff auf einen genauen Frequenzzähler hat, kann man dies Referenzboard so genau wie möglich abgleichen. Dieses Referenzboard gibt dann an irgendeinem Pin eine durch einen genauen Faktor geteilte Taktfrequenz aus. Diesen Ausgang verbindet man mit einem Eingang des abzugleichenden controllerboards. Hier ist auch zunächst die Abgleichfirmware geladen. Die firmware gleicht jetzt das RFM so ab, dass seine eigene, geteilte Taktfrequenz genau derjenigen der Referenz entspricht. Eine Fertigmeldung (bzw. Fehleranzeige) erfolgt durch die Prog LED. Beim anschliessenden flaschen der Applikation muss man darauf achten, dass das eeprom nicht gelöscht wird. Dafür gibt es ein fuse-bit.

Nachgleich von im Betrieb befindlichen Funkboards:

Per Funk wird der Abgleich durch Beschreiben der Adresse 0x0210 durchgeführt. Ein einmaliges Schreiben auf 0x0210 lädt den Wert erstmal nur in das RFM. Falls der dann total falsch abgestimmt ist, und nicht mehr empfangen kann, hilft ein reset um den alten Wert wieder zu laden. Andernfalls kann man denselben Wert ein zweites mal schreiben. Dadurch wird er ins EEPROM übernommen (incl. Komplement -> 0x211) und auch beim reset wieder geladen. Durch dieses Verfahren wird verhindert, dass man per Funk einen Abstimmwert in's EEPROM schreibt, bei dem das RFM keinen Empfang mehr hat.

Wieso 0x0210?

Wenn man freebus-rf Module über den Bus anspricht, muss man 0x100 auf die interne eeprom Adresse draufaddieren.

und wie kann man diese Adressen überhaupt über den Bus ansprechen?

leider kann ich hier nur beschreiben, wie das mit eibd geht:

mwrite ip:rechnername 0.8.15 210 d0 2f

rechnername ist der Name des Rechners, auf dem der eibd läuft

0.8.15 ist die PA des zu programmierenden freebus Bausteins.

Auf Adresse 0x110 0x111 werden die Werte 0xd0 0x2f geschrieben.

Auslesen kann man natürlich auch über eibd:

mread ip:rechnername 0.8.15 210 2

RSSI

Den RSSI Wert (Received Signal Strength Indication) kann man durch lesen der Adresse 0x0200 bekommen. Er ist für den Frequenzabgleich allerdings nicht aussagekräftig genug.

mread ip:rechnername 0.8.15 200 1