AskSin++ Library

Begonnen von papa, 08 September 2016, 11:11:25

Vorheriges Thema - Nächstes Thema

xkalle01

ZitatWenn du auch den hc-sr501 verwendest, dann läuft der vielleicht nur bis 3,0V stabil - so steht es jedenfalls im Datenblatt.
Ja, den hc-sr501 benutze ich auch.
Ich habe aber den MAX1724 zur Erzeugung der 3.3V verbaut, wie auch auf dem Universalsensor. Der macht auch aus 1.2V noch 3.3V :)

Deinen generierten Code würde ich gern einmal testen.

papa

Zitat von: xkalle01 am 20 März 2017, 12:07:56
Besonders die List0 währe interessant, dort sind viele Konfigurationen enthalten, die ich gern über FHEM setzten würde.
Oder geht das schon und ich habe es nur noch nicht verstanden?

Die List0 kann im Device-Template als letzter Template-Parameter gesetzt werden. Dort wird als Default-Argument immer List0 automatisch gesetzt.
Ich habe die beispiele HM-ES-TX-WM & HM-WDS100-C6-O-2 angepasst, dass diese jetzt auch die erweiterte List0 setzen. Die Register sind dann auch von FHEM aus setzbar.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Dietmar63

So hier die versprochenen Klassen generiert durch Perl(aktueller Stand - betaphase) aus den xml:
Ich habe gesehen, dass perl zwischendurch noch einige Fehler ausgeworfen hat - der Code wurde aber trotzdem erzeugt.

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

papa

Da scheint noch ein Bug drin zu sein. Die MasterID in Liste 0 ist 3 Byte lang. Dein generierter Code betrachtet aber nur das erste Byte.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

papa

Habe eben den Support für ARM genauer für das Maple Mini Board im Master-Branch eingecheckt. Es gibt jetzt auch nen stm32 Verzeichnis für die ARM Examples.

Der HM-LC-SWX-SM funktioniert soweit. Allerdings werden die Listen derzeit nicht dauerhaft gesichert. Da der ARM kein EEProm hat, werden die Listen derzeit nur im Speicher abgelegt. Es ist geplant, diesen Speichern dann nach Änderungen ins Flash zu schreiben. Außerdem läuft die CPU immer voll Kraft. Die Sleep-Funktionen müssen auch noch implementiert werden. Die VCC-Messung im BatterySensor ist noch nicht getestet.

Mit dem Maple Mini können auch größere Geräte umgesetzt werden. Die CPU besitzt 128KB Flash und 20KB RAM. Der Takt ist 72 MHz. Weitere Infos gibt es hier http://wiki.stm32duino.com/index.php?title=Maple_Mini.

Um den Code zu übersetzen wird eine aktuelle ArduinoIDE benötigt. Ich verwende Version 1.8.1. Außerdem muss der STM32-Support wie hier https://github.com/rogerclarkmelbourne/Arduino_STM32/wiki/Installation beschrieben installiert sein.

In der IDE sind folgende Einstellungen zu setzen:
  Board: Maple Mini
  CPU Speed: 72 MHz
  Bootloader Version: Original - den anderen Bootloader habe ich noch nicht probiert

Die Hardware gibt es günstig beim China-Man https://de.aliexpress.com/item/STM32F103RCBT6-ARM-Cortex-M3-leaflabs-Leaf-maple-mini-module-for-arduino-STM32/1878982440.html

Das CC1101 ist an dem SPI1 anzuschliessen. Der GDO0-Interrupt an PB0. Als Config-Button wird der Button auf dem Board verwendet. Die Debug-Ausgaben kommen über den USB-Anschluß.

Viel Spaß beim Nachbauen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Dietmar63

Zitat von: papa am 20 März 2017, 22:04:58
Da scheint noch ein Bug drin zu sein. Die MasterID in Liste 0 ist 3 Byte lang. Dein generierter Code betrachtet aber nur das erste Byte.

kannst du das mal genauer beschreiben:


   bool       masterId                  (uint32_t v) const {return setByte(0,(v>>16)&0xff) + setByte(1,(v>>8)&0xff) + setByte(2,(v));};
   uint32_t   masterId                  (          ) const {return getByte(0)<<16 + getByte(1)<<8 + getByte(2);};
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

papa


class Channel0List0Data {
/*
   uint8_t masterId                  :24;  // 0x0a.0, s:24   d:   
*/
public:
   static uint8_t avrRegister[1];  <== Hier müsste 3 stehen - 3 Byte

