Forum: Projekte & Code RFM12 Empfang von Sensordaten im IRQ


von Michael U. (amiga)


Angehängte Dateien:

Lesenswert?

Hallo,

anbei mal ein AVR-Projekt von meiner Sensor-Geschichte:
Beitrag "Sensoren mit RFM02/12, FOST02, HP03S (ASM)"

inzwischen als mein erstes C-Projekt.

Die RFM12-Routine empfängt transparent im Interrupt die Daten der 
Sensoren.
Paket-Länge und Anzahl der Sensoren sind im .h eingestellt.
Die Daten für RFM12-Init sind im .c fest eingetragen, ich ändere da z.Z. 
nichts, man kann da natürlich noch Funktionen für Frequenz/Baudrate usw. 
hinzufügen.

Es läuft mit 19200Baud auf 433,92MHz, Paket-Länge ist 18 Byte, Anzahl 
der Sensoren ist 6.

Der Datenaufbau:
byte 0 Sensornummer (ASCII 1...9)
byte 1 komplement der Sensornummer
byte 2 - 15 Daten als ASCII
byte 16 Batterie-Status (0x5A / 0xA5) z.Z ungenutzt)
byte 17 Prüsumme: Addition Byte 0 - 16.

Den Aufbau kann man natürlich ändern.
Die Daten werden transparent in ein Array mit Index Sensornummer-1 
eingelesen.

Das Weiterverarbeiten in main muß unter IRQ-Sperre durch umkopieren 
erledigt werden.
Im Archiv ist ein Testbeispiel, daß die Daten des Array über UART 
ausgibt.

Vielleicht interessiert es jemanden oder er will meine C-Künste in der 
Luft zerreißen... ;-)

Gruß aus Berlin
Michael

von Elektrikser (Gast)


Lesenswert?

Doch das interessiert mich schon. Aber warum soll man jetzt dich 
zerreißen? Das Programm sieht auf den ersten Blick gut aus.
Kannst du mal eine Senderoutine deiner Sensorplatine posten? Ich 
versuche gerade einen RFM12. Und ich habe Probleme mit dem Schlafen 
schicken und wieder aufwecken. Der will einfach nicht weniger Strom 
aufnehmen.

Gruß Gerd

von Michael U. (amiga)


Angehängte Dateien:

Lesenswert?

Hallo,

naja, ist Bestandteil meines ersten C-Projektes, sonst bisher eben nut 
ASM...

Zum Sensor: ich habe auf den Modulen nur RFM02 drauf, die weichen doch 
merklich von den RFM12 ab (kein Sende-FIFO z.B.). Außerdem ist alles 
noch in ASM geschrieben. Ich hänge es aber trotzdem mal ran.

Bei mir läuft nur der WakeUp-Timer des RFM02. Der Tiny ist im Powerdown 
und wird per Interrupt vom RFM02 geweckt.
Ich habe da allerigs auch 2 von meinen 6 Modulen, wo irgendwas noch 
nicht richtig stimmt.

Die RFM12-C-Routine habe ich mal in U.Radigs Webserver reingehangen, 
lief eigentlich fast auf Anhieb.
Wenn ich nicht gerade rumbastel sollte er unter

http://roehre.homeip.net
user test
password test

eigentlich erreichbar sein.

Gruß aus Berlin
Michael

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Sieht doch ganz nett aus, hab das mal zum Anlaß genommen endlich mal 
meine Sensoren in Betrieb zu nehemn, mal schauen obs läuft ;)
Ich würde aber die Kommandos noch mit Namen versehen (per define) 
anstelle die als Zahl in den Quellcode zu schreiben. Längere Command 
Sequenzen kannst du auch als Array ablegen und dann in einer Schleife 
ausgeben.

So... jezt wird erstmal weiter programmiert ;)

von Simon K. (simon) Benutzerseite


Lesenswert?

Warum Sensornummer und Daten als ASCII? Ist doch bloß umständlich.

von Michael U. (amiga)


Lesenswert?

Hallo,

