mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM12 Receive Timing & Fifo


Autor: Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Roth (gelb)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Roth (gelb)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :(

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.