Forum: Mikrocontroller und Digitale Elektronik RFM12 - ein bisschen mehr als spielen.


von Thomas Maier (Gast)


Lesenswert?

Guten Tag :-),

ich habe mir vor einiger Zeit ein paar RFM12-Module und zwei zugehörige 
Funk-Evaluation-Boards von Pollin gekauft. Jetzt habe ich mich ein 
paarmal rangesetzt...und siehe da...es funkt :-).So weit, so gut! Aber 
ich brauch mehr. Ich bekomme es nicht so wirklich gebacken mehr als 
Testprogramme zu bauen. Nachdem das aber alles ernsthaft verwendet 
werden soll, wäre es toll - wenn das ginge ;-). Und bevor ich mir da 
jetzt selber ein riesen Gerüst aufbaue...dachte ich mir...lobe die 
Abstraktion - es muss ein Protokoll her. Und da wären wir beim Thema:

Ich habe mich für das S.N.A.P.-Protokoll entschieden (war das ein 
Fehler?). Jetzt habe ich aber nicht wirklich einen Ansatz wie ich das 
implementieren soll. Zu Bascom-Projekten gibt es jede Menge Hilfe, bei 
GCC siehts da ja eher schlecht aus. Hat denn jemand von euch zufälig ein 
Projekt rumliegen in dem S.N.A.P für nen ATmega8 (o.Ä) an einem 
RFM12-Modul implementuert ist, vielleicht sogar noch für die Pinbelegung 
des Pollin-Evaluation-Boards? Prinzipiell kanns auch jedes andere 
Protokoll sein..ich habe mich da nicht festgesetzt. Es sollte möglichst 
"flach" sein. Ich brauche eigentlich nur "Geräte-ID's", auf 
Fehlerkorrektur kann verzichtet werden, quasi ein UDP in klein...

BTW: Falls mir jemand aus Stuggi hilft, gibts gern n Bier ;-)

Viele Grüße,
Thomas

von Roland P. (pram)


Lesenswert?

Hast du dir das schon mal angesehen?
http://www.ethersex.de

Gruß
Roland

von Thomas Maier (Gast)


Lesenswert?

Hey,
Danke für die schnelle Antwort. Ich hab mir das Projekt gerade mal 
angeschaut - colle Sache! ich habe allerdings das Gefühl, dass das ein 
bisschen zu viel für mich kann. Ich denke das wäre einfach 
überdimensioniert. Das einzige was ich übertragen will, ist 
bidirektional AN oder AUS zwischen drei RFM12's...

von Detlev T. (detlevt)


Lesenswert?

Hallo Thomas,

mit fertigen Lösungen sieht das wirklich schlecht aus, das habe ich auch 
festgestellt. Es sieht so aus, als würde ich meine eigene Lösung bauen 
müssen. SNAP halte auch ich für eine gute Wahl.

Meine Planungen sehen so aus

1.) Datenübertragung mit Hilfe einer Interrupt-Routine (INT1), analog zu 
den RS232-Lösungen. Die Module sind wohl ein wenig biestig, weswegen 
einige sie nur pollen. Das nützt mir aber nichts. Die ISR-Routine soll 
etwa so aussehen: Status des RFM auslesen, je nach Modus:
Empfangen: Byte abholen, SNAP-Sync-Byte erkennen bzw. wenn schon vorher 
erkannt, neues Byte in Empfangspuffer schreiben. Wenn Puffer schon voll: 
Verwerfen.
Senden: Wenn noch Daten im Sendepuffer sind: neues Byte senden. Sonst 
Sender abschalten.

Beim Senden stellt eine Routine des Hauptprogrammes den SNAP-Frame 
inklusive der Füllbytes vor UND nach dem Frame zusammen, schaltet das 
RFM12 auf Senden und schreibt ggf. das erste Byte. Zurückschalten auf 
Empfang übernimmt wie gesagt die ISR.

