SIGNALDuino Empfänger Firm- und Hardware

Begonnen von Ralf9, 02 Oktober 2016, 22:59:51

Vorheriges Thema - Nächstes Thema

Sidey

Hmm, das ist ja sehr spannend.
Was gibt der cc1101 denn am GDO02 aus?  Ist das eine Serielle Übertragung, die Manchester Codiert ist?
Was das Setzen der Register angeht, könnte man die ja durchaus aus der CULfw übernehmen. Um die Register zu verstehen und zu verändern gibt es von TI ein tool.

Der Abschnitt ab goto könnte in eine eigene Funktion oder direkt inline an dieser Stelle aufgeführt werden.

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Ralf9

Zitat von: Sidey am 06 Dezember 2016, 20:43:03
Was das Setzen der Register angeht, könnte man die ja durchaus aus der CULfw übernehmen. Um die Register zu verstehen und zu verändern gibt es von TI ein tool.
Das Lesen und Setzen der Register habe ich in meinem sketch vom AskSin und der a-culw übernommen.
Bis auf das set bWidth habe ich die Routinen des CC1101 vom "00_CUL.pm" in die "00_SIGNALduino.pm" eingebaut.
Die konfiguration für das Senden fehlt noch.

Zitat
Der Abschnitt ab goto könnte in eine eigene Funktion oder direkt inline an dieser Stelle aufgeführt werden.

Ist das mit dem goto so sauber programmiert oder würdest Du es umschreiben.
Ich verstehe nicht so richtig wie dies funktioniert. Werden mit dem goto beide for Schleifen sauber verlassen?

Gruß Ralf
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Sidey

Zitat von: Ralf9 am 06 Dezember 2016, 21:24:53
Das Lesen und Setzen der Register habe ich in meinem sketch vom AskSin und der a-culw übernommen.
Bis auf das set bWidth habe ich die Routinen des CC1101 vom "00_CUL.pm" in die "00_SIGNALduino.pm" eingebaut.
Die konfiguration für das Senden fehlt noch.
Kannst Du den quellcode mal in einem neuen branch einchecken? Interessiert mich jetzt :)


Zitat von: Ralf9 am 06 Dezember 2016, 21:24:53
Ist das mit dem goto so sauber programmiert oder würdest Du es umschreiben.
Ich verstehe nicht so richtig wie dies funktioniert. Werden mit dem goto beide for Schleifen sauber verlassen?

GOTO = gehe zu... Es ist ein Sprungbefehl. Er verlässt das Programm und setzt es an dem angegebenen Label vor. Es wird auch nicht zurück gesprungen.
Ob goto sauber oder nicht ist, darüber kann man viel streiten. Ich habe es auch schon angewendet, es gibt Situationen, da ist es ein angebrachtes Mittel der Wahl.
Oft führt es aber zu dem sogenannten "Spagetti Code".
In dem unten angegebenen Fall, sollen damit wohl zwei FOR schleifen beendet werden. Man kann das auch mit LAST <label> sauber erreichen oder $e und $m verändern (unsauber). Oder ein Flag setzen und das in der FOR schleife zusätzlich auswerten.

Wenn es um sauber geht, dann würde mir das vermutlich am besten gefallen.  (Sofern ich den Zweck der goto Funktion richtig verstanden habe)

    OUTERLOOP:
    for (my $e = 0; $e < 4; $e++) {
      for (my $m = 0; $m < 4; $m++) {
        $bits = ($e<<6)+($m<<4);
        $bw  = int(26000/(8 * (4+$m) * (1 << $e))); # KHz
        last OUTERLOOP if($arg >= $bw);
      }
   
    $ob = sprintf("%02x", $ob+$bits);
    Log3 $name, 3, "Setting MDMCFG4 (10) to $ob = $bw KHz";
    CUL_SimpleWrite($hash, "W12$ob");
    CUL_WriteInit($hash);

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Ralf9

Zitat von: Sidey am 06 Dezember 2016, 21:36:17
Kannst Du den quellcode mal in einem neuen branch einchecken? Interessiert mich jetzt :)

