Forum: Mikrocontroller und Digitale Elektronik RFM69 OOK - ein Bit zuviel zwischen Transmissions


von Markus P. (teschi)


Lesenswert?

Hallo beisammen,

ich will mit dem RFM69CW Nachrichten per OOK verschicken und habe den 
Effekt, dass nur der erste Frame "korrekt" verschickt wird,
für alle fortlaufenden Frames fügt der RFM69CW ein zusätzliches 
(Start?-)Bit ein.

Falls jemand eine Theorie hat, was dazu führt und wie man das 
abschaltet, wäre ich dankbar.
Ich hab zwar 'nen Workaround, würde aber doch gerne verstehen was da 
passiert. Beim Datenblatt-wühlen bin ich bisher nicht fündig geworden.

Hier ein paar Details:
* Der RFM69 ist im PACKET-Modus, Variable-länge, Präambel=aus, 
Sync-Bytes=aus, CRC=aus
* Der erste Frame wird immer korrekt "genau so" übertragen, wie ich das 
in die FIFO geschrieben habe
* Wenn das letzte Bit der ersten Übertragung == LOW, dann wird ein 
zusätzliches HIGH-Bit vor der zweiten Übertragung eingefügt.
* Scheinbar wird das Bit immer eingefügt, aber der Pegel ist abhängig 
von dem letzten Bit der letzten Übertragung.
* Ein wechsel nach STANDBY zwischen den Übertragungen ist KEINE Abhilfe 
gegen das senden des zusätzlichen Bits
* Ein wechsel nach SLEEP zwischen den Übertragungen behebt das Problem, 
und bei der nächsten Übertragung gibt es kein zusätzliches Bit.

Mein Workaround:
* Aktuell wechsle ich halt immer kurz nach SLEEP, danach passt alles 
wieder.


Sagt das jemanden was?
Ist das Standardverhalten, oder kann man das abschalten?

Vielen Dank schon mal
  Teschi

von Markus P. (teschi)


Angehängte Dateien:

Lesenswert?

P.S.:
Noch mehr Details (falls es jemanden interessiert):

Ich habe einen Testcase gebastelt, der 3x3 Frames (mit kurzen pausen) 
verschickt:
Die 3 Frames sind jeweils:
 a) 0x3C, 0xAA, 0x0C (endet mit 0)
 b) 0x3C, 0xAA, 0x0D (endet mit 1)
 c) 0x3C, 0xAA, 0x0C

Die Testcases sind:
 1) Schicke die 3 Frames ohne den TX-Modus zu verlassen
 2) Schicke die 3 Frames und wechsle dazwischen nach STANDBY
 3) Schicke die 3 Frames und wechsle dazwischen nach SLEEP

Ich hänge mal an:
 * Den Arduino Sketch
 * Pulseview Aufzeichnung (inkl. dem kompletten SPI-Traffic)
 * Oszi-Bilder (Gelb: separater 433Mhz Empfänger, Blau: DATA an 
Pin-DIO2, Rot: Random I/O für Debugging)

Im speziellen kann man sehen:
- scope07.png: Sieht so aus wie man sich [0x3C, 0xAA, 0x0C] vorstellt.
- scope08.png: Hier sieht man das zusätzliche HIGH-Bit vor 0x3C (von 
Cursor markiert), Zusätzlich ist das letzte Bit von 0x0C zu lang, und 
zeigt, dass OOK so lange das letzte Bit sendet, bis man TX abschaltet.
- scope09.png: Wenn man hier von STANDBY auf TX umgeschaltet, versucht 
der RFM69 scheinbar noch das letzte Bit vom letzten Paket weiter zu 
senden, und fügt gleich darauf ein zusätzliches LOW-Bit ein ... sehr 
merkwürdig

von Felix P. (fixxl)


Lesenswert?

