Erkennung RFM69HCW-Jeelink in "LaCrosseITPlusReader" fehlerhaft?

Begonnen von Enginiana Jones, 22 November 2016, 21:57:31

Vorheriges Thema - Nächstes Thema

Enginiana Jones

Hallo Zusammen

hoffe ich bin hier im richtigen Abschnitt auch für JeeLinks. Hab leider keine bessere Ecke gefunden.

Nach dem ich mit meinen Jeelink bei den Funksteckdosen gerade feststecke, habe ich mich mal näher damit beschäftigt warum mein DIY-Jeelink (Arduino Nano Clone + Adafruit RFM69HCW) keinerlei Temperatursensoren erkennt.

Ich hab mit der Arduino-Umgebung und dem Sketch aus dem Sourceforge-repository von FHEM mal angefangen.
Debugging an im Sketch und auf Arduino geladen.

Erste Antwort im Serial Monitor:
[LaCrosseITPlusReader.10.1q (RFM12 f:868300 r:17241)]


Dann im Code mal gegraben und die Init-Kette für die RFM-ICs im Code verfolgt.
Bin dann in der RFMxx.cpp auf den Abschnitt gestoßen, der die Erkennung des RFM-ICs ausführt.


...
  // No radio found until now
  m_radioType = RFMxx::None;

  // Is there a RFM69 ?
  WriteReg(REG_PAYLOADLENGTH, 0xA);
  if (ReadReg(REG_PAYLOADLENGTH) == 0xA) {
    WriteReg(REG_PAYLOADLENGTH, 0x40);
    if (ReadReg(REG_PAYLOADLENGTH) == 0x40) {
      m_radioType = RFMxx::RFM69CW;
    }
  }

  // Is there a RFM12 ?
  if (m_radioType == RFMxx::None) {
    if (isPrimary) {
      m_radioType = RFMxx::RFM12B;
    }
    else {
      spi16(0x820C); // Osc. + LBD
      for (int i = 0; i < 1000; i++) {
        asm("nop");
      }

      spi16(0xC04F); // LBD=3.7V
      for (int i = 0; i < 1000; i++) {
        asm("nop");
      }
      if ((spi16(0x0000) & 0x0400) == 0x0400) {
        spi16(0xC040);  // LBD = 2.2V
        for (int i = 0; i < 1000; i++) {
          asm("nop");
        }

        if ((spi16(0x0000) & 0x0400) == 0) {
          m_radioType = RFMxx::RFM12B;
        }
      }
    }
  }
...


Nachdem ich ja neugierig war, warum mein RFM69HCW vom sketch als RFM12B identifiziert wird, hab cih dort mal ein paar Serial.println zum debugging reingepackt.


...
// No radio found until now
  m_radioType = RFMxx::None;

  Serial.println("Teststring um Zeit zu gewinnen für Konsole");

  // Is there a RFM69 ?
  WriteReg(REG_PAYLOADLENGTH, 0xA);
  if (ReadReg(REG_PAYLOADLENGTH) == 0xA) {
   
    Serial.println("A1 PayloadLength: " && ReadReg(REG_PAYLOADLENGTH));
   
    WriteReg(REG_PAYLOADLENGTH, 0x40);
    if (ReadReg(REG_PAYLOADLENGTH) == 0x40) {
     
      Serial.println("A2 PayloadLength: " && ReadReg(REG_PAYLOADLENGTH));
     
      m_radioType = RFMxx::RFM69CW;
    }
  }

  // Is there a RFM12 ?
  if (m_radioType == RFMxx::None) {
    Serial.println("A3");
    if (isPrimary) {
      Serial.println("A4");
      m_radioType = RFMxx::RFM12B;
    }

...


Damit sollte man rausfinden was beim Init und Identifizierung so alles passiert.

Auf Arduino laden, SerialMonitor an und folgende Ausgabe:



Teststring um Zeit zu gewinnen
A3
A4
Teststring um Zeit zu gewinnen
A3
*** LaCrosse weather station wireless receiver for IT+ sensors ***
Radio is: RFM12
Radio setup complete. Starting to receive messages

[LaCrosseITPlusReader.10.1q (RFM12 f:868300 r:17241)]



Ich bin jetzt kein wirklicher Arduino-/ATMega-Hexer und nur stümperhafter Code-Verstümmler, aber was ich aus der Ausgabe meine zu lernen:


  • Zeit war genug zur Ausgabe via Serial Monitor, da erster String komplett
  • Identifikation geht einmal los und er überspring mal geflissentlich den Abschnitt für RFM69
  • Code startet nochmal neu -> ???? -> Glitch beim Arduino-Reset?
  • Code überspringt ein zweites mal den RFM69-Anteil und identifiziert RFM699HCW als RFM12B -> ?!?
  • Erst jetzt kommt anscheinend die Setup-Schleife des Arduino in der das serielle Interface initialisiert wird. Danach dann Ausgabe der ersten schon vorherr vorhandenen Debug-Ausgabe "*** LaCrosse weather station ... *** "

Mein Schluss:
Da läuft irgendwas im Code komplett schief weil die RFM69xx Erkennung komplett übersprungen wird?

Wenn es irgendwie geht, unterstütze ich gerne weiterhin beim Debuggen des Codes mit meinen bescheidenen Möglichkeiten.

Wenn ich irgendwo einen Denkfehler habe (Init/Identify RFMxx kommt vielleicht vor Setup-Schleife des Arduino in der Serial-Interface überhaupt erst konfiguriert wird? -> Warum dann überhaupt Ausgaben bei eingefügten Serial.prints ???)

Dank fürs Lesen und die Mühe!

Grüße

Trinidad


KölnSolar

vermutlich nicht. Dieses Subforum trägt die Überschrift CUL-Entwicklung (vs. Jeelink-Entwicklung). Du kannst also warten bis der Thread-Author in das richtige Subforum verschiebt oder dort ein neues Thema aufmachen. Ich würde es mal mit "Sonstige Systeme" versuchen.
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt