mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM12: Was macht dieser Code?


Autor: Bernd Vogt (berndv)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bastle zur Zeit mit den RFM12 Funkmodulen und der Ethersex Firmware 
rum. Kann mir jemand von euch erklären, was der unten stehende Code 
macht?

Speziell interessiert mich, warum am Anfang der Interruptroutine 
'rfm12_trans (0x0000)' aufgerufen wird (was macht rfm12_trans (0x0000) 
überhaupt?).

Und, unter welchen Umständen kann es passieren, dass man in das letzte 
'if' reinläuft. Was läuft da falsch?

ISR(RFM12_vect)      /* PCINT */
{
  uint16_t status = rfm12_trans (0x0000);

  if (status & 0x4000) {
    RFM12_DEBUG ("rfm12/por -> init");
    rfm12_init ();
    return;
  }

  if (status & 0x2000) {
    RFM12_DEBUG ("rfm12/overflow -> init");
    rfm12_init ();
    return;
  }

  if ((status & 0x8000) == 0) {
    RFM12_DEBUG ("rfm12/spurious int: %x", status);
    return;
  }

  ...
}

Gruß,
Bernd

P.S.: Den kompletten Code gibt es hier 
https://github.com/ethersex/ethersex/blob/master/h...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Vogt schrieb:
> Und, unter welchen Umständen kann es passieren, dass man in das letzte
> 'if' reinläuft. Was läuft da falsch?
Unter dem Umstand, dass in der Variable status z.B. der Wert 0 ist. 
Das könnte sein, wenn z.B. das RFM12 Modul nicht versorgt wird, oder, 
oder...

> was macht rfm12_trans (0x0000) überhaupt?
Das sieht man, wenn man sich die Funktion mal genauer ansieht...
uint16_t
rfm12_trans(uint16_t wert)
{
  uint16_t werti = 0;

  PIN_CLEAR(SPI_CS_RFM12);

/* spi clock down */
#ifdef CONF_RFM12_SLOW_SPI
  _SPCR0 |= (uint8_t)_BV(SPR1);
#else
  _SPCR0 |= (uint8_t)_BV(SPR0);
#endif

  werti = (uint16_t)(spi_send ((uint8_t)((0xff00U & wert) >> 8)) << 8);
  werti += spi_send ((uint8_t)(0x00ffU & wert));

/* spi clock high */
#ifdef CONF_RFM12_SLOW_SPI
  _SPCR0 &= (uint8_t)~_BV(SPR1);
#else
  _SPCR0 &= (uint8_t)~_BV(SPR0);
#endif

  PIN_SET(SPI_CS_RFM12);
  return werti;
}
Dann wird klar: damit wird eine SPI-Übertragung abgewickelt. Und mit dem 
Wort 0x0000 wird der Status abgefragt:
http://www.mikrocontroller.net/articles/RFM12#Register

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht nach Fehlerbehandlung aus.

- gerd

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Status holen, Interruptquelle maskieren, um den Auslöser zu 
identifizieren.
PowerOnReset und FIFO-Overflow werden zuerst getestet.

Der letzte Fall testet, ob ein anderes Int-Bit außer 0x8000 (FIFO hat 
Daten) gesetzt ist. Wenn nicht, wurde der Interrupt wohl durch eine 
Störung und nicht vom RFM12 ausgelöst...

Gruß aus berlin
Michael

Autor: Bernd Vogt (berndv)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zunächst mal Danke für eure Antworten! Ich denke ich beginne zu 
begreifen was hier passiert... wobei mir die Ursache noch föllig unklar 
ist :(

Ich verstehe das jetzt so: Der Befehl 0x0000 liest das Statusregister 
des RFM12 aus. Es wird erwartet, dass das erste Bit im Register gesetzt 
ist, was soviel bedeutet, wie dass das RFM12 Modul bereit zum Senden 
ist. Leider ist aber dieses Bit 0 und das bedeutet, dass das Modul 
gerade Daten empfängt? Evtl. durch eine Störung?

Was könnte die Ursache für diese Störung sein? Kann es evtl. auch an 
einer fehlerhaften Initialisierung oder sogar Verkabelung des Moduls 
liegen?

Das Seltsame ist, dass ich das selbe Verhalten auf zwei verschiedenen 
Boards (AVR-NET-IO und Pollin Funkboard) und auch an zwei föllig 
verschiedenen Standorten habe...

Grüße,
Bernd

Autor: wb1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
da ich das gleiche Problem habe, interessiert mich wie weit Du gekommen 
bist.
In den vielen Seiten die ich durchkämmt habe, fand ich das die 868 
module mit rx-fifo-read (b000), dazu muß ef-bit gesetzt sein oder 
status-read gelesen werden.
Ich glaube, der Interrupt kommt von RX, aber warum?

Autor: Bernd Vogt (berndv)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe hier [1] noch eine recht gute Antwort zu meinem Problem 
bekommen.

Die momentane Vermutung geht dahin, dass beim Senden ganz kurz die 
Stromversorgung zusammenbricht, da das RFM12 beim Umschalten von RX auf 
TX schnell mehr Strom benötigt.

Die Lösung könnte sein, einen 100nF Kondensator in direkter Nähe des 
RFM12 einzubauen, so wie hier [2]. Der sollte dann die Schwankung 
ausgleichen können.

Gruß,
Bernd

P.S.: wb1 lass mich wissen, ob du weiter gekommen bist.

[1] 
http://list.zerties.org/pipermail/ethersex-devel/2...
[2] 
https://m21.hyte.de/attachment/wiki/Projekte/Ether...

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.