Die Auswertung, ob ein gültiger Frame empfangen wurde, übernimmt nicht 
die ISR, sondern eine Routine des Hauptprogrammes. Die löscht auch ggf 
den Empfangspuffer.

Implementieren werde ich nur eine Untermenge des SNAP-Protokolls. 
Maximal 32 Byte Payload (vielleicht auch nur 16) sind erlaubt. Dann 
beschreibt der Wert des SNAP-Protokolls exakt die Bytes, was bei 
größeren Frames nicht der Fall ist. Ggf. könnte daher die ISR schnell 
und einfach bestimmen, ob schon genug Bytes empfangen wurden.

Es gibt nur Ein-Byte-Adressen und es wird nur CRC8 als Absicherung 
verwendet (Routinen zur Berechnung findet man beim DS1820-Sensor)

Zur Entprellung der Tasten habe ich eine ISR-Routine (hier aus dem 
Forum), die den TIMER0 verwendet und die alle 4ms aufgerufen wird. In 
dieser wird jetzt zusätzlich ein uint8_t hochgezählt, wenn er nicht 
schon 0xFF ist. Die RFM12-Empfangsroutine soll diesen Wert zurücksetzen, 
wenn ein Byte empfangen wurde (timeout).

So kann das Hauptprogramm feststellen, ob gerade jemand sendet oder 
nicht. Setzt man den Wert nicht auf 0 zurück, sondern auf (TCNT0 & 
0x7F), so ergibt sich ein relativ zufälliger Time-Out-Wert von 0.5 bis 
1s, so dass sich die verschiedenen Sender nicht so leicht in die Quere 
kommen.

ACK/NAK habe ich (noch) nicht eingeplant. Eine mögliche Lösung aus 
meiner Sicht: Die Entprellroutine bekommt eine zusätzliche uint16_t 
Variable, die bis auf null runtergezählt wird (Time-Out für Antwort). 
Die Zahl der Adressen wird auf 128 (0x00-0x7F) begrenzt. Das oberste Bit 
wird bei jedem neuen(!) Paket getoggelt, bei einer Wiederholung also 
gerade nicht. (Das habe ich mir von den IR-Fernbedienungen abgeguckt) 
Der Empfänger braucht ein maximal 16-Byte großes Bit-feld, wo diese Bits 
gespeichert werden um zu erkennen, ob es sich bei diesem speziellen 
Sender um ein neues Paket handelt.

So weit meine Ideen.

Gruß, DetlevT

von Thomas Maier (Gast)


Lesenswert?

Hört sich interessant an :-). Ist das bisher "nur" eine Idee? Ich schaue 
mir gerade noch die RFM12-lib 
http://www.das-labor.org/wiki/RFM12_library an...schaut auch nicht 
schlecht aus.

Viele Grüße,
Thomas

von Detlev T. (detlevt)


Lesenswert?

Hallo Thomas,

diese Library kannte ich noch nicht. Die Interruptbehandlung werde ich 
mir wohl abgucken. Ansonsten gefällt mir das Ganze nicht so, die 
ISR-Routine ist mir viel zu lang und macht zu viel.

Noch ist alles in der Planung, Code gibt es noch nicht. Ich arbeite an 
einer gcc-avr-Library, die für einen ATMEGA328p die typische Hardware 
abdecken soll (Tastenentprellung, LCD, RC-5/NEC Remote Control, 
EM4095-RFID, DS1820, RTC, UART, SPI, I2C, ADC, PWM, externes EEPROM 
(24C512) mit einem einfachen Datei-System, SD-Card mit 
FAT16-Unterstützung, eine interne Uhr, SHT-11 Feuchtesensor, 
BMP08-Drucksensor und halt auch RFM12 mit SNAP-Protokoll)

Das soll alles in einer einbindbaren Library (.a) enden, wo der Linker 
sich automatisch herauspickt, was er gerade braucht. Da muss man ein 
bisschen im Voraus planen. :D

Gruß, DetlevT

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.