ST7789 Display Driver, Bildaufbau

  • Guten Morgen zusammen,

    Ich habe ein Waveshare 1,3" Display das ich mit einem Mikrocontroller von ST ansteuere. Angeschlossen habe ich das Display über SPI und ich kann dieses auch steuern.

    Zugegeben, ich habe eine Library von github genommen, da ich das Display eigentlich nur als mittel zum Zweck benötige und mich deshalb nur in den source code eingearbeitet habe.

    Nun habe ich ein Vertändnis problem.

    Ich möchte das Display nutzen um später einen flüssigen Bildablauf zu erhalten.

    Wie wird so ein flüssiger Bildaufbau erreicht?

    Ich habe die Vorstellung, dass ich das Bild welches auf dem LC-Display angezeigt wird in meinem Controller gespeichert ist und das neue Bild in einem zweiten Array gespeichert wird. Ich vergleiche nun jede Zelle der Beiden Arrays, und alles was in dem zweiten Array steht, wird auf das Display geschrieben.

    Oder liege ich damit komplett auf dem falschen weg.


    Mir würden bereits anregungen für weitere Suchen weiter helfen, ich hab diesbezüglich leider keinen Anschluss daran, wo ich suchen soll.

    Falls ihr noch Infos braucht, stelle ich die natürlich gern bereit.

    Freundliche Grüße

    Jens

  • Moin Neiwirger,

    und ob wir fragen haben...

    Ich habe ein Waveshare 1,3" Display das ich mit einem Mikrocontroller von ST ansteuere.

    Du hast wirklich einen Mikrocontroller angeschlossen oder meinst du den Grafikprozessor auf dem Display?

    Angeschlossen habe ich das Display über SPI und ich kann dieses auch steuern.

    Die SPI-Schnittstelle befindet sich auf einem Raspberry?

    ich möchte das Display nutzen um später einen flüssigen Bildablauf zu erhalten.

    Was meinst du mit flüssigen Bildaufbau? Videos?

    Schreibe mal was du eigentlich auf dem Display ausgeben möchtest.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Deine Intuition ist falsch. Üblicherweise wird einfach der gesamte Bildschirminhalt neu dargestellt. Und dein SPI Display buffert eh einen Frame. In deinem uC modifizierst oder erstellst du deinen nächsten Frame einfach komplett neu.

  • Guten Morgen,

    danke für die Antworten. Hier sind die gewünschten Infos:

    Du hast wirklich einen Mikrocontroller angeschlossen oder meinst du den Grafikprozessor auf dem Display?

    Ja, ich habe den STM32L476RG angeschlossen. Welcher auf den Grafikprozessor am Display zugreift und Bilddaten bereitstellt.

    Die SPI-Schnittstelle befindet sich auf einem Raspberry?

    Diese ist durch den STM32 bereitgestellt.

    Was meinst du mit flüssigen Bildaufbau? Videos?


    Schreibe mal was du eigentlich auf dem Display ausgeben möchtest.

    Folgendes habe ich vor:

    Ich habe einen MLX90640 IR-Sensor welcher 32x24 Pixel große Bilder bereitstellt. Diese Bilder möchte ich auf dem Display bereitstellen, um eine "Art" IR-Kamera auf zu bauen. Als refresh rate werden hier 64Hz im Datenblatt angegeben. Auch wenn ich diese nicht erreichen sollte, so würde ich gern aus dem Display das maximal mögliche rausholen.

    Den Sensor selbst habe ich noch nicht programmiert, da ich für diesen die Library gerne selbst schreiben möchte, aus Übungszwecken.

    Deine Intuition ist falsch. Üblicherweise wird einfach der gesamte Bildschirminhalt neu dargestellt. Und dein SPI Display buffert eh einen Frame. In deinem uC modifizierst oder erstellst du deinen nächsten Frame einfach komplett neu.

    Verstehe ich dich richtig, dass ich die Bilder per SPI nur auf den Grafikprozessor, welcher ein eigenen RAM hat, schiebe? Und eben dieser dann den Rest übernimmt?

    Vielen dank euch!

  • Ja, machst du doch jetzt auch schon. Ob man einen Frame oder 1000de hintereinander darstellt ist gleich.

  • Prinzipiell ist mir das klar.

    Ich frage mich nur ob mein Verständnis für den Bildaufbau, respektive der Einstellung dazu grundlegend falsch ist.

    Da ich sehen kann wie Zeile für Zeile auf den Bildschirm geschrieben wird. Ein unbewegtes Bild auf 240x240 Pixel skaliert aus

    einem Array heraus dauert etwa 1,5 sekunden.

    Aus dem Grund auch die Frage zu den grundsätzen des Bildaufbaus, da ich vermute, dass ich hier definitiv im Dunkeln tappe

    und die Möglichkeiten des ST7789 nicht voll ausschöpfe.

  • Ich kann nicht sehen, wie du mit Display arbeitest. Darum kann ich auch nichts dazu sagen, ob das nun gut oder schlecht ist, ob das Problem beim Treiber oder bei deiner Skalierung oder beim uC liegt.

    Nur sind die Moeglichkeiten hier beschraenkt: bestenfalls erlaubt das Display ein blockweisen Zugriff, so dass du also nur eine kleine Menge Pixel updaten kannst. Das geht zB in Grenzen mit den beliebten SSD1306. Aber fuer deinen Anwendungsfall hilft dir das halt nix, denn wenn man deine IR-Kamera bewegt, dann aendert sich nunmal das gesamte Bild. Nicht nur ein Teil.

    Man findet aber Belege dafuer, dass das Display zu 60FPS in der Lage ist:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Wenn man von 240**2 und 16 Bit pro Pixel ausgeht, dann braucht man dafuer ~7.200.000 MBit auf dem SPI. Das ist nicht ungewoehnlich schnell. Wie schnell steuerst du das Display an?

  • Moin Neiwirger,

    da du nicht geschrieben hast, welche Auflösung das LC-Display hat und auch nicht welcher Controller darauf werkelt, kann ich nur einen Rat geben, lese das Datenblatt des Controllers. Der sagt dir welche Geschwindigkeit auf dem SPI-Bus möglich ist.

    Der SPI-Bus kann mehrere MHz schnell sein. Du willst ein Bild von 32X24 Pixel darstellen. Wahrscheinlich in Farbe. Das wären 16Bit pro Pixel.

    Das Bild beginnt bei Zeile1 und Spalte1. Dann wird Zeilenweise übergeben.

    Da dein Display wahrscheinlich meht Pixel darstellen kann, musst du ja nicht das komplette Display beschreiben, sondern adressierst

    die erste Zeile und Spalte..

    Vorher machst du das Display halt schwarz. Dann erscheint in der Mitte dein Bild.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Guten Morgen,

    vielen Dank das ihr da so Geduldig mit mir seid. Ich bin jetzt mal so weit gekommen, dass ich das Bild Scrollen kann. Ein zuvor in den RAM geschriebenes Bild läuft flüssig von oben nach unten durch.

    Nun überlege ich mir, ob ich die Bilddaten außerhalb des Sichtbaren bereiches in den Ram schreiben kann, und dann das Bild durch laufen lasse.

    Dann habe ich dennoch die Problematik, das ich das Bild doch noch eher langsam auf die Grafikeinheit übertragen bekomme obwohl ich mit 20Mbits/s Arbeite.

    Ich bleib da dran, da mich das brennend interessiert.

    Grüße

  • Da du keinen Code zeigst, ist mir nicht so klar, was du da genau meinst. Wenn das Bild flüssig scrollt, warum ist es dann doch zu langsam?

  • Moin!

    @__deets__ , habe ich übersehen... SRI!!

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Guten Morgen zusammen,

    letzte Nacht habe ich es hinbekommen.

    Ich bin über einen englisch Sprachigen Blog gestolpert, in welchem der Autor genau mein Verständnisproblem beleuchtet, da es laut seiner Aussage

    einige gibt, die dasselbe Verständnisproblem haben.

    Es ist tatsächlich die Ansteuerung des SPI-Busses, die mir Probleme gemacht hat. Mir war nicht bewusst wie genau die Funktion HAL_SPI_Transmit() des ST Mikrocontrollers Arbeitet.

    Aus diesem Grund habe ich mit einer for-Schleife die Daten über diesen Befehl gesendet. Das heißt aber auch, dass jedes Mal die SPI-Verbindung aktiviert und deaktiviert wurde, was die Kostbare Zeit gekostet hat.

    Stattdessen kann man dieser Funktion ein Array direkt als Daten übergeben und die Menge an Daten, die man übertragen möchte (maximal 65536 Byte).

    So wird der Kanal einmal geöffnet, alle Daten übertragen und dann geschlossen. Zack, ist das Bild da!

    Ich bedanke mich für eure tatkräftige Unterstützung, auch wenn ich nicht unbedingt der redseligste Fragesteller bin.

    Falls jemand anderes ein Verständnisproblem dieser Art hat, schickt mir gerne eine PN, ich Versuche dann zu Helfen.

    Freundliche Grüße

    Jens

  • Moin Jens,

    danke für die Rückmeldung!

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!