   static uint8_t getOffset  (uint8_t r) {
      for (uint8_t i=0;i<sizeof(avrRegister);i++) {
         if(avrRegister[i]==r) {
            return i;
         }
       return 0xff;
      }
   };
   static uint8_t getRegister(uint8_t o) {
     if (o>=0 && o <= sizeof(avrRegister)) {
        return avrRegister[o];
     };
     return 0xff;
   }
};

uint8_t Channel0List0Data::avrRegister[] = {0x0A};  <== Hier fehlen die Register 0x0B und 0x0C
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Dietmar63

Warum - liefert die Routine nicht immer nur die Position des Anfangsbytes?
Dann müsste die Liste ja im Zweifel recht lang sein.

Ich bin mir nicht sicher, aber bei anderen Felder habe ich auch nicht immer n Byte gesehen.

Dietmar
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

papa

Die MasterID ist 3 Byte und in den Registern 0xA,0xB,0xC gespeichert - also müssen auch 3 Register dafür übertragen werden.

static uint8_t avrRegister[3];

uint8_t Channel0List0Data::avrRegister[] = {0x0A,0xB,0xC};

Nur so kann die getRegister-Funktion für jedes Byte der Liste das entsprechende Register zurückgeben.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Dietmar63

Welche Klasse/Methode benötigt das genau so?
Warum ist das nicht bei anderen uin32_t Variablen auch?

Welche Klasse/Methode tauscht die Daten mit der Zentrale aus. Vielleicht kann ich dort das warum verstehen?
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

papa

Zitat von: Dietmar63 am 21 März 2017, 22:12:50
Welche Klasse/Methode benötigt das genau so?

Das wird zum Lesen und Schreiben der Register von der Zentrale aus benötigt. Es werden hier immer die Paare von Register und Wert übermittelt. Deshalb muss die Firmware in der Lage sein, alle Register in den entsprechenden Offset im Flash umzurechnen bzw. umgekehrt.

Zitat von: Dietmar63 am 21 März 2017, 22:12:50
Warum ist das nicht bei anderen uin32_t Variablen auch?

Welche ???

Zitat von: Dietmar63 am 21 März 2017, 22:12:50
Welche Klasse/Methode tauscht die Daten mit der Zentrale aus. Vielleicht kann ich dort das warum verstehen?

z.B.

Device::sendInfoParamResponsePairs
Device::writeList

BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

0xFFFF

@dietmar: Falls es keine zu großen Umstände bereitet, könntest du mir die messages  für den hm-lc-rgbw-wm generieren?

Dietmar63

@0xFFFF

ja,
Das kann ich machen, Die Generierung der Listklassen muss ich aber nochmals überarbeiten - da hatte ich wohl noch nicht alles verstanden.
Aber daran denken, der Generator ist noch in de Betaphase des Tests.

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

#238
@papa:

ich habe mir den Code der Methoden

Device::sendInfoParamResponsePairs
Device::writeList


angesehen und folgendes verstanden:
Die erste Methode versendet die Daten in 8-Pairchen (Register:Wert) an die Zentrale.
Die Anzahl der zu versendenden Register wird per getSize ermittelt, deshalb muss darauf geachtet werden, dass sizeOf(DataClass) zur Compilezeit den richtigen Wert liefert.
Das erreichst du dadurch, dass die DataKlasse folgende Parameterleise am Anfang enthält. Die Variablen werden nur für sizeOf in getSize() benötigt, selbst jedoch nie angesprochen:


  uint8_t sign             :1;     // 0x08, s:0, e:1
  uint8_t                  :7;     //
  uint8_t transmitTryMax   :8;     // 0x30, s:0, e:8


Jedes Register(1 Byte) muss deshalb von getRegister(pos) ermittelbar sein.

Device::writeList schreibt den ganzen Kram(ConfigWriteIndexMsg), der von einer Zentrale gekommen ist, ins Eprom zurück. Das Parsen erfolgt in der MessageKlasse ConfigWriteIndexMsg.
Ich will das mal ausprobieren. Bei welchem example funktioniert das und welchen Tastendruck muss ich ausführen damit die Daten ausgetauscht werden.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

papa

Das funktioniert bei allen. Schon das Pairen mit der Zentral schreibt und ließt die Liste 0.

Am einfachsten kann man das HM-LC-SWX-WM Example nehmen. Dort werden die geänderten Register der Channel sofort übertragen - z.B. powerUpAction
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire