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

Documents pareils