Effiziente Anzeige von einfachen Texten / Grafiken auf einem Farb-LCD von ARM

12

Wie sollte man beim Entwerfen eines ARM-basierten Geräts, das einfache Grafiken auf einem Farb-LCD anzeigen soll, vorgehen, um schnelle Aktualisierungen zu ermöglichen, vorzugsweise ohne an einen bestimmten ARM- oder LCD-Hersteller gebunden zu sein? In meinem aktuellen Projekt wird eine Schwarzweißanzeige verwendet, die über den SPI-Anschluss eines PIC blitzschnell gesteuert werden kann (Neuzeichnen einer komplexen Anzeige in 1/60 Sekunde). Es scheint, dass herkömmliche Farb-LCD-Displays einen SPI-Anschluss haben, aber selbst das Befüllen eines 160 x 120-LCD mit einer Volltonfarbe würde 30 ms dauern, und ein 320 x 240 würde im besten Fall 120 ms dauern (10-MHz-Takt).

Wenn man die Controller-Pins schonen könnte, könnte der Parallelmodus besser sein, aber ich kenne keine familienunabhängige Methode zum Anschließen der parallelen Schnittstelle, ohne dass drei separate Speicheranweisungen für jedes Pixel erforderlich sind (eine zum Einstellen der Daten, eine, um den Taktausgang hoch und eine, um ihn niedrig zu takten). Einige ARM-Chips haben Speicher-Bus-Schnittstellen, aber diese möchten oft Dinge wie Multiplexen von Adressen und Daten oder viele Pins für die Ausgabe irrelevanter Adressbits (das LCD würde nur ein Adressbit benötigen).

Ein interessanter Ansatz für die ILI9320 von ILITEK oder die HD66789 von Renesas wäre die Verwendung einer CPLD zur Konvertierung von SPI in parallele Daten und die Verwendung eines Modus, der ein Pixel pro Bit ausgibt. Wenn Sie sich das Datenblatt von Renesas ansehen, können Sie möglicherweise mit minimaler Hardware Pixel-pro-Bit-Schreibvorgänge durchführen (keine CPLD erforderlich), indem Sie alle parallelen Datenbits auf den seriellen Datenpin legen und den seriellen Modus für alles außer Pixel verwenden Schreiben und Verwenden der Vergleichs- / Maskenfunktionen, so dass entweder nur Nullen Pixel transparent sind und nur Einsen Pixel ausgewählte Bits in GRAM setzen, oder nur Einsen Pixel transparent sind und nur Nullen Pixel ausgewählte Bits löschen. Der Abschnitt "Eigenschaften" des IKITEK-Datenblattes weist auf eine ähnliche Funktionalität hin, die Registerkarten enthalten jedoch keine

Angenommen, der Code zeigt hauptsächlich einfarbigen Text und Grafiken. Der ideale Ansatz wäre die Verwendung einer CPLD, um den SPI-Port des ARM mit dem parallelen Port des Displays zu verbinden und das Laden der CPLD mit Vordergrund- / Hintergrundfarben zu ermöglichen. Dies wäre besonders schön, wenn man "transparente" Pixel schreiben könnte. Bei einer Schriftart als zweifarbige Bitmap können die Schriftartdaten einfach direkt in den SPI-Port geladen werden. Auf diese Weise könnten Schriftdaten alle zwei ARM-Takte mit einer Rate von einem Pixel angezeigt werden. Andererseits würde eine CPLD, die ausreicht, um eine solche Anzeigesteuerungsaufgabe auszuführen, etwa 2 USD kosten.

Wie lässt sich ein ARM am besten mit einem Farb-LCD verbinden, wenn hauptsächlich einfarbiger Text oder einfache (z. B. 16-Farben- oder 64-Farben-) Grafiken angezeigt werden sollen?

Bearbeiten

Ich habe viele LCD-Anzeigeprojekte mit vielen Arten von LCDs durchgeführt, einschließlich Zeichenmodus-LCDs, benutzerdefinierten 3: 1-Multiplex-LCDs mit eigener Ansteuermethode, grafischen Schwarzweiß-LCDs mit integrierten Controllern und Schwarzweiß-LCDs -weiße LCDs, für die ich meinen eigenen CPLD-basierten Controller entwickelt habe, der mit dem Allzweck-DMA eines Mikrocontrollers (der sogar vier Graustufen bietet) kompatibel ist. Ich bin stolz darauf, Displays flott zu machen. Einer der Grafik-Controller war ein bisschen wie ein Hund, der ungefähr 1/10 Sekunde für eine Vollbildaktualisierung benötigte, selbst wenn konstante Daten geschrieben wurden, aber die meisten meiner Displays können sogar ein ziemlich komplexes Bild in weniger als 1/50 Sekunde rendern.

