Hier soll nun eine Möglichkeit beschrieben werden, wie das LCD an einem passenden Controller betrieben werden kann. Als Controller wird hier der SED1335 von Seiko/Epson (Von Epson gibt es einen kompatiblen Typ: S1D13305) verwendet. Die Verbindung mit dem Rechner geschieht über dessen Parallelport. Die Software wurde unter Linux (Kernel 2.2.x), geschrieben und getestet.
Achtung: Um die in dieser Anleitung angegebene Hardware nachzubauen
bedarf es einiger Erfahrung im SMD-Löten.
Außerdem besteht grundsätzlich die Gefahr, daß
man seinen PC und/oder andere damit verbundene Komponenten zerstören kann!
Die Arbeit an elektronischen und elektrischen Komponenten kann immer
gefährlich sein; in diesem Fall sei besonders auf den CFL-Konverter
hingewiesen, der eine Hochspannung von einigen Hundert Volt erzeugt, so
daß die Gefahr eines elektrischen Schlages besteht! Also Vorsicht!
Scans vom Epson Datenbuch: EpsonLCD_TCMA0635-1.tar.gz (Achtung: ca. 4.2 MB!)
Die ganzen Schaltpläne, Stücklisten, Programme, usw. gibt es hier: gfxlcd-0.3.tar.gz
Dateien im Archiv und dessen Beschreibung:
Unterverzeichnis /cflres-ctrl-0.3 (CFL/RESET-Controller) -------------------------------------------------------- control_logic3.brd - Schaltplan control_logic3.sch - Layout part-list - Bauteilliste reedrel.lbr - Bibliothek fü das Reed-Relais shematics_cflres_ctrl.pdf - Schaltplan als PDF Unterverzeichnis /gfxlcdctrl-hw-1.7 (LCD-Controller) ---------------------------------------------------- 62256SO28L.lbr - Bibliothek für das statische RAM 62256 (32Kx8) im SOJ28 Gehäuse lcdcon.lbr - Bibliothek für die LCD-Anschlußbuchse new_hand5_1_8_64k_smd.brd - Das Layout new_hand5_1_8_64k_smd.sch - Der Schaltplan part-list - Bauteilliste sed1335F0B_QFP60.lbr - Bibliothek für den SED1335F0B im QFP-60 Gehäuse shematics_lcd_ctrl.pdf - Schaltplan als PDF Unterverzeichnis /gfxlcdtest-0.7 (Das Testprogramm) --------------------------------------------------- Makefile - Das Makefile für gfxlcdtest.c README.hantronix - Beschreibung des Hantronix Beispielcodes [1] font_pearl_8x8.c - Der Zeichensatz den das LCD anzeigen soll gfxlcd.h - Headerfile gfxlcdtest.c - Das Testprogramm sed133x.h - SED1335 Headerfile testbild2_bw.pbm - Eine Grafik 320x240 (PBM-Format _ohne_ Header!) [1] nicht im Archiv enthalten. Den Beispielcode gibt es auf der Hantronix Webseite (siehe unten). Unterverzeichnis /sed-mdacon-0.1.4 (Der Kerneltreiber) ------------------------------------------------------ README - README zum Kernelmodul mdacon_sed.c - Kernelmodul Unterverzeichnis /lcd-supply-1.2 (Spannungsversorgung) ------------------------------------------------------ LCD_PowerSupply.brd - Das Layout (Eagle) LCD_PowerSupply.pdf - Schaltplan der Eagle-Version als PDF LCD_PowerSupply_print.png - Belichtungsvorlage LCD_PowerSupply.sch - Der Schaltplan (Eagle) lcdsupply1_1.pdf - V1.1 Schaltplan in PDF part-list - V1.1 Bauteilliste part-list.eagle - Bauteilliste der Eagle-Version TL497A.lbr - Bibliothek für den TL497A
Hier ein paar Bilder vom Conrad-Display und dem CFL-Konverter:
Schaltbild (PDF-Version):
Stückliste:
Part Value Device Package Library Sheet C1 12p C0805 C0805 ipc-rcl 1 C2 12p C0805 C0805 ipc-rcl 1 C3 100n C1206 C1206 ipc-rcl 1 C4 100n C1206 C1206 ipc-rcl 1 C5 100n C1206 C1206 ipc-rcl 1 C6 100n C1206 C1206 ipc-rcl 1 C7 100n C1206 C1206 ipc-rcl 1 C8 100n C1206 C1206 ipc-rcl 1 D1 1N4148 DMLL-41 MLL-41 ipc-rcl 1 IC1 74HC04 7404 SO14 74xxsmd 1 IC2 74HC32 7432 SO14 74xxsmd 1 P1 25k B25P B25P trimpot 1 Q1 10MHz SM49 SM49 quartz 1 Q2 BC817 SOT23_N SOT23 ipc-rcl 1 Q3 BC807 SOT23_P SOT23 ipc-rcl 1 R1 100k R0805 R0805 ipc-rcl 1 R2 47k R0805 R0805 ipc-rcl 1 R3 4.7k R0805 R0805 ipc-rcl 1 R4 100k R0805 R0805 ipc-rcl 1 SV1 ML10 ML10 ML10 con-ml 1 U$2 62256SOJ 62256SOJ SOJ-28/3 62256SO2 1 U$3 LCD_CON14 LCD_CON14 CON_LCD lcdcon 1 U$4 SED1335 SED1335 QFP60-BB sed1335F 1 U$5 62256SOJ 62256SOJ SOJ-28/3 62256SO2 1 X1 M25H M25H M25H subd 1
Den SED1335 gibt es z.B. bei Spezial Electronic, das RAM und die anderen Kleinteile gibt es bei Conrad Electronic.
Das größte Hindernis ist die doppelseitige Platine. Denn
sowas richtig zu belichten und zu ätzen ist nicht ganz einfach, da
ja beide Seiten deckungsgleich übereinander liegen müssen. Vielen
Dank geht hier an Peter Sobisch, der diese Platine wahrlich kunstvoll geätzt
und gebohrt hat. Ein weiteres Problem, bzw. ein ganzes Stück Arbeit,
ist das Durchkontaktieren. Das wurde hier händisch mit ganz dünnem
Draht gemacht. Dazu wurde eine einzelne Ader von normalem Schaltdraht durch
die Bohrung gesteckt und auf beiden Seiten vorsichtig verlötet. Eine
Sauarbeit, wirklich.
Ein bisschen Mühe macht auch das Einlöten des SEDs , aber
mit einer feinen Spitze läßt sich das einigermaßen problemlos
bewältigen.
Hier zwei Bilder von dem fertigen LCD-Controller:
Stückliste (Version 1.1):
Part Value ---- ----- R1 1.5R R2 18k R3 10k Poti R4 1.2k R5 20R/1W L1 470µ D1 1N4002 U1 TL497A U2 7805 C1 47µ/35V C2 100n C3 150p C4 47µ/35V C5 100µ C6 100n C7 10µ
Hier die Schaltung (PDF-Datei) und ein Bild:
Neu: Eagle-Schaltplan und Layout von der Spannungsversorgung. Vielen Dank geht hier an Ralf Grafe, der sich die Mühe gemacht hat:
Stückliste (Eagle-Version 1.2):
Part Value Device Package Library Sheet C1 100n C2,5-3 C2.5-3 capacitor-wima 1 C2 100n C2,5-3 C2.5-3 capacitor-wima 1 C3 10u CPOL-EUE3.5-8 E3,5-8 rcl 1 C4 150p C2,5-3 C2.5-3 capacitor-wima 1 C5 47u CPOL-EUE3.5-8 E3,5-8 rcl 1 C6 100u CPOL-EUE3.5-8 E3,5-8 rcl 1 C7 100n C2,5-3 C2.5-3 capacitor-wima 1 C8 100u/25V CPOL-EUE3.5-8 E3,5-8 rcl 1 D1 1N4001 1N4004 DO41-10 diode 1 D2 1N4004 1N4004 DO41-10 diode 1 IC1 7805 78XXL 78XXL v-reg 1 L1 L-EU0207/10 0207/10 rcl 1 POWER 22-23-2021 22-23-2021 con-molex 1 R1 1,5 R-EU_0207/10 0207/10 rcl 1 R2 20/1W R-EU_0207/10 0207/10 rcl 1 R3 18k R-EU_0207/10 0207/10 rcl 1 R4 1k2 R-EU_0207/10 0207/10 rcl 1 R5 10k TRIM_EU-PT10S PT-10S pot 1 SV2 ML10 ML10 ML10 CON-ML 1 U$1 TL497A TL497A DIL14 TL497A 1
Hier die Schaltung (PDF-Datei):
Stückliste:
Part Value Device Package Library Sheet BUS ML10 ML10 ML10 con-ml 1 C1 100n C5B2,5 C5B2,5 cap 1 C2 100n C5B2,5 C5B2,5 cap 1 C3 100n C5B2,5 C5B2,5 cap 1 CFL MA03-1 MA03-1 MA03-1 con-lstb 1 D1 1N4148 1N4148 DO35-10 diode 1 EXT MA04-1 MA04-1 MA04-1 con-lstb 1 IC1 74HC30 7430 DIL14 74xx 1 IC2 74HC175 74175 DIL16 74xx 1 IC3 74HC00 7400 DIL14 74xx 1 R1 4.7k 0204/7 0204/7 r 1 R2 4.7k 0204/7 0204/7 r 1 R3 4.7k 0204/7 0204/7 r 1 SUPPLY MA03-1 MA03-1 MA03-1 con-lstb 1 U$2 REED REED REED reedrel 1
Der Stecker BUS muß dann folgendermaßen mit dem LCD-Controller, bzw. dem parallelen Port verbunden werden:
CFL-Controller (BUS) LCD-Controller/Parallelport ------------------------------------------------------------ 1 - A0 ------- 14 - /FEED 2 - D3 ------- 5 - D3 3 - /RD ------- 16 - /RESET 4 - D2 ------- 4 - D2 5 - /WR ------- 1 - /STROBE 6 - D1 ------- 3 - D1 7 - D7 ------- 9 - D7 8 - D0 ------- 2 - D0 9 - /CS ------- 17 - /SELOUT 10 - /RESET_OUT ------- Reset SED1335 = Diode 1, Anode
Hier die Schaltung (PDF-Version) und ein Bild von dem Controller (die Platine auf der rechten Seite):
Leider braucht fast jede Hardware auch ein Stück Software um eingermaßen sinnvoll zu funktionieren. Hier gibt es nun zwei Sachen: ein einfaches Testprogramm und einen Kernel-Treiber. Wer sich für die Programmierung des SED1335 interessiert, sollte sich auf jeden Fall das Datenblatt von der Seiko-Seite besorgen.
Dies ist ein einfaches Testprogramm mit ncurses-Oberfläche, womit man die grundlegenden Funktionen des LCDs ausprobieren kann. Zum kompilieren einfach in das Verzeichnis wechseln und make eingeben. Dann das Programm als root aufrufen, da es direkt auf den parallelen Port zugreifen muß. Nach dem Start erscheint im oberen Teil das Menu und im unteren sind Logging-Ausgaben zu sehen.
Hier ein Screenshot und ein Bild der Ausgabe auf dem LCD:
Funktionen:
1 - Display on = Schaltet das LCD an 2 - Display off = Schaltet das LCD aus 3 - Enter sleep Mode = Bringt den SED und das LCD zum schlafen 4 - Wakeup from Sleep Mode = Weckt den SED und das LCD wieder auf 5 - Display default GFX = Zeigt die Grafik an (testbild2_bw.pbm) 6 - Display default Text = Zeigt einen Text an 7 - Clear GFX Screen = Löscht den Grafikbildschirm 8 - Clear Text Screen = Löscht den Textbildschirm 9 - Cursor off = Schaltet den Text-Cursor ab 0 - Cursor on = Schaltet den Text-Cursor ein c - Console Mode = Ein pseudo Konsolenmodus. Man kann tippen. (Beenden mit .) r - read Cursor address = Liest die aktuelle Cursor-Adresse g - GFX Test = Zeichnet eine Sinus-Kurve (ziemlich langsam!) s - read Status flag = Liest das Status-Flag vom SED o - read control port = Liest den Controlport (Parallelport) b - get byte at cursor address = Liest das Byte an der aktuellen Cursor-Position a - attribute test = Zeigt ein paar Buchstaben invers an e - Reset SED = Resetet den SED w - Backlight on = Schaltet die Hintergrundbeleuchtung ein v - Backlight off = Schaltet die Hintergrundbeleuchtung aus x - Exit = Beendet das Programm
Um den Treiber einzubinden geht man so vor:
Probleme:
Hier ein paar Bilder von der Konsole:
Der Controller und das Display funktionieren - ohne Änderungen an der Hardware - mit der letzten Version (v0.5.2) von LCDproc. Der dortige Treiber für den SED1330 benutzt genau die gleiche Portbelegung, sofern in der Konfiguration der passende Typ angegeben wird.
Download von http://lcdproc.org/
Die Installation wird dann einfach anhand der Dokumentation durchgeführt.
Hier auf meinem Rechner habe ich als Installations-Ort /usr/local/ benutzt.
Hier die Kurzform, der Treiber muss beim configure mit --enable-drivers=... angegeben werden.
Es ist evtl. auch sinnvoll, den curses-Treiber mit zu bauen, da man damit schön die Ausgabe
testen kann.
> tar xzvf lcdproc-0.5.2.tar.gz > cd lcdproc-0.5.2 > ./configure --prefix=/usr/local --enable-drivers=curses,sed1330 > make > su # make installDie Konfigurationsdateien liegen dann unter /usr/local/etc.
## Server section with all kinds of settings for the LCDd server ## [server] ... Driver=sed1330 ... DriverPath=/usr/local/lib/lcdproc/ ... ### Driver sections are below this line, in alphabetical order ### ... ## Seiko Epson 1330 driver ## [sed1330] # Port where the LPT is. Common values are 0x278, 0x378 and 0x3BC Port=0x378 # Type of LCD module (legal: G321D, G121C, G242C, G191D, G2446, SP14Q002) # Note: Currently only tested with G321D & SP14Q002. Type=SP14Q002 # Width x Height of a character cell in pixels [legal: 6x7 - 8x16; default: 6x10] CellSize=6x10 # Select what type of connection [legal: classic, bitshaker; default: classic] ConnectionType=bitshaker
Auf den ConnectionType kommt es besonders an! Es muss bitshaker verwendet werden, da hier dann die Zuweisungen des Controlports richtig passen (Siehe Dokumentation oder Source).
Die anderen Konfig-Dateien können erstmal so bleiben, sie sind für die Clients, wobei lcdproc hier der wichtigste sein dürfte. Dieser zeigt nämlich die verschiedenen Screens, z.B. System-Load, Netzwerkstatistik, usw. an.
lcdexec kann über das Menu bestimmte Befehle starten. Das Menu benötigt aber ein Keyboard am Display, hier also nicht zu gebrauchen. Testen kann man das, wenn man den curses Treiber verwendet.
lcdvc ist ein einfacher Teminal-Client. Man hat dann die aktuelle Konsole auf dem Display und kann sich dann einloggen (über die normale Tastatur), usw.
Auf der Website von LCDproc gibt es noch mehr Links zu anderen Clients und im Web sind bestimmt noch viele mehr zu finden.
Nun denn, auf zum ersten Test. Als root einmal den LCDd aufrufen:# LCDd -r 4 -f ... Server running in foreground Listening for queries on 127.0.0.1:13666 sed1330: Using LCD type SP14Q002 sed1330: Using ConnectionType bitshaker sed1330: Text size: 53x24 sed1330: Cell size: 6x10 sed1330: Graphical size: 320x240 ...
Optionen sind mit -r 4 der Report-Level und mit -f die Anweisung, im Vordegrund zu laufen, also nicht als daemon.
Jetzt sollte am angeschlossen Display eine Ausgabe zu sehen sein:## LCDproc Server ##########################+ Clients: 0 Screens: 0Wenn das geklappt hat, kann man mal den lcdproc Client starten:
> lcdproc -f
Jetzt sollten die verschiedenen Screens nach und nach auf dem Display angezeigt werden. Diese können in der Konfig-Datei /usr/local/etc/lcdproc.conf angepasst werden.
Zu guter Letzt sollten dann noch die init-Scripte kopiert werden, damit
der LCD daemon und der oder die benötigten Clients beim hochfahren des
Systems gestartet werden.
Hinweis: Ich verwende hier debian und kopiere also die passenden Scripts:
# cp scripts/init-LCDd.debian /etc/init.d/LCDd # cp scripts/init-lcdproc.debian /etc/init.d/lcdproc
Jetzt noch die Links auf die Runlevel anlegen.
Start in rc2# cd /etc/rc2.d # ln -s ../init.d/LCDd S20LCDd # ln -s ../init.d/lcdproc S50lcdprocStop in rc0 und rc1
# cd /etc/rc0.d # ln -s ../init.d/LCDd K50LCDd # ln -s ../init.d/lcdproc K20lcdproc # cd /etc/rc1.d # ln -s ../init.d/LCDd K50LCDd # ln -s ../init.d/lcdproc K20lcdproc
Fertig :-)
Bei meinem Display funktionierte die Geschichte leider nicht ganz auf Anhieb. Beim Testen mit LCDd wurde auf dem Display nur ein komplett schwarzes Bild angezeigt. Nachdem ich mir mal die Signale der Steuerleitungen mit dem Oszilloskope anschaute, war das auch kein Wunder. Von Rechtecksignalen war da nicht mehr viel über, so hat vermutlich nicht mal die Initialisierung richtig geklappt. Vermutlich liegt das an dem zu aggressiven Timing im Treiber sed1330, zumindest für mein Setup hier, welches im Moment zugebenermaßen auch etwas verbastelt ist. In Verbindung mit einem schlechten und/oder langen Parallelportkabel kann es dann halt Probleme geben.
Aber es gibt ja den Source-Code. Nach dem Einfügen von einigen Pausen in die Display Command Routine funktionierte alles wie gewünscht. Auch die Signale sahen auf dem Scope dann eingermaßen gut aus.
Hier die entsprechenden Änderungen am Source:
server/drivers/sed1330.c
/////////////////////////////////////////////////////////////////
// Send a command and accompanying p
// INTERNAL
//
void
sed1330_command( PrivateData * p, char command, int datacount, unsigned char * data )
{
int i;
int port = p->port;
int s = 2;
port_out(port+2, (p->nRESET|p->nWR|p->A0) ^ OUTMASK); // set A0 to indicate command
port_out(port, command); // set up p
uPause(s);
port_out(port+2, (p->nRESET|p->A0) ^ OUTMASK); // activate ^WR
uPause(s);
port_out(port+2, (p->nRESET|p->nWR|p->A0) ^ OUTMASK); // deactivate ^WR again
port_out(port+2, (p->nRESET|p->nWR) ^ OUTMASK); // clear A0 to indicate p
for (i = 0; i < datacount; i++) {
port_out(port, data[i]); // set up data
uPause(s);
port_out(port+2, (p->nRESET) ^ OUTMASK); // activate ^WR
uPause(s);
port_out(port+2, (p->nRESET|p->nWR) ^ OUTMASK); // deactivate ^WR again
uPause(s);
}
}
Hier ist der Output von diff -u zum downloaden: sed1330-timingchange.diff
This works on my machine ;-)