Forum: Mikrocontroller und Digitale Elektronik RFM12 Receive Timing & Fifo


von Meier (Gast)


Lesenswert?

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
}

von Meier (Gast)


Lesenswert?

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

von Peter R. (gelb)


Lesenswert?

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

von Meier (Gast)


Lesenswert?

@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

von Peter R. (gelb)


Lesenswert?

@ 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

von Meier (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.