ganz einfach: ich muß nicht darüber nachdenken, ob es dem RFM evtl. 
zuviele 0x00 oder 0xFF hintereinander werden und er Probleme mit der 
Bitsyncronisation bekommt.
Außerdem kann ich die Daten beim Debuggen einfach im Terminalprogramm 
lesen.

Umrechnen muß ich sie für meine Zwecke ohnehin irgendwo, sie werden u.a. 
im CSV-Format in einem Flash zwischengespeichert und können von dort per 
X-Modem abgeholt werden.

Gruß aus Berlin
Michael

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Michael U. schrieb:
> Zum Sensor: ich habe auf den Modulen nur RFM02 drauf, die weichen doch
> merklich von den RFM12 ab (kein Sende-FIFO z.B.). Außerdem ist alles
> noch in ASM geschrieben. Ich hänge es aber trotzdem mal ran.
Habs gerade mal durchgeschaut braucht man den nIRQ Pin zwangsläufig für 
die Ansteuerung des RFM02? Hab ich natürlich verpennt und (bisher) nicht 
verbunden, ich würds halt nur nachholen bevor ich versuch die Software 
in Betrieb zu nehmen falls man den braucht.

Und nuzt du ne Antenne für die Module? Oder kann man die testweise auch 
ohne Betreiben wenn die Module nebeneinander auf dem Basteltisch liegen?

von Michael U. (amiga)


Lesenswert?

Hallo,

ja, der RFM02 will mit jedem nIRQ-Puls pünktlich das nächste Bit zum 
Senden haben. Er hat wirklich keinen Buffer. ;-)

Geht auch komplett ohne Antenne und die Sendeendstufe dürfte es bei den 
Leistungen völlig egal sein.

Ansonsten habe ich überall 17cm Draht dran, in den Modulgehäuse 
fragwürdig gebogen, ist allerdings dann zu merken, daß die abgestrahlte 
Leistung runter geht, wenn man das übertreibt.

Gruß aus Berlin
Michael

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Okay dan muß ich das noch Nachrüsten mal wider eigene Doofheit von mir 
das ich das beim Layouten übersehen habe :-\
Zum Glück hab ich noch genug Pins frei um das eben nachzuholen ;)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Kann mal jemand bei sich Messen welchen Widerstand der nIRQ Pin des 
RFM02 gegen GND hat? Ich messe da 100 Ohm trotz Pullup an CS.
Habe leider kein zweites Modul zum gegenchecken.

von Michael U. (amiga)


Lesenswert?

Hallo,

naja, Widerstandsmessungen sind da fragwürdig...
Ein nicht angeschlossener zeigt Diodenverhalten gegen GND, 900mV 
Flußspannung.
Im 2k Bereich sind es 900Ohm, andere Richtung sehr hochohmig.

Aber: der RFM02 kann nIRQ durchaus auf L halten, auch wenn /CS auf H 
liegt.
Wie sollte er sonst einen Interrupt z.B. vom WakeUp-Timer melden.

Gerade mal mein MiniLog rangehangen: nIRQ bleibt z.B. nach WakeUp auf L 
bis ich mit dem RFM02 rede.

Gruß aus Berlin
Michael

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Michael U. schrieb:
> Aber: der RFM02 kann nIRQ durchaus auf L halten, auch wenn /CS auf H
> liegt.
> Wie sollte er sonst einen Interrupt z.B. vom WakeUp-Timer melden.
Hm.. klingt logisch, dann muß ich mich ja nicht wundern :)
Dann werd ich mal den Empfänger aufbauen und schauen ob was ankommt.

von frewer (Gast)


Lesenswert?

Hallo Michael,