Viele meiner Projekte sind batteriebetrieben, daher ist die Stromaufnahme ein Problem. Den DMA-basierten Display-Controller habe ich gut gemacht, aber es war für ein zeilenbetriebenes Projekt. Ich glaube, die einzige Möglichkeit, eine vernünftige Stromaufnahme von einem Grafik-LCD zu erhalten, ist die Verwendung eines Controllers, der den Anzeigepuffer und die Spaltentreiber kombiniert. Das Senden einer großen Anzahl von Anzeigen zwischen Chips pro Frame würde selbst bei einer einzelnen Bit-pro-Pixel-Anzeige viel Energie verschwenden. Auf einem Farbdisplay mit 16 Bit pro Pixel wäre es weitaus schlimmer.

Ich habe erst angefangen, Farb-LCD-Datenblätter zu betrachten. Viele Displays scheinen einen Controller zu verwenden, der dem ILITEK ILI9320 ähnelt, obwohl alle Datenblätter, die ich für Controller gefunden habe, die auf diesem allgemeinen Design basieren, mit "vorläufig" gekennzeichnet sind. Einige wie die ILITEK one behaupten, Maskierungs- und Transparenzfunktionen zu haben, listen jedoch keine Register für diese auf. Ich weiß nicht, ob die echten Chips solche Merkmale haben, aber die "vorläufigen" Datenblätter sie nicht enthalten, oder ob sie die Merkmale weggelassen haben, aber vergessen haben, sie zu erwähnen. Wenn in der Praxis alle derartigen Chips Transparenzmerkmale aufweisen, erscheint es vernünftig, für sie zu entwerfen; wenn nicht, nicht

