Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Wenn man für ein MemoryWrite nur 63 Bytes hat (dafür spricht auch, dass die MDT-Schnittstelle auch versucht hat, mit 63 zu schreiben, als der Stack noch 250 (genaue Zahl weiß ich nicht mehr) als APDU-Länge zurückgegeben hat), dann lohnt sich aber nicht wirklich, hier weiter zu forschen, ob man beim SAMD mehr als die 53 Bytes, die derzeit gehen, durch vergrößern des seriellen Puffers oder ähnlichem erreicht. Denn man würde wohl maximal 10 Bytes mehr pro Paket bekommen.
meine Idee ist, so zu tun, als wenn das L-Flag nicht gesetzt wäre. Ich hab es mal mit dem Busmonitor getestet, ein KO von einem offiziellen Gerät zu lesen, wenn da kein L-Flag gesetzt ist. Es kommt ein ACK, aber kein GroupValueResponse. Genau das will ich. Und es ist - glaube ich - die beste Lösung im Sinne der Buskommunikation.
Die Frage ist, ob es das Richtige ist, ein von der ETS gesetztes Flag eine Zeit lang nicht zu beachten.
Zu Deinem anderen Problem kann ich Dir leider nichts sagen, so tief bin ich in die Kommunikation noch nicht "herabgestiegen".
Sollte ein GroupValueResponse auf ein GroupValueRead überhaupt gesendet werden, wenn noch kein Wert vorliegt, somit der gesendete Wert ganz sicher inkorrekt ist?
Also ich wäre immer noch für die Rückmeldung Busy.
Wenn du ne normale GroupValueResponse schickst wird der Wert ja wieder geloggt, der nicht korrekt ist.
Wenn du nicht antwortest, wird das Telegramm nur unnötig wiederholt.
Wenn du ein Nack schickst wird es glaub auch erneut probiert.
Eine andere Art zu antworten fällt mir gerade nicht ein.
Aber mit iwas solltest auf jeden Fall antworten^^
Ich beschäftige mich gerade mit einem anderen Thema bei dem ich nicht weiter komme, bzw vll nen Denkfehler habe.
Ich bin grad dran den Extended Frame einzubauen...
Sind ja theoretisch maximal 252 Bytes circa für das Telegramm (eig 254 Bytes, aber 2 Bytes gehen für APCI und TPCI drauf).
Wenn ich jetzt einen MemoryWrite machen möchte verwende ich ja folgendes: Screenshot 2021-04-25 200804.png
Hier kann ich ja bei "number" (was die Länge angibt) maximal 63 eintragen.
Hat ein MemoryWrite ein Limit von 63 Bytes?
Oder übersehe ich da was?
So, ich habe einen Weg gefunden, der ein KO auch nicht größer macht - bin mir nur nicht sicher, wie "Sauber" das ist. Ich habe beim GroupObject ein neues commFlag New eingeführt, das jetzt beim GroupObject::readEnable() abgefragt wird. Solange das commFlag auf New steht, ist readEnable() immer false. Bei GroupObject::valueNoSend() wird dann das commFlag auf Ok gesetzt. Wenn man bei der Initialisierung dafür sorgt, dass alle KO ihren Startwert mit value() oder valueNoSend() gesetzt bekommen, funktioniert das zuverlässig, soweit ich das sehen konnte. Aber ich habe natürlich schon ein paar Stellen gefunden, die ich nicht richtig initialisiere . Aber das ist ja ein lösbares Problem.
Die allgemeine Frage ist eher: Sollte ein GroupValueResponse auf ein GroupValueRead überhaupt gesendet werden, wenn noch kein Wert vorliegt, somit der gesendete Wert ganz sicher inkorrekt ist?
Der NCN sendet dann für alle Ankommenden Requests ein NACK Busy zurück.
kenne ich. Ich könnte den auch einschalten... Das Problem hier wäre, dass das nur im Auto-ACK Modus funktioniert und damit für ALLE Telegramme ein Busy senden würde. Ich würde also für diese Zeit den Bus lahmlegen. Und wenn es in der Zeit einen Hänger geben sollte, dann würde der Modus ja nicht aufgehoben werden. Und ich will ja durchaus, dass das Modul seine Werte senden kann, ich will nur nicht, dass es zu früh antwortet.
Aber ich stöber mal im Stack. Vielleicht kann ich ja wirklich noch ne Methode ergänzen, die zur Laufzeit mal das L-Flag am KO deaktiviert udn ich aktiviere es wieder, sobald das erste Mal ein Wert reingeschrieben wurde. Oder ich baue in meinen Fork standardmäßig ein, dass ein von der ETS vergebenes L-Flag nur dann beachtet wird, wenn das KO gültige Werte hat. Muss mal ein bisschen debuggen...
Hab mir den Stack nicht angeschaut, aber eine Idee wäre es das Gerät in eine Art Busy-Mode zu stecken.
Der NCN sendet dann für alle Ankommenden Requests ein NACK Busy zurück.
Sie Datenblatt (Anhang) auf Seite 31.
Wenn du dann alle Werte hast, setzt den Busy Mode wieder auf False und Anfragen werden normal beantwortet.
Inwieweit das der Stack implementiert hat weiß ich aber wie gesagt nicht.
Ich hab noch eine Frage an die Leute, die sich im Stack auskennen: Kann ich irgendwie die Antwort auf einen ReadRequest eine Zeit lang verhindern?
Folgende Situation: Beim Startup meines Sensormoduls ist der KNX-Stack immer das Erste, was "Up" ist, und ich möchte auch, dass beim Startup Sensorwerte initial gesendet werden, sobald sie bekannt sind. Ich möchte natürlich auch, dass Sensorwerte beliebig gelesen werden können, deswegen haben die entsprechenden KO auch immer das L-Flag gesetzt.
Jetzt sind bestimmte Teile der Applikation erst nach ca. 2 Sekunden "da" (bei 1-Wire dauert es so lange, bis ich die ersten Sensorwerte habe). Wenn diese Sensorwerte beim Startup per ReadRequest angefragt werden, liefern sie 0, da das KO intern noch gar nicht beschrieben wurde, der KNX-Stack aber den ReadRequest beantwortet.
Abstrakt formuliert: Ich möchte, dass das L-Flag an einem KO erst funktioniert, nachdem sicher ist, dass das KO auch korrekt antworten kann, also mit einem nicht-initialen Wert.
Beispiel:
Modul startet, KO1 liefert normalerweise Tempeartur, Temperatursensor braucht 2 Sekunden für Startup
nach 1 Sekunde macht die Visu (warum auch immer) einen ReadRequest auf KO1
Modul sendet ein 0°C als Response
nach 2 Sekunden liefert der Temperatursensor einen Wert, KO1 sendet 22.5°C auf den Bus
Ich habe dann 1 Sekunde lang einen falschen Wert auf dem Bus, das möchte ich verhindern. Hört sich kurz an, aber in Logs/Diagrammen sieht so was immer "falsch" aus. Und ich möchte eigentlich das Lesen von nicht definierten Werten verhindern.
danke für den ausführlichen Bericht. Stellt sich (leider) so dar, wie ich es befürchtet habe - als zu energiehungrig. Ich bin eben mit Hardware nicht so erfahren, dass ich das bewerten kann, aber die Hardware soll ja auch nicht beliebig teuer werden.
als auch vom Netzteil über 5 V in den Step Down Wandler auf dem Nano 33 IoT,
oder aber direkt vom Netzteil in das 3.3 V Potential eingespeist
eigentlich ziemlich gut funktioniert (halbwegs vernünftiger WLAN-Empfang vorausgesetzt).
An der MicroBCU 2 (NCN5120) ging dann aber leider nichts mehr. Die Stromaufnahme ist zwar nur kurzzeitig zu hoch, aber das reicht leider aus um die Spannung soweit einbrechen zu lassen, dass es den Controller resettet.
Hier ein paar Scope-Aufnahmen mit folgenden Hinweisen:
Zeitbasis: 2 s / Div
gelb = Spannung (meist 2 V / Div, Ausnahme bei 20 V Versorgung, dann 5 V / Div)
blau = Strom (immer 50 mA / Div, 1 mV -> 1 mA)
die einzelnen Funktionen wurden künstlich verlängert, um das im Oszi besser zu sehen
die Dauer für das Herunterladen der Firmware und das Kopieren vom WiFi Chip war immer irgendwo zwischen 0.5 s und 2 s
die Firmware war im Prinzip ein "Blink" Beispiel mit der SNU-Update Funktionalität sowie vielen Debug-Ausgaben, insgesamt 36 kB
Hier mal exemplarisch mit einem Netzteil welches direkt in das 3.3 V Potential des Nano 33 IoT einspeist:
Anlagen der Spannung (hier 3.3 V) und der SAMD Chip ist in der "setup()"-Funktion, der WiFi Chip wird auch gestartet, nach kurzer Zeit aber wieder in den Reset-Zustand versetzt (Stromaufnahme = 0 mA)
Der SAMD geht in die "loop()" Funktion über (LED blinkt mit 0.25 Hz -> 2 s an, 2 s aus)
Das Firmwareupdate wird gestartet (dazu wird der Reset des WiFi Chip aufgehoben und ein Verbindungsversuch zum WLAN unternommen (per DHCP minimal 1.2 Sekunden, mit fester IP geht das schneller), die Stromaufnahme liegt (die Peak ausgenommen) Anfangs bei ca. 135 mA, danach bei ca. 120 mA
Die Firmware wird per http von einem Raspberry Pi in den Speicher des WiFi Chip heruntergeladen, die Stromaufnahme liegt (ebenfalls Peak ausgenommen) bei ca. 145 mA, geht dann auf ca. 120 mA zurück
Die WLAN Verbindung wird getrennt -> knapp über 50 mA
Die "WiFi.end()" Methode wird aufgerufen und das Kopieren der Firmware vom WiFi Chip in den SAMD gestartet
Das WiFi Modul wird über ein Low am Reset-Eingang in den Reset-Zustand versetzt (-> keine Stromaufnahme mehr)
Ein automatischer Reset des SAMD führt dazu, dass auch der WiFi Chip resettet wird
Der WiFi Chip wird wieder in den Reset-Zustand gebracht und die LED blinkt durch die neue Firmware mit 0.5 Hz -> 1 s an, 1 s aus)
Hier das ganze nochmal mit 5 V aus dem Netzteil (links) und 21 V (rechts, dazu hätte ich VFILT oder den V20V Ausgang des NCN2150 genommen, aber die Stromaufnahme geht leider nicht weit genug runter):
Hier mit aktiviertem "LowPowerMode" des WiFi Chips (die Stromaufnahme während dem Aufbau der Verbindung sowie dem Download des Firmware bleibt gleich, zwischendrin geht sie aber deutlich runter).
Den Stromanstieg beim Verbindungsversuch mit dem WLAN von ca. 70 mA auf knapp 170 mA macht der DCDC-Wandler des NCN5120 sehr kurz mit, dann aber ist die Spannung soweit eingebrochen, dass es zum Reset kommt.
Die Zeit, welche hier die Stromaufnahme zwischen den sicher geltenden 100 mA des NCN5120 und dem Maximalstrom von knapp 170 mA bei 5 V Versorgungsspannung liegt ist nicht sehr lang (der Peak ganz am Anfang auf 170 mA sind weniger als 40 ms), aber es reicht halt ohne zusätzliche Komponenten nicht aus.
Wenn man das weiter verfolgen wollte, würde ich mit einem großen Elko und/oder Goldcap (alternativ ganz kleiner Akku) versuchen, für die Zeitdauer des WLAN-Verbindungsversuchs und des Downloads die benötigte Energie bereitzustellen.
Allerdings wären das dann immer "gesondert zu behandelnde" Geräte mit extra Hardware, und eigentlich will man sowas nicht unbedingt haben, sondern am besten sollten alle Geräte eine Firmwarupdatemöglichkeit von Haus aus bieten.
ich würde den Stack bzw. die Firmware für das Raumsensormodul mumpf nutzen mit einer microBCU2 und einem Seeeduino XIAO (mit SAMD21) nutzen.
Der SAMD wird aus der BCU2 versorgen, RX und TX sind mit Pin 6 und 7 (Serial1) verbunden. Die Debug-ausgabe auf Serial 1 lautet "ERROR, TPUART not responding"
Sowohl der SAMD21 als auch die µBCU2 sind funktionsfähig. Ein einem einfach Sketch mit dem knxtpuart funktioniert die Kommunikation
Kennt jemand den Fehler bzw lässt sich der Fehler einkreisen?
Bin für jeden Hinweis dankbar.
Die Möglichkeit die Du nennst (also unter Nutzung des internen Flash Speichers) funktioniert natürlich, allerdings hat man dann wie auch von Dir erwähnt etwas weniger als die Hälfte des Flashs zum Zwischenspeichern des Binaries zur Verfügung. Das klappt zum Beispiel mit der ArduinoOTA Bibliothek gut: https://github.com/jandrassy/ArduinoOTA
Für den SAMD gibt es aber noch bessere Wege für ein OTA Update (Quellen und Beispiele sind im Core für den SAMD enthalten, siehe: https://github.com/arduino/ArduinoCo...ster/libraries). Für den Nano 33 IoT kommen folgende Möglichkeiten in Frage
SDU: Update von einer SD-Karte (die ist nicht auf dem Board drauf sondern müsste extern angeschlossen werden)
SFU: Update über einen externen Flash (z.B. auf dem MKR MEM Shield, also auch noch eine weitere Komponenten nötig)
SNU: Update über den Flash-Speicher des NINA W102 (der ist ja eh verbaut -> keine weiteren Komponenten nötig)
Ich plane die Nutzung der SNU Bibliothek (habe das aber wie gesagt noch nicht direkt mit dem knx-Stack getestet). Ein Beispiel für die Nutzung findest Du hier: https://github.com/arduino/ArduinoCo...sage/Usage.ino
Erwähnenswerte Features:
Den Update-Vorgang kann man direkt vom SAMD21 aus (also z.B. über einen externen Taster) oder aber auch (zumindest theoretisch, getestet habe ich es noch nicht) über KNX starten -> es wird für das Update keine IDE oder ein Rechner, sondern nur die einmalig exportierte Binärdatei benötigt
Das WiFi Modul muss nur für das Update eingeschaltet werden und kann danach wieder deaktiviert werden -> spart Strom (die genaue Stromaufnahme muss ich nochmal messen, während des Updates sind es für das ganze Board etwa 100 mA bei 5 V... das könnte knapp werden rein über KNX)
Die Binärdatei lädt der SAMD21 über das WiFi Modul in dessen Speicher von einer beliebigen URL via HTTP (das funktioniert mit jedem Server, NAS, Raspberry Pi, o.ä.):
Danach ist nur noch ein Reboot nötig, das wars. Das Ganze benötigt zusätzlich etwa 20 kB Flash und 300 Byte RAM
Falls das mit der Versorgung über den Bus doch irgendwie klappen sollte, könntest Du so ein ESP32 Modul evtl. mit der WiFiNINA Firmware flashen und per SPI an Deine KNX-Hardware dranhängen.
Wie genau die LoadProzedure das nochmalige übertragen der APP verstehe ich noch nicht ganz.
Werde mir das morgen mal weiter anshauen.
Aber schon mal danke für den Denkanstoß.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Einen Kommentar schreiben: