LCD-Display Tester
Es
wird ein einfacher Tester für LCD-Displays nach dem HD447780-Standard
beschrieben. Neben einem Test wichtiger Funktionen erlaubt die
Vorrichtung einen Überblick über den definierten Zeichensatz.
Displays
nach dem HD447780-Standard sind mittlerweile weit verbreitet und auch
als Bauteil zu günstigen Preisen erhältlich. Der ursprüngliche Baustein
HD447780 von Hitachi wird zwar meines Wissens nicht mehr hergestellt,
jedoch ist eine Vielzahl von kompatiblen Bauelementen erhältlich und
auch in aktueller Produktion. Obwohl nicht als solcher definiert, haben
sich Displays nach dem HD447780-Standard als sogenannter
Industriestandard etabliert und weite Verbreitung gefunden. Es ist
daher praktisch, eine Einrichtung zur Verfügung zu haben, mit der
solche Bauelemente schnell getestet werden können, auch nach
eventuellen Fehlanschlüssen und zur Überprüfung bei Reparaturarbeiten.
Außerdem gestattet die nachfolgend vorgestellte Vorrichtung, sich einen
Überblick über den im ROM des Moduls definierten Zeichensatz zu
verschaffen, der von Variante zu Variante unterschiedlich sein kann.
Dabei wurde auf eine möglichst einfache Anwendbarkeit geachtet.
Die
Schaltung verwendet einen ATtiny2313 in der SMD-Variante,
hauptsächlich, weil ein solcher gerade vorhanden war. Der Tester kommt
allein mit Bit-Funktionen an den Ports aus, so dass ein einfaches
Modell wie eben der ATtiny2313 vollkommen ausreichend ist.
Bemerkenswert ist vielleicht die Erzeugung der Kontrastspannung V0.
Häufig wird hierfür ein Poti verwendet. Dies erfordert jedoch nicht nur
einen Einstellvorgang, sondern nimmt meistens auch noch lästig viel
Platz ein. Hier wird der Spannungsabfall über einer Siliziumdiode
1N4148 genutzt, so dass eine Kontrastspannung von etwa 0,7 V gegen
Masse entsteht. Dies führt in vielen Fällen zu einigermaßen brauchbaren
Ergebnissen. Der etwas unübliche Wert des Serienwiderstands von 3,1 kΩ
kommt dadurch zustande, dass ich aus einem preiswert erworbenen Beutel
unsortierter Widerstände eine größere Zahl davon habe. Es ist
wahrscheinlich nicht kritisch, innerhalb derselben Größenordnung davon
abzuweichen.
Die Schaltung so wie sie ist enthält keinen
Strombegrenzungswiderstand für die LED-Beleuchtung, sondern verlässt
sich darauf, dass das Display-Modul einen solchen eingebaut hat. Wer
sich nicht darauf verlassen will, sollte einen hinzufügen.
Für
den Anschluss des Display-Moduls wird eine zehnpolige Flachkabelleitung
mit einer Pfostenbuchsen-/Wannensteckerkombination verwendet. Die
gewählte Steckerbelegung sieht auch eine Leitung und einen Pin für die
Schreib-/Leseumschaltung R/W vor, obwohl der Tester keine Lesefunktion
verwendet. Die Leitung liegt in der vorliegenden Schaltung einfach auf
Masse, also ist dauerhaft Schreiben eingestellt. Die Reservierung einer
eigenen Leitung dafür geschah aus der Überlegung, sich an dieser Stelle
spätere Erweiterungen, die auch Auslesefunktionen umfassen können,
offen zu halten.
Das Programm wurde in C geschrieben und mit
AVR-GCC kompiliert. Es verwendet meine eigene Unterprogrammsammlung
lcd4.inc. Das Display-Modul wird hierbei im Vier-Bit-Modus angesteuert.
Zwar ist der in der Programmierung zunächst etwas aufwändiger, ist es
jedoch einmal gelungen, kann man die Routinen immer wieder verwenden
und spart sich vier Leitungen am Mikrocontroller. Die Routinen wurden
so angelegt, dass sich eine gewisse Flexibilität bei der Verwendung der
Ports des Controllers ergibt. Die Steuerleitungen E und RS können auf
beliebige Ports und Bits gelegt werden. Die Datenleitungen D4...D7 des
Displaymoduls müssen auf dem oberen Nibble eines Ports liegen. Sie
müssen also auf einen Port gelegt werden, bei dem das obere Nibble
vollständig definiert ist. Für den verwendeten ATtiny2313 bedeutet
dies, dass die Datenleitungen auf den Port B gelegt werden müssen und
zwar auf PB4...PB7, da die ebenfalls definierten Ports A und D über
kein vollständig definiertes oberes Nibble verfügen. Bei anderen
Controllern können auch andere Ports x verwendet werden, sofern die
Bits Px4...Px7 durchgehend und vollständig vorhanden sind. Eine größere
Flexibilität an dieser Stelle wäre sicherlich vorteilhaft, aber ich
habe es noch nicht geschafft, dies umzusetzen. Dies ist zweifellos
einer von vielen Punkten, die noch verbessert werden können.
Interessierte seien an dieser Stelle auf die Quelltexte der Programme
verwiesen.
Ebenso verwendet das Programm in der vorliegenden
Version ausschließlich den 2x16-Zeichen-Modus bei Vier-Bit-Ansteuerung.
Es verzichtet ferner auf Cursor- und Scroll-Funktionen, eigene
Definitionen von Sonderzeichen sowie auf Auslesefunktionen des
Display-Moduls. Hier bieten sich weitere Möglichkeiten zur Verbesserung
und Erweiterung.
Einmal gestartet, initialisiert das Programm
zunächst das Display-Modul im Vier-Bit/2x16-Zeichen-Modus. Anschließend
beginnt eine Endlosschleife, in der zunächst eine Einschaltmeldung
ausgegeben wird, anschließend wird im Display Zeichen für Zeichen der
vollständige Zeichensatz von 0x00 bis 0xf ausgegeben. Dies erlaubt es
auch, sich einen Überblick über den eingebauten Zeichensatz zu
verschaffen. Die benutzerdefinierbaren Zeichen werden hierbei nicht
gesondert definiert, so dass der Inhalt dieser Speicherstellen und
damit die Erscheinung der Zeichen im Display zufällig ist. Nach der
Ausgabe des letzten Zeichens 0xf wird das Display gelöscht und ein
neuer Schleifendurchlauf beginnt mit der Einschaltmeldung. Der
ATtiny2313 läuft mit dem internen Taktoszillator bei 4 MHz und einem
Teilungsfaktor von 8, wodurch sich eine effektive Taktfrequenz von 500
kHz ergibt. Diese ist auch im Programm als Zeitbasis für die
delay-Routinen aus util/delay.h defniert.
Der Controller wurde
auf eine 1,27 mm einseitige Lötrasterplatine aufgebaut. Diese ist durch
Drähte mit einer 2,54 mm Lochrasterplatine mit Lötpunkten verbunden,
die die Kontrastspannungserzeugung und den 10-poligen Wannenstecker
trägt. Beim Aufbau habe ich – mal wieder – nicht auf eine geschickte
Anordnung der – wenigen – Bauelemente zueinander im Hinblick auf eine
geradlinig-elegante Leitungsführung geachtet. Aber das Ganze
funktioniert und erfüllt seinen Zweck.
Der
Anschluss des zu testenden LCD-Moduls erfolgt durch ein zehnpoliges
Flachbandkabel. Dies ist auf der Seite des Testers mit einer
zehnpoligen Pfostenleiste versehen. Auf der Seite des LCD-Moduls kann
das Kabel direkt an die entsprechenden Kontakte auf der Modulplatine
angelötet werden. Für den schnellen Wechsel eignet sich eine kleine
Zwischenplatine besser, die die einzelnen Adern der zehnpoligen Leitung
mit blanken Schaltdrähten verbindet. Das LCD-Modul wird dann an diese
blanken Schaltdrähte angelötet. Auf diese Weise wird verhindert, dass
die Wärme der An- und Ablötvorgänge die Isolation des Flachbandkabels
in kurzer Zeit beschädigt, was dann zu unerwünschten Kontakten zwischen
den Einzelleitungen führt.
Download: LCD_Tester.zip
#include <stdint.h>
#include <avr/io.h>
#define F_CPU 500000UL
#include <util/delay.h>
#define lcd_port PORTB
#define lcd_dir DDRB
#define lcd_rs_port PORTD
#define lcd_rs_dir DDRD
#define lcd_rs_bit 4
#define lcd_en_port PORTD
#define lcd_en_dir DDRD
#define lcd_en_bit 6
#include "lcd4.inc"
int main(void)
{
int i, j;
lcd_setupports();
lcd_init();
while(1){
lcd_string("LCD Display Test");
lcd_ddram(0x40);
lcd_string("Version 1.1 2017");
_delay_ms(1000);
for (i = 0; i < 255; i += 32)
{
lcd_ddram(0x00);
for (j = 0; j < 16; j++){
lcd_putchar(i+j);
_delay_ms(200);
}
lcd_ddram(0x40);
for (j = 0; j < 16; j++){
lcd_putchar(i+j+16);
_delay_ms(200);
}
}
_delay_ms(200);
lcd_cls();
_delay_ms(200);
}
return(0);
}