1 Ansteuerung von Grafikdisplays ohne Grafikcontroller unter Ver
Transcription
1 Ansteuerung von Grafikdisplays ohne Grafikcontroller unter Ver
1 Ansteuerung von Grafikdisplays ohne Grafikcontroller unter Verwendung von „emWin GSC“ Dipl.-Ing. Christoph Tenbergen Glyn GmbH & Co. KG Einleitung Durch die größer werdenden Anforderungen an den Bedienungskomfort in heutigen Applikationen werden immer mehr LC-Displays zur Visualisierung eingesetzt. Displays begegnen uns z.B. in Aufzügen, an Messgeräten, Bankautomaten oder Parkscheinautomaten. Die Anforderungen der Anwender sind dabei klar definiert, eine funktionale und grafisch aufgearbeitete Ausgabe von Prozessen und Betriebsdaten. Heute wird ein großer und ansprechender Bedienungskomfort gefordert. Gleichzeitig sind neue Applikationen einem immer größer werdenden Preis- und Konkurrenzdruck ausgeliefert. So ist eine der Hauptanforderungen an die Technik die Suche nach Möglichkeiten einer Kostenreduzierung, bei gleichzeitiger Verbesserung der Technik. Im „Embedded-Bereich“ wird dieses zunehmend durch immer leistungsfähigere Bauteile erreicht. Man schaue sich alleine die Entwicklung der Mikrocontroller an. So verfügen moderne Controller über AD/DA-Wandler, Schnittstellen wie CAN bis hin zu integrierten LCD-Controllern. Warum sollte dann nicht auch ein Mikrocontroller neben seinen anderen Aufgaben die eines Grafikcontrollers mit übernehmen ? – Leider gibt es noch keine Mikrocontroller die über einen integrierten Grafikcontroller verfügen, allerdings ist ein Grafikcontroller auf einem Mikrocontroller mit hoher Rechenleistung durchaus zu realisieren. Hierzu wird der Grafikcontroller als Software nachgebildet. Grundlagen Angesteuert werden Dot-Matrix LC-Displays normalerweise über die Kombination Mikrocontroller, Grafikcontroller, sowie Spalten und Zeilentreiber (Bild 1). Dabei werden dem Grafikcontroller die Grafikdaten über einen 4- oder 8-bit breiten Datenbus übertragen. Weitere Aufgaben des Grafikcontrollers sind regelmäßiges Auffrischen des Displays, sowie Ansteuerung der Zeilen- und Spaltentreiber. Die Bilddaten werden zunächst im externen oder internen DisplayRAM des Grafikcontrollers abgelegt. Dieses Display-RAM ist häufig in zwei RAM-Pages unterteilt. In einer Page steht die aktuelle Displaydarstellung. In der zweiten Page können Grafikdaten zur Darstellung eines neuen Bildes geladen werden. Sobald die zweite Page mit neuen Daten versorgt worden ist, werden die Pages umgeschaltet und die neuen Daten angezeigt. Da also viele Applikationen, die auch Dot-Matrix LC-Displays ansteuern, einen Mikrocontroller enthalten, könnte man mit diesem auch gleich das Display direkt ansteuern. Hierzu muß die MCU so leistungsfähig sein, daß sie neben dem Ansteuern des LC-Displays auch sämtliche anderen Aufgaben der Applikation erledigen kann. Zu diesen Aufgaben kann das Verarbeiten und Auswerten von Meßdaten gehören. Mit den zur Zeit verfügbaren Controllern können ohne Probleme ¼ VGA LC-Displays direkt angesteuert werden. Größere Displays können nicht direkt angesteuert werden, da dann das regelmäßige Auffrischen des Displays zu lange dauert (Display flackert) und zuwenig Performance für andere Aufgaben der Applikation übrig bleibt. 2 BILD1: Anschlusschema eines LC-Display auf herkömmliche Art Ein weiterer Nachteil der meisten Grafikcontroller ist, daß sie in der Regel nur einen implementierten Zeichensatz und selten Zeichenfunktionen besitzen. Da aber gerade der Einsatz von Dot-Matrix LCDisplays eine vielfältige Darstellung ermöglicht und dies natürlich auch erwünscht ist, müssen umfangreiche Routinen zur Grafikprogrammierung erstellt werden. Das Programmieren derartiger Routinen nimmt erfahrungsgemäß mehrere Mann-Monate Entwicklungszeit in Anspruch. Will man an dieser Stelle der Entwicklung „das Rad nicht neu erfinden“, kann man auch das Softwarepaket emWin GSC einsetzen. Dieses Softwarepaket enthält nicht nur die Treibersoftware zur direkten Ankopplung der Zeilen- und Spaltentreiber, sondern auch sämtliche Features um eine Prozessvisualisierung zu ermöglichen. Vorteile Die Vorteile der Ansteuerung kleiner LC-Displays durch einen Mikrocontroller liegen zunächst in der Kostenersparnis. Durch den Wegfall des Grafikcontrollers (ca. 6,00 - 8,00 DM) sowie des eventuell vorhandenen externen Display-RAM und durch den geringeren Bestückungsaufwand werden Kosten eingespart. Der Platzbedarf auf der Platine verringert sich ebenfalls, so daß ein Design noch kompakter aufgebaut werden kann. Durch die direkte Ankopplung an den Mikrocontroller und der Nutzung des internen RAM als Bildspeicher wird die Bildaufbauzeit stark verkürzt. Ein Vorteil der sich besonders bei schnell wechselnden Darstellungen (Animation) bemerkbar macht. Des weiteren ist es möglich direkt im Bildspeicher das RAM zu manipulieren. Somit muss bei kleinen Darstellungsänderungen nicht der gesamte Speicher „refreshed“ werden. Auch muss nicht permanent eine zweite Page bestehen in der neue Bilder hinterlegt werden. Das heißt, daß man den Bildspeicher variabel halten kann, und in seiner Größe den jeweiligen Bedingungen anpassen kann. Ein weiterer und wesentlicher Vorteil liegt in der Darstellung von Graustufen auf einem monochromen LC-Display. Hier können alternativ 2,4,8 oder 16 Graustufen ohne zusätzliche Hardware dargestellt werden. So reduzieren sich nochmals die Kosten für das LC-Display. Weitere Vorteile ergeben sich natürlich bei der Verwendung von emWin GSC, da dieses Softwarepaket alle benötigten Routinen für eine effiziente Grafikprogrammierung zur Verfügung stellt. Diese Routinen übersteigen bei Weitem die Möglichkeiten eines „normalen“ Grafikcontrollers. Hierzu gehören unter anderem Zeichen- und Grafikfunktionen, verschiedene Zeichensätze bis hin zu Routinen zur 3 Fensterdarstellung und Menüverwaltung. Das Softwarepaket emWin GSC ist in Ansi-„C“ geschrieben, so daß es auf beliebige Mikrocontroller oder Prozessoren lauffähig ist. Zur Ausgabe von Texten und Variablen stehen dem Anwender umfangreiche Softwarefunktionen zur Verfügung. Unter Angabe der X/Y-Position werden die Daten auf dem Display pixelgenau ausgegeben und dargestellt. Zusätzlich gibt es einen Font Konverter mit dem alle Windows-PC Schriftarten in „C“-Files konvertiert und somit auf dem Display dargestellt werden können. Zum Zeichnen stehen unter anderem Funktionen für Linien, Kreise und Rechtecke zur Verfügung. Zur Ausgabe eines Kreises müssen lediglich die X/Y Koordinaten des Mittelpunktes und der Radius des Kreises angegeben werden. Auch Bitmaps können auf einfache Weise dargestellt werden (Bild 2). Mit Hilfe eines ebenfalls erhältlichen Bitmapkonverters können auf dem PC erstellte Grafiken ohne Mühe für die Applikation umgewandelt werden und auf dem LCD zur Anzeige gebracht werden. extern bmImpact_Logo_4; /* C-File containing the Bitmap information */ void ShowBitmap(void) { GUI_DrawBitMap (450,200, & bmImpact_Logo_4); } void USER-main() { GUI_Init(); ShowBitmap(); } Screen shot zum Beispiel Bild2: Ausgabe einer Bitmap emWin GSC beinhaltet neben diesen umfangreichen Zeichenroutinen und dem Treiber für das LCDDisplay, als wesentliches Feature ein sehr effizientes Farb Management System. Es arbeitet auf dem logischen Level mit RGB Farben und ist somit unabhängig vom verwendeten Display. Zur Laufzeit werden diese in die best möglichen darstellbaren Farben konvertiert. Dies ist natürlich auch sehr wic htig für die Darstellung der Graustufen. Damit der Speicherbedarf der Grafikroutinen möglichst klein bleibt, ist emWin als Grafik-Library konzipiert. So werden nur die Grafikmodule eingebunden die auch wirklich verwendet werden. Der Speicherplatzbedarf der grafischen Benutzeroberfläche liegt zwischen 5,5 und 28 kByte. Der ROM-Bedarf hängt stark von der CPU, der Effizienz des „C“-Compilers und dem Funktionsumfang der Grafikroutinen ab. 4 Anschluss der Spalten- und Zeilentreiber an die MCU Auf einfache Art und Weise können Spalten, sowie Zeilentreiber an die MCU angeschlossen werden. Hierzu werden die fünf typischen Steuerleitungen verwendet: FLM gibt den Start für einen Displa yzyklus an, M zur Erzeugung der Treiberwechselspannung, CL1 und CL2 als Clocksignale, die die Daten den einzelnen Dots und Zeilen des Displays zuordnen und als letztes das ON/OFF Signal um das Display ein oder aus zu schalten um beispielsweise den Stromverbrauch zu senken. Zusätzlich werden noch vier oder acht bitparallele Leitungen für die Grafikdaten benötigt. Es empfiehlt sich natürlich das 8bit breite Datenprotokoll, da hierdurch Rechenleistung eingespart werden kann. Dabei sollten die Datenleitungen über einen parallelen Port angesteuert werden, um eine effiziente Arbeitsweise zu ermöglichen. Bild3: Anschluß des LCD-Moduls 5 Arbeitsweise des Softwaretreibers zur Ansteuerung des LCD-Moduls Die Ansteuerung der Spalten- und Zeilentreiber erfolgt über eine Interruptserviceroutine. Diese Routine muß sämtliche Steuerfunktionen, die sonst ein Grafikcontroller erledigt, übernehmen. Hierzu gehören das Aktivieren der Zeilen über CL1, das Schieben und Übertragen der Daten über CL2, Aktivieren eines Displayzyklus durch Anlegen des FLM-Signales, sowie das Erzeugen einer Wechselspannung zur Versorgung des Moduls über das M-Signal. Eine weitere wichtige Voraussetzung ist der zyklische Aufruf der Routine, damit das Display regelmäßig „refreshed“ wird. Dieses ist auch die Grundlage zur Darstellung mehrerer Graustufen auf einem monochromen-LC-Display. Aus diesen Anforderungen heraus, sollte ein Timerinterrupt mit sehr hoher Priorität diese Aufgaben übernehmen. Um die Treibersoftware möglichst effizient zu halten und eine hohe Ablaufgeschwindigkeit zu ermöglichen, ist dieser Teil in Assembler gehalten und sehr Prozessor spezifisch. Das Kernstück der Treibersoftware, der Timerinterrupt zur Ansteuerung der Steuersignale und Übertragung der Daten soll im folgenden näher betrachtet werden. Um einen Überblick der grundlegenden Arbeitsweise zu vermitteln ist diese Routine in „C“ programmiert und steuert ein 160 x 160 Dots LCD-Modul mit 4-Bit parallelen Datenprotokoll an. Zunächst müssen allerdings einige Voreinstellungen durchgeführt werden. Hierzu gehören beispielsweise Angaben zur Größe des Displays und die Anzahl der Farben. Bei emWin GSC werden diese Angaben im HEX-File LCDconf.h gemacht, das die Konfigurationseinstellungen enthält. Die Umsetzung erfolgt während der Compilierung des Programmes durch den Preprozessor. Unter anderem wird die Größe des benötigten Bildspeichers nach folgender Formel berechnet: Spalten x Zeilen x (Anzahl Graustufen/2) Größe benötigtes RAM = 8 Bsp.: 160 x 160 Dots Display 4 Graustufen RAM = 160 x 160 x 2 = 6400 Bytes 8 Mögliche Graustufen sind 2,4,8,16 entsprechend 1,2,3 oder 4 bit pro Pixel. Je mehr Graustufen bzw. Farben dargestellt werden, desto größer wird der Rambedarf. Bei der Darstellung von vier Graustufen werden zwei Pages benötigt. Der benötigte Timerinterrupt zur LCD-Modulansteuerung besteht aus vier Teilen. Diese sind notwendig um das Zeitdiagramm zur Ansteuerung des LC-Displays (Bild 5) zu realisieren. Der in „C“ gehaltene Sourcecode steht unter Bild 5 zur Verfügung. Folgend die vier Teile der Interruptserviceroutine im einzelnen: 1. Ausgabe der Daten pro Zeile über CL2-Signal Über eine For-Schleife werden die Daten-Bytes jeder Zeile hochgezählt. Bei einem 160 x 160 Dots Display besteht jede Zeile aus 160 Bits, dieses entspricht 20 Bytes. Da es sich im Beispiel um ein 4bit paralleles Protokoll handelt wird zunächst das High-Nibble an den Datenport übergeben und dann das Low-Nibble. Des weiteren muß das Clock2-Signal bei jedem zu übertragenden Nibble zunächst gesetzt werden und nach der Übertragung an den Datenport wieder zurückgenommen werden (Bild 5: Zeitdiagramm zur Ansteuerung des LC-Displays). Hierdurch wird erreicht das sämtliche Dots jeder Zeile angesprochen werden. 6 Bild 4: Zusammenhang zwischen LC-Display und Daten 2. Weiterschalten der Zeilen über CL1 Signal und Beschalten des FLM-Signals bei ne uem Displaydurchlauf Im weiteren Verlauf der Interruptroutine muss das Clock 1 Signal zum Umschalten der Zeilen bedient werden. Ebenso das „First Line Marker“ Signal, falls es sich um die erste Zeile handelt. Ein neuer Displaydurchlauf wird hiermit Angekündigt. 3. Generieren der Wechselspannungsversorgung über das M-Signal. In Teil 3 der Interruptroutine wird das M-Signal angesteuert um die Wechselspannungsversorgung zu generieren. Die Ansteuerung sollte so erfolgen, daß keine Zeile ständig mit der selben Polarität angesteuert wird. 4. Verstellen der Interruptfrequenz zur Darstellung der Graustufen und inkrementieren des Zeilenzählers Im letzten Teil der Routine wird der Zähler für die Zeilen inkrementiert. Dieser wird solange inkrementiert bis die letzte Zeile erreicht wurde ( im Beispiel die Zeile 160 ). Bei erreichen dieser Zeile wird die Frequenz der Interruptroutine hoch bzw. heruntergesetzt. Dies ist zur Darstellung der Graustufen notwendig (Siehe Darstellung von Graustufen mit einem monochromen LCDisplay). Bild 5: Zeitdiagramm zur Ansteuerung des LC-Displays 7 interrupt [88] using [1] void ISRTimerA1(void) { int i; U8* pData = &LCD_VRam[GrayCnt][Line*LCD_BYTESPERLINE]; // Part 1: Send data out for (i=0; i< LCD_BYTESPERLINE; i++) { // Output high nibble CL2 = 1; PORT_DATA = *(pData+i)>>4; CL2 = 0; // Output low nibble CL2 = 1; PORT_DATA = *(pData+i); CL2 = 0; } // Part 2: Give next line signal and first line marker if necessary if (Line==0) { FLM = 1; CL1 = 1; CL1 = 0; FLM = 0; } else { CL1 = 1; CL1 = 0; } // Part 3: Make sure we generate AC voltage (every 7th line) if (!--MCnt) { MCnt = 7; LCD_M ^=1; } // Part 4: Increment line counter, set interrupt frequency if (++Line==LCD_YSIZE) { Line=0; GrayCnt = (GrayCnt==1) ? 0 : GrayCnt+1; SetFreq(GrayCnt ? F_LOW : F_HIGH); } } Sourcecode der Interruptroutine zur LC-Displayansteuerung 8 Darstellung von Graustufen auf einem monochromen LC-Display Die Darstellung von Graustufen auf einem monochromen LC-Displays wird durch Zusammensetzen mehrerer Bilder erreicht. Hier zunächst einige Grundlagen: Um ein Pixel dauerhaft und mit gleicher Intensität anzuzeigen muß es in gleichmäßigen Abständen mit Strom versorgt werden. Die Intensität des Pixels richtet sich nach der Dauer des Stromflusses. Wird nun ein Pixel besonders lange mit Strom versorgt erscheint es Dunkel, wird es dagegen nur kurze Zeit angesteuert ist die Intensität nicht so stark, es erscheint gräulich. Bild 6 zeigt ein Beispiel der Darstellung eines Bildes mit vier Graustufen. Hierzu müssen zwei Bilder im RAM hinterlegt werden. Beide Bilder werden im Wechsel eingelesen. Der wesentliche Unterschied liegt in der Dauer der Ansteuerung der einzelnen Zeilen. Die Zeilen von Bild 6.1 werden 100 µsec mit Strom versorgt, die von Bild 6.2 50 µsec lang. Damit ergeben sich folgende Zeiten zur Darstellung der einzelnen Bilder, bei einem 160 x 160 LCD: Dauer Bild = Yline × tline Yline = Anzahl Dots in Y-Richtung tline = Dauer der Ansteuerung pro Zeile Dauer Bild 6.1: TBild1 =160 × 100 µsec = 16 msec Dauer Bild 6.2: TBild2 =160 × 50 µsec = 8 msec Gesamtdauer zur Darstellung Bild 6.3: 8 msec + 16msec = 24 msec Damit ergibt sich eine Bildwiederholfrequenz von 41,640 Hz. Die Zuordnung der Farben zeigt Tabelle 1. Man erkennt an den Zeitdiagrammen, das die Intensität jeder Graustufe sich aus dem Mittel des fließenden Stromes zusammenstellt. Fließt kein Strom durch ein Pixelelement wird die Farbe „Weiß“ dargestellt (Chart 1). Fließt dagegen sehr lange ein Strom über das Pixelkristall (Chart 4) wird die Farbe Schwarz dargestellt. Durch verkürzen des Stromflusses werden die Graustufen dargestellt (Chart 2/3). Tabelle 1: Zuordnung der Graustufen 9 Im folgenden Beispiel ist die Zuordnung der Pixeldaten einer Zeile in bezug auf die Farben dargestellt. Wichtig ist hier: Es werden nie zwei Datenbits pro Pixel übertragen, sondern die Datenbits werden „nacheinander“ mitgeteilt (tbild1, TBild2). Die Farbzuordnungen und Unterteilungen in einzelne Bildseiten werden von emWin GSC automatisch durchgeführt. Der Anwender muß nur noch das optimale Timing herausfinden, damit die Farbgebung seinen Vorstellungen entspricht. Dies wird normalerweise empirisch ermittelt Bild 6 Darstellung eines Bildes mit vier Graustufen 10 Auslastung des Mikrocontrollers am Beispiel des M16C des Herstellers Mitsubishi Natürlich benötigt jeder Mikrocontroller eine gewisse Performance, um die Arbeit des Grafikcontrollers mit zu übernehmen. Hier empfiehlt sich eine MCU wie der M16C/62 von Mitsubishi oder der V850/SA1 von NEC. Bei diesen Bausteinen handelt es sich um Registermaschinen, die über die notwendige Rechenleistung verfügen , um neben der Displayansteuerung auch andere Aufgaben einer Embedded-Applikation zu übernehmen. Folgend typische Werte der Prozessorauslastung des M16C/62: Taktfrequenz [MHz] 16 16 Display [dots] 160*100 240*128 Dateninterface [bits] 8 8 Wiederholrate [Hz] 80 80 Prozessorauslastung 12% 22% Fazit Bei der direkten Ansteuerung kleiner Grafikdisplays kann bei den heutigen, immer leistungsfähiger werdenden, Mikrocontrollern auf den Grafikcontroller verzichtet werden. Die Vorteile wie Kostenersparnis, einfacheres Hardwaredesign oder auch die erweiterten Möglic hkeiten der Grafikprogrammierung durch die Grafiksoftware emWin GSC sind nicht von der Hand zu weisen. Auch das erheblich schnellere auffrischen der Grafikdaten, kann besonders bei einer schnellen Animation von Vorteil sein. Und nicht zuletzt die Darstellung von Graustufen auf monochromen LCDisplays zeigen die immensen Vorteile eines Mikrocontrollers mit „Software Grafikcontrollers“ an Bord. Jeder Entwickler der kleine Grafikdisplays in seiner Applikation ansteuern muß, sollte aus diesen Gründen ein Design ohne Grafikcontroller anstreben und sich damit diese Vorteile zu nutze machen. Autor: Christoph Tenbergen Field Application Engineer GLYN GmbH & Co. KG Aussenbüro Nettetal Ringstr. 88 D-41334 Nettetal Telefon : 02157-124-227 Fax : 02157-124-211 E-Mail : [email protected] Internet: www.glyn.de