Ankündigung

Einklappen
Keine Ankündigung bisher.

Entwicklung eines Tastsensors

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

    #46
    Zitat von thewhobox Beitrag anzeigen
    Über Common kannst du den alarmPool weitere Timer hinzufügen.

    Muss ich mir ansehen, sieht aber so aus als würde das mit dem "alarmPool1" auch aufm zweiten core laufen.

    Edit:
    Code:
    alarm_pool_add_repeating_timer_us(alarmPool1, LEDFPSTime_ms * 1000, (repeating_timer_callback_t)&FixedFPSLedLoop, nullptr, &fixedLEDTimer);
    nur den "alarmPool1" findet er mir nicht.
    Includes vergessen?
    Zuletzt geändert von cad435; 27.04.2025, 22:24.

    Kommentar


      #47
      ist den dual core rein kompiliert?
      OpenKNX www.openknx.de | OpenKNX-Wiki (Beta)

      Kommentar


        #48
        In der platfomio.custom.ini habe ich unter dem genutzten enviroment

        Code:
        build_flags =
           ${develop.build_flags}
          -D OPENKNX_DUALCORE
          -D DEVICE_TAS_UP_4X_TouchRGB​
        Also meines erachtens schon

        Ich krieg aber auch den Callback nicht rein gelinkt, weil er dafür einen static function call mit einer (bool*)(repeating_timer *rt) signatur haben will wenn ich das richtig verstehe.

        Also ich verstehs nicht was da laufen soll um ehrlich zu sein...
        Zuletzt geändert von cad435; 27.04.2025, 22:49.

        Kommentar


          #49
          Ich kann dir nachher mal den Code aus dem Dali GW raus suchen, den ich früher verwendet hat (vor Umstellung auf pio und rmt)
          OpenKNX www.openknx.de | Kaenx-Creator | Dali-GW

          Kommentar


            #50
            Das wär wohl Mal ein Ansatzpunkt.
            Danke!

            Kommentar


              #51
              Habe heute mal etwas programmiert (Die "Basisplatine" inklusive der galvanisch getrennten BCU ist angekommen)

              Fazit bis jetzt: mit Dualcore-Flag startet der Controller nicht:

              Code:
              0d 00:00:05: Common:                  Init firmware
              0d 00:00:05: Common:                  Debug logging is enabled!
              0d 00:00:05: Hardware<Flash>:         Initialize flash
              0d 00:00:05: FlashDriver<openknx>:      flash at 0x000FC000 with 16384 size
              0d 00:00:05: FlashDriver<knx>:          flash at 0x000F4000 with 32768 size
              0d 00:00:05: KNX:                       Set Callback
              0d 00:00:05: Common:                  Init knx stack
              0d 00:00:05: KNX:                       readMemory
              0d 00:00:05: KNX:                       RESTORED 00 01 00 FA 00 00 FF 22 01 00 08 01 11 05 00 01 04 00 01 60 00 01 00 00 FF 22 01 00 00 FA FF 22 01 01 00 00 19 BE 00 00 00 54 19 C0 01 00 00 04 FE 00 00 1A 14 05 00 01 00 00 00 02 00 00 1F 14 00 04 01 00 00 00 02 00 00 1F 18 00 04 FF FF FF FF FF FF FF
              0d 00:00:05: KNX:                       restoring data from flash...
              0d 00:00:05: KNX:                       saverestores 2
              0d 00:00:05: KNX:                       -12
              0d 00:00:05: KNX:                       .
              0d 00:00:05: KNX:                       -28
              0d 00:00:05: KNX:                       .
              0d 00:00:05: KNX:                       restored saveRestores
              0d 00:00:05: KNX:                       tableObjs 4
              0d 00:00:05: KNX:                       -28
              0d 00:00:05: KNX:                       .
              0d 00:00:05: KNX:                       -44
              0d 00:00:05: KNX:                       .
              0d 00:00:05: KNX:                       -55
              0d 00:00:05: KNX:                       .
              0d 00:00:05: KNX:                       -66
              0d 00:00:05: KNX:                       .
              0d 00:00:05: KNX:                       restored Tableobjects
              0d 00:00:05: Logic:                   Setting: Buzzer available: 0
              0d 00:00:05: Logic:                   Setting: RGBLed available: 0
              0d 00:00:05: Flash<Default>:          Load data from flash
              0d 00:00:05: Flash<Default>:            Validate slot 0
              0d 00:00:05: Flash<Default>:              No data found
              0d 00:00:05: Flash<Default>:            Validate slot 1
              0d 00:00:05: Flash<Default>:              No data found
              0d 00:00:05: Flash<Default>:            Abort: No valid data found
              0d 00:00:05: KNX:                     TP is connected
              $​

              Zusätzlich gibt es einen schönen Heartbeat, das wars aber dann auch schon

              ohne Dualcore-Flag startet er schon und ist über die ETS programmierbar...
              Allerdings blinkt die Programmier LED dann immer (eventuell einfach der normale Heartbeat?)
              wenn man den Programmierknopf drückt, dann blinkt die LED schneller und der Controller ist auch im Programmiermodus, da ich in diesem Zustand die Adresse & Applikation programmieren konnte


              Code:
              0d 00:00:05: Common:                  Init firmware
              0d 00:00:05: Common:                  Debug logging is enabled!
              0d 00:00:05: Hardware<Flash>:         Initialize flash
              0d 00:00:05: FlashDriver<openknx>:      flash at 0x000FC000 with 16384 size
              0d 00:00:05: FlashDriver<knx>:          flash at 0x000F4000 with 32768 size
              0d 00:00:05: KNX:                       Set Callback
              0d 00:00:05: Common:                  Init knx stack
              0d 00:00:05: KNX:                       readMemory
              0d 00:00:05: KNX:                       RESTORED 00 01 00 FA 00 00 FF 22 01 00 08 01 11 05 00 01 04 00 01 60 00 01 00 00 FF 22 01 00 00 FA FF 22 01 01 00 00 19 BE 00 00 00 54 19 C0 01 00 00 04 FE 00 00 1A 14 05 00 01 00 00 00 02 00 00 1F 14 00 04 01 00 00 00 02 00 00 1F 18 00 04 FF FF FF FF FF FF FF
              0d 00:00:05: KNX:                       restoring data from flash...
              0d 00:00:05: KNX:                       saverestores 2
              0d 00:00:05: KNX:                       -12
              0d 00:00:05: KNX:                       .
              0d 00:00:05: KNX:                       -28
              0d 00:00:05: KNX:                       .
              0d 00:00:05: KNX:                       restored saveRestores
              0d 00:00:05: KNX:                       tableObjs 4
              0d 00:00:05: KNX:                       -28
              0d 00:00:05: KNX:                       .
              0d 00:00:05: KNX:                       -44
              0d 00:00:05: KNX:                       .
              0d 00:00:05: KNX:                       -55
              0d 00:00:05: KNX:                       .
              0d 00:00:05: KNX:                       -66
              0d 00:00:05: KNX:                       .
              0d 00:00:05: KNX:                       restored Tableobjects
              0d 00:00:05: Logic:                   Setting: Buzzer available: 0
              0d 00:00:05: Logic:                   Setting: RGBLed available: 0
              0d 00:00:05: Flash<Default>:          Load data from flash
              0d 00:00:05: Flash<Default>:            Validate slot 0
              0d 00:00:05: Flash<Default>:              No data found
              0d 00:00:05: Flash<Default>:            Validate slot 1
              0d 00:00:05: Flash<Default>:              No data found
              0d 00:00:05: Flash<Default>:            Abort: No valid data found
              0d 00:00:05: KNX:                     TP is connected
              0d 00:00:06: Common:                  processAfterStartupDelay
              0d 00:00:06: ================================================================================
              0d 00:00:06:
              0d 00:00:06:         Open #           OpenKNX.de
              0d 00:00:06:         +----+
              0d 00:00:06:         # KNX            wiki.openknx.de - forum.openknx.de
              0d 00:00:06:
              0d 00:00:06: ======================== Information ===========================================
              0d 00:00:06: Device
              0d 00:00:06: ID:                      TAS_UP_4X_TouchRGB
              0d 00:00:06: Name:                    OpenKNX Touch Display RGB
              0d 00:00:06: Serial number:           00FA:13584F24
              0d 00:00:06: Firmware
              0d 00:00:06: Name:                    TAS-UP-4x-TouchRGB
              0d 00:00:06: Version:                 0.1.1
              0d 00:00:06: Number:                  FF22
              0d 00:00:06: KNX-Type:                TP (07B0)
              0d 00:00:06: CPU-Mode:                Single-Core (Temperature 36.0 °C)
              0d 00:00:06: Programming
              0d 00:00:06: Address:                 1.1.5 (Configured)
              0d 00:00:06: Version:                 0.1
              0d 00:00:06: Number:                  FF22
              0d 00:00:06: Runtime
              0d 00:00:06: Free memory:             209.797 KiB (min. 209.797 KiB)
              0d 00:00:06: Free stack size:         Core0: 3168 bytes
              0d 00:00:06: Watchdog:                Unsupported
              0d 00:00:06: --------------------------------------------------------------------------------
              0d 00:00:06:
              0d 00:00:06: Type "help" to view a list of available commands.
              0d 00:00:06: Logic:                     afterStartupDelay
              0d 00:00:06: Logic:                       prepareChannels
              0d 00:00:06: Common:                  Warning: The loop took longer than usual (26 >= 7)
              0d 00:00:06: Common:                  Send Heartbeat 3​
              Jemand eine Ahnung was da sein könnte?

              Habe vorerst mal meinen eigenen geschriebenen Code Auskommentiert, ändert aber nichts.
              Mein Ausgangscode war die Firmware vom SEN-UP1-8xTH.


              - cad435

              Kommentar


                #52
                Hast du auch die Methode loop1 und setup1 implementiert?

                Der Core0 wartet auf die Rückmeldung von Core1, dass dieser fertig ist. Sprich du musst openknx.setup1() aufrufen.
                Wenn diese nicht kommt, bleibt Core0 in einer Endlosschleife.
                OpenKNX www.openknx.de | Kaenx-Creator | Dali-GW

                Kommentar


                  #53
                  ah ja, das wars 👍

                  Danke!

                  Kommentar


                    #54
                    Und gleich die nächste frage:

                    Ich versuche gerade einen bzw. mehrere Parameter zu laden

                    image.png

                    Fangen wir mal mit der Sensitivität an,
                    Code:
                    ParamTTD_CAP_Sensitivity

                    Code:
                        uint8_t GlobalSen = ParamTTD_CAP_Sensitivity; //Get the sensitivity from the parameter
                        cap->SetGlobalSensitivity(GlobalSen); //Set the sensitivity of the CAP1188
                        logDebugP("SetGlobalSensitivity: %i", GlobalSen); //Print the sensitivity to the debug output​
                    Das ganze ist in der Setup()-function meines Moduls einprogrammiert.

                    Im Log bekomme ich aber jedes mal
                    Code:
                    TDD_Module:              SetGlobalSensitivity: 0
                    Es gibt da noch dieses Flash-Modul, aber ich bin bis jetzt eigentlich davon ausgegangen, dass ich mich darum nicht kümmern muss, da die KNX-Facade das regelt?
                    Wenn ich mir code ansehe der die Flash-Klasse verwendet, dann kann ich da überhaupt keinen Bezug zur knxprod.h erkennen, da werden wild nacheinander bits und bytes aus dem flash gelesen.

                    Daher bin ich nun etwas verwirrt was im Endeffekt was genau macht.

                    - cad435

                    Kommentar


                      #55
                      Zitat von cad435 Beitrag anzeigen
                      Ja ich weis, multicore ist schwer zu debuggen, aber ich glaube die funktionen sind unabhängig genug, dass man das eine unabhängig vom anderen debuggen kann.
                      Ging mir da weniger um die allgemeinen Herausforderungen mit nebenläufigen Implementierungen, sondern die Nutzung eines Hardware-Debuggers: Das lief bei mir mit Dual-Core auf RP2040 bislang nicht brauchbar; will an dieser Stelle aber nicht behaupten dass das nicht grundsätzlich funktionieren könnte.

                      Nutzung des zweiten Kerns und noch mehr die Nutzung von Interrupts sollten nicht der erste Lösungsansatz sein. Soweit ich das aus Deinen Postings entnehmen kann, geht es darum alle etwa 20ms die LED-Farbe zu aktualisieren (das wäre für mich noch kein Indikator für den Bedarf), wobei ich nicht erkennen kann wie lange die Kommunikation mit den LEDs dauert. Mehr als 1ms?

                      Um ein besseres Gefühl für den Laufzeitbedarf zu erhalten, kannst Du das Debug-Flag OPENKNX_RUNTIME_STAT nutzen. Das liefert dann über die Konsole per Befehl (rundtime ...) Statistiken über die Ausführungsdauer der verschiedenen Module. Bin mir gerade nicht mehr sicher, ob ich den core1-Support schon integriert hatte (2023..) oder der noch in einem Entwicklungsbranch liegt. Wichtig: Alles was in Interrupts passiert wird nicht korrekt gemessen und dem gerade ausgeführten Modul zugeschlagen. Und die Messsung, sowie auch die Ausgabe der Messergebnisse auf der Konsole haben einen gewissen Overhead.
                      OpenKNX www.openknx.de | StateEngine: Universelle Zustandsautomaten in KNX | OpenKNX Konfigurationstransfer

                      Kommentar


                        #56
                        Zitat von cad435 Beitrag anzeigen
                        Ich versuche gerade einen bzw. mehrere Parameter zu laden
                        Ich stolpere da gerade über Deinen Text mit den Hinweisen zur Werteingabe (und den Fehlenden Spinner rechts im Eingabefeld): Kann es sein, dass der Parameter als String und nicht als passender Integer definiert ist?
                        Ich würde da zwei Parameter-Typen mit Wertebereich 0..1016 (>=10Bit) und 0..127 (>=7Bit) erwarten.
                        OpenKNX www.openknx.de | StateEngine: Universelle Zustandsautomaten in KNX | OpenKNX Konfigurationstransfer

                        Kommentar


                          #57
                          hmm, also interrupts hab ich in meinem "direkten" code eigentlich nicht drinnen.

                          Die LED's sind ws2812b Digitale LED's. angesteuert über FastLED. Der RP2040 ist seit 2021 in FastLED integriert. Wenn ich diesen Post https://github.com/FastLED/FastLED/pull/1261 richtig interpretiere nutzt die übertragung den PIO Kern des RP2040. Die übertragungszeit sollte damit quasi nicht vorhanden sein.

                          Die Library nutzt einen DMA Interrupt um Daten vom Memory ins PIO zu schaufeln, aber der sollte Zeitunkritisch sein.


                          ich würde den zweiten Kern für die ganze Color-Magic nutzen, da das eigentlich total unkritisch ist. Und eben meiner Meinung nach "nebenher" abgekoppelt von allem was KNX macht laufen kann.

                          momentan debugge ich allerdings noch mit dem Logger, da ich mir noch keine Zeit genommen hab meine BlackMagicProbe zu suchen (Ja ich weis, ich weis...)

                          Danke für den Hinweis mit dem Debugger, falls das gar nicht funktioniert debugge ich halt im SingleCore modus dann!

                          - cad435

                          Kommentar


                            #58
                            Die Sensitivity soll nach besten Wissen und Gewissen als Zahl implementiert sein:

                            Code:
                            <ParameterType Id="%AID%_PT-CAP1188Sensitivity" Name="CAP1188Sensitivity">
                                            <TypeRestriction Base="Value" SizeInBit="8">
                                              <Enumeration Text="Gain x128" Value="0" Id="%ENID%" />
                                              <Enumeration Text="Gain x64" Value="1" Id="%ENID%" />
                                              <Enumeration Text="Gain x32" Value="2" Id="%ENID%" />
                                              <Enumeration Text="Gain x16" Value="3" Id="%ENID%" />
                                              <Enumeration Text="Gain x8" Value="4" Id="%ENID%" />
                                              <Enumeration Text="Gain x4" Value="5" Id="%ENID%" />
                                              <Enumeration Text="Gain x2" Value="6" Id="%ENID%" />
                                              <Enumeration Text="Gain x1" Value="7" Id="%ENID%" />
                                            </TypeRestriction>​
                            </ParameterType>
                            Die Threshholds sind texte, da hab ich mir einen Conversion-Helper geschrieben.
                            Die Size der Texte ist auch mit "+1" definiert für die Nullterminierung. Das würde ich aber erst angehen, wenn die zahlen funktionieren, da ein Layer an komplexität mehr.

                            - cad435


                            Der momentane Stand ist hier einzusehen:
                            https://github.com/cad435/TAS-UP-4x-TouchRGB (ja ich weiß, ist sicherlich nicht schön, kommt alles noch, zuerst will ich mal verstehen was geht )
                            Zuletzt geändert von cad435; 18.05.2025, 22:01.

                            Kommentar


                              #59
                              Zitat von cad435 Beitrag anzeigen
                              hmm, also interrupts hab ich in meinem "direkten" code eigentlich nicht drinnen.
                              D.h. Du setzt nicht auf den Aufruf über Alarm-Pool?

                              Zitat von cad435 Beitrag anzeigen
                              ich würde den zweiten Kern für die ganze Color-Magic nutzen, da das eigentlich total unkritisch ist. Und eben meiner Meinung nach "nebenher" abgekoppelt von allem was KNX macht laufen kann.
                              Das wird wahrscheinlich aber auch nicht komplett unabhängig von dem passieren was auf dem KNX-Bus läuft? Zugriffe auf den knx-Stack aus core1 solltest Du tunlichst unterlassen, da die Implementierung nicht auf eine nebenläufige Nutzung ausgelegt ist.

                              Zitat von cad435 Beitrag anzeigen
                              Die Threshholds sind texte, da hab ich mir einen Conversion-Helper geschrieben.
                              Die Size der Texte ist auch mit "+1" definiert für die Nullterminierung. Das würde ich aber erst angehen, wenn die zahlen funktionieren, da ein Layer an komplexität mehr.
                              Warum der Umweg über Strings? Du erlaubst ausschließlich ganzahlige Eingabewerte in einem festgelegten Intervall. Das wird direkt von ETS als Eingabewert unterstützt.
                              OpenKNX www.openknx.de | StateEngine: Universelle Zustandsautomaten in KNX | OpenKNX Konfigurationstransfer

                              Kommentar


                                #60
                                Zitat von coko Beitrag anzeigen
                                D.h. Du setzt nicht auf den Aufruf über Alarm-Pool?
                                Momentan nicht, da ich ihn nie zum laufen gebracht habe.

                                Das wäre die implementierung im Loop1

                                Code:
                                if (millis() - lastTimeLEDRun >= LEDFPSTime_ms) //If the time is up, run the LED's
                                    {
                                        FixedFPSLedLoop(); //Run the LED's
                                        lastTimeLEDRun = millis(); //Set the last time the LED was run to the current time
                                    }​
                                Zitat von coko Beitrag anzeigen
                                Zugriffe auf den knx-Stack aus core1 solltest Du tunlichst unterlassen
                                Habe ich auch nicht vor. Wüsste auch nicht wieso. LED Farbe wird eventuell über den bus gesendet, aber die Variable wird auch vom "Loop0" abgeholt und gesetzt.

                                Der loop1 würde dann die Farbe nehmen, die Dimmwerte berechnen und sie an den LED-Controller übergeben.

                                Zitat von coko Beitrag anzeigen
                                Warum der Umweg über Strings?
                                Unwissenheit?

                                Was müsste ich denn da für einen Parameter-Type verwenden?

                                Ist das das Problem warum der
                                Code:
                                ParamTTD_CAP_Sensitivity
                                nicht gespeichert wird? Weil dieser wird ja als Integer (hoffe ich) gewertet

                                Kommentar

                                Lädt...
                                X