Forum: Projekte & Code Beispielprogramm für RFM12 433MHz Funk-Module


von Newbie Daniel (Gast)


Lesenswert?

ok also hatte ich doch alles richtig eingestrahlt. und bei mir kommt 
irgendwie nur müll an.

zumindest kann es nicht an dem Seriel->USB Adapter liegen da er beim 
test einbandfrei funktioniert hat.

als Antenne benutze ich eine 1mm² draht aufgewickelt zur spule.

habt ihr vielleicht eine ahnung woran es liegen könnte. zudem es ist 
nicht immer der gleiche müll varriert etwas.

Sender
20 EB DD 87 E7 EE BF 08 80 F3
20 EB DD 87 E7 EE BF 08 80 F3
20 EB DD 87 E7 EE BF 08 80 F3
20 73 75 08 0A C8
20 73 75 08 0A C8

Empfänger
14 58 1A 79 71 41 F8
14 58 1A 5E 71 43 F8
14 58 1A 5E 71 43 F8
14 61 1A 59 1C 41 F8
14 94 75 1A 59 12 00 CD

also ein gewisses muster ist zu sehen aber net dat was kommen sollte und 
empfangen tut er auch net. das sind die strings die beim start 
ausgegeben werden sollen.

von Benedikt K. (benedikt)


Lesenswert?

Die Daten haben Bitweise betrachtet nicht wirklich viel Ähnlichkeit. 
Hast du schonmal ausprobiert, ob bekannte Daten die in der Software 
gesendet werden (also z.B. uart_putc(0x23)) richtig ankommen?

von Newbie Daniel (Gast)


Lesenswert?

ehm ok glaub wir missverstehen uns wieder aber mal wieder meine schuld 
sorry die dinger kommen nur nach einem reset. muss mir angewöhnen das 
ich ausführlicher werde.

sprich jede zeile kam nach einmal reset drücken.

und dann geht es ja ehr um die zeile:
1
uart_puts_P("Sender laeuft !\n");

oder sehe ich das falsch kann es sein das diese uart.c und uart.h net so 
funzt wie sie soll für das funk-evu-board obwohl ich schon gescheckt 
habe ob es wie beim normalen evu-board angeschlossen ist (was es auch 
ist). oder muss ich da noch irgendwo was definieren um es auf das board 
anzupassen? <- könnte ich mir ehr vorstellen aber wenn ja wo?

von Benedikt K. (benedikt)


Lesenswert?

Passt die in der Software eingestellte Quarzfrequenz zu der real 
vorhandenen? Sind die Fusebits richtig auf Quarz eingestellt?

von Newbie Daniel (Gast)


Lesenswert?

die prozessoren laufen beide von board aus auf 16MHz also vom quarz und 
fuse bits passen. das prog selber hab ich auf die 8MHz stehen lassen. 
muss man das auf die board frequenz anpassen oder was? <- mal dumm 
gefragt

von Benedikt K. (benedikt)


Lesenswert?

Stell in der Software 16MHz ein, dann sollte es funktionieren.

von Newbie Daniel (Gast)


Lesenswert?

jo hab es mal nach dem schreiben gleich praktiziert und oh wunder der 
sender gibt nun den richtigen string raus nur der empfänger net. hab 
nochmal die fuse bits kontrolliert die sind bei beiden identisch und 
durch ein einfaches blicken weiß ich das der quarz zumindest schon mal 
dran ist aber raus kommen tut nur folgendes:

E0 E0 00 E0 E0 E0 E0 E0 00 E0 00 00 E0 E0 00 E0 E0 E0 00 E0 00 E0 E0 E0 
00 E0 E0 E0 00 E0 00 00 E0 00 00 00 E0 E0 E0 00 E0 E0 E0 00 E0 E0 E0 E0 
E0 00 00 E0 00 E0 E0 00 00 E0 00 00 00 E0 00

das kommt bei einmal reset.

aber so wie es ausschaut kommt der sender auch nicht viel weiter da der 
string "sende..." nicht ausgegeben wird.

wie kann ich nun rausfinden wo er sich genau aufhängt? kann zumindest 
noch sagen das er bis "rf12_txdata(test,32);" noch hinkommt.

von Newbie Daniel (Gast)


Lesenswert?

ok anscheinend brauchten beide eine bedenkzeit und ein programm wechseln 
was getsern sender war ist heut empfänger und umgekehrt und siehe da es 
klapt nur das ich vor dem "Dies...." noch immer ein zeichen empfangen 
wird keine ahnung von wo da es auch variiert.

von Newbie Daniel (Gast)


Lesenswert?

nehmee alles zurück das ist das dritte müll byte  thx for help nun kann 
ich ja weiter rum spielen.

von Newbie Daniel (Gast)


Lesenswert?

nehme alles zurück das ist das dritte müll byte. thx for help nun kann 
ich ja weiter rum spielen.

von Patrick (Gast)


Lesenswert?

Benedikt, danke für die tolle Arbeit!

Hat schon mal jemand daran gedacht, hierfür einen Wiki einzurichten?
Ich hab zwar nicht den ganzen Thread gelesen, aber mir scheint dass den 
Usern immer wieder die gleichen Fehler passieren (z.B. fehlender 
Bypass-C am RFMxx). Außerdem verliert man bei den verschiedenen über den 
ganzen Thread verteilten Versionen und Unterversionen schnell den 
Überblick.

lG Patrick

von Gast (Gast)


Lesenswert?

Ich benötige beim RFM12 den PIN nIRQ für den Wake-Up Timer 
(Batteriebetrieb).

Leider wird nIRQ auf LOW gesetzt und blockiert, nachdem ein Byte 
erfolgreich gesendet wurde (d.h. Statusbit RGIT => 1  und  nIRQ => 0).

Wird jetzt der Wake-Up Timer gestartet, bleibt nIRQ die ganze Zeit auf 
LOW. Das Wake-Up Event wird korrekt im Statusregisterbit WKUP angezeigt, 
nur der nIRQ ist leider blockiert.

Ich habe keine Befehlsequenz gefunden, die den nIRQ sauber wieder 
freigibt.
Ich habe getestet:
- Lesen der Statusregister (0x0000)
- das Bit et im Power-Managemant gelöscht und gesetzt, wie im Handbuch 
unter "12. wake-up timer" beschrieben
- Alle Varianten den Chip schlafen zu legen (0x8201) und wieder 
aufzuschalten.

Als einzigen dirty Workaround  habe ich gefunden, ein zusätzliches dummy 
Byte zu senden und den Sender sofort stromlos zu schalten (0x8201) bevor 
das Statusbit RGIT/FFIT  Erfolg meldet und nIRQ wieder auf LOW geht.

Hardware: Pollin RFM12s Rev:3.0

von Hermann G. (df2ds)


Lesenswert?

Hallo zusammen,
zunächst vielen Dank an Benedikt für das tolle Stück Software.
Ich habe jetzt etwas Probleme, das ganze auf meine Fragestellung zu 
portieren:

Ich möchte Daten zunächst über 2 RFM12 zwischen 2 Controllern 
austauschen (halbduplex reicht). Die Daten gehen dann aber nicht sofort 
an den jeweiligen UART, sondern erst mal in einen Buffer. Erst im Zuge 
des weiteren Programmablaufs entscheidet sich, ob die Daten über den 
UART gesendet werden oder direkt intern verarbeitet werden.

Hat jemand schon mal so etwas gemacht und ich habe es hier nicht 
gefunden? Oder ist das so "exotisch", dass ich es selbst implementieren 
muss ;) ?

Viele Grüße
  Hermann

von Benedikt K. (benedikt)


Lesenswert?

Hermann Gebhard schrieb:

> Die Daten gehen dann aber nicht sofort
> an den jeweiligen UART, sondern erst mal in einen Buffer.

Das machen eigentlich alle Programme: Die empfangenen Daten werden 
zunächst in einen internen Speicher eingelesen. Dann kann man die Daten 
Byteweise abholen. Allerdings muss die Software dafür sorgen, dass der 
Puffer leer ist bevor das nächste Paket ankommt, sonst gibts Probleme.

Die UART Ausgabe baue ich immer nur als Beispiele ein, da man so die 
Software leicht ausprobieren und testen kann.

von Marc (Gast)


Lesenswert?

Hallo Allerseits,

das Problem vom Oliver Schneider ist gelöst.
Vorweg eine wichtige Hardware-Sache: Die Verbindung zwischen dem µC und 
dem Funkmodul muss ziemlich kurz sein. Bei einem Pollin-Board und dem 
Funkmodul auf einem externen Board, das mit einem Flachbandkabel 
verbunden ist, funktioniert es mit einem ca. 20cm Kabel nicht mehr, mit 
ca. 6cm dagegen wunderbar. Scheinbar ist das Clock-Signal zu schwach 
oder die Sampling-Zeitpunkte für die Datenübernahme extrem dicht 
zusammen, oder sonst irgendwas.
Ansonsten gibt es noch ein paar Verbesserungsmöglichkeiten und Bugs in 
Benedikts Code (dem unidirektionalen für RF12).
- GAAANZ Wichtig: Das letzte gesendete Byte wird nicht ordentlich 
übertragen, man muss also noch ein Dummybyte hinterherschicken. Das hat 
wohl mit dem Empfang und verschiedenen Buffern zu tun, der 
Taktrückgewinnung und irgend welchen anderen seltsamen Dingen. 
Jedenfalls, wenn man noch ein weiteres Byte sendet, das beim Empfang 
aber ignoriert, klappts.
- In der Empfangsroutine kann leicht über die Feldgrenze geschrieben 
werden: Es wird immer ein unsigned short (sind offenbar 16 Bit, sonst 
passt das mit den restlichen Routinen nicht) an eine Feldposition mit 8 
Bit Platz geschrieben. Das funktioniert auch, bis man zum letzten 
Element kommt. Da kann man dann nur hoffen, dass hinter dem Feld nichts 
wichtiges steht. Besser, man schreibt einen expliziten Typecast in die 
Zuweisung.
- Die Synchronisierungsphase vor der Präambel könnte man noch etwas 
verlängern. Ich hatte das Gefühl, dass dann die Übertragung sicherer 
startet.