Wenn du in den Tx-Modus gehst, fängt das Modul, sobald es bereit ist 
("ModeReady" bzw. "TxReady", macht beim Transmitter keinen Unterschied) 
sofort an zu senden. Liegen zu diesem Zeitpunkt noch keine Daten im 
FIFO, werden abwechselnd 1er und 0er rausgeschickt. Das ist im 
Datenblatt auf Seite 36 beschrieben, allerdings ist nicht ganz klar, 
welcher Pegel zuerst kommt. Wenn der FIFO leer ist, der Sendevorgang 
also abgeschlossen, man den Tx-Modus aber nicht verlässt, werden weiter 
fröhlich Daten generiert.

Daher würde ich den Sendevorgang mal folgendermaßen gestalten:
- Gehe in den Standby-Mode
- Schreibe zu sendende Daten in den FIFO
- Wechsle in den Transmit-Mode (Befehl senden und auf "ModeReady" 
warten, kein Delay in der while-Schleife)
- Warte auf PacketSent, kein Delay in der while-Schleife
- Wechsle in den Standby-Mode

Die Delays in der while-Schleife sollten weggelassen werden, weil es ja 
theoretisch passieren kann, dass bei der Abfrage das Bit noch nicht 
gesetzt ist, aber direkt zu Beginn der 200us umspringt. Dann wartet man 
noch 199us, obwohl das Paket schon durch ist und das Modul sendet 
weiter.

Siehst du dann immer noch unerwünschte Bytes?

von Reiner O. (elux)


Lesenswert?

Markus P. schrieb:

> ich will mit dem RFM69CW Nachrichten per OOK verschicken und habe den
> Effekt, dass nur der erste Frame "korrekt" verschickt wird,
> für alle fortlaufenden Frames fügt der RFM69CW ein zusätzliches
> (Start?-)Bit ein.

Kommt mir bekannt vor, jedoch beim RFM 12.

Hängt der RFM am Hardware SPI ?


MfG
Elux

von Markus P. (teschi)



Lesenswert?

Danke schon mal für Eure Antworten.

@Elux:

Korrekt, Hardware-SPI an Arduino Uno (mit 500kBaud). Ist das das 
schlecht?
Mal gleich Richtung RFM12 googlen... falls Du da noch spezifischere 
Pointer hast, nehm ich die gerne :D


@fixxl:

Ich hab meinen Testcase entsprechend geändert
das unerwünschte Bit ist aber leider immer noch da.

sieht jetzt in etwa so aus:
1
void sendFunc2(int debugPulses, byte byte1, byte byte2, byte byte3)
2
{
3
  // send block of 3 bytes, pre-fill FIFO and change to TX Mode
4
  rfmWriteReg(0x00, byte1); // FILL FIFO
5
  rfmWriteReg(0x00, byte2); // FILL FIFO
6
  rfmWriteReg(0x00, byte3); // FILL FIFO
7
  debugPulse(debugPulses);
8
  setOperationMode(MODE_TX); // set Mode: TX, wait for mode_ready
9
10
  // wait for the transmission to finish and go to standby
11
  while ((rfmReadReg(0x28) & 0x08) == 0) 
12
    {}
13
  setOperationMode(MODE_STANDBY);
14
  delay(4);
15
}

Der Hinweis mit S. 36 war interessant, weil daraus hervorgeht, dass das 
zusätzliche Bit innerhalb des Blocks "Transmission of Packet" passiert.
Was aber genau dafür verantwortlich ist, und ob man's ausschalten kann, 
tappe ich noch im dunkeln

> Liegen zu diesem Zeitpunkt noch keine Daten im FIFO, werden abwechselnd 1er und 
0er rausgeschickt
Meinst du hier die Präambel? Diese habe ich ausgeschaltet (Länge=0). 
Hab's aber mal noch mit Präambel ausprobiert, auch hier kommt's zu dem 
zusätzlichen Bit.

Anbei noch:
* Code
* Pulsview Aufzeichnung
* Kommentierte PulseView Screenshots

: Bearbeitet durch User
von Felix P. (fixxl)


Lesenswert?

