Entwicklung SIGNALDuino Empfänger Firm- und Hardware V4 für Maple Mini und ESP32

Begonnen von Ralf9, 13 Dezember 2019, 12:48:26

Vorheriges Thema - Nächstes Thema

DirkS

Hallo Ralf,
bei der Pinbelegung hast du nur bedingt Recht. Es gibt CC1101 die genau die gleiche Pinbelgung haben. Ich habe diese Module e07-m1101d.
Ich habe zwei leicht unterschiedliche Black Boards. Das eine hat keine Extras und tatsächlich nur 64kb/20kb. Das zweite (mit schräger MCU) hat 128km/20kb, EEprom, Flash, TF Card Slot, etc. Aber beide zeigen die gleichen Symptome.
[Nachtrag]
Ich habe nun noch einmal alles kontrolliert. Auf dem Board mit 128kb Flash läuft es jetzt. Ich habe die  dev-r3.5_xFSK genommen. Vermute, es ist aber nicht der Grund. Auf den Board mit 64kb Flash hat sich wohl zusätzlich eine kalte Lötstelle eingeschlichen. Dies habe ich gemerkt, als ich die Pins mit einer LED kontrolliert habe. Die LED flackerte und leuchtete teilweise dunkler.
Wenn also jemand Interesse an der Konfiguration hat, bitte melden!

Ralf9

ok, mit dem e07-m1101d passt die Pin-Belegung
Demnach hast Du die folgenden Anpassungen alle gemacht:

In der SIGNALDuino.ino:
//#define MAPLE_SDUINO 1
#define MAPLE_CUL 1

diese PIN müssen angepasst werden
#elif MAPLE_CUL
#define PIN_LED              33
#define PIN_SEND             17   // gdo0 Pin TX out
        #define PIN_RECEIVE          18

hier muss für das cc1101 Modul B die 18 angepasst werden
const uint8_t pinReceive[] = {11, 18, 16, 14};

cc1101.h

hier muss die 12 angepasst werden
const uint8_t radioCsPin[] = {7, 12, 15, 3};



ZitatIch habe die  dev-r3.5_xFSK genommen.
Wenn Du nur ein cc1101 mit 433MHz SlowRF verwenden willst kannst Du auch das Signalduino Modul vom normalen fhem update nutzen.
Das dev-r3.5_xFSK ist beim FSK leider nicht mit meiner Firmware kompatibel.
Beim Signalduino Modul von Sidey fehlen auch die komfort Funktionen.

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

DirkS

Anpassungen an den Pins für den CC1101 und der LED hatte ich vorgenommen.
Zudem hatte ich das Board und MCU angepasst. Nachdem ich die kalte Lötstelle behoben habe, funktioniert nun auch das andere Board.
Ich habe jetzt das Release 3.4.0 benutzt.
Ich könnte ein Pull request vorbereiten, wenn gewünscht. Müsste nur wissen, dann in welche Version.


Ralf9

wo hast Du das Black Board mit 128k flash gekauft? bei Aliexpress und ebay habe ich es nicht gefunden.
Mit den Erweiterungen die ich noch geplant habe, wird meine Firmware größer als 64k werden.
Gibt es das e07-m1101d Modul auch als 868 MHz Version?
ZitatZudem hatte ich das Board und MCU angepasst.
Ich verwende diese STM32 Boards,
https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json
da ist das Blackboard nicht dabei. Funktioniert es auch ohne boardanpassungen mit dem "Gerneric STM32F103CBT6" board?

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

DirkS

Glaube die e07-mm1101d gibt es nur mit 433MHz.
Das Black Board mit 128k hat gleiche Abmessungen aber ein etwas anderes Layout.
Ist von Aliexpress
https://www.aliexpress.com/item/32525208361.html
Ein Problem war, dass die Pin Nummer nicht mit dem Board übereinstimmten. Nachdem ich die Konstanten (z.B. PB1,PA7,...) benutzt hatte, funktionierte es.
Müsste also einmal probieren, ob dies mit dem Generic Settings noch übereinstimmen.

Ralf9

Demnach können bei den PINs anstatt der Nummern auch die Portbezeichungen (z.B. PB0) verwendet werden.

Mit der Pin Belegung des e07-mm1101d
1 - GND Ground plane
2 - VCC +3.3V rail
3 - GDO0 PB0
4 - CSN PB2
5 - SCK PA5
6 - MOSI PA7
7 - MISO PA6
8 - GDO2 PA15


ergeben sich dann die folgenden Ergänzungen:

In der SIGNALDuino.ino:

//#define MAPLE_SDUINO 1
//#define MAPLE_CUL 1
#define BLACKBOARD 1
..
#ifdef BLACKBOARD
#define MAPLE_Mini
#define CMP_CC1101
#endif
..
#elif BLACKBOARD
#define PIN_LED              PA1
#define PIN_SEND             PB0   // gdo0 Pin TX out
        #define PIN_RECEIVE          PA15
#define PIN_WIZ_RST          PC14


cc1101.h
#elif BLACKBOARD
#define mosiPin PA7   // MOSI out
#define misoPin PA6   // MISO in
#define sckPin  PA5   // SCLK out
SPIClass SPI_2(mosiPin, misoPin, sckPin);
const uint8_t radioCsPin[] = {7, PB2, 15, 3};


Mit dem Backboard lässt sich ohne Löten ein Signalduino zusammenbauen, aber nur mit einem 433 cc1101 für slowRF. FSK ist nicht möglich.

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 vor die Firmware so zu erweitern, daß auf den cc1101 Modulen A und B gleichzeitig ASK/OOK (SlowRF) möglich ist, ich bin mir aber unsicher ob es beim gleichzeitigen Empfang von z.B 433 MHz SlowRF und 868 MHZ SlowRF zu Beeinflussungen kommen kann.

Bei den empfangenen Pulsen (GDO2 Pin) werden bei jeder Flanke die Interruptroutine (handleInterruptA) aufgerufen.
In der Interruptroutine wird die Pulsdauer gemessen und in den FiFo gespeichert.

Damit ein gleichzeitiges empfangen von 2 SlowRF Nachrichten möglich ist, sind getrennte Interruptroutinen und FiFo notwendig.
handleInterruptA für cc1101 Modul A und handleInterruptB für cc1101 Modul B

Da habe ich nun ein Verständnisproblem:
in der Interruptroutine werden die Interrupts gesperrt,
wenn nun durch eine Pulsflanke von Modul A handleInterrupt aufgerufen wird und noch bevor die Interruptroutine beendet ist, von Modul B eine Pulsflanke kommt, was passiert dann? Die Interrupts sind noch gesperrt.

Kann jemand ganz grob abschätzen (Größenordnung reicht) wie lange die Ausführung der Interruptrotine dauert?

SimpleFIFO<int16_t,FIFO_LENGTH> FiFoA;
SimpleFIFO<int16_t,FIFO_LENGTH> FiFoB;

volatile unsigned long lastTimeA = micros();
volatile unsigned long lastTimeB = micros();

void handleInterruptA() {
  noInterrupts();

  const unsigned long Time=micros();
  const unsigned long duration = Time - lastTimeA;
  lastTimeA = Time;
  if (duration >= pulseMin) {//kleinste zulaessige Pulslaenge
int16_t sDuration;
    if (duration < maxPulse) {//groesste zulaessige Pulslaenge, max = 32000
      sDuration = int16_t(duration); //das wirft bereits hier unnoetige Nullen raus und vergroessert den Wertebereich
    }else {
      sDuration = maxPulse; // Maximalwert set to maxPulse defined in lib.
    }
    if (isHigh(pinReceive[0])) { // Wenn jetzt high ist, dann muss vorher low gewesen sein, und dafuer gilt die gemessene Dauer.
      sDuration=-sDuration;
    }
//MSG_PRINTLN(sDuration);
    FiFoA.enqueue(sDuration);

  } // else => trash

  interrupts();
}

void handleInterruptB() {
  noInterrupts();

  const unsigned long Time=micros();
  const unsigned long duration = Time - lastTimeB;
  lastTimeB = Time;
  if (duration >= pulseMin) {//kleinste zulaessige Pulslaenge
int16_t sDuration;
    if (duration < maxPulse) {//groesste zulaessige Pulslaenge, max = 32000
      sDuration = int16_t(duration); //das wirft bereits hier unnoetige Nullen raus und vergroessert den Wertebereich
    }else {
      sDuration = maxPulse; // Maximalwert set to maxPulse defined in lib.
    }
    if (isHigh(pinReceive[1])) { // Wenn jetzt high ist, dann muss vorher low gewesen sein, und dafuer gilt die gemessene Dauer.
      sDuration=-sDuration;
    }
//MSG_PRINTLN(sDuration);
    FiFoB.enqueue(sDuration);

  } // else => trash

  interrupts();
}


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

wenn ich mit
attachInterrupt(digitalPinToInterrupt(PIN_RECEIVE), handleInterrupt, CHANGE);
bei einer Flanke an einem Eingang per Interrupt eine handleInterrupt Routine aufrufen möchte,
ist mir nicht klar was passiert, wenn während der Flanke z.B. in einer Interruptroutine mit
noInterrupts();
die Interrupts deaktiviert sind.

Sehe ich das richtig, daß die Interruptanforderung der Flanke im "Pending request register" gemerkt wird?
Wird dann nach einem
Interrupts();
der pending Interrupt der Flanke aktiv und ruft die handleInterrupt Routine auf?

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

ZitatSehe ich das richtig, daß die Interruptanforderung der Flanke im "Pending request register" gemerkt wird?
Wird dann nach einem
Interrupts();
der pending Interrupt der Flanke aktiv und ruft die handleInterrupt Routine auf?
Dies scheint so zu funktionieren, ich habe mir dazu ein Testprogramm geschrieben.