von AVRnoob (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Ihr,

ich versuche das beispielprogramm von Benedikt auf einem AT90USB128 zum 
laufen zu bringen. aber leider bleibt es immer in der rf12_ready() in 
der schleife hängen. Die funktion habe ich, nachdem ich gelesen habe das 
schon mehrere hier ein problem damit haben, entsprechend geändert zu:
1
void rf12_ready(void)
2
{
3
  cbi(RF_PORT, SDI);
4
  cbi(RF_PORT, CS);
5
  _NOP(); //einen Takt warten. Funktion aus ina90.h
6
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready; hier bleibts hängen
7
  set_7seg(4);
8
}

die Dateien im anhang ist nur die erste version mit geänderten PINS für 
MISO, MOSI, SCK und SS. Die Spannungsversorgung erreiche ich indem ich 
das entsprechend an PORTD an einen PIN hänge (sind nicht alle 
rausgeführt bei PORTB) der dauerhaft die Spannung gewährleistet.

Konfiguration:
1
#define RF_PORT  PORTB
2
#define RF_DDR  DDRB
3
#define RF_PIN  PINB
4
5
#define SDI    2
6
#define SCK    1
7
#define CS    0
8
#define SDO    3


ich hoffe einer von euch kann mir bei meinem problem helfen und ich 
befürchte das es ein dumme fehler ist den ich nur dauernd übersehe :(


Gruß und Danke
AVRnoob

von Benedikt K. (benedikt)


Lesenswert?

- Wo bleibt er hängen: Beim Senden oder beim Empfangen?
- Funktioniert die Kommunikation prinzipiell, also wird der Takt vom 
RFM12 auf 10MHz umgeschaltet?

von AVRnoob (Gast)


Lesenswert?

bei beiden malen bleibt der hängen.

wie stell ich das den fest mit dem takt? (Ohne oszilloskop) Die 
rf12_trans(...) läuft er zumindest durch.

von Benedikt K. (benedikt)


Lesenswert?

Du könntest einen 2. AVR als Teiler durch 1 Million programmieren und 
diesen damit Takten. Ob die LED mit 1Hz oder 10Hz blinkt sollte man 
erkennen können.
Ich tippe nämlich auf ein generelles Kommunikationsproblem, denn 
zumindest beim Senden sollte die Software nicht hängen bleiben.

von AVRnoob (Gast)


Lesenswert?

also ich habs nun einfach an ein oszi von einem freund abgemessen (CLK 
port am rfm12) und der schaltet aufjedenfall auf 10Mhz.
kann ich eigentlich den takt vom rfm12 irgendwie variabel ändern? beim 
pollin beispiel steht drinnen das der mit 8Mhz taktet statt mit den 10 
(einfach ein fehler?).

von Marcello C. (mcampione)


Lesenswert?

Nach langes Basteln funktioniert das Testprogramm mit dem Propeller 
wunderbar !

Wer für Propeller Hilfe braucht kann sich bei mir gerne melden ...

Ciao

von Willy K. (wiko)


Lesenswert?

Hallo allerseits,

Horst Meier stellte in seinem Beitrag vom 23.06.2007 eine RFM12 (433 
MHz) Assembler-Lösung für einen ATtiny 2313 vor.
Ich versuche gerade die Schaltung und den Code auf eine 868 MHz Lösung 
mit einem ATMega88A mit RFM12B abzuändern.
Die Lösungen von Benedikt "rfm12_r2323_rxtx_check5" und "RF12_just_rxtx"
habe ich bereits mit 2 x STK500 und ATMega8L ( 868 Mhz )aufgebaut.
Die Datenübetragung funktioniert einwandfrei. Da ich zwar etwas 
Erfahrung mit C habe aber kein C-Experte bin und einige Projekte bereits 
in Assembler realisiert habe, scheint mir Horst's Lösung passender zu 
sein.
Ich möchte ähnlich wie joern ( 11.03.2009 )von einer Basistation bis zu
3 Außenstationen ansteuern mit entsprechender Rückantwort.
Die Stationen sollen spätzestens nach 3 Minuten antworten, ansonsten 
werden die Relais der Stationen per separater Watchdogschaltung 
abgeschaltet.
etwa mit nur 3 Bytes : von Basis -> Station1
1.Byte Zieladresse
2.Byte Absenderadresse
2.Byte Command ( z.B. Aus- oder Einschalten und Watchdog retriggern)
danach 3 Bytes Station1 ->Basis
1.Byte Zieladresse ( hier die Adresse der Basis )
2.Byte Absenderadresse ( damit ich die Stationen unterscheiden kann )
2.Byte Statusinfo  ( z.B aus- oder eingeschaltet etc.)
Die Funkübertragung ist nur ein Teil meines Projekts
Es werden noch diverse Sensoren ( Temperatur/Druck) ausgewertet (per 
TWI)  und Relais geschaltet.Eine kabelgebundene Lösung in Assembler 
existiert bereits.
Ich hoffe es kann jemand helfen.

Gruß
Willy

von Benedikt K. (benedikt)


Lesenswert?

Und was war jetzt die Frage?
Die Lösung hast du schon genannte: Du überträgst die Daten (z.B. hiermit 
Beitrag "Re: Beispielprogramm für RFM12 433MHz Funk-Module") so wie du sie 
genannt hast, der Empfänger prüft ob die empfangene Nachricht für ihn 
ist, falls ja wird sie abgearbeitet, falls nein verworfen.

von Willy K. (wiko)


Lesenswert?

Hallo Benedikt,

Vielen Dank für Deine schnelle Antwort.
Deine Software "just_rxtx" sendet die Bytes optimal nacheinander und 
gibt pro Byte eine Rückmeldung an den Absender 0=ok 1=Fehler. Da es sich 
in meinem Projekt um eine Basis und drei Außenstationen handelt ist 
diese Kommunikation nicht ausreichend. Wenn von der Basis eine bestimmte 
Außenstation angesprochen wird (über das Adressbyte),dann soll auch nur 
diese entsprechend antworten und nicht alle.
Lässt sich das so realisieren wie ich das beschrieben habe ?
Wo genau in der Software sind die Änderungen notwendig ?


Gruß
Willy

von Benedikt K. (benedikt)


Lesenswert?

Die rf12 Routinen kannst du eigentlich unverändert übernehmen.
Das eine Byte pro Übertragung ist nur ein Beispiel. Wenn du z.B. 
tx_data(data,16); schreibst, werden 16 Bytes aus dem data Array auf 
einmal übertragen. Maximal sind 128 Bytes möglich.
Ebenso beim Empfangen: Dort kommen auch die Daten als 128Byte Packete 
an.

von Willy K. (wiko)


Lesenswert?

Hallo Benedikt,


for (;;)
  {  check_rx_packet();
            if (rx_data_in_buffer())
                {   unsigned char count, i;
      count=rx_data(data);
      for (i=0; i<count; i++)    // Empfang
                        {
      uart_putc(data[i]);
         }
                }
             if (uart_data())       // sende Beispiel
                {
     data[0]=uart_getchar();       // ???
                 uart_putc(tx_data(data,1));   // ???
                }
        }
wenn ich das richtig verstehe, dann wird durch die Funktion 
check_rx_packet,
ob Daten vorhanden sind, wenn rx_data_in_buffer "true liefert dann wird 
die Anzahl der empfangenen Bytes gezählt
count=rx_data(data) und anschließend alle Daten an die UART ausgegeben.
Den anschließenden Sendeteil vertehe ich nicht richtig.
uart_data() kommt aus uart.c und gibt 1 zurück wenn 1<<RXC ( receive 
complete). Aber wie funktioniert das mit den beiden folgenden Zeilen ?

Gruß
Willy

von Benedikt K. (benedikt)


Lesenswert?

Willy K. schrieb:

> wenn ich das richtig verstehe, dann wird durch die Funktion
> check_rx_packet,
> ob Daten vorhanden sind,

Ja. Allerdings läuft über diese Funktion der komplette Empfang der Daten 
usw. ab. Daher muss diese ausreichend oft aufgerufen werden, damit der 
Empfangspuffer des RF12 nich überläuft.

> wenn rx_data_in_buffer "true liefert dann wird
> die Anzahl der empfangenen Bytes gezählt
> count=rx_data(data) und anschließend alle Daten an die UART ausgegeben.

Jaein. Das ganze ist Paket basiert. Sollte eine nachricht empfangen 
werden, wird diese von der check_rx_packet Funktion empfangen und in den 
internen Puffer gespeichert. Das gesamte Paket wird über rx_data() 
abgeholt und in das neue Array kopiert. Das muss ausreichend schnell 
geschehen, denn wenn das nächste Paket empfangen wird, ehe das alte 
abgeholt wurde, geht das alte Paket verloren.

> Den anschließenden Sendeteil vertehe ich nicht richtig.
> uart_data() kommt aus uart.c und gibt 1 zurück wenn 1<<RXC ( receive
> complete). Aber wie funktioniert das mit den beiden folgenden Zeilen ?

uart_data() zeigt an, dass sich Daten im Empfangspuffer befinden. Falls 
ja, wird ein Byte mittels uart_getchar() aus dem Puffer gelesen, in 
data[0] kopiert und dieses über tx_data() versendet. Zusätzlich wird der 
Sendestatus über den UART zurückgesendet.
Das ganze ist nur zur Demonstration vorhanden, damit die Software direkt 
ohne Anpassungen lauffähig ist, und man so die Module testen kann.

von Willy K. (wiko)


Lesenswert?

Hallo Benedikt,

ich verstehe ,dass die Software nur zum Testen der Module gedacht ist.
Die entprechenden Anpassungen muss ich wohl selbst durchführen.

Vielen Dank vorerst

Gruß
Willy

von Gastino G. (gastino)


Lesenswert?

So, ich habe mein RFM12 nun auch zumindest als Sender mit eigenem Code 
in Betrieb genommen. Ich hatte einige Probleme, beim Senden den die 
Ready-Signale mittels IRQ bzw. SDO zu bekommen. Hier scheinen so 
ähnliche Fehler auch recht häufig aufzutreten, daher mal meine 
Erkenntnisse dazu:

Im Gegensatz zu den (falschen) Angaben im Datenblatt ist es nicht 
möglich, Steuerbefehle im Sende-Datenstrom unterzubringen. Die 
Beschreibung im Datenblatt (TX Register Buffered Data Transmission), 
erst zwei Bytes in den TX-Buffer zu schreiben und dann per Power 
Management-Befehl den Transmitter einzuschalten, funktioniert genau wie 
das Ausschalten des Transmitters im selben Beispiel nicht!
Das heißt, Kommandos müssen immer am Anfang nach dem Ziehen der Chip 
Select-Leitung abgesetzt werden, nach dem Schreiben irgendwelcher Bytes 
in den TX-Buffer erkennt das RFM12 diese Befehle nicht mehr, solange die 
Chip Select-Leitung noch gehalten wird.
Die ganzen Code-Beispiele halten sich interessanterweise nicht an die im 
Datenblatt empfohlene Vorgehensweise und funktionieren daher.

Mit der folgenden Reihenfolge läuft mein Sender nun anscheinend 
erfolgreich:

CS auf Low setzen
Config Command (EL=1)
Power Management Command (ER=0, ET=1)
Warten auf SDO==1 oder nIRQ==0
Schreiben in TX-Buffer
Warten auf SDO==1 oder nIRQ==0
.
.
.
Schreiben in TX-Buffer
Warten auf SDO==1 oder nIRQ==0
CS auf High setzen

CS auf Low setzen
Power Management Command (ER=1, ET=0)
CS auf High setzen

Die Kommunikation per SPI hätten die Designer des Chips wirklich etwas 
durchdachter machen können. Die Rückmeldung zu gesetzten Register-Werten 
ist gleich Null. Dabei wäre es schon nicht schlecht, ohne Hilfsmittel 
oder zusätzlichen Schaltungsaufwand herausfinden zu können, ob der 
Sender nun an oder aus ist. Glücklicherweise gibt es noch den 
CLK-Ausgang, an dem man mit dem Multimeter(!) "debuggen" kann (indem man 
CLK ein und ausschaltet).

von Marcello (Gast)


Lesenswert?

Gastino,

ich habe mehr oder wenig genau dieselbe Erfahrung mit dem rfm12 gemacht.
Es geht noch zuverlässiger wenn du immer die ganze Reihenfolge schickst:

CS_Low
SPI_Befehl
CS_High

Die Sendegeschwindigkeit hängt praktisch von der SPI Geschwindigkeit 
ab...

Ich habe ca. 86.000 kbs erreicht.

von Dom X. (mentox)


Lesenswert?

kann man mit den dingern so eine art funksteckdose bauen, aber mit 
rueckantwort. ich bekomme naemlich immer die kriese wenn ich per funk 
steckdose was an und ausmachen will aber nich erkennen kann obs geklappt 
hat da das ja aus dem baumarkt immer nur one way ist ..

die naechste frage waere kann man mit dem rfm12 auch die baumarkt 
steckdosen steuern?

wuerde dso nen ding auch gerne an den net-io haengen .. sollte gehen 
oder?

wie zufrieden seit ihr mitlerweile mit dem ding?

viele gruesse mentox

von aXeL (Gast)


Angehängte Dateien:

Lesenswert?

Hiiiiiilfe!

Nach tagelangem rumprobieren mit den Modulen bin ich jetzt wirklich kurz 
vorm Aufgeben...
Wie es aussieht wird was gesendet und der Empfänger sieht auch, daß da 
ein Sender ist, aber der FIFO bleibt leer!!!
Ich hab fast den ganzen Thread hier gelesen und dieses Problem bisher 
nicht nochmal gefunden. Hat jemand eine Idee?
Defekte Module kann ich weitestgehend ausschließen, da ich es schon mit 
2 433MHz und 2 868MHz Modulen versucht habe.
Die Kommunikation mit den Modulen läuft anscheinend auch einwandfrei, 
denn das CLK-Signal läßt sich ohne Probleme auf 10MHz oder "Aus" 
schalten.
Benedikts Programm habe ich natürlich auch schon ausprobiert, aber da 
tut sich leider gar nichts.
Und da Benedikts Progamm zwar gut strukturiert ist, es dadurch aber auch 
etwas unübersichtlicher wird, habe ich mal etwas kompakteren Code 
zusammengeschrieben, der empfängerseitig den Modul-Status pollt und auf 
RS232 ausgibt. Und falls im Status ein voller FIFO angezeigt wird, wird 
auch der FIFO ausgelesen und auf RS232 ausgegeben. Habe ich aber bisher 
noch nicht erleben dürfen...
Die RF-Konfiguartion habe ich dabei von Benedikt übernommen.

Meine große Bitte wäre, daß jemand, bei dem die Module laufen, den Code 
mal bei sich draufspielt und schaut ob er im Status was mit 0x8000 oder 
größer bekommt.
Wenn irgendwas mit dem Bit 0x0100 kommt, wird zumindest ein RF-Signal 
empfangen, wie es bei mir (meistens) der Fall ist. Das Status Read 
Command ist ja im Datenblatt auch ausführlich beschrieben.
Für Leute die Sender und Empfänger genau abgleichen wollen, ist der Code 
ebenfalls interessant, weil im Status ja der Frequenzoffset mitangegeben 
wird...

Ansonsten ist der Code für einen ATmega8 mit Auslieferungskonfiguartion. 
Also internem Oszillator und 1Mhz Takt. Und ich benutze das Hardware 
SPI, weil es sehr einfach zu handhaben ist. Nur der nSEL-Pin muß 
wahrscheinlich angepasst werden, da ich ihn auf PortD habe. Läßt sich in 
den #defines leicht machen. Pull-up an FSK ist natürlich auch dran...
Oh, und der Sender benutzt nIRQ. Für den Fall, daß jemand auch den 
Sendecode testen will.

Falls also jemand vor lauter Schnee etwas Zeit dafür übrig hat, wäre ich 
sehr dankbar. Andernfalls wandert das alles bald in den Müll...

Viele Grüße
aXeL

von Manuel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Erstmals will ich mich bei allen die Code für die Funkmodule geschrieben 
haben, bedanken... ich weiß echt nichtmehr woher ich alles hab, aber ich 
glaub hauptsächlich eh von benedikt... Also Danke!

Auch wenn meine Source Codes noch nicht vollständig sind, und ich mir 
noch nichts passendes für den empfang überlegt hab, will ich mal meine 
vorläufigen Codes hier reinstellen. Bin demnächst drauf und drann das 
ganze nochmal mit interrupts + fehlerkorrektur etc. zu schreiben, aber 
zum testen ist das so mal ganz toll.

(Wollte zuerst alles mit #defines auswählbar machen, aber ich glaub das 
wird sehr unübersichtlich. Aber so wies jetzt ist gehts glaub ich noch. 
einfach in config.h alles richtig eintragen. Falls man den Reset 
verwendet würd ich einen zusätzlichen Wiederstand empfehlen, weil ich 
nicht weiß, was bitte ein DIO sein soll... hab mal was gelesen dass man 
das für den Controller als Reset verwenden kann, die meisten lassen ihn 
unbeschaltet, hat bei mir aber irgendwie nicht geklappt siehe unten...)

Weil ichs noch nirgendst gelesen hab und es aber aus unerklärlichen 
gründen bei mir fehler gemacht hat: nRes lege ich über einen Wiederstand 
(kiloohm unkritisch) auf die Versorgungsspannung. Erst seitdem ich das 
mach funktioniert bei mir senden und empfang. lustigerweise hat das 
umschalten der Ausgangsfrequenz (CLK) auch schon vorher funktioniert. 
Bin mir aber nicht ganz sicher ob da nicht noch irgendein problem war...

Inzwischen find ich die hope datenblätter schon viel besser... es gibt 
aber auch irgendwie verschiedene, bei manchen steht nur sehr wenig, bei 
anderen viel... wenn man mal drinnen ist dann kann man glaub ich echt 
viel mit den Modulen machen.


Sobald ich wieder Zeit hab gibts auch einen RF_FREQUENCY_868 switch.

Ich weiß dass es schon vieles gibt zu dem Thema, wollte nur mal einen 
Laagebericht abgeben, da ich einige Probleme mit dem Pollin Funkboard 
usw. hatte.. und es doch recht viel arbeit war bis alles funktioniert 
hat.

Ich hoffe es hilft wem und ist nicht nur Wiederholung der letzten 
Beiträge :P

von Marcelo F. (klaps)


Angehängte Dateien:

Lesenswert?

hallo leute
ich möchte jetzt auch mal per funkt daten übertragen. Habe mir überlegt, 
dass ich leicht anfangen sollte. Möchte also mal nur über funk eine LED 
an und aus-schalten. Ich habe nicht ganz verstanden, wie ich die 
hardware aufbauen soll. Einfach atmega8 an RFM12 oder mus noch etwas 
dazwichen?
 Hier sind ziemlich viele versionen würde sich die im anhang dafür 
eignen?

danke für eure hilfe
Marcelo

von aXeL (Gast)


Lesenswert?

Nicht alle auf einmal antworten bitte... ;o)

Was ist denn los? Seit 11 Tagen kein einziger Beitrag, trotz 20 
Downloads...
Einer von Euch muß doch das Programm inzwischen mal getestet haben...
Auch wenn gar nichts funktioniert hat, würde ich mich über eine kurze 
Rückmeldung freuen, damit ich vielleicht doch noch einen Anhaltspunkt 
finden kann, warum es bei mir nicht richtig funzt...

Viele Grüße,
aXeL

von toriba (Gast)


Lesenswert?

hallo
habe nur mal ne kurze frage gibt es irgendeinen unterschied zwichen 
rfm12 oder rf12? Das programm rf12 läuft das auch auf einem rfm12 funk 
Modul?

Mfg
Tobias

von Andreas M. (andreas_m)


Lesenswert?

Hallo aXel, hallo an alle RFM12-Benutzer,

ich muss mich jetzt auch in die Gruppe der Erfolglosen einreihen.
Nach dem bei mir ein Funkstrecke RFM02 -> RFM01 seit 4 Wochen 
erfolgreich Daten überträgt, versuche ich es jetzt mit den 
RFM12-Modulen.
Aber was das RFM12 sendet kommt nirgends an. Weder an einem RFM12 noch 
an einem RFM01.
Empfangsseitig ist alles ok, das RFM12 empfängt die gesendeten Daten des 
RFM02 korrekt.
Ich versuche jetzt schon seit 1 Woche den Fehler in der Senderoutine zu 
finden, habe die Beispielcodes angepasst, verändert, zigmal das 
Datenblatt gelesen, aber alles ohne Erfolg.
Das Trägersignal ist da, das habe ich mit einem Fernseher kontrolliert.
Ich habe schon unzähliges versucht, daher bin jetzt der Meinung, dass 
die RFM12 (hab's mit 2 von 4 probiert) defekt sein müssen.
Vielleicht eine fehlerhafte Serie?
Ich habe meine Mitte Dezember bei Pollin gekauft.
Gibt es noch Andere, die auch das Sendeprobleme haben?
Danke schon jetzt für Eure Mithilfe.

Freundliche Grüße
Andreas

von Andreas M. (andreas_m)


Lesenswert?

Hallo,

das Senden funktioniert jetzt doch.
Leider habe ich keine Erklärung, woran es lag. Am Code habe ich nichts 
geändert. Möglicherweise hat's schon gestern funktioniert und ich hab's 
einfach durch das viele ausprobieren übersehen.
Tut mir Leid, dass mein Beitrag von heute morgen unnötig war.

Gruß
Andreas

von Tom (Gast)


Lesenswert?

@ Andreas Montnacher

Hallo,
habe gelesen, dass deine Funkstrecke RFM02 --> RFM01 funktioniert.
Bei mir läuft es leider noch nicht.
Könntest Du mir mal bitte sagen, wie Du die Module an den Controller
angeschlossen hast, und evtl. deine Programme hochladen?
BRauche mal was zum vergleichen.
Danke
Gruß Tom

von Karl K. (bluestar84)


Angehängte Dateien:

Lesenswert?

Einen schönen guten Tag auch, bin neu hier und hab mich mal n bischen
mit dem pic und dem RFM auseinandergesetzt, bei der Programmierung hab
ich mich sehr an eure Vorschläge gehalten, aber irgenwie ist da noch der
wurm drine, ich selber benutz das RFM12 von Pollin. Ich wollte damit ein
kleines spiel programmieren, um die Funkübertragung erstmal
auszuprobieren. Wäre cool wenn mir jemand nen tipp geben kann wo ich
scheisse gebaut hab.
Außerdem nimmt er den PORTA als eingang nicht an, und ich weiß nicht
wieso, aber ihr bestimmt:-)
Mfg Karl

von Andreas M. (andreas_m)


Angehängte Dateien:

Lesenswert?

Hallo Tom,

meine Programme sind in Assembler geschrieben und durchgehend 
kommentiert.
Falls Du einen Assembler brauchst, am Anfang der Programme findest du 
den Link dazu.
Die Verbindungen zw. AVR und RFM sind gleich denen vom Pollinboard.
Die Led's und Schalterpins nicht. Das 2. Funkmodul hatte ich immer auf 
einem Steckbrett aufgebaut.
Die Settings der RFM-Register sind nicht unbedingt ein Muss, aber es 
funktioniert mit diesen Einstellungen. Habe die Settings noch nicht 
optimiert.
Zur Funktion: der RFM02 sendet alle 5 Sek, 5x das gleiche Byte, wobei 
immer nur der Zustand eines Schalters gesendet wird.
Der RFM01 gibt den Zustand der Schalter an den Leds, als Flash, für ca 
100ms aus.
Du kannst mich jederzeit fragen, wenn's klemmt.

Gruß
Andreas

von Tim (Gast)


Lesenswert?

Hallo zusammen,

ich habe im Datenblatt von dem RFM12 gelesen, dass man diesen auch ohne 
TX Buffer/Register benutzen kann. Für eine spezielle Anwendung würde ich 
gerne mit dem RFM12 Modul gerne einzelne Bits vertschicken können. Kann 
mann, wenn man das Bit 7 "el" im Configuration Control Command Register 
auf low lässt, einzelne Bits wie beim RF02 Modul versenden? d.h. wird 
die Bit Rate vom RFM12 Modul dann als Taktgeber an irgendeinem Pin 
herausgegeben und kann ich dann am FSK Input meine zu versendenen Bits 
anlegen? Ich hoffe, dass mir da jemand weiterhelfen kann- danke für eure 
Hilfe!

Gruß
Tim

von G a s t (Gast)


Lesenswert?

Vielleicht ist es im Thread schon erwaehnt, ist etwas zu lange zum 
gruendlichen Durchlesen:

Im Code von Benedikt K. (rfm02.zip vom 16.04.2007 15:28) fuer das 
RFM02-Modul ist in der Funktion zum Setzen der Sendeleistung ein Bug.
1
void rf02_setpower(unsigned char power)
2
{
3
  rf02_trans(0xB000 | ((power & 7) << 8));
4
}

Die Sendeleistung bleibt immer auf 0dB (also auf Maximum, weshalb es 
wohl auch nicht direkt auffaellt), da die Bits fuer die Wahl der 
Leistung nicht hoch genug geschoben werden. Sie muessten eigentlich 
direkt ins hohe Byte, also direkt nach dem B stehen, laut Datenblatt zum 
RF02.

Korrekt muesste der Code so lauten, wenn ich mich nicht irre:
1
void
2
rf02_setpower(unsigned char power)
3
{
4
  rf02_trans(0xB000 | ((power & 7) << 16));
5
}

von G a s t (Gast)


Lesenswert?

Vorigen Post bitte loeschen.

War natuerlich kein Bug im Code vom Benedikt, sondern in meinem Kopf. 
Sorry.

von Holger S. (holli_1)


Lesenswert?

Tim schrieb:
> Kann
> mann, wenn man das Bit 7 "el" im Configuration Control Command Register
> auf low lässt, einzelne Bits wie beim RF02 Modul versenden? d.h. wird
> die Bit Rate vom RFM12 Modul dann als Taktgeber an irgendeinem Pin
> herausgegeben und kann ich dann am FSK Input meine zu versendenen Bits
> anlegen?

Ja, funktioniert. Es gibt allerdings keinen IRQ vom RFM12 als Takt für 
die Bitrate. Das musst du im AVR mit einem Timer machen.

von fantomas (Gast)


Lesenswert?

Abend, ich habe mir überlegt wie ich mit den rfms bisschen Energie 
sparen könnte. Habe paar Infos zur Filter gefunden und mir überlegt ob 
es eine gute idee wäre ein aktiven rc bandpass filter zu bauen mit den 
man erst den nc weckt und dann den rfm Modul anschmeißt. Momentan wecke 
ich meine ncs in bestimmten Abständen und lausche ob was los ist.

Wollte euch fragen ob Ihr in die Richtung schon was gemacht habt oder 
bessere Ideen gibt wie man die Batterien schont.

Grüße fantomas

PS
bei lynx-dev gabs Preissenkung für Module. Die btm Module sind auch 
billiger geworden.

von Holger S. (holli_1)


Lesenswert?

Was soll das Teil dann eigentlich filtern?
Willst du Strom sparen, musst du den RFM schlafen legen. Dann empfängt 
er natürlich auch nichts.

von fantomas (Gast)


Lesenswert?

Wenn der Empfänger immer erreichbar sein soll dann muss der Modul 
ständig im Empfangsmodus sein und das kostet Strom(20mA). Und ich möchte 
eben so wenig wie möglich Strom verbrauchen. Deswegen dachte ich warten 
bis etwas auf der Frequenz spuckt und erst dann den Modul an schmeißen.

von Fabian S. (jacky2k)


Lesenswert?

Hallo,
habe mir Platinen geätzt für das RFM01 und RFM02 und grade erst diesen 
Text gesehen in den Sourcen:
> // nFFS: 1-10k Pullup an Vcc !!!
Da ich kein Bock habe die Platinen nun noch mal zu ätzen, warum muss das 
und kann ich das nicht mit dem internen Pull-Up machen?

von Manuel Stahl (Gast)


Lesenswert?

Fabian S. schrieb:
> Da ich kein Bock habe die Platinen nun noch mal zu ätzen, warum muss das
> und kann ich das nicht mit dem internen Pull-Up machen?

Sicher, wenn du den Pin sowieso mit dem µC verbunden hast geht das auch. 
Nur ist für den nFFS-Pullup nicht unbedingt ein µC-Pin notwendig, wenn 
du nur dien FIFO nutzen möchtest.

von Fabian S. (jacky2k)


Lesenswert?

Jo hab ich auch vorhin raus bekommen, danke ;)
Habe jetzt noch ein Problem, dass ich Datenmüll empfange. Das letzte der 
32 Zeichen (letzte Leerzeichen in dem String) ist immer ein Zufallswert. 
Also habe den Test verwendet aus dem Code hier, wobei ich jetzt doch 
zwei RF12 Module drin habe.
Also du zu sendenen Daten kommen korrekt an, danach gibt es jedoch 
Datenmüll beim ausgeben übern uart.
Vielleicht liegt es daran, dass mir nicht ganz klar ist wie das 
Empfangen funktioniert. Ich sage der Funktion ja, dass sie 32 Bytes 
empfangen soll. Wartet er dann wirklich bis 32 Bytes da sind? Macht er 
eine Null-Terminierung?

von Holger S. (holli_1)


Lesenswert?

Fabian S. schrieb:
> Habe jetzt noch ein Problem, dass ich Datenmüll empfange. Das letzte der
> 32 Zeichen (letzte Leerzeichen in dem String) ist immer ein Zufallswert.

Nach dem letzten (32.) Byte mit Nutzdaten musst du noch 2 Byte 
zusätzlich senden. Die letzten 2 Byte müssen nämlich noch aus dem 
TX-Register zum Sender geschoben werden. Sonst bleiben die drin stecken 
und der empfangende RFM bekommt nur noch Rauschen.

Fabian S. schrieb:
> Wartet er dann wirklich bis 32 Bytes da sind? Macht er
> eine Null-Terminierung?

Wenn einmal das Sync erkannt wurde, liefert der FIFO so lange Daten bis 
zum Abschalten des Empfangs oder FIFO Reset. Wenn das Programm 32 Byte 
erwartet, wird es diese auch bekommen falls du nur die Hälfte sendest. 
Der Rest ist einfach digitalisiertes Rauschen.

von Fabian S. (jacky2k)


Lesenswert?

Verstehe ich das richtig? Ich soll statt 32 einfach 34 Bytes senden, 
wobei die letzten beiden nur irgendwas ist, was irgendwo in der Tonne 
landet?
Kommt mir seltsam vor :-/

