Hallo zusammen,
ich weiss das zum Thema RFM12 schon viele Beiträge im Forum stehen, aber
ich habe keine Antwort auf meine Frage direkt gefunden.
Ich habe eine Datenübertragung mit RFM12 Modulen realisiert, welche sich
16Byte Datenpakete austauschen. Der Code ist in c geschrieben und
orientiert sich an den Beispielen in der Beschreibung von HopeRF.
Die Datenübertragung wird mit einer Prämbel gestartet und nach dem
SyncWord werden 16Byte übertragen. Zum Abschluss wird ein Byte mit der
CheckSumme gesendet, um sicherzustellen, dass die Daten i.O. sind.
Nun zur Frage:
Bei mir sind nur 80-85% der "valid" (Checksumme i.O.) in den restlichen
versteckt sich kleinerer Datenmüll. Ist das ein Guter Wert oder könnt
Ihr das besser?
Ich habe den ganzen Tag verschiedenste Test gemacht, komme aber nicht
über diesen Wert.
Dinge die Verbesserungen brachten:
- Datenbytes mit 0x00 durch 0xAA ersetzen
Dinge die keinen Einfluss hatten:
- Zeitabstand mit dem die Paket folgten
- Zeitabstand wischen den Bytes
- Anzahl der Datenbytes verringern
- Abstand zwischen den RFM Modulen (in der Wohnung)
Soweit erst einmal
Gruß
Matthias
Ist jetzt nicht speziell zu den RFM12.
In einem solchen Fall würde ich statt des CRC eine Detektion nehmen, die
auch Fehler korrigieren lässt. (Fehlerkorrekturcodes, wie Hamming-Codes)
Das sollte auch längere Folgen gleicher Bits vermeiden, die Probleme
machen können, ohne dass man auf magic-number Ersetzungen zurückgreifen
muss.
Eventuell ist die Baudrate zu hoch? Mehr als 20..50kBaud hat bei mir
noch nie gut funktioniert.
Mit 20kBaud sende ich Pakete mit 64 Byte + 2 Byte CRC und habe praktisch
keine Probleme mit fehlerhaften Daten. (Bilddaten mit etwa 40kByte und
entsprechend vielen Paketen im Handshake hintereinander)
Grüße, Peter
Ich betreibe die Datenübertragung in Paketen von 14 Bytes pro Paket mit
9600 Bps und habe bei normalen Entfernungen keine Datenverluste. Ich
benutze auch eine CRC am Ende um die Korrektheit der Daten zu
überprüfen, welche im Normalfall auch immer stimmt.
Ciao,
Rainer
Hi,
Hab mich länger mit RFM01 und RFM02 auseinander gesetzt und ein
ähnliches Problem gehabt.
Bei mir lag es daran, dass ich nach dem letzten Bit den Sender zu
schnell abgeschaltet hatte. Sprich: Das letzte Bit wurde nicht
vollständig übertragen und vom Empfänger fehlinterpretiert.
Und ja, ich hab auf das Ready2Send vom RFM gewartet.
Falls Du möglicherweise ein ähnliches Problem hast, sende mal ein Bit
mehr oder mach nen kurzes delay rein, falls Du den Sender abschaltest.
Ich weiss nicht, ob nach 16 Byte schon ein Sync passieren kann...da
würde die Manchester-Codierung natürlich helfen. Möglicherweise hängt
das dann wiederum von der Baudrate ab.
Gruß ka-long
Hallo zusammen,
danke für die vielen Infos, ist alles sehr interessant und ich sehe,
dass es noch besser als bei mir geht. Da werde ich weitersuchen...
@ roland + maxx
Dieses Problem hatte mit den vielen Nullen hatte ich schon im Blick.
Wenn ich aber 16x 0xAA oder 0x55 sende verbessert sich die Situation
nicht merklich. Aber interessantes Verfahren, mache ich vielleicht
trotzdem ;)
@ peter
meine Baudrate ist auf 4kB, aber ich werde hier noch mal eine Variation
durchführen heute abend
@ ka-long
diese Problem umgehe ich gerade, indem ich nach dem CRC-byte noch 2
weitere Bytes sende (brachte auch eine Verringerung der Fehler) aber ich
werde noch einmal mit einem extra langem Delay vor der Abschaltung
testen
Ich werde mal versuchen die Pakete in ein Terminal umzuleiten zum
mitloggen. Vielleicht werden dann (Un)Regelmässigkeiten sichtbar.
Gruß, und vielen Dank soweit
Matthias
Hallo zusammen,
ich habe nun wie angekündigt weitere Tests durchgeführt mit folgender
überraschenden Erkenntnis.
Auch meine Schaltung kann zu 100% korrekte Pakete übertragen.
Meine Schaltung beinhaltet neben dem RFM-Modul einen USB Anschluss
(alles in einem PIC18F2550). Diese beiden Module (Hardware oder
Software) beeinflussen sich negativ. Wenn ich erst 50 Pakete empfange
und sie danach über USB auslese ist alles i.O.
Wenn ich aber permanent (alle 200ms) per USB anstehende Paket abfrage,
kommt es zu beschädigten RFM-Paketen.
Ich glaube es ist ein Timing Problem. Wie lange kann denn ein Paket im
RFM bleiben, bis es abgeholt werden muss ?
Macht Ihr die Paketabfrage über einen Interrupt in der MCU (nIRQ - Pin
vom RFM)
Gruß,
Matthias
mw2000 schrieb:> Ich glaube es ist ein Timing Problem. Wie lange kann denn ein Paket im> RFM bleiben, bis es abgeholt werden muss ?
Der Empfangspuffer ist ein FIFO (16 Bit) und wird mit den nächsten 1
Byte langen Paketen wieder überschrieben. Das Paket kann also
theoretisch bis zum Beginn des übernächsten Paketes drinbleiben.
> Macht Ihr die Paketabfrage über einen Interrupt in der MCU (nIRQ - Pin> vom RFM)
Ja.
Hi nochmal,
Deine Konfiguration wird so arbeiten:
Wenn der Empfänger ein SYNC WORD bekommen hat und nicht resettet wurde
schiebt er lustig bei gütigem VDI Bits ins 16-bit FIFO mit Deiner
eingestellten Baudrate.
Falls Du also als Paket 16 Bytes meinst ist die Antwort: Gar nicht,
passt nämlich nicht ins FIFO.
Gruß ka-long
Hallo zusammen,
mir dämmert da, dass ich noch ein Konzeptproblem habe daher hier nochmal
meine jetzige Vorgehensweise im Detail.
Hier meine Sendefunktion (wobei das senden über SPI erfolgt, nicht FSK)
//Nachbereitung der Daten falls welche empfangen wurden
68
if(retVal>0){
69
//Behandlung fehlerhafter Daten
70
if(retVal==2){
71
for(b=0;b<RFM_PACKET_LEN;b++)
72
*uchrDatapacket++=0;
73
}
74
//Behandlung i.O. Daten
75
if(retVal==1){
76
for(i=0;i<RFM_PACKET_LEN;i++)
77
*uchrDatapacket++=RF_RXBUFFER[i];
78
}
79
}
80
//Rueckgabewert
81
returnretVal;
82
}
und hier die Verwendung im Hauptprogramm des Empfängers:
1
while(1){
2
3
//USB Bearbeitung
4
....
5
6
7
//Empfangen eines RFM-PACKET
8
RFM_LED=0;
9
chkRF=RFM_ReadPacket(&rxPac.rawData);
10
if(chkRF>0){
11
iRfmCntAll++;
12
if(chkRF==1){
13
//Packet korrekt empfangen
14
RFM_LED=1;
15
iRfmCntValid++;
16
//das empfangene Paket weiterverarbeiten -> an USB geben
17
ProcessRFM_RxPaket(&rxPac);//(60 Zyklen dauer)
18
}
19
}
Nun das Problem so wie ich es jetzt sehe. (Bitte korrigiert mich bevor
ich alles falsch umbaue)
Mein PIC sitzt in der while schleife fest und die Abarbeitung des RFM12
erfolgt nicht über Interrupt. Mein Sender sendet 10 Byte-pakete a 16
Byte mit 10ms delay zwischen den Bytepaketen und keinem Delay zwischen
den einzelnen Bytes eines Paketes.
Wenn ich die USB Funktionen deaktiviere schafft es der PIC immer die
FIFO rechtzeitig zu leeren und produziert fehlerfreie Pakete. Wenn die
USB-Funktion aktiviert ist, kann es sein das die FIFO sich an einem Sync
Word Startet und die Abarbeitung nicht anläuft , weil noch die USB
Funktion bearbeitet wird. Jetzt verliere ich Bytes...
Wenn ich nun die Funktion chkRF = RFM_ReadPacket(&rxPac.rawData) in
eine Interruptfunktion einbette, getriggert an nIRQ, dann müsste es ja
klappen, da mein Empfangsfunktion ja für die 16 Bytes in der Schleife
bleibt und erst dann die FIFO resetet.
Hab ich's richtig zusammengebracht?
Danke soweit erst einmal
Gruß
mw2000
Hallo zusammen,
ich wollte mich nach den nun fast 2 Wochen noch einmal zu Wort melden.
Ich habe meinen Treiber auf Interrupt basierte Steuerung umgestellt und
siehe da. Es läuft jetzt schon seit Tagen mit 0.00% Fehlerrate (bei 4.8
kB). Unglaublich aber das ist echt der Wahnsinn...
Nun werde ich mal die Übertragungsraten hochschrauben.
Also noch mal Danke an alle
Gruß
mw2000
PS: Der Beispielcode im RF-Manual taugt nur fuer Testzwecke wo die CPU
zu 100% das Modul überwacht. (Sie mein alter Treiber)
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.