In der Anlage ist der sketch. Es gibt noch viel zu optimieren.

Es gibt noch viele todos:
- Es fehlt noch die Initialsierung der PATABLE
- die cc1101 Routinen solten noch in eine library ausgelagert werden
- beim Init sollte geprüft werden ob sich der cc1101 meldet und dann ein flag gesetzt werden. Bei gesetztem flag wird dann bei der Versionsabfrage cc11001 eingefügt und für die externe led wird dann Pin 9 verwendet.

Ist die Interruptroutine, die die Flankenzeiten in den FIFO schreibt in der Lage den Anfang oder Ende einer Nachricht zu erkennen, damit nur einmal pro Nachricht der RSSI abgefragt und gespeichert werden muss?
Oder hast Du schon eine Idee wie man das mit dem speichern der RSSI Werte machen könnte?   

Gruß Ralf
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

juergs

#19
Hallo Ralf9,
so ganz habe ich Deine eigentliche Absicht noch nicht verstanden.
Die 868-Variante mit dem Signalduino und damit den CUL868 zu ersetzen ?

Deine Settings in der cc1101.ino beziehen sich auf 433 MHz? -> SmartRF.

Warum benutzt Du nicht die Panstamp-Lib als CC1101 Grundlage und für die PA-Settings?

Hier noch eine printf-Implementierung über Seriell, oder hier better-arduino-debugging-printf/:

// Function that printf and related will use to print
int serial_putchar(char c, FILE* f) {
    if (c == '\n') serial_putchar('\r', f);
    return Serial.write(c) == 1? 0 : 1;
}

FILE serial_stdout;

void setup(){
    Serial.begin(9600);

    // Set up stdout
    fdev_setup_stream(&serial_stdout, serial_putchar, NULL, _FDEV_SETUP_WRITE);
    stdout = &serial_stdout;

    printf("My favorite number is %6d!\n", 12);
}

void loop() {
  static long counter = 0;
  if (millis()%300==0){
    printf("millis(): %ld\tcounter: %ld (%02X)\n", millis(), counter, counter++);
    delay(1);   
  }
}




// Rf settings for CC1101
RF_SETTINGS code rfSettings = {
    0x0B,  // IOCFG2        GDO2 Output Pin Configuration
    0x0C,  // IOCFG0        GDO0 Output Pin Configuration
    0x3D,  // PKTLEN        Packet Length
    0x32,  // PKTCTRL0      Packet Automation Control
    0x06,  // FSCTRL1       Frequency Synthesizer Control
    0x10,  // FREQ2         Frequency Control Word, High Byte
    0xB0,  // FREQ1         Frequency Control Word, Middle Byte
    0x71,  // FREQ0         Frequency Control Word, Low Byte
    0x57,  // MDMCFG4       Modem Configuration
    0xC4,  // MDMCFG3       Modem Configuration
    0x30,  // MDMCFG2       Modem Configuration
    0x23,  // MDMCFG1       Modem Configuration
    0xB9,  // MDMCFG0       Modem Configuration
    0x00,  // DEVIATN       Modem Deviation Setting
    0x00,  // MCSM1         Main Radio Control State Machine Configuration
    0x18,  // MCSM0         Main Radio Control State Machine Configuration
    0x14,  // FOCCFG        Frequency Offset Compensation Configuration
    0x07,  // AGCCTRL2      AGC Control
    0x00,  // AGCCTRL1      AGC Control
    0x90,  // AGCCTRL0      AGC Control
    0xFB,  // WORCTRL       Wake On Radio Control
    0x11,  // FREND0        Front End TX Configuration
    0xE9,  // FSCAL3        Frequency Synthesizer Calibration
    0x2A,  // FSCAL2        Frequency Synthesizer Calibration
    0x00,  // FSCAL1        Frequency Synthesizer Calibration
    0x1F,  // FSCAL0        Frequency Synthesizer Calibration
    0x2A,  // PTEST         Production Test
    0x09,  // TEST0         Various Test Settings
};

