Hallo, Ich habe ein Problem mit einem Atmega328PB und dem RFM75. Ich habe mir für ein Bastelprojekt zwei RFM75-Module geholt und versuche nun, seit längerem erfolglos, die beiden miteinander schwatzen zu lassen. Die SPI Schnittstelle zu den Modulen funktioniert einwandfrei(Mit Oszilloskop geprüft und zurücklesen der geschriebenen Werte über UART geprüft). Sieht jemand was ich falsch gemacht habe oder hat jemand funktionierenden GCC-Code für das Modul? Vielen Dank für eure Hilfe :) Gruß Farin
Hallo Farin, ich würde da folgendermaßen vorgehen , erstmal beim Sender: laß Dir nach der Initialisierung das Config-Register ausgeben, und schau nach ob alle Bits richtig stehen. danach dasselbe mit dem Status-Register dann erst senden. Nach jedem Befehl gibt das Modul den Wert des Status-Register zurück, das ebenfalls auswerten. Nicht in einer Dauerloop senden, sondern zum Testen nur einmal Senden und das Ergebnis auswerten. (FIFO-Status) Den Interrupt auswerten, falls gesetzt, die Interrupt-Bits im Statusregister zurücksetzen. Überprüfe die Payload-length Einstellung, meiner Ansicht nach hast Du eine Payload-length von 2 Byte und sendest 2x 1 Byte. Wenn dann alle verfügbaren Informationen sagen, daß der Sender das Packet korrekt abgeschickt hat, kann man sich um den Empfänger in ähnlicher Art und Weise kümmern. Gruß wv
Hallo wv, Das habe ich die letzten Stunden nun versucht, leider ohne Erfolg. Alle Register die ich lesen kann stimmen mit dem überein was ich schreibe. Ich habe auch beim Senden verschiedene Daten und Datengrössen erfolglos zu senden versucht. Ebenfalls habe ich noch versucht Sender und Empfänger zu wechseln, d.h. den Code auf den jeweils anderen Mikrocontroller zu laden. Ich weiss leider echt nicht mehr weiter.. Hat sonst niemand mit diesem Modul gearbeitet? Hast du vielleicht noch eine Idee? Gruß Farin
Hallo Farin, dann mach doch mal einen ganz einfachen Test: - Versorgungsspannung aus und wieder einschalten, damit der RFM75 nicht schon vorher durch Interrupts oder volles TX-FIFO blockiert ist. - Programm starten, den Wert vom Statusregister vor dem Senden ausgeben lassen: Statusregister = ? - Senden - Statusregister ausgeben lassen: Statusregister = ? - Interrupt low oder high? Gruß wv
Die RFM75 sind soweit ich weis sehr ähnlich oder sogar gleich zu den RFM70 Modulen. Wenn du deine Register beschreiben kannst und auch wieder auslesen kannst, dann steht ja die Kommunikation zum RFM75 schon mal. Aber die Frage ist halt die, ob das was du in die Register einschreibst denn auch das richtige ist? Ich habe vor ca. 4 Jahren mal mit dem RFM70 was gemacht und da gab es Register die von HIGH-Byte zu LOW-Byte beschrieben werden mussten und welche die von LOW-Byte nach HIGH-Byte beschrieben wurden. Das ganze war schon sehr undurchsichtig. Ich stelle halt mal hier die Registereinträge meines RFM70 als Receiver ein. Wie schon gesagt, das RFM75 sollte sehr ähnlich oder sogar gleich dem RFM70 sein, zumindest was die Register angeht. Genau weis ich das halt nicht. Aber eventuell hilft dir das hier ja: Bank 0, Register 0, 0x7B (7B = Receiver) Bank 0, Register 1, 0x01 Bank 0, Register 2, 0x01 Bank 0, Register 3, 0x03 Bank 0, Register 4, 0x00 Bank 0, Register 5, 0x02 Bank 0, Register 6, 0x35 Bank 0, Register 7, 0x70 Bank 0, Register 17, 0x01 Bank 0, Register 18, 0x01 Bank 0, Register 19, 0x01 Bank 0, Register 20, 0x01 Bank 0, Register 21, 0x01 Bank 0, Register 22, 0x01 Umschalten zu der Bank 1 Verwende den ACTIVATE Befehl 01010000 gefolgt von 0x53! Bank 1, Register 0, 0x40, 0x4B, 0x01, 0xE2 Bank 1, Register 1, 0xC0, 0x4B, 0x00, 0x00 Bank 1, Register 2, 0xD0, 0xFC, 0x8C, 0x02 Bank 1, Register 3, 0x99, 0x00, 0x39, 0x41 Bank 1, Register 4, 0xB9, 0x9E, 0x86, 0x0B Bank 1, Register 5, 0x24, 0x06, 0x7F, 0xA6 Bank 1, Register 12, 0x00, 0x12, 0x73, 0x00 Bank 1, Register 13, 0x36, 0xB4, 0x80, 0x00 Bank 1, Register 14, 0x41, 0x20, 0x08, 0x04, 0x81, 0x20, 0xCF, 0xF7, 0xFE, 0xFF, 0xFF Umschalten zu der Bank 0 Verwende den ACTIVATE Befehl 01010000 gefolgt von 0x53! Senden des ACTIVATE 01010000 Kommandos gefolgt von 0x73! (aktiviert das übergeben von Nutzdaten) Bank 0, Register 28, 0x01 Bank 0, Register 29, 0x07 Kannst es ja mal vergleichen mit deinen Einträgen... Bei diesen Werten brauchst du dir auch keine Gedanken mehr um den Blödsinn mit den verschiedenen Einschreiben von HIGH und LOW-Bytes zu machen. Das ist hier schon gemacht. Also von links (HIGH-Byte) nach rechts (LOW-Byte) lesen und eintragen. Einen C-Code kann ich dir leider nicht geben, denn ich programmiere ausschließlich in Assembler...
Habe mir halt selbst mal die Mühe gemacht und in deinen angehangen Code geschaut und es sieht auch so aus als seien die Einträge für die zweite Registerbank verdreht herum eingetragen. Zumindest wenn in C das erste Byte hinter dem "=" das HIGH Byte ist. Aus deinem Code: uint8_t b1_r0[]={0xE2, 0x01, 0x4B, 0x40}; uint8_t b1_r1[]={0x00, 0x00, 0x4B, 0xC0}; uint8_t b1_r2[]={0x02, 0x8C, 0xFC, 0xD0}; uint8_t b1_r3[]={0x21, 0x39, 0x00, 0x99}; uint8_t b1_r4[]={0x1B, 0x82, 0x96, 0xF9}; uint8_t b1_r5[]={0xA6, 0x0F, 0x06, 0x24}; Aus meinem Code: Bank 1, Register 0, 0x40, 0x4B, 0x01, 0xE2 Bank 1, Register 1, 0xC0, 0x4B, 0x00, 0x00 Bank 1, Register 2, 0xD0, 0xFC, 0x8C, 0x02 Bank 1, Register 3, 0x99, 0x00, 0x39, 0x41 Bank 1, Register 4, 0xB9, 0x9E, 0x86, 0x0B Bank 1, Register 5, 0x24, 0x06, 0x7F, 0xA6 Also so wie es auch aussieht, sind die Registerbänke wohl gleich bei dem RFM75 und RFM70. Zumindest sind es die selben Werte die benötigt werden. Dann vertausche doch mal die Registerwerte und gebe die Werte so ein wie in meinem Beispiel. Ich denke dann wird's auch funzen...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.