Ankündigung

Einklappen
Keine Ankündigung bisher.

thelsing/knx auf Teensy 3.2

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    thelsing/knx auf Teensy 3.2

    Hallo,
    ich habe vor ca. zwei Jahren eine Zutrittskontrolle mit RFID Reader, Türsteuerung und KNX Anbindung über Konnekting gebaut. Die Hardware ist eine Eigenentwicklung auf Teensy 3.2 Basis. Nun möchte ich gerne auf OpenKNX bzw thelsing/knx migrieren.
    Als erstes versuche ich die Demo (https://github.com/thelsing/knx/tree...mples/knx-demo) auf meiner Hardware zum Laufen zu bekommen.
    Die Plattform habe ich im Stack soweit ergänzt (#ifdef Direktiven in diversen files, platform files erstellt...), allerdings bekomme ich beim kompilieren in der knx_facade.h einige Fehler:

    Code:
    C:\CerberusDoorAccessControl\Firmware\Cerberus_Ope nKNX\libraries\knx/knx_facade.h:94: undefined reference to `Bau07B0::Bau07B0(Platform&)'
    .\libraries\knx\knx_facade.cpp.o: In function `KnxFacade<Teensy32Platform, Bau07B0>::manufacturerId(unsigned short)':
    C:\CerberusDoorAccessControl\Firmware\Cerberus_Ope nKNX\libraries\knx/knx_facade.h:244: undefined reference to `BauSystemB::deviceObject()'
    C:\CerberusDoorAccessControl\Firmware\Cerberus_Ope nKNX\libraries\knx/knx_facade.h:244: undefined reference to `DeviceObject::manufacturerId(unsigned short)'
    .\libraries\knx\knx_facade.cpp.o: In function `KnxFacade<Teensy32Platform, Bau07B0>::bauNumber(unsigned long)':
    C:\CerberusDoorAccessControl\Firmware\Cerberus_Ope nKNX\libraries\knx/knx_facade.h:249: undefined reference to `BauSystemB::deviceObject()'
    C:\CerberusDoorAccessControl\Firmware\Cerberus_Ope nKNX\libraries\knx/knx_facade.h:249: undefined reference to `DeviceObject::bauNumber(unsigned long)'
    .\libraries\knx\knx_facade.cpp.o: In function `KnxFacade<Teensy32Platform, Bau07B0>::KnxFacade(void (*)())':
    C:\CerberusDoorAccessControl\Firmware\Cerberus_Ope nKNX\libraries\knx/knx_facade.h:98: undefined reference to `BauSystemB::addSaveRestore(SaveRestore*)'
    .\libraries\knx\teensy32_platform.cpp.o:(.rodata._ZTV16Teensy32Platform+0x10): undefined reference to `Platform::currentIpAddress()'​
    Als Entwicklungsumgebung verwende ich Sloeber/Eclipse.

    Wo könnte das Problem liegen? Ich komme nicht wirklich weiter.

    Danke, LG

    #2
    Hallo,

    das Problem lag an Eclipse selbst, wenn das Unterverzeichnis der Bibliothek den selben Namen wie die Biliothek hat dann wird das Unterverzeichnis vom build ausgenommen

    Nun läuft der stack wie er soll. Mir ist aber aufgefallen dass Partielles Programmieren nicht funktioniert, in der ETS kommt ein Fehler. Sollte das funktionieren oder ist das im Stack (noch) nicht umgesetzt?

    Danke, LG

    Kommentar


      #3
      Partielles programmieren muss das Gerät unterstützen. Es muss also in der knxprod drin stehen, was beim partiellen programmieren gemacht werden soll. Ein Beispiel ist in meinem Logikmodul. Ich bin derzeit unterwegs, nachher kann ich noch einen Link reinstellen.

      Gruß, Waldemar
      OpenKNX www.openknx.de

      Kommentar


        #4
        Das muss ungefähr so aussehen:
        Code:
                    <LoadProcedures>
                      <LoadProcedure MergeId="2">
                        <LdCtrlRelSegment LsmIdx="4" Size="%MemorySize%" Mode="1" Fill="0" AppliesTo="full" />
                        <LdCtrlRelSegment LsmIdx="4" Size="%MemorySize%" Mode="0" Fill="0" AppliesTo="par" />
                      </LoadProcedure>
                      <LoadProcedure MergeId="4">
                        <LdCtrlWriteRelMem ObjIdx="4" Offset="0" Size="%MemorySize%" Verify="true" AppliesTo="full,par" />
                      </LoadProcedure>
                      <LoadProcedure MergeId="7">
                        <LdCtrlLoadImageProp ObjIdx="1" PropId="27" />
                        <LdCtrlLoadImageProp ObjIdx="2" PropId="27" />
                        <LdCtrlLoadImageProp ObjIdx="3" PropId="27" />
                        <LdCtrlLoadImageProp ObjIdx="4" PropId="27" />
                      </LoadProcedure>
                    </LoadProcedures>​
        Statt %MemorySize% musst Du die Größe Deines Speichers für Parameter angeben.

        Gruß, Waldemar
        OpenKNX www.openknx.de

        Kommentar


          #5
          Danke aber ganz verstanden habe ich es noch nicht. Wie müsste die Ladeprozedur bei der Demo https://github.com/thelsing/knx/blob...emo-tp.knxprod aussehen? Die Size steht ja eigentlich drin.
          So sieht es derzeit aus:
          Code:
          <LoadProcedures>
            <LoadProcedure MergeId="2">
              <LdCtrlRelSegment LsmIdx="4" Size="8" Mode="0" Fill="0" AppliesTo="full" />
            </LoadProcedure>
            <LoadProcedure MergeId="4">
              <LdCtrlWriteRelMem ObjIdx="4" Offset="0" Size="8" Verify="true" />
            </LoadProcedure>
          </LoadProcedures>​
          Aber ich glaube bei den Parametern ist da was durcheinander gekommen, z.B. Abgleich hat 4 Byte und im Code wird nur 1 ausgelesen:
          Code:
          Serial.println(knx.paramByte(4));
          Und die Reihenfolge stimmt auch nicht überein so wie ich das sehe.

          Kann es daran liegen?

          LG Wolfgang
          Zuletzt geändert von wolfib; 03.12.2022, 08:59.

          Kommentar


            #6
            Hi Wolfgang,

            ich habe die Ladeprozedur doch aben angegeben? Wie die Applikation aussieht, kommt ja von Dir. Das einzige, was man anpassen muss, ist %MemorySize%.

            Gruß, Waldemar
            OpenKNX www.openknx.de

            Kommentar


              #7
              Hallo,

              nein die Applikatoion und die knxprod sind von der OpenKNX demo https://github.com/thelsing/knx/blob...emo-tp.knxprod
              Mit der Zeile
              Code:
              <LdCtrlRelSegment LsmIdx="4" Size="%MemorySize%" Mode="0" Fill="0" AppliesTo="par" />
              funktioniert es jetzt.
              Was macht eigentlich der Block ab
              Code:
              <LoadProcedure MergeId="7">
              ?

              Danke für die Hilfe, LG Wolfgang
              Zuletzt geändert von wolfib; 08.12.2022, 12:07.

              Kommentar


                #8
                Hallo Wolfgang,

                Zitat von wolfib Beitrag anzeigen
                Mit der Zeile Code:

                <LdCtrlRelSegment LsmIdx="4" Size="%MemorySize%" Mode="0" Fill="0" AppliesTo="par" />
                funktioniert es jetzt.
                Das glaube ich nicht, zumindest ist das nicht vollständig. Es ist aber nicht so, dass ich die Sachen komplett verstehe, ich habe mir das auch nur aus verschiedenen knxprods zusammengesucht und getetstet. Soviel ich weiß, sorgt die MergeId="2" nur dafür, dass bei einer vollständigen Programmierung der Speicher mit 0 initialisiert wird und so nur die Applikationsteile übertragen werden, die nicht gleich 0 sind. Das sorgt für die Übertragung von weniger Daten, das ist aber nicht mit partieller Programmierung gemeint. Bei Partiell werden nur die Bytes übertragen, die sich seit der letzen Programmierung geändert haben.

                Für Partielle Programmierung ist eben auch der Block mit der MergeId="7" notwendig. Damit fordert die ETS nach dem Schreiben der verschiedenen Applikationsteile passende Checksummen vom Gerät an, damit sie vor dem nächsten partiellen schreiben beurteilen kann, ob der Inhalt noch korrekt ist. Ohne gültige Checksummen macht die ETS immer eine vollständige Applikation.

                Gibt es einen Grund, warum Du nicht einfach den ganzen Block "LoadProcedures" von mir übernimmst?

                Gruß, Waldemar
                OpenKNX www.openknx.de

                Kommentar


                  #9
                  Du hast recht, ich habe nur sehr wenige Parameter, da merkt man den zeitlichen Unterschied kaum.
                  Mit dem Block mit der MergeId="7" sieht man jetzt das auch tatsächlich nur ein Wert geschrieben wird (MemoryWrite Count=1).

                  Noch eine Frage, gibt es eine einfachere Möglichkeit die Parameter aus dem EEPROM zu extrahieren die ich übersehen habe? Ich mach das derzeit so:
                  Code:
                  paramControlType = knx.paramBit(PARAM_ControlType, 0);
                  paramDiagnosisEnable = knx.paramBit(PARAM_DiagnosisEnable, 1);
                  paramAutoNightDayHour = knx.paramByte(PARAM_AutoNightDayHour) >> 1 & 0b00011111;
                  paramAutoNightDaySwitch = knx.paramByte(PARAM_AutoNightDaySwitch) >> 6;
                  paramAutoNightDayMinute = knx.paramByte(PARAM_AutoNightDayMinute) & 0b00111111;
                  paramAutoNightDayBrightness = knx.paramWord(PARAM_AutoNightDayBrightness) >> 5;
                  paramAutoDayNightSwitch = knx.paramByte(PARAM_AutoDayNightSwitch) >> 6;
                  paramAutoDayNightHour = knx.paramByte(PARAM_AutoDayNightHour) >> 1 & 0b00011111;
                  paramAutoDayNightMinute = knx.paramByte(PARAM_AutoDayNightMinute) >> 2;
                  ...
                  In der vom KaenxCreator erstellten .h File ist ja leider nur der Byte-Offset definiert, den Rest muss man sich manuell zusammensuchen und mit Shift und Maskierung extrahieren und bei Änderungen wieder nachpflegen.

                  Danke für die Unterstützung!
                  LG Wolfgang

                  Kommentar


                    #10
                    wolfib Seit der Version 1.4.2 wird in der h. Datei auch Mask und Shift ausgegeben.
                    OpenKNX www.openknx.de | Kaenx-Creator | Dali-GW

                    Kommentar


                      #11
                      Ausgezeichnet!
                      Was ich mir noch wünschen würde ist das auch bei Parametern mit >= 8 bit Mask und Shift ausgegeben wird.

                      Danke, LG

                      Kommentar


                        #12
                        Warum? Hast du Mal ein Beispiel?

                        Gruß, Waldemar
                        OpenKNX www.openknx.de

                        Kommentar


                          #13
                          Ich habe auch Parameter mit 10 und 11 bit, die werden mit der paramWord Methode ausgelesen. Für die gibt KaenxCreator Mask und Shift nicht aus.

                          Und bei den 8 bit Parameter würde ich mir wünschen das es auch ausgegeben wird damit es konstistent ist und der Code gleich aussieht.

                          Ausserdem könnte man bei 1-bit Parametern noch überlegen ob man nicht den Offset statt Shift ausgibt, siehe:
                          paramDiagnosisEnable = knx.paramBit(PARAM_DiagnosisEnable, PARAM_DiagnosisEnable_BitOffset);
                          paramDiagnosisEnable = (knx.paramByte(PARAM_DiagnosisEnable) & PARAM_DiagnosisEnable_Mask) >> PARAM_DiagnosisEnable_Shift;​
                          Noch eine Idee die ich hätte wäre das im .h File die Berechnung in einem Block fertig zum Kopieren in den Sketch ausgegeben wird, z.B. (mit unterschiedliche Paramterlängen):
                          //paramDiagnosisEnable = knx.paramBit(PARAM_DiagnosisEnable, PARAM_DiagnosisEnable_BitOffset);
                          //paramMotorRotationDirection = (knx.paramByte(PARAM_MotorRotationDirection) & PARAM_MotorRotationDirection_Mask) >> PARAM_MotorRotationDirection_Shift;
                          //paramMotorRotationExtensionTime = (knx.paramWord(PARAM_MotorRotationExtensionTime) & PARAM_MotorRotationExtensionTime_Mask) >> PARAM_MotorRotationExtensionTime_Shift;
                          ...
                          Anbei mein ae-manu File.

                          LG Wolfgang
                          Angehängte Dateien
                          Zuletzt geändert von wolfib; 10.12.2022, 20:26.

                          Kommentar


                            #14
                            Anderer Vorschlag. Die Angaben dazu verwendet man doch eh nur um nen bestimmten Parameter zu bekommen.
                            Wieso also nicht gleich ne Funktion definieren, die den Wert zurück gibt:
                            Code:
                            #define getParam_MotorRotationExtension ((knx.paramWord(12) & 0xFEDD) >> 2)
                            Dann bräuchte man nix kopieren und der Code sieht auch gleich schöner aus.
                            mumpf wäre das viel Aufwand für dich?
                            OpenKNX www.openknx.de | Kaenx-Creator | Dali-GW

                            Kommentar


                              #15
                              Warum generierst du nicht einfach eine Klasse die einfach die Zugriffe kapselt?

                              Dass nutzt man dann:
                              Code:
                              MyDevice device = new MyDevice(knx);
                              j
                              int param1 = device.param1();
                              Sieht besser aus als die ganzen defines

                              Kommentar

                              Lädt...
                              X