From 6bf046801ce8f20f548a801367c9a6812a44da5f Mon Sep 17 00:00:00 2001 From: raw-designs Date: Thu, 3 Sep 2026 15:45:50 +0200 Subject: [PATCH] fix(P4): Hintergrundbeleuchtung kommt sofort - Bridge braucht zwei Latches (1.9.12) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der Nutzer hat es im Gegenlicht gesehen: Das Bild steht nach 446 ms fertig da, nur die Beleuchtung kommt Sekunden später. Die gesamte Suche im Zeichenablauf lief damit am falschen Ort - die Messungen dort waren alle unauffällig, weil dort auch nichts war. Der Referenz-Sketch (dsi-test.ino, enableBacklight) setzt 0xAB/0xAA zweimal mit delay(100) dazwischen, ausdrücklich "sicherheitshalber Helligkeit noch einmal übernehmen". jc_backlight_set() schrieb die Sequenz nur einmal. - 0xAB/0xAA werden jetzt wiederholt, Pause über WS7_BACKLIGHT_LATCH_MS (20). - 0xAD (Freigabe) nur noch beim ersten Aufruf statt bei jeder Änderung; der Referenzcode setzt sie ebenfalls nur einmal, und sie erneut zu schreiben stößt die Helligkeitsstufe der Bridge neu an. - jc_backlight_set() meldet seine Dauer selbst; die doppelte Messung im .ino entfällt. Beide Panel-Varianten mit arduino-cli gegengebaut. Co-Authored-By: Claude Opus 5 --- P4_Display_Firmware/Changelog.txt | 13 +++++++++ P4_Display_Firmware/P4_Display_Firmware.ino | 8 +----- P4_Display_Firmware/board_bringup.c | 29 +++++++++++++++++++-- P4_Display_Firmware/pins_config.h | 8 ++++++ 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index b3b1973..c15fe0d 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -1,3 +1,16 @@ +Version 1.9.12: +- Die Hintergrundbeleuchtung kommt beim Wechsel in den und aus dem Standby jetzt sofort. + Bisher stand das Bild bereits fertig da - im Gegenlicht war es zu sehen -, blieb aber + mehrere Sekunden dunkel. Das war die ganze gesuchte Verzögerung. +- Ursache: Die Bridge übernimmt eine neue Helligkeit nicht zuverlässig beim ersten Mal. Der + Beispielcode von Waveshare setzt sie deshalb zweimal, mit einer Pause dazwischen, + ausdrücklich „sicherheitshalber". Genau diese Wiederholung fehlte. +- Die Panel-Freigabe wird nur noch beim ersten Mal gesetzt. Sie erneut zu setzen, während die + Beleuchtung läuft, stößt die Helligkeitsstufe der Bridge neu an; der Beispielcode setzt sie + ebenfalls nur ein einziges Mal. +- Jeder Helligkeitswechsel meldet jetzt seine Dauer. Bleibt die Beleuchtung wieder hinterher, + lässt sich die Pause zwischen den beiden Übernahmen über WS7_BACKLIGHT_LATCH_MS erhöhen. + Version 1.9.11: - Endlose Startschleife behoben: Beleuchtung an, nie ein Bild. Der P4 startet sich nach dem Einschalten absichtlich einmal neu, weil das Panel sonst schwarz bleibt. Die Absicherung diff --git a/P4_Display_Firmware/P4_Display_Firmware.ino b/P4_Display_Firmware/P4_Display_Firmware.ino index bf2a5f2..f0aeffe 100644 --- a/P4_Display_Firmware/P4_Display_Firmware.ino +++ b/P4_Display_Firmware/P4_Display_Firmware.ino @@ -80,13 +80,7 @@ static void onState(const MachineState& st) { } if (bl < 0) bl = 0; if (bl > 100) bl = 100; if (bl != s_lastBacklight) { - // Vermessen: Rund um jeden Helligkeitswechsel hing die Bedienung bisher ein bis - // zwei Sekunden. Der Schreibzugriff geht ueber denselben I2C-Bus wie der Touch. - uint32_t t0 = millis(); - hal_backlight(bl); - uint32_t dt = millis() - t0; - if (dt > 50) esp_rom_printf("[HAL] %u ms: Helligkeit %d %% gesetzt, brauchte %u ms\n", - (unsigned)millis(), bl, (unsigned)dt); + hal_backlight(bl); // meldet seine Dauer selbst, siehe jc_backlight_set() s_lastBacklight = bl; } } diff --git a/P4_Display_Firmware/board_bringup.c b/P4_Display_Firmware/board_bringup.c index cbcff61..c4f7ed3 100644 --- a/P4_Display_Firmware/board_bringup.c +++ b/P4_Display_Firmware/board_bringup.c @@ -235,9 +235,34 @@ void jc_backlight_set(int percent) if (percent > 100) percent = 100; if (percent < 0) percent = 0; uint8_t brightness = (uint8_t)((255 * percent) / 100); - ws7_bridge_write(0xAD, 0x01); // Panel-/Backlight-Freigabe - ws7_bridge_write(0xAB, (uint8_t)(255 - brightness)); + uint8_t wert = (uint8_t)(255 - brightness); + int64_t t0 = esp_timer_get_time(); + + // Die Bridge uebernimmt eine neue Helligkeit nicht zuverlaessig beim ersten Mal. Der + // Beispielcode von Waveshare setzt sie deshalb zweimal, mit einer Pause dazwischen, + // ausdruecklich "sicherheitshalber". Uns fehlte diese Wiederholung: Das Bild stand + // dann fertig da, blieb aber dunkel, bis die Uebernahme irgendwann doch griff - beim + // Ein- und Ausschalten des Standby waren das mehrere Sekunden. + // + // Die Freigabe (0xAD) bleibt beim ersten Aufruf, danach nicht mehr: Sie erneut zu + // setzen, waehrend die Beleuchtung laeuft, stoesst die Helligkeitsstufe der Bridge neu + // an - der Beispielcode setzt sie darum ebenfalls nur ein einziges Mal. + static bool freigegeben = false; + if (!freigegeben) { + ws7_bridge_write(0xAD, 0x01); // Panel-/Backlight-Freigabe + vTaskDelay(pdMS_TO_TICKS(20)); // wie im Beispielcode: Bridge setzen lassen + freigegeben = true; + } + + ws7_bridge_write(0xAB, wert); ws7_bridge_write(0xAA, 0x01); // Helligkeit uebernehmen + vTaskDelay(pdMS_TO_TICKS(WS7_BACKLIGHT_LATCH_MS)); + ws7_bridge_write(0xAB, wert); // Wiederholung, siehe oben + ws7_bridge_write(0xAA, 0x01); + + esp_rom_printf("[HAL] %u ms: Helligkeit %d %% gesetzt, brauchte %u ms\n", + (unsigned)(esp_timer_get_time() / 1000), percent, + (unsigned)((esp_timer_get_time() - t0) / 1000)); } // ===================================================================================== diff --git a/P4_Display_Firmware/pins_config.h b/P4_Display_Firmware/pins_config.h index bea1948..4e03ebc 100644 --- a/P4_Display_Firmware/pins_config.h +++ b/P4_Display_Firmware/pins_config.h @@ -182,6 +182,14 @@ // auf I2C antwortet. Meldet sich 0x14 beim Start nicht, diesen Wert erhoehen. #define WS7_TOUCH_POWER_MS 120 +// Pause zwischen den beiden Helligkeitsuebernahmen der Bridge. Sie uebernimmt eine neue +// Helligkeit nicht zuverlaessig beim ersten Mal; der Beispielcode von Waveshare setzt sie +// darum zweimal. Ohne die Wiederholung stand das Bild fertig da, blieb aber dunkel - beim +// Wechsel in den und aus dem Standby mehrere Sekunden lang. Der Beispielcode wartet 100 ms; +// weniger genuegt hier, weil die Wiederholung ohnehin folgt. Bleibt die Beleuchtung wieder +// hinterher, diesen Wert erhoehen. +#define WS7_BACKLIGHT_LATCH_MS 20 + // Prueffarbbalken statt Oberflaeche anzeigen. Sie entstehen im DSI-Baustein selbst und // benutzen weder Bildspeicher noch LVGL. Damit laesst sich trennen, ob die Anzeigekette // bis zum Panel arbeitet (Balken sichtbar) oder nicht (schwarz). Nur zur Fehlersuche. -- 2.54.0