fix(P4): Hintergrundbeleuchtung kommt sofort - Bridge braucht zwei Latches (1.9.12) #81
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
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
|
||||
ws7_bridge_write(0xAB, (uint8_t)(255 - brightness));
|
||||
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));
|
||||
}
|
||||
|
||||
// =====================================================================================
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user