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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von J. T. (chaoskind)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Arc N. (arc)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.