Ich habe damit angefangen die Firmware so zu erweitern, daß auch beim cc1101 Modul A SlowRF (ASK) möglich ist.

Momentan wird in der signalDecoder4.cpp per callback "cc1101::getRSSI" in der SIGNALDuino.ino aufgerufen.
Es wird dazu FastDelegate.h verwendet.

Ich möchte das callback ohne das FastDelegate.h machen, dafür reichen aber meine Kenntnisse nicht aus.
Kann mir da jemand helfen?
Hat mir jemand eine Beschreibung wo das callback gut erkärt wird.

Momentan ist es so realisiert:

signalDecoder4.cpp
rssiValue = _rssiCallback();

signalDecoder4.h
class SignalDetectorClass
{
public:
typedef fastdelegate::FastDelegate0<uint8_t> FuncRetuint8t;
void setRSSICallback(FuncRetuint8t callbackfunction) { _rssiCallback = callbackfunction; }


SIGNALDuino.ino
SignalDetectorClass musterDec;
musterDec.setRSSICallback(&cc1101::getRSSI);                    // Provide the RSSI Callback


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

meier81

Hallo Ralf,

wie gerne würde ich dir helfen, stecke aber leider noch nicht mal so tief wie du in der Materie. Trotzdem lese ich immer fleißig mit und versuche mich auch über´s Internet schlau zu machen bzw. nachzulesen, sollte ich da was finden werde ich es berichten.

Gruß Markus
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

Ralf9

Liest hier jemand mit der mir mit dem callback weiterhelfen kann?
@Telekatz
@papa
@juergs
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

Reinhard.M

Hallo Ralf,

ich lese zwar mit muss aber leider genauso passen wie Markus, sorry.

Gruß Reinhard

juergs

Zitat@Telekatz
@papa
@juergs

Hallo Ralf,
stecke, wie meine Vorredner, leider auch gerade nicht so tief in der spezifischen Materie drin.

Schaue mal, was ich tun kann ...

Grüße + schöne Weihnachten
Jürgen


http://homepage.cem.itesm.mx/carbajal/Microcontrollers/SLIDES/Interrupts.pdf ab Seite 40.
https://www.st.com/content/ccc/resource/training/technical/product_training/3b/10/15/3e/57/60/4f/37/STM32L4_System_NVIC.pdf/files/STM32L4_System_NVIC.pdf/jcr:content/translations/en.STM32L4_System_NVIC.pdf
http://stefanfrings.de/stm32/stm32f3.html#nvic
https://stackoverflow.com/questions/55003417/synchronisation-mechanism-without-disabling-interrupts-on-cortex-m0

=> https://stm32f4-discovery.net/2014/08/stm32f4-external-interrupts-tutorial/
=>https://stackoverflow.com/questions/50105120/stm32f427-interrupt-clear-pending-bit/51221126#51221126

Wenn das Problem sauber "artikuliert" werden kann, dann könnte man auch die StackOverflow-STM32-Community  anfragen. ["Ask question"-Empfehlung!]

ZitatWenn das Signal zu früh verschwindet, während der Interrupt-Controller nach einer Gelegenheit sucht, den Interrupt-Handler auszuführen, geht es verloren. Der Interrupt-Handler wird dann nicht ausgeführt.

Für das Ermitteln der Interrupt-Dauer kann ich gerne mit einem Logikanalyzer bestimmen.
Benötige allerdings mehr Infos über das "Grundproblem". => Gleichzeitige Auslösung zweier Interrupts? Testprogramm?

TIPP:
Ich kann bei Darstellung von Abläufen PlantUML (https://plantuml.com/de/sitemap-language-specification ) insbesondere  Aktivitäts- und Sequenz-Diagramme empfehlen.
Mit VSCode/Code-OSS oder vscodium und https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml-Plugin = genial, mit Preview (benötigt Java) !


Ralf9

Hallo Jürgen,

Danke für die Links, ein Teil hatte ich selber schon gefunden, aber Du bist im suchen irgendwie etwas besser :)

Wegen dem callback da habe ich inzwischen dies gefunden
http://tedfelix.com/software/c++-callbacks.html

Wünsche Dir und allen die hier mitlesen schöne Weihnachten und Gesundheit

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 möchte es mal mit der hier beschriebenen "Interface Class" callback Methode versuchen
http://tedfelix.com/software/c++-callbacks.html

Ich habe mal in dem Beispielcode in Bezug auf den Signalduino einige Bezeichnungen angepasst
https://onlinegdb.com/0g0Mcc3nN

das main ist in der Signalduino.ino
die SignalDetectorClass ist in der Signalduino.h

mein Problem ist nun, daß die per callback aufgerufene callbackfunktion Callee auch eine class ist, das bring mir aber so nichts.
Ich möchte per callback "cc1101::getRSSI()" aufrufen.

getRSSI() ist in der Datei "cc1101.h" im namespace cc1101

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