Hallo Leute, ich habe hier zwei RFM12 Module die für mich Daten übertragen sollen. Codebeispiele gibt es ja genug sodass ich das auch recht schnell zum Laufen gebracht habe. Mein Frame ist folgendermaßen aufgebaut: Das erste Byte teilt dem Empfänger mit, wieviel Bytes empfangen werden sollen. Dann folgen die Datenbytes und 2 CRC16 Bytes. Aktuell arbeite ich mit einer Baudrate von 19200Baud Zu meiner Routine: Ich habe unten mal meine Empfangsroutine gepostet. Diese wird quasi in meiner Main-Funktion kontinuierlich aufgerufen. Ich habe alles unwichtige rausgeschmissen und empfange nur das erste Byte, welches ich über die UART an ein Terminalfenster schicke. So kann ich immer nachvollziehen, wieviel Bytes der Empfänger in diesem Falle empfangen möchte. Verschicke ich über den Sender 1-11 Bytes (+erste Byte+2Bytes CRC = 4-14Bytes), macht der Empfänger alles korrekt und zeigt die richtige Datenmenge an. Bei 12 Bytes (gesamt 15Bytes) macht er es zu ca. 50% richtig. Zeigt also richtigerweise eine 12 an oder fälschlicherweise eine 6. Bei 13 (gesamt 16Bytes) oder mehr Bytes wird nichts mehr empfangen. Ich vermute ein Timingproblem. Kann es sein, dass ich den Fifo irgendwie überlaufe oder sowas?? Hoffe ihr könnt mir ein Denkanstoß geben :) MFG void rf12_rxdata() { int i,data,crc; rfm12_send_cmd(0x82C8); // RX on rfm12_send_cmd(0xCA81); // set FIFO mode rfm12_send_cmd(0xCA83); // enable FIFO rfm12_ready(); data = (unsigned char) (rfm12_send_cmd(0xB000) & 0x00FF); if (data != 0) { while (!(UCSRA & (1<<UDRE))); UDR = data; } rfm12_send_cmd(0x8208); // RX off }
Hat denn keiner eine Idee? Vielleicht kann mir jemand ein Feedback geben, wiviel Bytes er schon mit dieser Funktion an einem Stück empfangen hat. Vielleicht muss man ja nach ein paar Bytes den Receiver de- und neu aktivieren oder ein Status lesen oder sowas ... Bin für jede Info dankbar ... MFG
rfm12_send_cmd(0x82C8); // RX on Hier ist der Synthesizer ausgeschaltet, braucht man den nicht beim Empfangen? Sollte sonst 0x82D8 sein. Ansonsten mache ich es genauso, meine Pakete sind problemlos bis zu 70 Byte lang, inkl. Präambel, sync und CRC. Grüße, Peter
@Peter, danke für Deine Antwort ... habe den Befehl mal abgeändert. Leider ändert das nichts an meinem Problem. Aber wenn Du 70 Befehle am Stück empfängst ohne den Receiver oder Status zu ändern, dann muss ich noch einen Fehler irgendwo versteckt haben. Anbei noch mal meine Routine für die Initialisierung, vielleicht habe ich dort noch was übersehen. Init: RFM12_RESET = 1; //out of Reset delay(500); rfm_send_cmd(0xC060); // AVR CLK: 2MHz rfm_send_cmd(0xC0C0); // AVR CLK: 5MHz rfm_send_cmd(0xC0E0); // AVR CLK: 10MHz rfm_send_cmd(0x80D7); // Enable FIFO, 433MHz rfm_send_cmd(0xC2AB); // Data Filter: internal rfm_send_cmd(0xCA81); // Set FIFO mode rfm_send_cmd(0xE000); // disable wakeuptimer rfm_send_cmd(0xC800); // disable low duty cycle rfm_send_cmd(0xC4F7); // AFC settings: autotuning: -10kHz...+7,5kHz rfm_send_cmd(0x0000); rfm_send_cmd(0xA620); // Sende/Empfangsfrequenz auf 433,92MHz einstellen rfm_send_cmd(0x94AC); // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm rfm_send_cmd(0xC622); // 19200 baud rfm_send_cmd(0x9860); // 1mW Ausgangangsleistung, 120k MFG
@ Meier (Gast) Ich polle für jedes Byte erstmal den IRQ-Pin des RFM12 und lese den FIFO erst aus, wenn IRQ null ist (per SPI). Diese Synchronisation kann ich in deinem Code nicht finden. Ich programmiere allerdings Assembler, vielleicht übersehe ich da was. Grüße, Peter
@Peter Das ist ja dann quasi der Interruptbetrieb. Habe ich auch mal versucht, bin damit aber nicht zum Erfolg gekommen, da der überwiegende Teil an Codebeispielen das nicht so macht. Und mit den Datenblättern komme ich nicht so richtig klar :(
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.