von Holger S. (holli_1)


Lesenswert?

Richtig, die 2 zusätzlichen Bytes sind nur "Dummys". Der RFM hat ein 2 
Byte großes TX-Register. Das ist ein FIFO in Senderichtung. Wenn du nach 
dem 32. Byte sofort den Sender ausschaltest, werden die nicht mehr 
komplett gesendet. Daher schiebst du noch 2 Byte zusätzlich in den FIFO. 
Damit werden die 32 Byte dann wirklich gesendet, vom vorletzten (33.) 
Byte übrigens auch ein Teil. Ich habe das mit einem Logikanalysator 
nachvollziehen können.

von Fabian S. (jacky2k)


Lesenswert?

Naja ausschalten wollte ich ihn dann noch nicht.
Er soll ein paar Pakete im Abstand einiger Sekunden senden. Wenn ich 
dann immer die 2 Bytes rein schiebe, damit er das aktuelle Paket sendet 
kommen doch die beiden Dummy Bytes an, sobald ich das 2. Paket sende 
oder?

von Holger S. (holli_1)


Lesenswert?

Dieser Ablauf ist aber nicht gut. Damit ist der Sender auch dann aktiv, 
wenn du gar nichts zu übertragen hast. So etwas soll nicht vorkommen.
Richtig wäre folgender Ablauf:

Sender: Tx an - sende Präambel (2D, D4) - sende 32 Byte Daten - sende 2 
Dummybytes - Tx aus ...warten ... TX an ...

Empfänger: RX an - FIFO Init/Reset - 32 Byte empfangen - FIFO Reset - 32 
Byte empfangen - FIFO Reset .....

Beim Einschalten des TX wird der TX-FIFO initialisiert. Die 2 Byte am 
Ende stören so überhaupt nicht. Damit gibt es einen klaren Ablauf. Nach 
dem Senden braucht der Empfänger natürlich etwas Zeit, um die Daten zu 
verarbeiten bzw. zur RS232 zu schicken. Das muss mit dem Sender 
abgestimmt sein. Sonst kann es zu Überschneidungen kommen und Daten 
gehen verloren.

von Fabian S. (jacky2k)


Lesenswert?

Ich muss zugeben, dass ich von den Modulen sogut wie keine Ahnung habe 
und verwende die Lib vom Benedikt. (Vielen Dank übrigens!)
Habe da nun keine Funktion gefunden wie tx_on oder tx_off :P
Und auch um den Fifo zu resetten finde ich nichts. Wie stellt man das 
an?

von Nn N. (jaytharevo)


Angehängte Dateien:

Lesenswert?

Hallo,
also ich hab hier ein paar allgemeine Fragen zu diesem Empfangsmodul.
Ich arbeite hier nämlich an einer Diplomarbeit und unsere Hauptschaltung
muss bis nächsten Freitag fix sein, es geht soweit alles, es fehlt aber
eben noch, dass RFM02 zum empfangen. Verwendet wird ein ATMEGA8, dieser
wird von einem externen Takt gespeist (1,8..MHz), ca. 5V
Versorgungsspannung, dann wird ein LCD im 4-Bit Modus betrieben, 2 ADC
Eingänge sind belegt, ein weiterer Pin von PORT C. Somit bleiben
eigentlich nur mehr PortC und PortB über für genügend Pins. Was ich mit
dem RFM02 machen will ist simpel, ich will ein Signal senden, welches
den µC aus einem Schlaf-Modi aufweckt, am liebsten wäre mir der
Power-Down Modus. Nun hab ich mich bereits ein WENIG in die Materie von
RFM eingelesen. Soweit ich weiß geht ein Pin High sobald der Buffer des
Modules voll ist. Nun hab ich mir gedacht, dass ich, das als externen
Interrupt verwenden kann zum wieder aufwecken. Nun, der Pin des externen
Interrupts ist ja bereits durch, das LCD belegt. Was nun? Den Pin vom
LCD anders Belegen? Gibts andere Möglichkeiten den µC aufzuwecken?

Weiters wollte ich auch nach der Beschaltung von dem Modul fragen. Ist
wirklich nur die Versorgungsspannung, Ground und ein 10k Widerstand
zwischen Data und Vdd nötig (Anhang)?
Und soweit ich, das verstanden habe müssen die Pins SDI, nSEL, SCK und
SD0 nun nur mehr mit dem µC verbunden werden. Der Rest bleibt in der
Luft?
Ich bitte um eine kurze Rückmeldung ob meine Gedankengänge richtig sind.

MFG Julian

von Fabian S. (jacky2k)


Lesenswert?

Was das Anschließen des Moduls angeht kann ich nun nicht weiter helfen, 
aber wenn du dein Pin des LCDs nicht umlegen willst kannst du ja den 
16Bit Timer nehmen, um den Atmega regelmäßig aufzuwecken und schaust 
dann kurz nach, ob was neues da ist. Bei 1,8Mhz und 16 Bit kommst auf 
ca. 37Hz runter, der Stromverbrauch sollte also nur unwesentlich 
steigen.

von Klaus (Gast)


Lesenswert?

Hallo, habe die Kombination RFM01 und RFM02. Verwende den Code von 
Benedikt (danke für die gute Arbeit) und habe es nun endlich nach 2 
Tagen zum laufen bekommen. Es lag einzig und allein an der 
Optimierungseinstellung. Hatte -O0 eingestellt und nun auf -O2 
umgestellt und es klappt. Könnte mir bitte einer erklären, wieso es 
daran lag oder wo man etwas zu diesen Einstellungen nach lesen kann.

von Manuel Stahl (Gast)


Lesenswert?


von Klaus (Gast)


Lesenswert?

Achso ja super, vielen Dank

von Fabian B. (fabs)


Lesenswert?

Schau dir mal in Zukunft die Warnings deines Compilers genauer an. Der 
AVR-GCC z.B. gibt ein sehr diskriptives Warning aus, wenn eine _delay 
Funktion mit -O0 verwendet wird.

Gruß
Fabian

von Tweaker (Gast)


Lesenswert?

mal ne kleine Frage am Rande;-)
Die meisten werden wohl müde lächeln;-)

versuche RFM01-RFM02 zum laufen zu bringen mit Software von Benedikt.
Kann ich am Atmega auch den Internen Takt nehmen und auf 8Mhz stellen 
und nur noch in der Software die anpassung von F_CPU vornehmen?

Wird das funktionieren?

Vielen Dank

von DTMRacer (Gast)


Lesenswert?

Hallo Leute!

Ich habe mir nun auch die RFM12 Module von Pollin bestellt. Leider habe 
ich, wie viele andere hier auch ein kleines Problem:

Ich bin Besitzer des Pollin AVR Funk Evaluationsboard, und habe dort ein 
RFM12 Modul draufgelötet. Das Modul sendet am CLK die Frequenz 10Mhz 
aus, und scheint auch zu senden und zu empfangen. Soweit wunderbar!