Ralf9

#20
Zitat von: juergs am 07 Dezember 2016, 22:48:26
Deine Settings in der cc1101.ino beziehen sich auf 433 MHz? -> SmartRF.

Meine Settings beziehen sich auf 433 MHz SlowRF von der a-culfw.
Die cc1101 konfig der a-culfw lässt sich auch einfach mit get raw C99 anzeigen.

Es ist damit die nanocul Hardeware und Platine verwendbar.
Es besteht die Möglichkeit die RSSI auszulesen
Nur eine Antenne
Evtl besser Empfang?

Gruß Ralf
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Ralf9

Ich habe mir mal die http://culfw.de/commandref.html und die a-culfw libs angeschaut. Nun ist mir das Prinzip der a-culfw klarer geworden.

Bei meiner jetztigen cc1101.ino gehen die Einstellungen beim reset verloren.
Bei W - Befehl muß noch der Offset von +2 berücksichtigt werden:
if (reg > 1 && reg < 0x3e) {
...
writeReg(reg-2, var);


In der a-culfw wird mit dem W-Befehl in das EEPROM geschrieben. Mit X21 wird es dann in die CC1101 Register geschrieben
Note: 00 disables radio reception, any other value initializes the radio chip and enables reception. Default is 00: do not report anything, radio chip is uninitialized.



Beim W-Befehl gibt es einen Offset +2 da die ersten beiden byte im EEPROM die magic bytes sind.
Wenn beim cc1101 init die magic bytes ungültig sind, dann wird das EEPROM und die cc1101 Register mit den default Werten initialisiert.
Sind die magic bytes gültig, dann werden die cc1101 Register mit den Werten vom EEPROM initialisiert.

Ich würde vorschlagen, daß wir beim W-Befehl (EEPROM write) den Wert auch gleich ins cc1101 Register schreiben.

Es ist sind noch die folgenden Befehle notwendig:
e - Befehl (EEPROM / factory reset)
x - Befehl (Change the PA tables (power amplification for sending))

Gruß Ralf
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Sidey

Klingt irgendwie logisch, dass ein Write Befehl auch die Register gleich setzt. Warum sollte man das nicht machen.
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Ralf9

#23
Zitat von: Ralf9 am 12 Dezember 2016, 20:11:43
Das Problem habe ich auch wenn ich die a-culfw flashe, dann wird der  EAS800z und NC-7345 gar nicht empfangen.
Ich denke ein Grund könnte sein, daß ich hier im Haus Funkstörungen habe und der RXB6 Superheterodyne empfängt bei Funkstörungen besser als der CC1101.

Ich werde mal eine bessere Antenne versuchen.
Evtl bringt auch eine Abschirmung des CC1101 was. Ich kann Tipps brauchen was für ein Blech ich dafür am besten nehme, es sollte lötbar sein.

Kann ein Grund für die Probleme auch sein, daß die "blauen" CC1101 Module bzgl. der Frequenz extrem ungenau sind oder spielt das keine so große Rolle?
Dieses Modul ist anscheindend besser:
http://www.ebay.de/itm/433M-CC1101-10mW-Wireless-Sender-Receiver-Module-NRF905-SX1212-si4432-SC-/141924675760?hash=item210b5eb0b0:g:tuUAAOSwu1VW3~SY

Zitat von: RaspII am 09 Dezember 2016, 17:53:03
Ich hatte in der Vergangenheit immer wieder Probleme mir den "blauen" CC1101 Modulen. Diese sind bzgl. Frequenz extrem ungenau, deshalb verwende ich diese Module nicht mehr in meinen Projekten.

Zitat von: RaspII am 09 März 2016, 21:12:41
ich hab noch etwas mit dem blauen 433 Mhz Modul geforscht.
Dazu hab ich es bei 433 Mhz in Betrieb genommen, meine 433 Mhz Funksteckdosen kann ich damit auch steuern.
Allerding sehe ich auch hier eine Frequenzabweichung von ca. 120khz, d.h. etwa die hälfte der Abweichung die wir bei 868 Mhz sehen (Soll Frequenz ist 433.920Mhz). Der Handsender (Bild Mitte) sendet auf der korrekten Frequenz)

