Forum: Mikrocontroller und Digitale Elektronik Was tun gegen flackerndes Display am STM32F746Disco?


von J. T. (chaoskind)


Lesenswert?

MoinMoin,

eine weitere Frage im Zusammenhang mit meinem GameOfLife Gebastel. Das 
Display flackert. Und zwar in unterschiedlichen Mustern, je nach dem wie 
lange es dauert, ein neues Bild zu zeichnen.

Ich hab vor Ewigkeiten mal eine HandsOn-Session von ST mitgemacht, da 
hieß es sinngemäß:"Die Displays haben 2Layer. Zeige den einen Layer und 
bearbeite den anderen, damit es nicht flackert".

Genau das klappt aber nicht, da jedesmal beim Layerwechsel ein Flackerer 
erzeugt wird.

Wenn ich aber nur einen Layer benutze und man quasi direkt jedes gemalte 
Pixel auftauchen sieht, ist das Flackern deutlich geringer, es ergibt 
sich aber ein anderes Problem. Es sieht aus, als hätte man eine PWM auf 
dem Bild die von links nach rechts und von oben nach unten immer weniger 
wird.

Ist ja auch irgendwie logisch, wenn man sich vor Augen hält:

BildMalen()
Bildschirm leeren ---> erstes Pixel an 0,0 malen ---> letztes Pixel 
erster Reihe malen x,0 ---> ..... ---> erstes Pixel letze Reihe malen 
0,y ---> letztes Pixel letzte Reieh malen x,y ---> wieder von vorn.

Das erste Pixel wird natürlich viel länger gezeigt als das letzte. Das 
ist also auch kein Zustand.

Kennt jemand von euch eine Möglichkeit, das Flackerfrei hinzubekommen? 
Ich habe Videos von dem Discoboard gesehen, wo das Display schön flüssig 
lief. Prinzipiell muss das also gehen.

MfG Chaos

von Max D. (max_d)


Lesenswert?

Das Display nicht leeren.
einfach neue Pixel über alte schreiben.
damit ändern sich visuell nur die Pixel die geändert werden müssen ohne 
flackern.
Der DMA hilft den framebuffer schnell genug auf das Display zu schubsen 
um es für den Nutzer in "einem Guss" aussehen zu lassen.

von J. T. (chaoskind)


Lesenswert?

Max D. schrieb:
> Das Display nicht leeren.
> einfach neue Pixel über alte schreiben.
> damit ändern sich visuell nur die Pixel die geändert werden müssen ohne
> flackern.
> Der DMA hilft den framebuffer schnell genug auf das Display zu schubsen
> um es für den Nutzer in "einem Guss" aussehen zu lassen.

Aber das Display leeren passiert doch auf dem unsichtbaren/nicht 
angezeigtem Layer? Das dürfte doch eigentlich keinen Einfluss haben?
Bisher leere ich den Layer vor dem neuschreiben, damit ich nur lebende 
Zellen zeichnen muss, was schneller ist, als jede Zelle zu zeichnen.

Wenn dass dann fertig gemalt ist, wechsle ich den Layer.

Und das ist beim durchsteppen auch sehr deutlich zu sehen. Es gibt einen 
Flackerer beim Layerwechsel. Selbst wenn ich beide Layer leer habe, also 
gar nichts mit ihnen gemacht habe, und dann den Layer wechsel, gibt es 
diesen Flackerer.
Von daher glaube ich nicht, dass es einen Unterschied macht, ob ich den 
Layer vorher leere oder nicht?!

von Max D. (max_d)


Lesenswert?

Dein displaytreiber macht dann wohl den Fehler das display zu löschen 
bevor er den neuen layer schiebt.

von Arc N. (arc)


Lesenswert?

J. T. schrieb:
> Aber das Display leeren passiert doch auf dem unsichtbaren/nicht
> angezeigtem Layer? Das dürfte doch eigentlich keinen Einfluss haben?
> Bisher leere ich den Layer vor dem neuschreiben, damit ich nur lebende
> Zellen zeichnen muss, was schneller ist, als jede Zelle zu zeichnen.
>
> Wenn dass dann fertig gemalt ist, wechsle ich den Layer.

Wirklich den Layer? Nicht das übliche Doublebuffering synchron zum 
VSync/VBlank?
Siehe bspw. AN4861 Abschnitt 4.4.2 LTDC and DMA2D/CPU synchronization

von J. T. (chaoskind)


Lesenswert?

Arc N. schrieb:
> Siehe bspw. AN4861 Abschnitt 4.4.2 LTDC and DMA2D/CPU synchronization

Werd ich mir mal zu Gemüte führen. Wo du dass erwähnst, dass könnte in 
die richtige Richtung gehen. Ich erinner mich dunkel, als ich angefangen 
habe, war in include files nur ein Layer definiert. Also hab ich die 
Layer folgendermaßen erstellt

init(layer0)  //Die Adresse gabs in den includes
init( (layer0 + (4*480*272) ).

4mal wegen ARGB 480mal wegen X Pixeln und 272 mal wegen den Y Pixeln. 
Das sollte doch soweit passen?

Und der DMA wurde zwar initialsiert von CubeMX, aber benutzt wird er 
irgendwie nirgendwo ;D.

Naja mal schauen was mir die AN so darüber erzählen kann.

MfG Chaos

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.