Das 2. Modul habe ich über einen Adapter auf mein Steckbrett gebracht. 
Dort gibt es aber nur Probleme: Die Initialisierung scheint nicht 
anzukommen. Es werden 1Mhz am CLK ausgesendet, und dadurch kann man auch 
nicht senden oder empfangen, logisch. Ich habe bereits den AtMega32 und 
den AtMega8 ausprobiert. Ich habe auch schon versucht, erst den 
Empfänger einzuschalten, oder die Init-Routine mehrmals zu senden. Alles 
vergeblich! Übrigens programmiere ich in Bascom :D

Die SPI Pins habe ich auch schon etliche Male überprüft, sogar mit denen 
vom Pollinboard verglichen.

Ich bin nun wirklich am Ende meines Wissens! Ist das Modul kaputt? Kann 
ich eine Erstattung fordern?!

DTMRacer

von Fabian S. (jacky2k)


Lesenswert?

Also ich hatte es, dass sich das Modul nicht initialisiert hat einmal 
dadurch, dass die Sleeps zu klein waren und dann auch, dass die Clock 
nicht groß genug war. Also mit nem Clock von 1Mht habe ich es noch nicht 
hinbekommen.

von DTMRacer (Gast)


Lesenswert?

welche genauen Sleeps meinst du? Während der Initialisierungsphase? Also 
zwischen den ganzen Routinen?

Und übrigens läuft mein M8 mit 8MHz.

Ich bin echt ratlos..

von Fabian S. (jacky2k)


Lesenswert?

Ich weiß nicht wie das in Bascom aussieht, ich verwende nur C, aber da 
sind in der Lib ein oder zwei sleeps drin und die muss man evtl 
vergrößern.

von Fabian S. (jacky2k)


Lesenswert?

So ich hab dann auch nochmal ne Fragen, wenn hier noch jemand aktiv ist 
;)
Ich versuche grade den Wake-Up Modus zum laufen zu bringen, es 
funktioniert jedoch kein Stück.
Einfache Frage: Was zur Hölle muss ich machen???

Momentan sieht meine Initialisierung so aus:
rf12_init();
sleep_10ms(100);
rf12_setfreq(RF12FREQ(433.92));
rf12_setbandwidth(4, 1, 4);
rf12_setbaud(19200);
rf12_setpower(0, 6);
sleep_10ms(100);

rf12_trans(0xE000 | 512 | (1<<8));  // wake up timer value => 1024ms
rf12_trans(0x8200 | (1<<5) | (1<<1) | (1<<0) | (1<<7)); // WA aktivieren

Warum passiert da nichts am Interrupt Pin?

von DTMRacer (Gast)


Lesenswert?

hmm.. :/ Ich weiß nicht genau welche Sleeps du meinst. Den Einzigen den 
ich hier sehe, ist 150 ms vor dem Beginn der Initialisierung.

Kann es nicht vielleicht wirklich sein, dass das Modul kaputt ist?!

von Fabian S. (jacky2k)


Lesenswert?

Sorry ich hab kein Plan von Bascom, in C gibt es 2 Funktionen wo Sleeps 
drin sind: rf12_trans() und rf12_init().

von DTMRacer (Gast)


Lesenswert?

okay. Du hast ja oben schon erwähnt, dass du kein Bascom kannst, aber 
danke für die Namen der Routinen!

Leider funktioniert auch das nicht. Übrigens wäre es auch unlogisch, da 
ich aus Testzwecken exakt die gleiche Software auf beiden Controllern 
habe. Und auf dem einem Controller funktioniert es ja. Erstmal geht es 
bei mir darum, die 10Mhz am CLK zu erreichen.

Ich werde mich mal mit Pollin in Kontakt setzen...

von Fabian S. (jacky2k)


Lesenswert?

Hmm kp ich hab hier auch schon das eine oder andere Modul durch etwas 
unsachgemäße Behandlung abgeschossen. Also viel aushalten tun die 
nicht...

von Karl K. (bluestar84)


Lesenswert?

Hi DTMRacer, ich hatte mit 3 RFM Chips das gleiche Problem, die init 
wurde nur halb abgeschlossen und ich bin auch nicht auf 10 Mhz gekommen. 
Hab die Timings während der Ansteuerung auch mal verzögert... Kein 
Plan... Hab auch keine Lösung

von geist (Gast)


Lesenswert?

Für die Leute die mit Bascom AVR arbeiten siehe http://www.comwebnet.de
unter Projekte und im Forum.

von DTMRacer (Gast)


Lesenswert?

Karl K. schrieb:
> Hi DTMRacer, ich hatte mit 3 RFM Chips das gleiche Problem, die init
> wurde nur halb abgeschlossen und ich bin auch nicht auf 10 Mhz gekommen.
> Hab die Timings während der Ansteuerung auch mal verzögert... Kein
> Plan... Hab auch keine Lösung

jaa.. ich hab jetzt eine:

Ich habe die SPI Pins von dem Pollin Experimentier Funk Board direkt an 
dem funktionierendem Modul, mit Kabel ausgestattet. Den Vcc Jumper 
gezogen, also bekommt das eig. funktionierende Modul keinen Strom mehr, 
und die SPI Pins an das Modul auf dem Steckbrett geklemmt. Das Modul 
springt nicht auf 10 Mhz. Also ist es wohl kaputt, ich wende mich jezt 
einfach mal an Pollin, mal sehen was die dazu sagen..

Würde ich dir auch einfach mal empfehlen!

von DTMRacer (Gast)


Lesenswert?

Sie senden mir kostenlos ein neues Modul, ohne das ich das alte 
zurückschicken muss! Verdammt kulanter Laden :)

von grünes Krokodil (Gast)


Lesenswert?

Hallo,

Wir haben uns vor einigen Tagen das Funkmodul RFM12 gekauft und haben 
diese nun hier. In Bascom kennen wir uns zwar einigermaßen gut aus (so 
grundlegende Funktionen) und wollten nun eine Datenübertragung mit Hilfe 
dieser Funkmodule einrichten. Jetzt ist halt unser Problem, dass wir 
ersteinmal von Funkmodulen keine Ahnung haben ;-)!
Nach Lesen von gefühlten 200 Posts in diesem Thread und nachdem wir uns 
ca 5 Stunden mit dem Thema beschäftigt haben, kriegen wirs immernoch 
nicht hin :-D

Ich wollte jetzt malhier euch fragen, ob jemand von euch uns den 
Programmcode (Sende, sowie Empfangsmodul) in Bascom zur verfügung 
stellen könnte.

Besonders hamma wäre natürlich, wenn jemand lust hat uns das zu erklären 
bzw wir, nachdem wir das Programm haben, einige doofe Fragen dazu 
stellen dürfen, wenn wir was nicht verstehen.

von geist (Gast)


Lesenswert?

Bascom Code wurde oft schon getestet:
http://comwebnet.weimars.net/index.php?option=com_content&task=view&id=41&Itemid=99999999

Fragen: http://www.comwebnet.de/forum

Es gibt also keine Frage - die sind dort alle beantwortet ;)

Auch diverse Projekte wie RFM12 Testboard, SNAP Protokoll, 
Funkwetterstation mit dem RFM12, RFM12 Datenloggerauch andere Projekten 
in Bascom.


http://www.comwebnet.de

von Holger S. (holli_1)


Lesenswert?


von Alexander P. (tollerteppich)


Lesenswert?

Hallo zusammen

Man das ist ja nen echt Krass langer Fred geworden in den letzten Jahren 
XD

Ich habe einen Traum den ich gerne umsetzen würde.

Und zwar möchte ich in meiner Wohnung eine Art EIB Bus Haben der auf 
Funk Basiert (Mietwohnung) um zB. per Fernbedienung Lampen oder anderes 
Zeugs zu schalten.



Jetzt habe ich einige fragen:

- Hat jemand von euch so etwas schon mal gebaut und gibt es dazu 
vielleicht schon eine fertige Dokumetation ?

-Funktionieren die RFM12 Module auch einwandfrei wenn man mehrere Sender 
und Empfänger hat oder kommt es da zu Störungen untereinander ?

-Hab ich das richtig gelesen das man mit den Programmen die ihr 
entwickelt habt 4byte übertragen kann ?



Was ich mir überlegt habe:

-da ich glaube ich nie mehr als 255 Geräte in meiner Wohnung haben würde 
täte es eine 8bit Identifizierung der Geräte anhand zugeteilter IDs

-In den meisten fällen werde ich nur 1/0 als Daten wert brauchen 
(Schalten)

-zum messen zB Temperatur dann 0-255 oder für Dimmer

-Fehleranalyse/Korektur der Daten mittels Parity oä. muss mich da 
nochmal ind INF1 Skript einlesen :D

-Auswertung von Daten an einem Empfänger von mehreren Sendern



Was ich besitze:

-CNC-Fräse -> Platinen Fräsen mittels Target 3001!
-Tektronix TDS 1002b Digi ossi mit 1GS/s 2CH 60MHz
-Mögliche Kanalerweiterung von 10kanälen(1,0) Elektor Schaltung für Ossi
-C und mProzessor Kentnissen aus Studium (wenig Praxis mit AVR)
-AVR Programmer (mySmartUSB+Software)
-Steckboard, Lötkolben, und was man so braucht zum basteln :D



Ist das Reliesierbar Ja/Nein ? mit begründung bitte ^^

Viele Grüße Alex

von Martin (Gast)


Lesenswert?

>> Was ich besitze:
>> ...
>> Ist das Reliesierbar Ja/Nein ? mit begründung bitte ^^

Dir fehlt noch der Duden.

von Fabian (Gast)


Lesenswert?

Hallo,

ich habe ein kleines Problem mit meinem Empfänger:

Der Empfang der Daten funktioniert nur wenn ich am SCK-Pin ein ca 30 cm 
langes Drahtstück anlöte... Ansonsten kommt nur Müll am Empfänger an.

Weiter oben gibt es schon so einen Eintrag mit einem Tastkopf am 
sck-pin.... wurde eine Lösung gefunden?

Danke

Grüße Fabian

von mydani (Gast)


Lesenswert?

Alexander P. schrieb:
> - Hat jemand von euch so etwas schon mal gebaut und gibt es dazu
> vielleicht schon eine fertige Dokumetation ?

Gebaut ja, Doku nein.

>
> -Funktionieren die RFM12 Module auch einwandfrei wenn man mehrere Sender
> und Empfänger hat oder kommt es da zu Störungen untereinander ?

Bei Funk kommt es immer zu Störungen und jedes Modul ist Sender und 
Empfänger.

>
> -Hab ich das richtig gelesen das man mit den Programmen die ihr
> entwickelt habt 4byte übertragen kann ?
Oder mehr, was der RAM so hergibt.

von Micha (Gast)


Lesenswert?

Hallo Benedikt,
habe Deinen (uralten) Code (vom 22.05.2007) entpackt, in Avr-Studio 
importiert, die Konfiguration an die Pollin Funk-Board angepasst und 
alles hat auf Anhieb funktioniert!!!!
Vielen Dank,
Grüße,
Micha