Ich würde erwarten, dass für die meisten Projekte ein typischer Bildschirm aus beliebig platziertem Text in einer moderaten Anzahl von einfarbigen Schriften beliebiger Größe besteht. Schriftarten würden höchstwahrscheinlich als Bit-pro-Pixel-Daten gespeichert. Wenn ich mit einem Cortex-M3 die Anzeige mit parallelen Daten schreiben wollte, würde die "innere Schleife" des Codes zum Schreiben von zwei Pixeln wahrscheinlich ungefähr so ​​aussehen:

  rol r0, r0, # 2; Holen Sie sich ein Bit in C, das andere in N
  itcs
  strhcs r1, [r3, # DATA_OFS]; Daten schreiben
  strhcc r2, [r3, # DATA_OFS]; Daten schreiben
  strb r4, [r3, # CLOCK_SET_OFS]; Uhr hoch stellen
  strb r4, [r3, # CLOCK_CLR_OFS]; Uhr niedrig stellen
  itmi
  strhmi r1, [r3, # DATA_OFS]; Daten schreiben
  strhpl r2, [r3, # DATA_OFS]; Daten schreiben
  strb r4, [r3, # CLOCK_SET_OFS]; Uhr hoch stellen
  strb r4, [r3, # CLOCK_CLR_OFS]; Uhr niedrig stellen

Nicht gerade das schnellste Ding der Welt. Das Beseitigen der Schreibvorgänge für die Anweisungen zum Setzen / Löschen der Uhr würde helfen. Meine Vermutung wäre, dass es keinen netten architekturunabhängigen Weg gibt, um beide Taktschreibvorgänge zu eliminieren, aber es könnte einen ziemlich verbreiteten Weg geben, um einen zu eliminieren (z. B. können viele Chips einen Zähler / PWM haben, der dazu gebracht werden könnte, einen Ausgang zu pulsieren kurz als Antwort auf einen einzelnen Speichervorgang).

Die Verwendung des SPI-Ports und das Hinzufügen von Hardware zum Takten eines Pixels pro Bit würde den Zugriff auf die Anzeige erheblich beschleunigen. Bei Verwendung einer Anzeige ohne Maskierung und Transparenz müsste die CPLD einen Adressenzähler enthalten und für jedes Pixel entweder ein Wort mit Pixeldaten takten oder einen Befehl zum Festlegen der Adresse für die Position des folgenden Pixels (für den ein Zähler erforderlich wäre) ). Wenn eine Anzeige hingegen Maskierung und Transparenz hätte, wäre alles, was ich tun müsste, eine CPLD-Unterstützung für einen Modus zu haben, in dem nach dem Takten mit 16 Bits jedes zusätzliche Bit ein Datenwort mit dem auf die Anzeige überträgt LSB-Tracking des SDI-Pins (möglicherweise ist nicht einmal die Verwendung einer CPLD erforderlich - nur ein paar normale Logikchips). Ich würde die Transparenzfarbe auf die Farbe setzen, die ich schreiben möchte, aber mit gespiegeltem LSB.

Ich möchte kein schönes Design entwickeln, das auf Maskierung und Transparenz beruht, und dann feststellen, dass die einzigen Displays mit solchen Merkmalen eine Vorlaufzeit von 30 Wochen haben. Auf der anderen Seite möchte ich nicht zulassen, dass Paranoia über die Verfügbarkeit mich dazu veranlasst, ein minderwertiges Design zu verwenden, wenn solche Displays bei vielen Anbietern verfügbar sind und bleiben.

Superkatze
quelle
1
Dies ist keine Antwort, da Sie nicht an einen bestimmten ARM-Anbieter gebunden sind. Die LPC LH754xx-Mikrocontrollerfamilie enthält jedoch einen integrierten LCD-Treiber.
Kevin Vermeer
@reemrevnivek: Es gibt eine Reihe von ARM-Chips mit kleinen LCD-Treibern; Ich kann mir keinen Chip vorstellen, der einen Treiber hat, der für ein Grafikdisplay in nützlicher Größe geeignet ist, das in einem Paket erscheint, das in einem anderen als einem Chip-on-Glass-Szenario verwendet werden kann. Ein Chip hat zwar einen Controller, ein LCD mit einem Chip-on-Glass-Controller scheint jedoch energieeffizienter und einfacher zu arbeiten zu sein. Ich werde den von Ihnen erwähnten Chip überprüfen - könnte interessant sein.
Supercat
@supercat - Ich denke an LCDs mit einer RGB-Schnittstelle: Pixeltakt-, Bildsynchronisations- und Zeilensynchronisations-Steuerleitungen mit einem parallelen Pixeldatenbus. Erwarten Sie eine COG-gesteuerte Anzeige?
Kevin Vermeer
1
@reemrevnivek: Das hatte ich mir gedacht. Sie scheinen ziemlich verbreitet zu sein, da sie in vielen tragbaren batteriebetriebenen Geräten wie Mobiltelefonen verwendet werden. Ein COG-Display mit integriertem Controller ist wesentlich energieeffizienter als ein Display, das kontinuierlich getaktete RGB-Daten benötigt.
Supercat
@reemrevnivek: Ich habe gerade meine Frage mit mehr Details aktualisiert.
Supercat

Antworten:

7

Das Problem bei der Verwendung eines Mikrocontrollers zum Ansteuern eines LCD ist, dass ein LCD ständige Aufmerksamkeit erfordert. Dies kann durch eine über SPI betriebene CPLD (natürlich unter Verwendung von DMA) gemildert werden, aber dann stößt man auf das andere Problem: Farb-LCDs erfordern vielvon Dateien. 320x240 in Schwarzweiß ist bei 9,6 KB marginal, aber bei 24-Bit-Farben müssen plötzlich 230 KB Daten in 1/60 Sekunde geliefert werden. (Vergessen Sie jedoch nicht, dass Sie eine 4-Bit- und 16-Farben-Steuerung erhalten können, indem Sie die niedrigen 20 Bits an eine Einstellung binden.) Ein 24-Bit-Bildspeicher passt auf den meisten Mikrocontrollern nicht mehr in den integrierten Arbeitsspeicher, und Sie haben wahrscheinlich keine Zeit mehr, von einem externen RAM-Chip zu lesen, die Daten auszutakten und noch andere Vorgänge auszuführen. Der Versuch, dies mit einer CPLD (oder einem FPGA) und einem RAM-Chip zu tun, führt dazu, dass Sie deutlich über dem Preis von 2 USD liegen, der Sie dazu veranlasst hat, Ihrer Frage zu widersprechen.

Die traditionelle Lösung für die Verbindung eines Mikrocontrollers mit einem Farb-LCD ist ein Display-Controller wie ein SSD1963. Hier ist ein sehr einfaches Blockdiagramm:

MCU zum RAM-Puffer und zu den Registern und von dort zur LCD-Schnittstelle

Die parallele Eingabe in einen großen RAM-Bildspeicher (Übersetzung: über 2 US-Dollar) erfolgte über eine in Registern konfigurierbare parallele LCD-Schnittstelle. Der parallele Eingang ist normalerweise mit einer Speicherbusschnittstelle kompatibel.

Der Markt für Farb-LCDs ist im Internet nicht immer leicht zu finden, da es sich in der Regel nur um OEMs handelt. Der Rest kauft Displays von Unternehmen, die den Controller in das Display integrieren. Die beste Ressource, die ich gefunden habe, war Crystal Fontz, insbesondere diese Seite zur Auswahl von Grafik-LCDs . Scrollen Sie nach unten für die Controller, die die folgenden Optionen enthalten (Hinweis: Nicht alle sind Farbcontroller):

  • Epson S1D13521B01 E Ink Broadsheet (1 Modul)
  • Epson S1D13700 (11 Module)
  • Kompatibel mit Epson SED1520 (8 Module)
  • Himax HX8345 kompatibel (1 Modul)
  • ILITek ILI9325 kompatibel (3 Module)
  • KS0107 / KS0108 kompatibel (26 Module)
  • Novatek NT7534 (14 Module)
  • Orise Technology OTM2201A (1 Modul)
  • Orise Technology SPFD5420A (1 Modul)
  • RAiO RA8835 (1 Modul)
  • Sanyo LC7981 (13 Module)
  • Sino Wealth SH1101A (2 Module)
  • Sitronix ST7920 (29 Module)
  • Solomon SSD1303 (1 Modul)
  • Solomon SSD1305 (9 Module)
  • Solomon SSD1325 (2 Module)
  • Solomon SSD1332 (1 Modul)
  • Solomon SSD2119 (2 Module)
  • ST STV8105 (1 Modul)
  • Toshiba T6963 (23 Module)
Kevin Vermeer
quelle
@reemrevnivek: Ich hatte über Farb-LCDs mit integrierten Controllern nachgedacht. Sie scheinen ziemlich häufig zu sein, aber die, die ich gesehen habe, scheinen im Allgemeinen zu erwarten, dass die CPU mit vielen Bits pro Pixel taktet, obwohl ein häufiges Anzeigeszenario die Anzeige von einfarbigem Text ist. Ich habe einmal einen DMA-basierten 4-Level-Graustufen-LCD-Controller unter Verwendung einer CPLD implementiert, und es hat sehr gut funktioniert, aber das war ein netzbetriebenes Gerät.
Supercat
1
@supercat - Sehr wenige LCD-Controller erwarten, dass eine CPU für jeden Frame viele Bits pro Pixel eintaktet . Sie erwarten im Allgemeinen, dass dedizierte Grafikhardware dies tut. Grundsätzlich ist die für die Erzeugung des Bildes für den Bildschirm erforderliche Verarbeitungsleistung bei relativ großen RGB-Anzeigen (dh> 128 * 128) groß genug, um eine bestimmte GPU (auch wenn diese in die MCU integriert ist) zu verwenden so ziemlich immer präsent.
Connor Wolf
1
@supercat - Aber was Sie beschreiben, eine spezialisierte CPLD, die ASCII für Raster-Konvertierungen ausführt, ist im Grunde (benutzerdefinierte) spezialisierte Grafikhardware . Ich sage im Grunde, erfinde das Rad nicht neu, und es ist wahrscheinlich einfacher und kostengünstiger, nur eine MCU mit eingebautem Video-Interface zu kaufen, als eine selbst zu entwerfen.
Connor Wolf
1
Wie auch immer, wenn Sie wirklich Ihre eigenen Daten rollen möchten, würde ich sagen, verwenden Sie ein paar Dual-Port-SRAM-ICs und verwenden Sie einen Port für die Ausgabe auf dem LCD und den anderen für die MCU. Auf diese Weise kann die MCU den Speicherinhalt mit der von ihr gewünschten Geschwindigkeit ändern und das LCD kann mit seiner Aktualisierungsrate betrieben werden.
Connor Wolf
1
@Fake Name: Es wäre keine ASCII-zu-Raster-Konvertierung. Grundsätzlich wäre es eine Bit-pro-Pixel-zu-Multibit-pro-Pixel-Konvertierung. Ich glaube, du verstehst falsch, was ich ansehe. Ich suche nicht nur Displays mit Treibern , sondern auch mit Treibern und Controllern . Sie müssen also nur dann mit Daten versorgt werden, wenn sich etwas auf dem Bildschirm ändert.
Supercat