bastle gerade auch mit den RFM Modulen und zwar mit der Version 
RFM02/01-868 und arbeite Deine Initialisierung ab. Dabei sind mir ein 
paar Dinge unklar, die ich auch in den Datenblättern nicht 
nachvollziehen kann.
Deine Initialisierung:
0xCC00   // Status Read Command löscht letzten Interrupt
0xC0E0   // Power Settings: PAmpli, Quarz, Synthesizer ein, Clock=an 
(dc)
0xC2A0   // low bat detector auf 2,2V; TX Bit Sync, WakUp-Timer 
Calibrierung aus
0x8883   // Configuration: 433MHz Band, 1MHz Clock, 12,5pF Last Quarz, 
120kHz Shift
0xA620   // Frequenz: 430MHz + (0,0025 * 0x620) --> 433,92MHz
bis hierher ist alles klar.
aber jetzt:
0xB200   // Power 2 * -3dBm -> -6dBm
warum 2*-3dBM?
0xD2C0   // Set PLL: set 33%
warum 33%
0xC810   // Baudrate: 344827 / 19200 = 17 - 1 -> 0x10
wo kommt der Wert 344827 her? Beim Data Rate Command steht eine Formel 
mit der ich nicht auf Deinen Wert 16 für r7..r0 komme.

Rest wieder klar.
0xE500 + 200   // WakeUp-Timer 2^7 *234ms ~ 30s ???!! nicht 1ms sondern 
10ms !!???
0xC002   // alles aus, WakeUp-Timer ein
0xC440   // sleep, noch 64 Takte

Jetzt noch eine Anmerkung zum Thema Clock out. Du verwendest den Clock 
nicht bei Deiner Schaltung also sollte der CLK gesetzt werden nach 
Datenblatt (was Du aber nicht machst).

Da ich die 868MHz Variante nutze, habe ich "Configuration setting" und 
"Frequency setting" angepasst. Muß ich bei den anderen Befehlen auch 
etwas tun??

MfG
frewer

von Michael U. (amiga)


Lesenswert?

Hallo,

@frewer:

>0xB200   // Power 2 * -3dBm -> -6dBm
>warum 2*-3dBM?
Sind -3dB Stufen beim Powerkommando,
1011 0xxx
xxx * -3dB ergibt die Reduzierung der Ausgangsleistung zwiscjem 0 und 
-21dB

>0xD2C0   // Set PLL: set 33%
>warum 33%
Im Originaldatenblatt des RF02 gibt es da eine Tabelle über das 
Phasenrauschen und die maximale Datenrate.
0xD2C0 sind max. 38400, Phasenrauschen -110dBc/Hz.
Welche Rolle das genau spielt kann ich jetzt auch nicht sagen...

>0xC810   // Baudrate: 344827 / 19200 = 17 - 1 -> 0x10
>wo kommt der Wert 344827 her? Beim Data Rate Command steht eine Formel
>mit der ich nicht auf Deinen Wert 16 für r7..r0 komme.
Der Wert ist schlicht falsch, ergibt irgendwas um 21000 Baud, fiel bei 
mir nur nie auf, weil ja Sender und Empfänger mit den gleichen Werten 
programmiert sind...

Eigentlich müßten Deine Anpassungen reichen.

Gruß aus Berlin
Michael

von Werner F. (frewer)


Lesenswert?

Hallo Michael,

hab länger nicht nachgesehen, deshalb entschuldige meine späte Reaktion. 
Hatte zwischendurch an einem anderen Projektchen gearbeitet, weil der 
Empfänger RFM02 nicht ankam. Jetzt er da und jetzt kann mich dann auch 
wieder dem Funken widmen.
Nun also vielen Dank für Deine Erklärungen. Ich habe mir nämlich ganz 
schön schwer getan, die Datenblätter zu verstehen. Für den Sender 
RFM01-868MHz habe ich das Programm nach Deinen Vorgaben angepasst, für 
den 868 MHz Empfänger bin ich jetzt dabei. Die Baudrate wollte ich im 
Hinblick darauf, dass ich am ATMEGA8 mit 8MHz intern arbeite auf max 
19200 Bd gehen. Mal sehen, ob das Pärchen zusammenspielt und ich kapiere 
warum.

Nochmals vielen Dank und Grüsse vom Zusammenfluß von Lahn und Rhein
frewer

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.