von HuiBui (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Micha,
ich arbeite auch mit dem Pollin Board und versuche es vergebens ans 
laufen zu bekommen. Mir fehlt ein bisschen die Übersicht und bin so zu 
sagen einsteiger in der AVR Programmierung mit c.
Vielleicht könntest du oder auch andere helfen. Möchte mein rf12 im 
868MHz Band betreiben und einfach einen String übertragen. Ich würde 
mich sehr über eure Hilfe freuen.

Vielen Dank
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <avr/eeprom.h>
5
#include <stdlib.h>  
6
#include <util/delay.h>
7
#include <stdint.h>
8
9
#include "global.h"
10
#include "set_clear.h" 
11
#include "UART.h" 
12
13
#define F_CPU 1000000UL
14
#define BAUD_UART 4800UL
15
16
#define RF_PORT    PORTB
17
#define RF_DDR    DDRB
18
#define RF_PIN    PINB
19
20
/*
21
rf12     ATmega32
22
23
SDI    <--------  MOSI      (PB5)
24
SDO    -------->  MIS0      (PB6)
25
SCK   <--------  SCK        (PB7)
26
nSEL  <--------  SS <=> CS (PB4)
27
nIERQ -------->  INT0      (PD2)  
28
29
*/
30
31
#define SDI    PB5
32
#define SCK    PB7
33
#define CS    PB4
34
#define SDO    PB6
35
36
void USART_Transmit_String( unsigned char *data, uint8_t length );
37
void USART_Transmit( unsigned char data );
38
39
40
uint16_t rf12_trans(uint16_t wert)
41
{  unsigned short werti=0;
42
  unsigned char i;
43
44
  cbi(RF_PORT, CS);
45
  for (i=0; i<16; i++)
46
  {
47
    if (wert&32768) //0b1000 0000 0000 0000
48
      sbi(RF_PORT, SDI);
49
    else
50
      cbi(RF_PORT, SDI);
51
  
52
    werti<<=1;
53
    if (RF_PIN&(1<<SDO))
54
      werti|=1;
55
56
    sbi(RF_PORT, SCK);
57
    wert<<=1;
58
    _delay_us(0.3);
59
    cbi(RF_PORT, SCK);
60
  }
61
  sbi(RF_PORT, CS);
62
  return werti;
63
}
64
65
void rf12_init(void)
66
{  
67
  RF_DDR = (1<<SDI)|(1<<SCK)|(1<<CS);
68
  RF_PORT=(1<<CS);
69
// wait until POR done
70
  for (unsigned char i=0; i<10; i++)
71
    _delay_ms(10);  
72
73
  rf12_trans(0xc0E0);  //LB Det./Clock Div. Command--> 10MHz; VIb=2,2V
74
  rf12_trans(0x80E7);  //Configuration Command    --> el und ef = 1; 868MHz band; 12pF  
75
  rf12_trans(0xc2AB);  //Datafilter Command    --> al = 1; ml = 0; DQD = 3; digital = 0; analog = 1
76
  rf12_trans(0xCA81);  //FIFO / Reset Mode Command  --> al: sync pattern = 0; FIFO fill = 0; Disable high sens; reset =1
77
  rf12_trans(0xE000);  //Wake-Up Timer Command    --> 0ms
78
  rf12_trans(0xC800);  //Low Duty-Cycle Command  --> en : Enable low duty-cycle = 0;Duty-cycle = .66666%
79
  rf12_trans(0xC4F7);  //AFC Command        --> ;AFC automatic mode = Offset always;  st : Strobe edge = 0;fi : Fine mode = 1
80
                      //    --> ;oe : Offset rgister enable = 1
81
                      //    --> ;en : Calculate offset = 1
82
                      //    --> ;Range limit = +3fres to -4fres
83
                      
84
  rf12_trans(0x9800); //AFC Command        --> ;Max. Deviation = +15kHz to -20kHz
85
}
86
87
void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi)
88
{
89
  rf12_trans(0x9500|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7));
90
}
91
92
void rf12_setfreq(unsigned short freq)
93
{  if (freq<96)        // 430,2400MHz  //868MHz
94
    return;
95
  else if (freq>3903)      // 439,7575MHz
96
    freq=3903;
97
  rf12_trans(0xA000|freq);
98
}
99
100
void rf12_setbaud(unsigned short baud)
101
{
102
  if (baud<664)
103
    baud=664;
104
  if (baud<5400)            // Baudrate= 344827,58621/(R+1)/(1+CS*7)
105
    rf12_trans(0xC680|((43104/baud)-1));
106
  else
107
    rf12_trans(0xC600|((344828UL/baud)-1));  // R=344828/Baud-1
108
}
109
110
void rf12_setpower(unsigned char power, unsigned char mod)
111
{  
112
  rf12_trans(0x9800|(power&7)|((mod&15)<<4));
113
}
114
115
void rf12_ready(void)
116
{  cbi(RF_PORT, CS);
117
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
118
}
119
120
121
void rf12_txdata(unsigned char *data, unsigned char number)
122
{  unsigned char i;
123
  PORTD  = (1<<PIND5);    //TX_LED_2 on
124
  rf12_trans(0x8238);      // TX on
125
  rf12_ready();
126
  rf12_trans(0xB8AA);
127
  rf12_ready();
128
  rf12_trans(0xB8AA);
129
  rf12_ready();
130
  rf12_trans(0xB8AA);
131
  rf12_ready();
132
  rf12_trans(0xB82D);
133
  rf12_ready();
134
  rf12_trans(0xB8D4);
135
  for (i=0; i<number; i++)
136
  {  rf12_ready();
137
    rf12_trans(0xB800|(*data++));
138
  }
139
  rf12_ready();
140
  PORTD  = (!(1<<PIND5));
141
  rf12_trans(0x8208);      // TX off
142
}
143
144
void rf12_rxdata(unsigned char *data, unsigned char number)
145
{  unsigned char i;
146
  PORTD  = (1<<PIND6);  //RX_LED_1 on
147
  rf12_ready();
148
  rf12_trans(0x82C8);      // RX on
149
  rf12_ready();
150
  rf12_trans(0xCA81);      // set FIFO mode
151
  rf12_ready();
152
  rf12_trans(0xCA83);      // enable FIFO statt CAf3
153
  
154
  for (i=0; i<number; i++)
155
  {  rf12_ready();
156
    *data++=rf12_trans(0xB000);
157
  }
158
  
159
  rf12_ready();
160
    PORTD  = (!(1<<PIND6));//RX_LED off
161
  rf12_trans(0x8208);    // RX off
162
  _delay_ms(1);      
163
}
164
165
//**********************************************************************
166
void send(void);
167
void receive(void);
168
169
void receive(void){
170
  unsigned char test[32];  
171
  rf12_rxdata(test,32);  
172
  // daten verarbeiten   
173
}
174
175
void send(void){
176
  unsigned char test[]= "Dies ist ein 868MHz Test !!!\n";  
177
  rf12_txdata(test,32);
178
  USART_Transmit_String( test, 32 );
179
}
180
181
int main(void){
182
  
183
  USART_Init();
184
  DDRD = 0xff;
185
186
  rf12_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
187
  rf12_setfreq(RF12FREQ(868.3));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
188
  rf12_setbandwidth(5, 1, 4);    // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm 
189
  rf12_setbaud(9600);      // 19200 baud
190
  rf12_setpower(0, 6);      // 1mW Ausgangangsleistung, 120kHz Frequenzshift
191
192
  for (;;)
193
  {
194
    send();
195
    //USART_Transmit_String("Test \n", 6);
196
    for (unsigned char i=0; i<100; i++)
197
      {_delay_ms(10);
198
      PORTD  = (1<<PIND6);
199
      }
200
    //receive();
201
  }
202
}

von huibui (Gast)


Lesenswert?

kann mir keiner Helfen?
ich bitte euch um einen kleinen gefallen, wer kennt sich gut aus?

vielen Dank fuer eure Hilfe

von Niko S. (huibui2010)


Lesenswert?

Hallo,
ich beschaeftige mich auch erst seit kurzem mit dem Modul und kenn mich 
daher auch nicht so gut aus, bei mir funktioniert das Senden beim 
empfangen habe ich auch noch meine Probleme, er haengt sich jedesmal in 
der rf12_ready funktion auf. Satusregister ausgelesen und bekomme da 
immer was anderes raus... vielleicht kann auch mir wer helfen.
-ATmega32
-Pollin Board

Aber vielleicht kann dir ein anderer aus diesem super Forum noch Helfen 
ich druecke dir die Daumen.

von Kaila (Gast)


Lesenswert?

Moin moin,

ich habe soeben meine beiden RFM12 868-MHz-Band FSK Module zum Laufen 
gebracht. Allerdings nicht mit einem AVR, sondern der Sender laeuft mit 
einem pic16f88 und der Receiver mit einem pic16f628a.
Der Sender schickt einen String samt checksum in die Welt und der 
Receiver empfaengt den String und wertet die checksum aus. Das laeft 
jetzt schon seit 1 Stunde ohne checksum-Error ueber 4 Stockwerke!

Wichtig ist die Initialisierung der Funkmodule! Ein gern gemachter 
Fehler ist auch Port-Konfiguration des Controllers, heisst welcher Port 
ist input, welcher output (SDI auf SDO usw.).

Wenn es gewuenscht ist, kann ich den Schaltplan samt Software posten!

der Kaila

von Fabian B. (fabs)


Lesenswert?

Interessant wäre vor allem (eben auch für AVR-ler) die Initialisierung 
bzw. Configurationsparameter für's RFM.
Also welches Register initialisiert du wie...

Gruß
Fabian

von Kaila (Gast)


Lesenswert?

Moin moin,

meine Initialisierung sieht folgendermassen aus:

  d=rfm12_spi16(0x80e7);          // El, Ef, 11.5pF, 868MHz band
  d=rfm12_spi16(0x82d9);          // !er, !ebb, Et, Es, Ex, !eb, !ew, Dc
  d=rfm12_spi16(0xa67c);          // 868,3MHz
  d=rfm12_spi16(0xc647);          // 4,8kbps
  d=rfm12_spi16(0x94a0);          // Vdi, fast, 134kHz, 0db,-103dbm
  d=rfm12_spi16(0xc2ac);          // Al, !ml, Dig, Dqd4
  d=rfm12_spi16(0xca80);          // fifo8, sync, !ff, Dr
  d=rfm12_spi16(0xca83);
  d=rfm12_spi16(0xc483);          // @pwr, no restrict, !st, !fi, Oe, En

  d=rfm12_spi16(0x9850);          // 90kHz, power - 0db

  d=rfm12_spi16(0xe000);          // not used (wake-up timer cmd)
  d=rfm12_spi16(0xc800);          // not used (low duty-cycle cmd)

  d=rfm12_spi16(0xc000);          // 1MHz, 2.2V (low bat detector and 
clk div)
  d=rfm12_spi16(0x0000);          // read status word to clear fifos

der Kaila

von Danke (Gast)


Lesenswert?

Hallo Kaila!

> Wenn es gewuenscht ist, kann ich den Schaltplan samt Software posten!

Das wäre sehr nett!

Danke!

von Kaila (Gast)


Angehängte Dateien:

Lesenswert?

Moin,

oki, hier der Sourcecode samt Schaltplan, der fuer Sender und Empfaenger 
gleichermassen gilt.
Die Software ist mit PikLab, sdcc, gputils und gpsim entwickelt worden.
Bitte gebt Bescheid, wenn ihr Ungereimtheiten findet. Ich bin gerne fuer 
Diskussionen zugegen!
der Kaila

von Niko S. (huibui2010)


Lesenswert?

Vielen Dank fuer deine Bemuehungen. Weisst du zufaellig auch warum man 
einen String empfaengt dieser im Terminal richtig angezeigt wird aber im 
outputfile unterscheiden sich die Zeiten.
hier mal ein Beispiel:

13:54:34.322:
H
13:54:34.430:
i
13:54:34.430:
er wird auf 868.3MHz gesendet
 empfangen

wuerde mich ueber jegliche Antworten freuen.

mfg

von Kaila (Gast)


Lesenswert?

Moinsen,

wie meinst Du das "im Output-File"?

von Niko S. (huibui2010)


Lesenswert?

Hey,
das ging aber schnell :-). Also das ist ein Auszug aus dem Outputfile 
von HTerminal mit dem ich meinen ganzen Sende Empfangsvorgang 
ueberwache. Sprich ob eine uebertragung zu stande kommt oder nicht. Und 
hierbei wundere ich mich ein bissschen ueber die "unterschiedlichen" 
Zeiten.
Wuerde das gerne in ein Log file schreiben weiss aber nicht wie das 
geht.

mfg

von Niko S. (huibui2010)


Lesenswert?

