rtrbt
Administrators
-
Benutzer seit
-
Letzter Besuch
Alle erstellten Inhalte von rtrbt
-
Temperatur und Luftdruck liefern plötzlich falsche Werte
Das ist ein Framing-Error, das heißt das ein Paket entweder eine komplett ungültige Länge hatte (z.b. nur ein halber Header) oder dass die Länge im Header nicht zur echten Paketlänge gepasst hat. Das könnte eventuell das letzte Paket sein, das gerade halb gesendet wurde, als das Bricklet sich neu gestartet hat. Ich hätte eher die Hoffnung gehabt, dass da deutlich größere Zahlen stehen, dann hätte man in Richtung defektes Kabel o.Ä. gehen können. So ist das ein eher schwaches Indiz. Der steht seit Tagen hier rum und hat bisher maximal für 13 Sekunden die selbe Temperatur gemessen. Es scheint als bräuchte ich dein Dach hier.
-
Temperatur und Luftdruck liefern plötzlich falsche Werte
Normalerweise nur wenn du es aus deinem Programm heraus machst. Wenn du aber z.b. Stromversorgungsprobleme oder sowas hast kann das auch sporadisch passieren. Die (Koprozessor-)Bricklets warten beim Boot eine Sekunde auf eine Enumerate-Anfrage, wenn die nicht kommt schicken sie von sich aus ein Enumerate mit connection_type=..._CONNECTED. Deshalb meinte ich, dass du bei deinem Enumerate-Handler darauf reagieren solltest.
-
Betaversion der C/C++ Bindings für Mikrocontroller
Ja. Die Bricklet-Firmware generiert nur ein Callback-Paket wenn es voll wird, also wenn 30 bzw. 60 Samples im Ringbuffer des Bricklets liegen. Ich glaube, dass du die 300µs nicht kompensieren musst. Zumindest unter der Prämisse, dass du dir ein Signal auf die Accelerometer geben kannst zur Synchronisierung des Starts: Wenn du das kannst und danach die Callback-Pakete verarbeiten kannst, ohne dass die Ringbuffer der Bricklets sich füllen, dann verlierst du keine Messwerte, das heißt vom Startzeitpunkt aus hast du jeweils eine vollständige Messung. Die Messungen kannst du dann zueinander verschieben, sodass die Startzeitpunkte übereinander liegen und da der Sensor selbst mit einer festen Frequenz misst, ist ein leichter Jitter (also eine Latenzschwankung) auf dem Übertragungsweg egal. Die Übertragung ist ja über den Ringbuffer von der eigentlichen Datenerhebung entkoppelt.
-
Betaversion der C/C++ Bindings für Mikrocontroller
Nicht unbedingt, die Bricklets haben eine Tick-Rate von 1000Hz, es kann also nur ein Paket pro Millisekunde generiert werden. Das funktioniert im Bricklet folgendermaßen: Es hat einen Ringbuffer für 256 16-Bit-Werte, der vom Sensor über einen Interrupt befüllt wird. Wenn der Ringbuffer voll ist, werden die ältesten Werte überschrieben. Das Callback wird im normalen Bricklet-Tick, also jede Millisekunde generiert, dabei wird nachgesehen, ob ein älteres Callback-Paket noch nicht verschickt werden konnte, falls ja wird es nicht überschrieben. Du bekommst also, wenn du nicht mit den 1000 PPS des Bricklets schritthalten kannst, ältere Werte, aber nur soweit wie der Ringbuffer sie noch hat. Im Normalfall hast du noch mehr Buffer im Master Brick und Brick Daemon, aber wenn du die Mikrocontroller-Bindings mit dem HAT benutzt fallen die alle weg. Die Bindings selbst haben nur einen Buffer in den ein Paket passt, da bekommst du also nicht noch mehr Latenz. Ich denke, das musst du dann folgendermaßen machen: Du musst erstmal anhand der Durchsatztests eine Datenrate finden, bei der du die Callbacks alle verarbeitet bekommst. Dann kannst du die Callbacks aktivieren und erstmal alle weglesen, damit die Ringbuffer möglichst leer sind. Danach kannst du die Daten aufzeichnen und dabei durch händisches Schedulen der Callback-Ticks der einzelnen Bricklets (also tf_accelerometer_v2_callback_tick im Gegensatz zu tf_hal_callback_tick) sicherstellen, dass die Messungen nicht auseinanderlaufen. Vermutlich musst du dann noch einen Synchronisierungspunkt erzeugen, indem du einen definierten Impuls auf die Accelerometer gibst. Edit: die 300µs Übertragungszeit musst du nicht kompensieren, das Accelerometer misst währendessen ja weiter.
-
Temperatur und Luftdruck liefern plötzlich falsche Werte
Das ist für mich ein sehr starker Indikator dafür, dass das Bricklet sich resettet. Mir ist nur unklar warum das so oft passiert und warum du die Enumerations nicht siehst, wenn es wieder kommt.
-
Betaversion der C/C++ Bindings für Mikrocontroller
Aus dem Stehgreif würde ich sagen der Grund ist folgender: Bei 1,95MHz brauchst du im Idealfall ~ 300µs um ein (volles) Paket zu übertragen. Das Callback-Polling funktioniert intern so, dass die Bindings vom Bricklet ein Byte Daten abfragen, wenn das 0 ist, dann hat es gerade keine Daten zu senden. Dann wird das nächste Bricklet gepollt. Wenn du jetzt pech hast und Bricklet X hat sein Paket gerade noch nicht bereit, dann werden erst die drei anderen Bricklets abgefragt, bevor es wieder dran kommt. Das kostet im schlimmsten Fall (wenn alle anderen Bricklets Pakete bereit haben) ~900µs, also fast eine Millisekunde, also ist Bricklet X selbst wenn jetzt alles perfekt läuft aus dem Takt und hängt immer ein Paket hinterher. Ich vermute, dass du, wenn du da noch das letzte Paket rausquetschen willst (und vor allem im Takt bleiben), dann musst du die einzelnen Bricklets von Hand ticken, und zwar so, dass du erst wieder alle vier Bricklets tickst, wenn du alle vier Pakete der letzten Runde hast.
-
Temperatur und Luftdruck liefern plötzlich falsche Werte
Bevor du mit dem Brick-Viewer drauf gehst frag mal (mit einem Python-Script oder sowas) die Callback-Konfiguration und die aktuelle Temperatur ab (jeweils mit dem Getter, nicht die Temperatur per Callback abfragen).
-
Temperatur und Luftdruck liefern plötzlich falsche Werte
Nein die Nachricht geht nur an das Bricklet, nicht an den Sensor selbst. Am Code fallen mir spontan zwei Dinge auf: Da deine Callbacks value_has_to_change=true haben, ist nicht so richtig unterscheidbar, ob die Temperatur gleich ist oder das Bricklet nicht mehr kommuniziert. Würde der Rest deiner Software das überstehen, da false mitzugeben? Dann kannst du auch viel strikter das Bricklet resetten, wenn z.b. 10 Sekunden lang kein Wert mehr kam. Du reagierst nur auf IPCON_ENUMERATION_TYPE_AVAILABLE, wenn das Bricklet sich neu startet (warum auch immer) bekommst du aber _CONNECTED. Da musst du auch die Callbacks neu registrieren usw. Hast du in deinem Log die Unhandled enumeration Meldung bekommen?
-
Temperatur und Luftdruck liefern plötzlich falsche Werte
Moin, Der Fehler war auch wieder, dass du über Minuten zwar Callbacks bekommen hast, aber die immer den selben Wert hatten? (Im Gegensatz zu du hast keine Callbacks mehr bekommen) Was macht dein Daemon mit dem Bricklet wenn ein Enumerate kommt? Nur Callbacks registrieren oder einen Reset oder den Heater an oder sowas? Das allein eine Enumerierung und ein Callback-Neuregistrieren eine eventuell hängendes I2C wiederbelebt ergäbe keinen Sinn, dann müssten wir die These wohl zu Grabe tragen. Gruß, Erik
-
Absturz Hat Brick ?
Für die Nachwelt: Wir haben telefonisch rausgefunden, dass es ein Hardwareproblem mit doppelt belegten GPIOs ist. Im HAT-Schaltplan kann nachgesehen werden, welche GPIOs vom HAT verwendet werden.
-
Betaversion der C/C++ Bindings für Mikrocontroller
Hm das stimmt, ich hatte bei mir den core_freq-Eintrag drin. Ich schreibe mir mal auf die Liste, dass ich die core_freq zur Laufzeit abfrage und die SPI-Clock entsprechend kompensiere. Das klappt aber nur, wenn force_turbo=1 ist, sonst schwankt die core_freq zur Laufzeit und ich bekomme nie eine stabile Clock. Damit die Tests sinnvoll sind habe ich eine neue Speicherkarte mit dem aktuellen Raspberry Pi OS (vom 27.05., Kernel 4.9.118) genommen. Wenn die core_freq nicht gesetzt wird, ist sie auf 400 Mhz, dann führt meine Einstellung auf 1,4 MHz dazu, dass in Wirklichkeit 1,4/250*400 = 2,24 MHz anliegen, deshalb klappt die Kommunikation nicht Ich komme mit core_freq=250 auf ~1130 PPS mit dem alten hal_linux (1.4MHz), mit dem hal_raspberry_pi sind die Werte so wie ich sie dir geschrieben hatte, also 2000 bzw. 2650. Mit dem Kernel 5.4.51+ #1330 (den ich gerade über rpi-update geholt habe) sind die hal_raspberry_pi-Zahlen identisch, mit dem hal_linux komme ich gerade auf 990 PPS (1,4 MHz) bzw. 1170 PPS (1.95 MHz). Warum das bei dir nicht sauber funktioniert, wenn du die core_freq setzt ist mir noch unklar.
-
Betaversion der C/C++ Bindings für Mikrocontroller
Im Demo-Programm sehe ich spontan, dass du den hal_raspberry_pi includest, aber noch tf_hal_linux_init aufrufst. Das musst du mal anpassen und vermutlich auch dein Makefile.
-
Betaversion der C/C++ Bindings für Mikrocontroller
Das hängt vermutlich davon ab wie du die Callbacks tickst. Was benutzt du dafür im Moment? Abgesehen davon ist das vermutlich ein Effekt, den du nur beobachten kannst, weil das Programm praktisch permanent überlastet ist. Wenn du es schaffst alle Pakete die die Bricklets erzeugen zu verarbeiten, sollte das nicht mehr auftreten. Die Bricklets generieren Pakete ja mit einer festen Frequenz.
-
Betaversion der C/C++ Bindings für Mikrocontroller
Der neue HAL ist jetzt als hal_raspberry_pi in Beta 5 enthalten. Da es jetzt etwas offizieller ist, habe ich den HAL umbenannt und den unnützen spidev-Parameter entfernt.
-
Absturz Hat Brick ?
Dann starte den Brick Daemon mal von Hand mit "sudo brickd".
-
Absturz Hat Brick ?
Poste mal das aktuelle brickd.log.
-
Absturz Hat Brick ?
Moin, Das verwirrt noch mehr. Die Relays haben bei allen Tests mit den Programmen 60 Sekunden abwechselnd geschaltet? Oder ist das Problem (bei HAT Firmware 2.0.2, die 2.0.3 kannst du künftig wieder ignorieren) nochmal aufgetreten, aber die Ausgabe hat sich nicht geändert? Mit dem Brick Viewer passiert es aber weiterhin? Um den gebroadcasteten Paketen im brickd.log nachzugehen, habe ich vom Brick Daemon eine Variante gebaut, die mehr Informationen liefert, wenn ein Paket defekt ist. Die ist in zwei Varianten im Anhang, einmal die 2.4.1 + das Logging, einmal alle Änderungen die wir seit der 2.4.1 schon hatten + das Logging. Bitte installiere mal jeweils eine Variante davon, reproduziere das Problem mit dem Brick Viewer und hänge das entsprechende brickd.log an. (Wegen der Übersicht: Bennene erstmal das brickd.log, dass du schon hast, um, sonst werden die Dateien so groß) brickd-2.4.1~log_armhf.deb brickd-2.4.2~log_armhf.deb
-
HAT Brick - brickd startet nicht
Moin, Hast du den Kernel über rpi-update auf die 5.4. aktualisiert? (kannst du auf der Konsole mit uname -a prüfen) Mit dem Kernelupdate kamen Änderungen am Device-Tree, mit denen die HAT+Brick Daemon-Kombination Probleme hat. Wir haben im Moment zwei Ansätze, das Problem zu lösen. Es gibt eine neue Firmware für das HAT, die mit dem geänderten Device-Tree umgehen kann, aber die bekommst du nicht geflasht, weil du schon auf dem neuen Kernel bist. Deshalb Ansatz 2: Installiere mal die angehangene Version vom Brick Daemon mit sudo dpkg -i brickd-2.4.1_armhf.deb Diese Version verwendet nicht mehr das spidev des Kernels, sondern kommuniziert direkt mit dem BCM2835-Chip. Das sollte das Problem umgehen und nebenbei etwas performanter sein. Du kannst dann darüber die neue HAT-Firmware flashen. Gruß, Erik brickd-2.4.1_armhf.deb
-
Betaversion der C/C++ Bindings für Mikrocontroller
Sorry, dass die Antwort etwas gedauert hat. Das hat mich erst sehr verwirrt. Anscheinend bricht die Performance mit dem 5.4er Kernel ziemlich ein, obwohl das Kernelupdate eigentlich den gegenteiligen Effekt haben sollte (siehe z.b. hier) Ich habe deshalb (und weil es mit HAT und Brick Daemon Probleme mit dem neuen Kernel gibt) einen neuen HAL geschrieben, der direkt mit dem BCM2835-Chip spricht, der die GPIOs steuert. Falls du den HAL testen möchtest, habe ich ihn mal angehangen. Die Init-Funktion heißt noch tf_hal_linux_init und nimmt den spidev-Pfad, das wird aber ignoriert, ich habe das Interface noch nicht verändert, damit man einfacher hin und her wechseln kann. Du musst dann im Makefile folgende Änderung machen: SOURCES_HAL_LINUX := hal_linux/hal_linux.c \ hal_linux/gpio_sysfs.c \ hal_linux/utils.c \ ersetzen durch SOURCES_HAL_LINUX := hal_bcm2835/hal_linux.c \ hal_bcm2835/bcm2835.c \ Bei meinen Tests läuft der HAL bisher deutlich besser: ich komme auf 2000 PPS bei 1,4MHz und 2650 PPS bei 1,95MHz. hal_bcm2835.zip
-
Betaversion der C/C++ Bindings für Mikrocontroller
You could connect your Bricklet to a PC over a Brick. Then you can check the UID with Brick Viewer. Also the bindings print the UID of all attached Bricklets to the serial console when calling tf_hal_arduino_init(). (This only works if the Bricklet is detected, so only with a level shifter in your case)
-
Absturz Hat Brick ?
Hier das Testprogramm in zwei Variationen: Mit dem HAL der dem Brick Daemon entspricht und alternativ mit dem HAL, der direkt mit dem GPIO-Chip des Raspberry Pi kommuniziert. Du musst für beide Testprogramme erst den Brick Daemon auf dem Raspberry Pi mit "sudo systemctl stop brickd" beenden, danach kannst du die Programme laufen lassen. Ich habe dir den Source mal mit angehangen, beide Programme schalten die Relays im Wechsel und lesen die Monoflop-Informationen zurück. Poste mal bitte die Ausgaben beider Programme. embedded_c_hal_bcm2835 embedded_c_hal_linux main.c
-
Absturz Hat Brick ?
Anschlussfrage: Hast du während das HAT Strom hatte die Bricklets an/ab/umgesteckt? Edit: Da war ich zu optimistisch am frühen Morgen, ich habe mir einfach ein Hot-Plug-Problem erzeugt, das ist aber nicht das selbe Problem, das du hast.
-
Absturz Hat Brick ?
Moin, Ich habe hier mit dem Aufbau nochmal rumgetestet und konnte es jetzt reproduzieren. Bei mir reicht es, am Dual Relay an Port C Channel 0 zu schalten, dann werden sofort Timeouts hochgezählt. Passiert es bei dir auch, dass das Digital In an Port B schnell zu blinken anfängt, wenn du beim Relay an Port C Channel 1 schaltest?
-
Betaversion der C/C++ Bindings für Mikrocontroller
Hi, Are you using some kind of level shifter between the Uno and the bricklet? This is required as the Uno (and all other AVR based Arduinos) have a logic level of 5V, but the bricklets only work with 3.3V. Some Unos seem to understand the 3.3V high level as a 5V high level, but some don't. The error code -10 indicates that the bindings can't find the bricklet (see errors.h), so you either have the logic level problem from above, or you use the wrong UID. The bindings will print all found devices to the serial console when tf_hal_arduino_init runs. You can connect to the serial console (maybe add a delay(5000) at the top of your setup-function, so you don't miss the output) and check if the bindings see the bricklet under another UID.
-
Betaversion der openHAB-Bindings
Die Infos kannst du ignorieren, das ist ein bekanntes Problem. Ich habe aber bisher noch nicht rausgefunden, wo das herkommt. Edit: Funktioniert die Regel abgesehen von den Meldungen?