Forum: Mikrocontroller und Digitale Elektronik RFM12b 868MHz


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Marco R. (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Seit einigen Tagen versuche ich ein Programm für das RFM12b Modul 
(868Mhz) zu schreiben (Programm im Anhang), leider bis jetzt ohne 
Erfolg. Ich habe etliche Programmierguids durchgelesen und mich an diese 
gehalten... kann mir deshalb auch keinen Fehler mehr erklähren. Leider 
finde ich auch keine wirklich verständliche library im Internet.

Details zum Projekt:

µController: Atmega8
Sender/Empfänger: RFM12b 868Mhz

Beschaltung:

Atmega --> RFM12b

Vcc --> Vcc
GND --> GND
SCK --> SCK
MOSI --> SDI
MISO --> SDO
PD7 --> nIRQ
SS --> nSEL

CLK,nRes, DCLK, nINT --> nicht belegt
FSK mit 10k pullup auf Vcc


Ich wäre würklich froh über Programme, Fehlerkorekturen oder 
Anleitungen.

mfg. Marco R.

von Christian S. (roehrenvorheizer)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

es gab dazu früher schon etwas:
Beitrag "bidirektionale RS232 Funkbrücke mit RFM12"

MfG

von c-hater (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Marco R. schrieb:

> Beschaltung:
>
> Atmega --> RFM12b
>
> Vcc --> Vcc
> GND --> GND
> SCK --> SCK
> MOSI --> SDI
> MISO --> SDO
> PD7 --> nIRQ
> SS --> nSEL
>
> CLK,nRes, DCLK, nINT --> nicht belegt

OK soweit.

> FSK mit 10k pullup auf Vcc

Nicht nötig für RFM12b (für RFM12 hingegen schon), schadet aber auch 
nicht.

> Ich wäre würklich froh über Programme, Fehlerkorekturen oder
> Anleitungen.

Tja, du hast leider alles entscheidende NICHT gesagt:

Was GENAU willst du erreichen? Wie hast du den RFM12b für diesen Zweck 
initialisiert?

Diese RFM12(b) sind funk- und protokollmäßig relativ mächtige Teile, man 
kann sie für viele Anwendungsfälle einsetzen. Dementsprechend komplex 
ist die korrekte Initialisierung. Man muss einfach wissen, was man 
erreichen will und sie dafür passend initialisieren.

Allerdings: bevor man sich damit abgibt, kann man auf jeden Fall erstmal 
etwas anderes testen: nämlich, ob die Kommunikation zwischen lokalem µC 
und RFM12 überhaupt korrekt funktioniert und damit auch die 
grundlegenden zwei Softwareschichten: SPI und Statusabfrage.

Wenn (wie in deiner Hardwarekonfig) nRes nicht mit dem µC verbunden ist, 
aber beide Teile an einer Versorgung hängen, fängt das erstmal damit an, 
dass man nach einem PowerOn dem RFM12 erst einmal 100ms genehmigt, bevor 
man überhaupt das erste Mal an seinen Beinchen wackelt...

Dann sollte man nIRQ checken. Wenn nicht Low, ist irgendwas mit der 
Hardware im Argen. Wenn Low: Statusregister des RFM12 das erste Mal 
lesen. Da sollte (mindestens) eins der IRQ-Bits gesetzt sein, nämlich 
POR. Logisch, oder?! Wenn nicht: Irgendwas ist mit der Hardware oder der 
SPI-Implementierung im Argen.

Dann liest man zur Sicherheit das Statusregister noch einmal, POR sollte 
jetzt aus sein (weil das Lesen des Statusregisters das POR-Flag des 
RFM12 löscht). Nicht? Hardware oder SPI-Software funktioniert nicht 
korrekt.

OK? Ab diesem Moment kannst du davon ausgehen, dass der RFM12 bereit 
ist, alles das zu tun, was du ihm aufträgst und du kannst in die normale 
Behandlung der Kommunikation mit ihm eintreten.

Was dann genau zu machen ist, hängt, wie schon gesagt, davon ab, was du 
mit dem Teil eigentlich machen willst...

von Marco R. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ersteinmal danke für die schnelle Antwort.
Ich will in weiterer folge das RFM12 Modul zur übertragung von Sensor 
Daten verwenden. Es sollte möglich sein Daten von Gyro Modulen und GPS 
Modulen bidirektional zu senden.

von grundschüler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
funk ist ja im Prinzip onewire. Die Übertragung hat Ähnlickeit mit IR. 
Dazu gibt es jede Menge code. Also schauen, dass man einen Eingangspin 
per Funk getoggelt bekommt und dann ein IR-Protokoll implementieren.

von Felix P. (fixxl)


Bewertung
0 lesenswert
nicht lesenswert
Dein Datentransfer funktioniert nicht, weil du dem Modul keine Zeit 
gibst, die Daten zu versenden. Das Modul kann intern lediglich zwei 
Bytes speichern und du darfst das nächste Bit immer erst per SPI 
nachschieben, nachdem eins versendet worden ist.

Du musst daher immer kontrollieren, ob ein Speicherplatz frei ist, bevor 
du die Daten schickst. Das geht am besten, indem man, während SDI low 
ist, einfach nur den Chip-Select auf low zieht, anschließend den Zustand 
der SDO-Leitung abfragt und danach den Chip-Select wieder auf high 
zieht. War SDO high, kann man das Byte übertragen, ansonsten muss man 
noch warten.

Am Ende der Übertragung bieten sich zudem zwei Dummy-Bytes an, damit 
auch sicher ist, dass wirklich alle Daten, die man übertragen wollte, 
rausgeschickt worden sind.

Beitrag #5143139 wurde von einem Moderator gelöscht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.