Vielleicht koenntest du mir deine Mail addresse geben dann koennten wir 
vielleicht darueber etwas schneller uns austauschen vielen Dank.
oder wenn du moechtest schreib mich einfach mal an huibui@gmx.de

von Robert K. (mr_insanity)


Lesenswert?

Hallo zusammen,

ich habe hier zwei RFM12 auf zwei Pollin Boards laufen.
Am Empfänger hängt ein Display, auf dem ich den empfangenen Text 
ausgebe.
Kann mir jemand sagen, warum das letzte Zeichen immer Müll ist?
Kann das einfach nicht nachvollziehen.
Benutze den Code von Benedikt auf einem Mega32 mit 16MHz und das Display 
hat nen T6963C.

MfG
Robert

von Werner B. (werner-b)


Lesenswert?

Robert Knipp schrieb:
> Hallo zusammen,
>
> ich habe hier zwei RFM12 auf zwei Pollin Boards laufen.
> Am Empfänger hängt ein Display, auf dem ich den empfangenen Text
> ausgebe.
> Kann mir jemand sagen, warum das letzte Zeichen immer Müll ist?
> Kann das einfach nicht nachvollziehen.
> Benutze den Code von Benedikt auf einem Mega32 mit 16MHz und das Display
> hat nen T6963C.
>
> MfG
> Robert

Der Fehler ist in Zeile 42

von Robert K. (mr_insanity)


Lesenswert?

Werner B. schrieb:
> Der Fehler ist in Zeile 42

Na das ist ja mal eine konstruktive Antwort.
Zu viel Per Anhalter durch die Galaxis gelesen, oder?

Ich weiß ja dass meine Frage nicht gerade präzise ist. Ich habe aber 
keinen balssen Schimmer woran es liegen könnte und dachte dass 
vielleicht jemand hier einen konstruktiven Tip hat, wo ich bei der 
Fehlersuche ansetzen kann.

von JAN (Gast)


Lesenswert?

@kaila
könntest du deine Files, incl der Hex, mit RAR oder WinZIP anhängen? 
Danke!

von Kaila (Gast)


Angehängte Dateien:

Lesenswert?

Moin moin und Prost,

bin gerade in Zwischenstation vom Mera-Luna-Festival. Hab noch 'ne
dicke Birne aber, hier die kompletten Files meines Senders und
Empfaengers!
der Kaila

Ps: Arbeite unter Linux und kann nur zip. Sollte aber von WinZip de-
komprimiert werden koennen!

Pps: Der Sender rotzt jetzt testweise alle 10ms einen String nebst
checksum raus. Ueber 4 Stockwerke taucht dann doch ab und zu ein
chksum-Error auf, aber ganz selten! Ist schon ziemlich sicher die
ganze Uebertragung :-D

von Niko S. (huibui2010)


Lesenswert?

Hey,

wollte mal nachfragen ob es eine einfach Möglichkeit gibt eine CRC 
einzufuegen? Da ich neu auf deisem Gebiet bin komme ich mit Kaila's code 
nicht zurecht.
Theoretisch ist mir eine crc bekannt nur beim implementieren hapert es 
noch.

mfg

von Kaila (Gast)


Lesenswert?

Hi Niko,

der String "Kaila" wird in rfm12_snd_msg in der for-Schleife ins
tx-Fifo geschrieben, also in msg[0..4] steht der String. In msg[5]
ist dann die berechnete check-Summe. Das ist keine zyklische Redundanz-
pruefung, sollte aber fuers erste reichen.
msg[0]='K',
msg[1]='a',
...
msg[4]='a'
msg[5]=chksum

Der Empfaenger bekommt aus den rx-Fifo den String wie folgt:
msg[0]='K',
msg[1]='a',
...
msg[4]='a'
msg[5]=chksum

Die chksum in msg[5] vom Sender muss mit der berechneten im
Empfaenger verglichen werden.
Das sollte erst einmal den evtl. Datenverlust registrieren!
der Kaila

von Niko S. (huibui2010)


Lesenswert?

Hallo allerseits,

erst einmal vielen Dank Kailer fuer deine rasche Antwort. Nun habe ich 
es geschafft eine CRC zu implementieren, aber bin auch schon wieder auf 
ein neues Problem Aufmerksam geworden :-(.

Versuche ein syn. Byte zu senden damit der Emppfaenger bescheid weiss 
das er empfangen kann. Es funktioniert nur habe ich ein 
Verstaendnisproblem und zwar schicke ich s. Quelltext:
1
Sender:
2
uint16_t syn, syn_Byte = 0xAA;
3
...
4
rf12_ready();
5
syn =  rf12_trans(0xB800 | syn_Byte);
6
...
// und versuche das nun im Sender auszulesen was letztendlich in syn 
drinsteht!
1
  USART_Transmit( syn );
2
  USART_Transmit( syn & 0x00FF);
3
  USART_Transmit( syn >> 8);
4
  USART_Transmit_String( "\n", 1 );
// aber es sind nur Nullen, im Empfaenger jedoch sehe ich das AA 
gesendet worden ist wie kann das sein?
1
Empfaenger:
2
rf12_ready();
3
USART_Transmit_String( "\n", 1 );  
4
uint8_t neu = rf12_trans(0xB000) & 0x00FF;
5
  USART_Transmit( neu );
6
USART_Transmit_String( "\n", 1 );
bitte um Hilfe Danke an alle

von Kaila (Gast)


Lesenswert?

Hi Niko,

arbeitest Du empfaengerseitig mit einer ISR?
der Kaila

von Niko S. (huibui2010)


Lesenswert?

hey,
nein das mache ich nicht, es wird der naechste Schritt sein eine Art 
chat aufzubauen dazu benoetige ich spaeter vielleicht noch ein paar 
Tipps.

mfg

von Wolfgang (Gast)


Lesenswert?

Hallo Leute,

ich besitze auch die RFM12 Funkmodule. Alles funktioniert wunderbar, nur 
mein Controller hat keine Zeit mehr die ganze Zeit auf das SDO Signal zu 
warten. Mit anderen Worten: Ich möchte ein nIRQ Interrupt nutzen, wenn 
das RFM12 Modul Daten empfangen hat. Meine Unterroutinen sehen 
folgendermaßen in Bascom aus:
1
'--------------------------------------
2
'---Funkmodul---
3
'--------------------------------------
4
5
Sub Rf12_init:
6
  Waitms 150
7
  Temp = Rf12_trans(&Hc0e0)
8
  Temp = Rf12_trans(&H80d7)
9
  Temp = Rf12_trans(&Hc2ab)
10
  Temp = Rf12_trans(&Hca81)
11
  Temp = Rf12_trans(&He000)
12
  Temp = Rf12_trans(&Hc800)
13
  Temp = Rf12_trans(&Hc4f7)
14
  Waitms 150
15
End Sub
16
17
18
Sub Rf12_setfreq(byval Freq As Single)
19
20
  Freq = Freq - 430.00
21
  Temp = Freq / 0.0025
22
  If Temp < 96 Then
23
    Temp = 96
24
  Elseif Temp > 3903 Then
25
    Temp = 3903
26
  End If
27
  Temp = Temp + &HA000
28
  Temp = Rf12_trans(temp)
29
End Sub
30
31
32
Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
33
  Drssi = Drssi And 7
34
  Gain = Gain And 3
35
  Temp = Bandwith And 7
36
  Shift Temp , Left , 2
37
  Temp = Temp + Gain
38
  Shift Temp , Left , 3
39
  Temp = Temp + Drssi
40
  Temp = Temp + &H9400
41
  Temp = Rf12_trans(temp)
42
End Sub
43
44
45
Sub Rf12_setbaud(byval Rfbaud As Long )
46
  Local Ltemp As Long
47
48
  If Rfbaud < 663 Then Exit Sub
49
50
  If Rfbaud < 5400 Then
51
    Temp = 43104 / Rfbaud
52
    Temp = Temp + &HC680
53
  Else
54
    Ltemp = 344828 / Rfbaud
55
    Temp = Ltemp
56
    Temp = Temp + &HC600
57
  End If
58
  Decr Temp
59
  Temp = Rf12_trans(temp)
60
End Sub
61
62
63
Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
64
  Outpower = Outpower And 7
65
  Temp = Fskmod And 15
66
  Shift Temp , Left , 4
67
  Temp = Temp + Outpower
68
  Temp = Temp + &H9800
69
  Temp = Rf12_trans(temp)
70
End Sub
71
72
73
Sub Rf12_txdata(byval Maxchar As Byte)
74
  Temp = Rf12_trans(&H8238)
75
  Rf12_ready
76
  Temp = Rf12_trans(&Hb8aa)
77
  Rf12_ready
78
  Temp = Rf12_trans(&Hb8aa)
79
  Rf12_ready
80
  Temp = Rf12_trans(&Hb8aa)
81
  Rf12_ready
82
  Temp = Rf12_trans(&Hb82d)
83
  Rf12_ready
84
  Temp = Rf12_trans(&Hb8d4)
85
  Rf12_ready
86
  For Count = 1 To Maxchar
87
    Rf12_ready
88
    Temp = &HB800 + Rfdata(count)
89
    Temp = Rf12_trans(temp)
90
  Next Count
91
  Rf12_ready
92
  Temp = Rf12_trans(&H8208)
93
End Sub
94
95
96
Sub Rf12_rxdata(byval Maxchar As Byte)
97
  Temp = Rf12_trans(&H82c8)
98
  Temp = Rf12_trans(&Hca81)
99
  Temp = Rf12_trans(&Hca83)
100
  For Count = 1 To Maxchar
101
    Rf12_ready
102
    Temp = Rf12_trans(&Hb000)
103
    Rfdata(count) = Temp
104
  Next Count
105
  Temp = Rf12_trans(&H8208)
106
End Sub
107
108
109
110
Function Rf12_trans(byval Wert As Word) As Word
111
  Local Lowbyte As Byte
112
  Local Highbyte As Byte
113
114
  Lowbyte = Wert And 255
115
  Shift Wert , Right , 8
116
  Reset Spi_cs
117
118
  Highbyte = Spimove(wert)
119
  Lowbyte = Spimove(lowbyte)
120
  Set Spi_cs
121
122
  Temp = Highbyte * 256
123
  Temp = Temp + Lowbyte
124
  Rf12_trans = Temp
125
126
End Function
127
128
Sub Rf12_ready
129
  Reset Spi_cs                                              'Chip Select = 0
130
  For I = 1 To 30000
131
  If Spi_sdo = 1 Then Exit For
132
  Next
133
End Sub

Ich habe nun den nIRQ Pin an INT1 am AtMega32 angeschlossen und den 
Interrupt auf fallende Flanke konfiguriert. Leider wird beim Empfangen 
kein Signal am nIRQ Pin geliefert. Muss ich diese Funktion im RFM12 
konfigurieren? Und wenn, was muss ich an das Modul senden, damit ein 
Interrupt ausgelöst wird, wenn Bytes im FIFO sind?

Viele Grüße,

Wolfang

von Kaila (Gast)


Lesenswert?

Hi Wolfgang,

uha, ist das so ein Mix zwischen Basic und Fortran, was Du da 
programmierst?
Oki, zum Thema. Deiner Initialisierung nach sollte der nIRQ-Pin vom 
RFM12 im default-Zustand auf +5V sein. Das wuerde ich erstmal testen. 
Bei mir war das anfaenglich nicht so (einige mV). Wenn dem so ist - also 
nicht +5V -, dann wuerde ich ein 22uF Elko direkt am VDD und GND vom 
RFM12 loeten und checken, was dann passiert. Die Dinger sind 
betriebsspannungsmaessig ziemlich empfindlich. Bei mir liefen die erst 
dann zuverlaessig....
der Kaila

von Holger S. (holli_1)


Lesenswert?

Guckst du hier:

http://bascom-forum.de/index.php/topic,3421.0.html

Da gibt es Beispiele für alle möglichen Ansteuerversionen.
Der nIRQ bleibt übrigens so lange auf low, bis das Statusregister 
gelesen wurde und entsprechend reagiert wurde. Beim FIFO IRQ muss der 
FIFO geschrieben oder gelesen werden, die anderen IRQ's werden beim 
Lesen gelöscht.

von Kaila (Gast)


Lesenswert?

Moin,

hmmm, aber bei mir macht es keinen Unterschied, ob ich das Status-Reg in 
der Initialisierungs-Routine vorsichtshalber lese oder Peng!
Erst mit dem Elko liess sich der nIRQ ueberreden, ueberhaupt auf High zu 
gehen?!
der Kaila

von Holger S. (holli_1)


Lesenswert?

Ich habe die RFM auf dem Pollin Funk AVR Board, da ist auch kein Elko in 
der Nähe. Es funktioniert trotzdem. Hast du diesen "high sensitivity 
reset" deaktiviert? Wenn man den Status ausliest, kann man ja sehen 
welcher IRQ der Auslöser war.

von Wolfgang (Gast)


Lesenswert?

Hallo,

ich mag diesen nIRQ-Pin nicht mehr.. Ich habe eure Vorschläge mal 
ausprobiert, leider funktionierte es irgendwie nicht.

Naja.. und so habe ich halt weiter gesucht und gesucht und gefunden:

Ohne weitere(!) Konfiguration (siehe meinen Code oben) konnte ich den 
FFIT Pin benutzen. Dieser schaltet auf High sobald der voreingestellte 
Wert an Bits (Bytes?) im FIFO Speicher gelandet ist. Bei mir ist dies 
glaub ich 8 Bits. Einfach den INT0 auf steigende Flanke konfigurieren 
und mit dem Byte auslesen beginnen.

Trotzdem danke für eure Hilfe!!

Wolfgang

von Holger S. (holli_1)


Lesenswert?

Ich hatte am Anfang die selben Probleme. Nur mit einem Logikanalysator 
kommt man da wirklich weiter. Sonst tappst du da immer im Dunkeln.
Mit FFIT funktioniert es natürlich auch so. Aber Funktionen wie Wake-up, 
welche einen IRQ benötigen kannst du nicht nutzen.

von Manuel (Gast)


Lesenswert?

Hallo liebe RFM12 Nutzer,

erstmal danke an Benedikt fuer die Bereitstellung des Sourcecodes. Ich 
habe 2 AVR Funkboards von Pollin und nutze den internen 8Mhz Takt des 
ATmega32.

Leider bekomme ich das ganze nicht so recht zum laufen, meine AVRs 
haengen im rf12_ready() beim warten auf den FIFO. Lustigerweise hatte 
ich nach laengerem hin-und-her schon einmal eine funktionierende 
Verbindung zwischen den 2 Boards hinbekommen. Nach kurzer Stromtrennung 
hat das ganze aber nicht mehr funktioniert (1 mal tat der Sender spaeter 
nochmal auf einem Board...). Seither haengen beide wie gesagt im 
rf12_ready...

Kann mir bitte jemand weiterhelfen wie ich da auf Fehlersuche gehen 
kann? Bin ein Anfaenger was Mikrocontroller betrifft, werde mich aber 
bemuehen :)

