Hallo Zusammen,
Ich bin seit einigen Jahren ein stiller Beobachter dieses Forums und
habe schon einige Probleme mit euch lösen können. Leider habe ich jetzt
ein Problem wo ich nicht weiter komme bzw benötige ich euren Rat.
Ich habe mehrere gleiche Platine mit ein je einem RFM69CW (868Mhz),
Attiny84A, Taster, Knopfzelle und LED's. Die Grundidee ist, dass es
einen Sender und mehrere Empfänger gibt. Die Empfänger sollen synchron
einen Ausgang ein oder ausschalten.
Leider passiert es ab und zu, dass ein Empfänger das Datenpaket nicht
erhält und somit den Ausgang nicht schaltet. Welche Parameter muss ich
verändern, damit die Datenpakete sicher ankommen?
Das ist derzeit meine INIT Routine für den Testaufbau. CRC habe ich zum
testen deaktiviert. 1 | rfm69_write(REG_OPMODE, RF_OPMODE_SEQUENCER_ON | RF_OPMODE_LISTEN_OFF | RF_OPMODE_STANDBY);
| 2 |
| 3 | rfm69_write(REG_DATAMODUL, RF_DATAMODUL_DATAMODE_PACKET | RF_DATAMODUL_MODULATIONTYPE_FSK | RF_DATAMODUL_MODULATIONSHAPING_00);
| 4 |
| 5 | rfm69_write(REG_BITRATEMSB, RF_BITRATEMSB_4800);
| 6 | rfm69_write(REG_BITRATELSB, RF_BITRATELSB_4800);
| 7 |
| 8 | rfm69_write(REG_FDEVMSB, RF_FDEVMSB_5000);
| 9 | rfm69_write(REG_FDEVLSB, RF_FDEVLSB_5000);
| 10 |
| 11 | rfm69_write(REG_FRFMSB, RF_FRFMSB_868);
| 12 | rfm69_write(REG_FRFMID, RF_FRFMID_868);
| 13 | rfm69_write(REG_FRFLSB, RF_FRFLSB_868);
| 14 |
| 15 | rfm69_write(REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_16 | RF_RXBW_EXP_2);
| 16 | rfm69_write(REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01); // set DIO0 to "PAYLOADREADY" in receive mode
| 17 | rfm69_write(REG_DIOMAPPING2, RF_DIOMAPPING2_CLKOUT_OFF);
| 18 |
| 19 | rfm69_write(REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN);
| 20 | rfm69_write(REG_RSSITHRESH, 220);
| 21 | rfm69_write(REG_SYNCCONFIG, RF_SYNC_ON | RF_SYNC_FIFOFILL_AUTO | RF_SYNC_SIZE_2 | RF_SYNC_TOL_0);
| 22 |
| 23 | rfm69_write(REG_PACKETCONFIG1, RF_PACKET1_FORMAT_VARIABLE | RF_PACKET1_DCFREE_OFF | RF_PACKET1_CRC_OFF | RF_PACKET1_CRCAUTOCLEAR_ON | RF_PACKET1_ADRSFILTERING_OFF);
| 24 | rfm69_write(REG_PAYLOADLENGTH, 66);
| 25 |
| 26 | rfm69_write(REG_FIFOTHRESH, RF_FIFOTHRESH_TXSTART_FIFONOTEMPTY | RF_FIFOTHRESH_VALUE);
| 27 |
| 28 | rfm69_write(REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_2BITS | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF);
| 29 | rfm69_write(REG_TESTDAGC, RF_DAGC_IMPROVED_LOWBETA0);
| 30 |
| 31 | rfm69_write(REG_PALEVEL, 148); //Power Level
| 32 |
| 33 | // write sync bytes 0x2D 0xD4
| 34 | do rfm69_write(REG_SYNCVALUE1,0x2D); while (rfm69_read(REG_SYNCVALUE1) != 0x2D);
| 35 | do rfm69_write(REG_SYNCVALUE2,0xD4); while (rfm69_read(REG_SYNCVALUE2) != 0xD4);
| 36 |
| 37 |
| 38 | while ((rfm69_read(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00) {};
| 39 |
| 40 | if (rfm69_read(REG_IRQFLAGS2) & RF_IRQFLAGS2_PAYLOADREADY)
| 41 | rfm69_write(REG_PACKETCONFIG2, (rfm69_read(REG_PACKETCONFIG2) & 0xFB) | RF_PACKET2_RXRESTART); // avoid RX deadlocks
| 42 |
| 43 |
| 44 | rfm69_write(REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01); // set DIO0 to "PAYLOADREADY" in receive mode
| 45 | rfm69_setMode(RF69_MODE_RX);
|
Derzeit wird nur ein Paket mit einem Längen und einen Daten Byte
gesendet. 1 | void rfm69_data_write(uint8_t *data, uint8_t lenght) {
| 2 | uint8_t i;
| 3 |
| 4 | ByteToSend = lenght;
| 5 |
| 6 | rfm69_write(REG_PACKETCONFIG2, (rfm69_read(REG_PACKETCONFIG2) & 0xFB) | RF_PACKET2_RXRESTART); // avoid RX deadlocks
| 7 |
| 8 | rfm69_setMode(RF69_MODE_STANDBY); // turn off receiver to prevent reception while filling fifo
| 9 | while ((rfm69_read(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00); // wait for ModeReady
| 10 |
| 11 | PORTB &= ~(1 << rfm69_CS); //Chip Select
| 12 |
| 13 | spi_write(REG_FIFO | 0x80);
| 14 | spi_write(lenght);
| 15 |
| 16 | for (i=0; i<lenght; i++)
| 17 | {
| 18 | spi_write(((uint8_t*) data)[i]);
| 19 | }
| 20 |
| 21 | PORTB |= (1 << rfm69_CS); //Chip Select
| 22 |
| 23 | rfm69_setMode(RF69_MODE_TX);
| 24 |
| 25 | while ((rfm69_read(REG_IRQFLAGS2) & RF_IRQFLAGS2_PACKETSENT) == 0x00); // wait for ModeReady
| 26 | rfm69_setMode(RF69_MODE_STANDBY);
| 27 |
| 28 | ByteToSend = 0;
| 29 | }
|
Im Anhang habe ich teile des Programmes angehängt.
Vielen Dank vorab!
Nicht ankommende Pakete kenne ich aus eigener langjähriger Erfahrung mit
dem Modul eigentlich nur aus zwei Gründen.
Hardwareseitig: Keine Beschaltung des Reset-Pins. Ziehe ich den Pin mit
10k gegen Masse oder VCC, läuft das Modul zuverlässig. Floatet der Pin,
gab es Ärger. Wie ist das in deinem Aufbau?
Softwareseitig: Der Empfänger wird durch einen Störer oder Rauschen auf
dem Kanal, welche die RSSI-Schwelle überschreiten, durch die AFC zu
einer falschen Frequenz gezogen und ist auf der eigentlichen taub. Hier
hat es bei mir geholfen, das Register "RegRxTimeout2" zu nutzen, um
einen Timeout auslösen zu können, wenn eine gewisse Zeit nach
Überschreitung der RSSI-Schwelle kein PayloadReady angezeigt wird. Ist
das Timeout-Bit im Statusregister gesetzt, startet man den Empfänger neu
und ist somit wieder empfangsbereit fürs eigentliche Signal. Deine
RSSI-Schwelle ist mit -110 dBm sehr niedrig gesetzt, abhängig von der
Umgebung und dem Layout kann der Empfänger da schon sehr oft
fälschlicherweise getriggert werden.
Danke für Tipps
Hardwareseitig ist der Reset Pin nicht belegt. Meiner Meinung nach
sollten nach einem Reset alle Register wieder auf Default sein, aber das
scheint bei mir nicht der Fall zu sein. Das zweite oder dritte
Datenpaket wird wieder empfangen. War das bei dir auch der Fall?
Trotzdem werde ich eine Pulldown Widerstand verlöten.
Software:
Zum Testen habe ich die RSSI auf -85dbm gestellt. Mal schauen was
passiert.
Antenne:
Wie sehen deine Antennen aus? Derzeit habe ich nur einen Draht mit ca.
8,5cm. Dieser ist aus Platzgründen um die Platine gewickelt, siehe Foto.
Spannungsversorgung:
Derzeit verwende ich CR2032 Knopfzelle. Mit dem Multimeter habe ich
gesehen, dass die Spannung während des Empfangs aufgrund der LED's
abfällt. Wie empfindlich ist der RFM69
Einen echten Reset hat es bei mir auch nie gegeben bei floatendem Pin,
aber eben sporadische Empfangsausfälle. Was da genau passiert, vermag
ich nicht zu sagen.
Meine Antennen habe ich damals fürs RFM12 gebaut, sind vom Formfaktor
her natürlich andere Kaliber als deine Drahtstücke:
Beitrag "Re: Sperrtopfantenne für RFM12"
Hast du mal die RSSI-Werte ausgelesen, um zu schauen, wie gut die
Nachrichten empfangen werden?
Die LEDs dürften doch eigentlich erst angehen, wenn der eigentliche
Empfang schon abgeschlossen ist und die Daten schon sicher im FIFO
liegen, oder? Daher würde ich das nicht als allzu kritisch sehen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|