Markus P. schrieb:
> Meinst du hier die Präambel? Diese habe ich ausgeschaltet (Länge=0).
So wie ich die S. 36 verstehe, fängt das Modul sofort mit dem Aussenden 
von Bytes an, sobald ModeReady eingetreten ist. Hierzu ist auch Seite 54 
im Datenblatt interessant:

"The transmission of packet data is initiated by the Packet Handler only 
if the module is in Tx mode and the transmission condition defined by 
TxStartCondition is fulfilled. If transmission condition is not 
fulfilled then the packet handler transmits a preamble sequence until 
the condition is met. This happens only if the preamble length /= 0 
[soll wohl ungleich 0 heißen], otherwise [also für den Fall == 0] it 
transmits a zero or one until the condition is met to transmit the 
packet data."

Dass "zufällig" 0 oder 1 geschickt wird, wenn man den Transmitter 
startet, scheint also normal zu sein. Die Frage bleibt, ob es irgendwie 
verhindert werden kann, nachdem ja eigentlich die TxStartCondition 
unmittelbar erfüllt ist.

Leider habe ich mit deinem Betriebsmodus keine praktische Erfahrung, ich 
arbeite bisher immer mit Präambel, Syncword und CRC, wo es nicht stört, 
wenn vor oder nach dem Paket noch irgendwelcher Quatsch geschickt wird, 
da sich der Packet-Handler drum kümmert.

von Markus P. (teschi)


Lesenswert?

Du hast Recht.

Die Passage sagt im Grunde schon recht deutlich, dass es undefiniert 
ist, was vor dem Beginn der Transmission passiert. Jedoch schon etwas 
verwunderlich, dass das unerwünschte Bit direkt NACH dem eintreten von 
TxReady passiert.

Wie dem auch sei, vermutlich hab ich hier auch ein etwas esoterisches 
Problem. Ich probier vermutlich am Wochenende noch ein bisschen weiter, 
und Kommentiere, wenn ich doch noch den Grund für das Verhalten finde.

Jedenfalls nochmal vielen, herzlichen Dank für Deine Antworten.
  Teschi

P.S.:
Mit ist außerdem heute noch die Idee gekommen, dass ich anstatt des 
"SLEEP"-Workaround für die Pausen ja auch einfach Nullen in die FIFO 
schreiben könnte, und anstatt der wiederholten Pakete einfach ein 
einzelnes, langes schicken könnte.

von Reiner O. (elux)


Lesenswert?

Ich habe mich mal umgesehen: genau das Problem mit einem Bit zuviel ab 
dem 2.Byte hatte ich seinerzeit (etwa 2012) auch. Damals bauten alle mit 
dem RFM12.
Ich hatte einen Mega8 und weil das HW-SPI frei war (und man das Geld für 
nicht genutzte HW ja nicht zurück bekommt ;-) ) hatte ich den RFM auch 
an das HW-SPI vom Atmel angeschlossen...
Seinerzeit hatten alle die Bibliothek von BenediktK verwendet und der 
hatte aus Kompatibilitätsgründen ein Software-SPI eingebaut. Ich habe 
seinerzeit sehr lange (und auch sehr erfolglos...) nach der Ursache 
gesucht.
Jedenfalls hat laut LA der Atmel alles richtig gemacht. Ich habe ja nun 
schon Einiges mit Atmels HW-SPI gemacht und nie Probleme damit gehabt, 
daher vermute ich das Problem im SPI Interface einiger RFMs. Nachdem ich 
dann (leise fluchend) auch auf SW-SPI (in Assembler) umgebaut hatte, 
ging es sofort perfekt.



Gruß aus Bestensee

Elux

von Markus P. (teschi)


Lesenswert?

oookaaaayyy...

Ich kann mir den WTF-Moment recht gut vorstellen
(und mein Fluchen wäre da definitiv nicht leise gewesen ;) )

Klingt aber irgendwie schon ziemlich ähnlich zu meinen Effekten.

Ich bau das am Wochenende mal zu 'ner SW-SPI um und schau was dabei raus 
kommt. (vorher komm ich vermutlich nicht dazu)

Dankeschöön
  Teschi

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.