Viele Gruesse,
 Manuel

von fabian27 (Gast)


Lesenswert?

erstmal wollte ich mich auch an Benedikt bedanken für seinen starken 
sourcecode.

nun nachdem ich die ersten teste mit dem rfm12 erfolgreich sind habe ich 
festgestellt dass manche daten die ich empfange  nicht rechtzeitig aus 
dem fifo ausgelesen werden..gibts es die möglichkeit die Grösse des FIFO 
buffer zu beinflussen oder ist die schon beim programm von benedikt auf 
die maximale Grösse eingestellt?

vielen dank

von Up4anything (Gast)


Lesenswert?

Hi,
wollte mich auch für den code rfm01 und rfm02 bedanken.
Dann hätte ich noch ne Frage, beim rfm02 is ja keine fsk-modulation auf 
dabei, über nimmt dein code die funktion dann?
MfG
Up4

von Christian S. (picpgm)


Lesenswert?

Hi an alle RFM12 Nutzer,

ich habe den Treiber erfolgreich auf den PIC für den CCS C Compiler und 
den Microchip C18 Compiler portiert. Alle Infos dazu habe ich hier 
zusammengefasst:
http://members.aon.at/electronics/pic/projects/rfm12/rfm12.html

MfG

von Jonathan L. (ext)


Lesenswert?

Hallo Benedikt,

ich bin durch deinen Code aus folgendem Beitrag schon sehr viel weiter 
gekommen:
Beitrag vom "Datum: 15.03.2009 19:17"
Da ich normalerweise nicht mit makefiles arbeite habe ich noch eine 
kurze Frage zur Verwendung anderer µCs.
Ist es richtig, dass ich wenn ich anstelle eines ATmega8 einen 
ATtiny2313 verwenden möchte nur im Makefile die Zeile MCU ändere?
Oder muss ich im Quelltext noch weitere Änderungen vornehmen?

Vielen Dank!

von Jonathan L. (ext)


Lesenswert?

Falls irgend jemand weiß, wie ich das ganze auf zwei ATtiny2313 zum 
Laufen bekomme meldet euch bitte.
Vielen Dank!

von nicht Gast (Gast)


Lesenswert?


von Jonathan L. (ext)


Lesenswert?

Das hat mir nicht sonderlich weiter geholfen. Ich nutze momentan den 
Code rfm12_just_rxtx.
Auf zwei ATmega8 läuft alles wunderbar. Ich möchte das genze jetzt gerne 
mit zwei ATtiny2313 zum laufen bekommen. Ich hab einige Probleme beim 
Anpassen des Codes, da die ATtiny 2313 ja kein richtiges SPI haben.
Außerdem hab ich große Probleme mit dem compilieren, da ich sonst nicht 
mit makefiles arbeite und normalerweiße nur eine .C Datei habe.

Alle Versuche, die ich in den letzten Tagen unternommen habe um das 
ganze nach einigen Änderungen im Code zu kompilieren, sind gescheitert. 
Ich nutze Code::Blocks. Wenn ich das Ganze zu compilieren versuche, 
bekomme ich einige Fehlermeldungen, die alle wie folgt beginnen:
undefined reference to '...'
Ich konnte leider keine Lösung dafür finden.

Ich wäre über Hilfe sehr dankbar.

Grüße ext.

von Jonny (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich nutze das Funk-Avr-Evaluationboard und die Module RF01 bzw. RF02 von 
Pollin. Das Senden funktioniert einwandfrei jedoch das Empfangen leider 
nicht. Beide Module takten auf 10Mhz und ich weiß einfach nicht mehr 
weiter. Im Anhang befindet sich der Code fürs empfangen. Kann mir 
vielleicht einer weiterhelfen?

mfg Jonny

von Christian S. (picpgm)


Lesenswert?

Hallo,

soweit ich das gesehen habe fehlt das "Receiver FIFO Read Command" 
(0xB000) damit die Daten aus dem FIFO geladen werden. Aktuell sendest du 
nur ein 8 Bit Kommando anstelle eines 16 Bit Kommandos ... (zumindest 
wäre es beim RFM12 so).
1
for (j=0; j<16; j++)  // read and discard status register
2
{  sbi(RF_PORT, SCK);
3
  asm("nop");
4
  cbi(RF_PORT, SCK);
5
}
6
7
// hier 0xB0 senden => "Receiver FIFO Read Command"
8
9
c=0;
10
for (j=0; j<8; j++)
11
{  c<<=1;
12
  if (RF_PIN&(1<<SDO))
13
    c|=1;
14
  sbi(RF_PORT, SCK);
15
  _delay_us(0.2);
16
  cbi(RF_PORT, SCK);
17
}
18
*data++=c;
19
sbi(CS_PORT, CS);

mfg
Christian

von Andreas S. (igel1)


Lesenswert?

Hallöle,

ich habe 2 Pollin-Boards v1.2 mit Atmega8 sowie jeweils RFM12-433.
Nach einigen Stunden Foren-Lektüre wage ich nun doch mal 'ne kleine 
Frage:

Welcher der vielen Beispielcodes läuft auf meinen (unmodifizierten)
Boards? Dabei möchte ich den Atmega8 am 12MHz Quarz betreiben/belassen
und optimalerweise SPI benutzen (muß aber nicht unbedingt sein).

Kleiner Tipp wäre nett.

Viele Grüße
Igel1

von Alf (Gast)


Lesenswert?

Danke an Benedikt ich habe die Module mit zwei Anpassungen zum laufen 
bekommen. Ich habe ein tamega32 in Verbindung mit avr bord von 
robotikhartware gennutzt.

1. es muste nur die pins vom port änder
#define SDI    5    //5
#define SCK    7    //6
#define CS    4    //7
#define SDO    6    //0
2. die angepaste ready funktion nutzen weil dich der sender immer 
aufgehangen hat.

void rf12_ready(void)
{
  cbi(RF_PORT, SDI);
  cbi(RF_PORT, CS);
  asm("nop");
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
}
danke an alle.

von Martin M. (ats3788)


Lesenswert?

Danke für den Beitrag auch wenn er schon ein paar Tage alt ist.
Hat mir doch Anregungen gegeben

Also ich beschäftige mich geraume Zeit mit RFM Module
und bin wie viele Wutausbrüche bekommen, weil das tweaken
nicht so stimme in den Hope Beschreibung ist.


Schaut euch die Microchip Doku zum MRF49XA ist identisch mit den Silab 
Chip IA oder SI 4420 nur eben Microchip genau.

http://ww1.microchip.com/downloads/en/DeviceDoc/70590C.pdf

Was mich zur Verzweiflung gebracht hatte das der FIFO des Receivers


Das erste Paket richtig empfangen hatte und dann meist nur Müll.
Alles geändert was so geht auf TX RX Seit aber über eine richtige Daten 
rate von über 10% Quersummencheck kam ich nicht darüber.

Also noch mal
http://www.mikrocontroller.net/articles/RFM12
studiert was man tun kann bei FIFO Overflow.
Meine MCU's liefen beide mit 10MHZ
Geschwindigkeit ändern, also internen.

Die Geschwindigkeit auf 16MHZ geändert und nun habe ich bei 4800 baud
525 gute zu 2 Drops.

Warum ich das geschrieben habe, weil ich selbst nicht glauben konnte das 
bei einer so niedrigen Bitrate von Bedeutung sein könnte.  CU :)

von Andreas I. (andreas92)


Lesenswert?

Hallo,

Ich beschäftige mich jetzt seit 2 Wochen mit den 868MHz Modulen und bin 
langsam am verzweifeln.
Ich benutze die RFM12b Module mit 2 Atmega8, habe alle Änderungen für 
die 868MHz übernommen und benutze den RFM12_RX_TX.zip Code von Benedikt 
vom 16.05.07 mit der optimierten Senderoutine.
Ich musste lediglich die neue uart Library runterladen und alles ging 
problemlos kompilieren.
Die While-Schleife läuft er problemlos durch, das "senden...." kann ich 
sekündlich im Terminal auslesen.
Nur gibt er mir weder ein 10MHz Signal an SCK aus, noch kann ich sonst 
irgendwelche Signale an MISO oder MOSI feststellen.
Also wird das RFM12 Modul wohl nicht richtig initialisiert, obwohl ich 
beim Debuggen keine Fehler feststellen kann.
Neben anderen möglichen Fehlerquellen wollte ich mal Fragen, ob es an 
meinem Atmel Studio 6 liegen kann, da der Code ja mittlerweile 8 Jahre 
alt ist und ja auch die uart-Library schon veraltet war.
Vielleicht hat sich ja etwas an sonstigen Libraries geändert, sodass es 
irgendwo zu Problemen kommt.
Alle anderen Fehlerquellen wie falsche Verdrahtung etc kann ich 
ausschließen, da ich alles schon sehr oft kontrolliert habe.
Ich würde mich freuen, wenn mir jemand helfen könnte.

Gruß

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.