Ich vermute mal das ist der Quarz, mal schaun ob ich das auch noch messtechnisch klären kann (mal sehen was der China Oszi taugt)
Klar ist nur, dass ich keine weiteren "blauen" Module mehr kaufen werde.

Gruß Ralf
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Ralf9

Hallo Sidey,

da jetzt bald Weihnachten ist, habe ich einen "kleinen" Wunsch. Kannst Du die Routinen für den CC1101 in die Signalduino Firmware einbauen?

Gruß Ralf
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

MichlB

Hallo und guten morgen

ja das wäre toll, wenn man den CC1101 in den Signalduino implementieren könne.. und am tollsten wäre es, wenn noch irgendwie ein kleines HowTo fürs Erstellen bzw. Flachen für den Nano mit CC1101 zustande käme... für die wie mich, die sich mit dem Programmieren nicht wirklich auskennen und eine "Ich nahm dich an der Hand und führe dich Schritt für Schritt weiter" Unterstützung brauchen... ;-)

Ich danke euch schon mal...

Ps. der CC1101 ist mit dem nano so zu verkabeln wie mit dem Selbstbaucul oder gibts da unterschiede?

lg
michl
1x PI 2B+ FHEM - Heizung
1x Pi 3b+ - FHEM - Haussteuerung
1x Pi 3 - MagicMirror
2x Pi B - Musicbox

Sidey

@ralf

Was mir nicht klar ist, wie das mit dem cc1101 und dem Pegel.

Die IOs vom Arduino arbeiten mit 5V.
Der cc1101 verträgt nur 3,9 V

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Ralf9

FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Ralf9

Hier ist eine erste Version der SIGNALDuino Firmware mit CC1101 unterstützung. Die Verkabelung des CC1101 ist wie beim Selbstbau cul
https://github.com/RFD-FHEM/SIGNALDuino/tree/dev-r33_cc1101
Es fehlt noch das hex-File zum flashen und das Senden wird auch noch nicht unterstützt.
Ich habe die folgenden Befehle eingebaut. Alle Werte sind in hex
C<reg>
    <reg> is a (two digit) hex number: return the value of the cc1101 register. <reg>=99 dumps the first 48 registers.
    Example: C35 -> C35 = 0D

e
    EEPROM / factory reset.  resets all eeprom values without reboot

r<AA>
    Read eeprom  (da das "R" beim SIGNALDuino bereits mit freeram belegt ist, habe ich das "r" verwendet)
r<AA>n
    Read 16 byte from eeprom (z.B. r00n)

W<AA><DD>
    Write eeprom (schreibt einen Wert ins EEPROM und ins CC1101 Register. Die eeprom Adresse hat einen Offset von 2. z.B W041D schreibt 1D ins Register 2)

WS<AA>
   Strobe commands z.B:
   34   Enable RX
   36   Exit RX / TX  (idle state)


Nach dem Schreiben eines Wertes in ein Register, müssen die Änderungen noch aktiviert werden.
Ich hab noch nicht rausgefunden ob dazu die  Strobe commands 36 (idle) und 34 (Enable RX) ausreichen oder ob ein reset notwendig ist.

Gruß Ralf
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Sidey

So generell sollten wir uns vielleicht mal überlegen ob wir die Kommandos in gewisser Weise Standardisieren.

So in der Art:
G für Get
S für Set
Und darunter dann weitere Kommandos

Z.B. G Ram oder G C Reg für Get cc1101 Reg...

Oder wir vergeben hexadezimal Steuerkommandos:

Get 0x00
Bis
Get 0xFF

Uns ebenso Set 0x00 bis 0xFF.

Was meinst Du Ralf?
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker