Forum: HF, Funk und Felder RFM69 verliert Datenpakete


von Peter G. (gransi)


Angehängte Dateien:

Lesenswert?

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!

von Felix P. (fixxl)


Lesenswert?

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.

von Peter G. (gransi)


Angehängte Dateien:

Lesenswert?

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

von Felix P. (fixxl)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.