Forum: Mikrocontroller und Digitale Elektronik RFM12b an Atmega168 - Empfangsprobleme


von Bernd (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche derzeit verzweifelt den RFM12B (868Mhz Band) mit dem ATmega 
168 zum Laufen zu bringen.

Der Sender funktioniert bereits. Wenn ich Daten in den FIFO schiebe, 
reagiert nIRQ.

Den Empfänger möchte ich interruptgesteuert programmieren. Doch leider 
bleibt der nIRQ dauerhaft auf logisch 1.

Ich habe im Anhang meinen C-Code und den Schaltplan für beide Geräte 
angeführt. Habt ihr vielleicht eine Idee, an was das liegen könnte, bzw. 
was man noch ausprobieren könnte?

Ich habe auch schon diverse Initialisierungen ausprobiert, doch leider 
ohne großen Erfolg :/

Vielen Dank!

Schöne Grüße
Bernd

Ps: Was ich noch dazu sagen möchte: Das Grundgerüst des C-Codes stammt 
von hier: http://www.joachim-neu.de/post/70/rfm12b-868/
Da ich eine interruptbasierende Lösung wollte, habe ich einige 
Adaptionen durchgeführt.

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Bernd schrieb:
> Den Empfänger möchte ich interruptgesteuert programmieren. Doch leider
> bleibt der nIRQ dauerhaft auf logisch 1.

Es ist jetzt 6 Jahre her, dass ich mich mit dem Ding befasste und selbst 
Code für den PIC schrieb aber ich hatte damals auch Probleme und diese 
hatten die Ursache darin, dass die RFM12b Chips Bugs hatten. Irgendein 
Flag wollte sich ums Verrecken nicht setzen.

Hier mal mein Code für PIC (mit CCS) von damals. Es funktionierte nur 
mit Polling, die INT Geschichte lief nie.

Aufgrund des Alters > 8 Jahre würde ich die Steine nicht mehr einsetzen, 
es gibt heute bessere Lösungen wie zb auf der 2,4Ghz Frequenz die 
NRF24L01 Nodule.

von Bernd (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

danke für die Antwort.

Ich habe heute weitere Versuche unternommen und dabei folgende 
Erkenntnisse gewonnen.

- Die Senderoutine habe ich erneut angepasst. Anbei die aktuelle 
Version.

- Dann habe ich das CLK Signal überprüft. Mir ist aufgefallen, dass sich 
die Frequenz des Signals während des Betriebs ändert. Eingestellt ist 1 
Mhz und plötzlich sind es 4Mhz. Einige Minuten später messe ich am CLK 
Ausgang wieder 1 MHz.
Mein Microcontroller wird überigens über einen externen 4MHz Quarz 
versorgt.

- Die Feldstärkespannung am Empfänger beträgt 0,35V. Laut der Kurve im 
Datenblatt müssten es bei optimalem Empfang allerdings 0,45V sein.

Hat vielleicht jemand zu diesen Punkten eine Idee? Der nIRQ Ausgang 
müsste doch trotz Polling auf logisch 0 fallen, sobald der FIFO Daten 
erhält.

Schöne Grüße und vielen Dank
Bernd

von Fred R. (fredylich)


Lesenswert?

Hallo Bernd,

bei mir war es ein Hardwareproblem.
Lösung:
Am Empfänger ein 100p Kondensator an nIRQ zu GND. Alles bestens.

Zum Programm kann ich nichts sagen. Schreibe in Bascom.

Zitat:
Hat vielleicht jemand zu diesen Punkten eine Idee? Der nIRQ Ausgang
müsste doch trotz Polling auf logisch 0 fallen, sobald der FIFO Daten
erhält.

Ich bin der Meinung umgedreht.

In Bascom sieht es so aus.

Config Int1 = Rising ‘wenn Int1 von 0 nach 1 dann Unterprogramm aufrufen
On Int1 Rfm_funkirq

Stelle ich es so ein
Config Int1 = Falling

Funktioniert es nicht.

Gruß
Fred

: Bearbeitet durch User
von Bernd (Gast)


Lesenswert?

Hallo Fred,

vielen Dank für deinen Input!

Ich habe heute deinen Tipp mit dem 100p Kondensator ausprobiert. Doch 
leider war das nicht die Ursache des Problems. :(

Auch habe ich den Interrupt testhalber einmal auf die steigende Flanke 
programmiert.

Wenn ich mit dem Oszilloskop den nIRQ PIn ansehe, bleibt dieser 
dauerhaft auf 1.

Ich habe heute übrigens nochmal die ARSSI Spannung beim Kondensator auf 
der Empfängerseite gemessen. Diese scheint optimal zu sein - ich habe 
mich gestern geirrt!
Man sieht - bei sekündlichem Senden einiger Bytes- wie die Spannung auf 
1,1V ansteigt und anschließend wieder auf 0,4V absinkt.

Schöne Grüße
Bernd

von Felix P. (fixxl)


Lesenswert?

Warum schaltest du nach jedem einzelnen Byte den Transmitter ab bzw. 
aktivierst den FIFO-Puffer neu?

Du solltest nach der Aktivierung des Transmitters im richtigen Timing 
(jeweils warten auf die fallende NIRQ-Flanke) die Bytes nacheinander in 
den Puffer schreiben und erst dann den Transmitter abschalten.

Beim Receiver ist es genauso: Receiver einmalig aktivieren, FIFO leeren 
und dann einfach die Bytes nacheinander im richtigen Timing abholen.

von Bernd (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

vielen Dank für eure Hilfe und gleichzeitig sorry für meine späte 
Antwort.

Ich habe die letzten Abende unzählige Experimente mit dem Dingern 
gemacht.

@Felix: Danke für den Hinweis mit dem FIFO. Nachdem ich das angepasst 
habe, kamen zumindest Daten auf der Empfängerseite an. nIRQ geht nach 
dem Erhalt der beiden Synchronisationsbytes ständig auf low.

Leider ist es nun so, dass der Empfänger nur Müll empfängt. Im 
angehängten Empfängercode sperre ich das FIFO nach 2 Bytes. 
(Empfängerseitig werden auch nur 2 gesendet)
Dennoch geht nIRQ ständig auf low. Es scheint, dass irgendwelche 
Störungen das FIFO füllen und dann den Interrupt request generieren. 
Kann das wirklich sein? Was kann man in diesem Falle anpassen?

Vielleicht hat ja jemand noch eine Idee :)

Vielen Dank für eure Hilfe!

Schöne Grüße aus Wien
Bernd

von Felix P. (fixxl)


Lesenswert?

Bernd schrieb:
> Leider ist es nun so, dass der Empfänger nur Müll empfängt. Im
> angehängten Empfängercode sperre ich das FIFO nach 2 Bytes.
> (Empfängerseitig werden auch nur 2 gesendet)
> Dennoch geht nIRQ ständig auf low. Es scheint, dass irgendwelche
> Störungen das FIFO füllen und dann den Interrupt request generieren.
> Kann das wirklich sein? Was kann man in diesem Falle anpassen?

Was heißt "der Empfänger empfängt nur Müll"? Du erwartest beim Empfänger 
0x20 an der Stelle receive[1], meiner Meinung nach müsste es aber doch 
in receive[0] stehen, oder?

Wie du dem Datenblatt auf Seite 30 entnehmen kannst, solltest du vor dem 
Abschalten des Senders nach der tatsächlichen Payload noch ein (ich 
selbst nehme zwei, um ganz sicher zu gehen, dass auch alles versendet 
worden ist) Dummy-Byte in den Sendepuffer schreiben. Der Sendepuffer 
kann zwei Bytes aufnehmen und schickt nur dann das ältere der beiden 
raus, wenn er voll ist. Wenn du also kein Dummy-Byte hineinschreibst, 
wird das letzte Byte deiner Payload nicht gesendet.

Mein übliches Vorgehen zum Vermeiden von Störungen ist, dass ich direkt 
nach dem FIFO-Schlüssel 0x2DD4 eine Längenangabe schicke, wie viele 
Bytes jetzt noch folgen werden. Dann weiß der Empfänger, wie lange er 
zuhören muss und wann er einfach den Puffer zurücksetzen kann. Zudem 
sichere ich das auch noch mit CRC ab, um sicher zu gehen, dass alles 
richtig übertragen wurde.

von Christian J. (Gast)


Lesenswert?

Bernd schrieb:
> Vielleicht hat ja jemand noch eine Idee :)

Ehrliche Antwort?

Wieso schlägst du dich mit 8 Jahre alten Chips herum, die 
erwiesenermaßen noch Bugs hatten? Der Empfänger empfängt immer Müll und 
wenn da zufällig 2DD4 dabei ist füllt er den Fifo.

Da komme ich mit einem normalen 3Euro 433 noch schneller zum Ziel, 15 
Minuten, Radio Head Libary und die Daten laufen.....

Ich habe auch Funkmodule in Betrieb, 2.4 Ghz und XBee, vollautomatische 
Frame Erzeugung, CRC usw ..... tun genau das was sie sollen. grunz

von Bernd (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen!

Ich möchte mich nochmal ganz herzlich für eure Mithilfe bedanken. 
Speziell bei dir Felix!
Nach fast 2 Wochen mühsamer Fehlersuche habe ich die Dinger tatsächlich 
zum Laufen gebracht :)

@Felix: Du hattest recht, es braucht die Dummy Bytes am Ende der 
Nutzdaten. Der gepostete Code ist so natürlich unbrauchbar, das stimmt. 
Aber zum Testen wollte ich ihn möglichst einfach halten.

Ich habe heute Nachmittag bereits ein Protokoll mit CRC implementiert.

Ich stelle den Code hier frei zur Verfügung. Er eignet sich zum Testen 
der Module und vielleicht hilft er ja jemandem.

Ganz schöne Grüße
Bernd

von Christian J. (Gast)


Lesenswert?

q.e.d.


RF_Sendbyte(check);         // Checksumme
RF_SendByte(0xAA);          // Dummy, nachschieben als Pipelineputzer
RF_SendByte(0xAA);          // Dummy, nachschieben als Pipelineputzer

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.