USB-LCD
Vorgeschichte:
Ich habe die
Schaltung Hauptsächlich
entwickelt um ein LCD, das damals (12/2003) am Parralellport lief, über
USB mit dem sehr guten Programm JALCDs zu betreiben. Außerdem wolle ich
die Assemblersprache der Atmel AVR Reihe erlernen. Ich habe früher
schon auf anderen 8 und 16Bit Systeme Assembler (6502 und
MC68000
) programmiert weshalb mir der Umstieg nicht all zu schwer fiel. Das
Projekt ist ständig gewachsen, so kam mit der Zeit die PWM-Steuerung
der Hintergrundbeleuchtung und Kontrast hinzu, sowie der Bootscreen im
EEprom und nicht zuletzt die geätzte Platine, für die ich mich extra in
das Elektronik CAD Programm EAGLE eingearbeitet habe und das obwohl ich
eingefleischter Lochraster-Freak bin, oder besser gesagt war.
Das
USB-LCD hat die gleiche Funktion wie das USB-LCD2, ist aber
Hauptsächlich mit DIL ICs aufgebaut und kommt mit einer Einseitigen
Platine aus. Der einzige SMD IC ist der FT232BM, der auf der Lötseite
montiert wird. Der FT232BM ist mittlerweile nicht mehr
lieferbar
und wurde durch den FT232BL (Bleifrei) ersetzt, der kompatibel
mit
der BM Version ist. Oben im Bild ist ein (nachträglich eingelöteten)
Max809 Resetbaustein zu sehen, der nur benötigt wird wenn ein alter
AT90S2313 benutzt wird. Dieser soll einem Bug im AT90S2313
entgegenwirken, der bei abfallen der Betriebsspannung (ausschalten)
noch Datenmüll ins Eprom schreibt.
Die
Schaltung
wurde ursprünglich mit dem Mikrocontroller AT90S2313
entwickelt
der mittlerweile ausläuft. Der Nachfolger vom AT90S2313 ist
der
ATiny2313 der abwärtskompatibel zum AT90S2313 ist. Dazu müssen jedoch
ein paar Fusebits verändert werden.Da dies schon kompetente
Leute
sehr gut erklärt haben, mach ich es mir einfach und verlinke hier zu Mikrocontroller-Projekte.de. Einen
sehr einfachen und tauglichen Programmer gibt es bei Elektronik-Projekte von
Scott-Falk Hühn.
Technische Daten:
- Läuft mit jaLCDs und LCD-Smartie ohne irgendwelche Plugins.
- Kontrast und Backlight über Software einstellbar.
- Bootscreen in EEprom speicherbar (mit Terminalprg. Hyperterm o.Ä.)
- 19200 Baud (8N1) Handshake off
- Unterstützt werden alle gängigen Text-LCDs mit einem(!) HD44780Controller
- Das wären 1x16,1x20,2x16,2x20,4x16 und 4x20
- Stromversorgung bis fast 500mA direkt an USB
Für Programmierer:
- Einfache Ansteuerung über Virtuellen Comport z.B. COM3: ,im Terminalprogramm sieht man die Zeichen die man eintippt
- Alle möglichen Funktionen zur Cusorsteuerung
- Benutzerdefinierte Zeichen.
- Der Bargraph (im Design von jaLCD) ist in der Firmware und auch außerhalb von jaLCDs nutzbar.
Funktion:
Der AVR emuliert ein serielles LCD Display von Cristallfontz,
(aber
nur soweit das es mit JaLCDs läuft). Um Portleitungen zu sparen habe
ich mich entschieden das LCD im 4-Bit Modus zu Betreiben, so brauche
ich nur 6 Portleitungen um das LCD zu steuern und 2 für den
UART
(serielle Schnittstelle).
Da der AVR 15 Portleitungen hat sind also noch 7 Portbits frei, von
denen ich aber noch 2 Reserviere um die Hintergrundbeleuchtung und den
Kontrast (über PWM- Pulsweitenmodulation) zu Steuern.
Grob gesagt wird z.B. die Beleuchtung andauernd ein und ausgeschaltet
und zwar so schnell, dass das Auge das nicht mehr mitbekommt.
5 Portleitungen sind also noch frei, die der Anwender nach Lust und
Laune mit Relais, LEDs oder Transistoren beschalten kann. Die
5
Ports sind in der Firmware als Ausgang programmiert und können vom
Anwender über JaLCDs angesteuert werden (dazu später mehr).
Die komplette Firmware ist in Assembler geschrieben und der UART
besitzt eine eigene Interruptroutine sodass die Kommunikation über
19200Baud laufen kann.
Die Schaltung
Hier die Teilschaltung des AVR:
An TxD und RxD kommt der
FT232BM, für
einen Anschluss an Com1: z.B. währe auch ein Max232 möglich.Ich weiss nicht
mehr mit welchen
Programm ich damals die Schaltpläne gezeichnet habe, Eagle war es
jedenfalls nicht.
Links im Schaltplan ist der übliche 4 MHz Quarz mit den 27pF Kondensatoren und die Power-on-Reset Schaltung mit R1 und C1 zu sehen. An PD0..4 kommen die Datenleitungen des LCDs D4..7 (4-Bit Modus), an PD5 und 6, 2 weitere Steuerleitungen des LCDs.
Kontrast:
Wird Pin 18 des AVR an das 10k Poti angeschlossen (Jumper wie
gezeichnet) liegt der Kontrast-Eingang des LCDs am PWM-Signal. Ist der
Jumper in Stellung +5 Volt hat man eine herkömmliche Kontrastreglung
die nur über den 10k Poti (Trimmmer) eingestellt werden kann.
Da ich unterschiedliche LCDs ausprobiert habe und jedes seine eigene
optimale Kontrastspannung hat, hab ich mich entschlossen den
herkömmlichen 10k Trimmer einzubauen, da man so optimal den Kontrast
auf das jeweilige LCD einstellen kann.
Abgleich:
Man stellt den Kontrast in der Software auf 0, und dreht das Poti so, dass man die Schrift auf dem LCD gerade noch sehen kann. Danach stellt man den Kontrast auf 50 - 70 und das Bild ist ok. Der 10 uF Elko ist zum Glätten der PWM Spannung und bildet zusammen mit dem 10k Poti einen Tiefpass-Filter. Sollten noch Streifen auf dem LCD zu sehen sein kann man den Wert auf 47 µf erhöhen.
Nun kommt der FT232BM ins Spiel.
Dieser Chip bringt wie gesagt alle Treiber mit und legt bei der Installation des VCP-Treiber einen virtuellen Com Port an (bei mir COM3). Der AVR kriegt also gar nicht mit ob er nun am USB oder an einem normalen Com Port hängt. Würde man an Txd und Rxd des FT einen Max232 anschließen könnte man eigentlich jedes Gerät mit serieller Schnittstelle an USB betreiben. Der FT232BM ist (fast) nach dem Designers Guide Page 6 angeschlossen, wobei Pin14 (PWRCTRL) mit Masse verbunden ist. Das SAGT dem Chip, dass er von der USB-Schnittstelle mit Spannung versorgt wird. Der 6 MHz Quarz mit den beiden 27 pF Kondensatoren kann natürlich (wie im Datenblatt des FT angegeben) durch einen 6 MHz Resonator ersetzt werden.Die Ferrit Perle (die hohe Frequenzen ausfiltern soll) hab ich mir von einem alten Mainboard ausgelötet. Ist nichts anderes zur Hand genügen auch ein paar Windungen Kupferlackdraht (Luftspule) oder eine Drahtbrücke
Die LEDs Tx und Rx Blinken lustig bei Betrieb und
signalisieren,
dass der FT232 Daten empfängt oder sendet. Will man nur eine
LED
anschließen (siehe ?Die Platine?) kann Pin 11 und 12 gebrückt werden
und nur eine LED (natürlich mit dem 220 Ohm Vorwiderstand) eingebaut
werden. Siehe Datenblatt Seite 20.
Pin 15 (PWREN#) geht auf Low sobald der FT initialisiert ist
und
schaltet die Hintergrundbeleuchtung ein (dazu später mehr).
Der 93C46 ist ein sogenanntes EEprom (nicht zu verwechseln mit dem EEprom der im AVR enthalten ist) und braucht nur in besonderen Fällen bestückt zu werden:
- Es werden mehr als ein FTDI Chip am USB betrieben. Dann braucht die jede Schaltung eine Eindeutige ID-Nummer.
- Man möchte mehr als 100 mA am USB-Port ziehen.
Also Datenblatt vom LCD lesen und schauen was die Hintergrund
Beleuchtung zieht. In diesem Fall muss noch ein Leistungstransistor an
Pin 15 des FT angeschlossen werden, der dann die Hintergrundbeleuchtung
schaltet. Das EEprom wird in der Schaltung (direkt über USB)
programmiert und zwar mit MProg.
Dazu müssen aber die Direkttreiber von Ftdi Installiert werden, da das
Tool sonst das EEprom nicht findet. Man lädt einfach die Beispielkonfig
in MProg und ändert den Wert auf (max.) 490 mA, (laut FTDI kann es bei
500 mA zu Problemen kommen) außerdem ist ein Helpfile dabei (leider
englisch), dass die anderen Parameter gut erklärt. Nach der
Programmierung des EEprom wird der Direkttreiber wieder deinstalliert
und der VCP-Treiber installiert. Das geht recht problemlos, da ein
Deinstallationstool mitgeliefert wird.
Die Schaltung für die Hintergrundbeleuchtung:
Bei
dieser Schaltung
muss das EEprom bestückt sein und mit Mprog auf 490mA max. programmiert
werden. Beim anschließen der Schaltung an den USB sind nämlich nur 100
mA zulässig und der FT muss die 490 mA erst vom PC anfordern. Ist dies
geschehen und die Initialisierung des FT hat geklappt, zieht der Chip
Pin 15 auf Masse. Das hat zur folge das Q1 sperrt und die Basis des
BD135 über R2 angesteuert wird. Das dauert einen kleinen Moment da C1
erst noch geladen sein will (Softstart).
Q3 wird benutzt um die Hintergrundbeleuchtung per PWM anzusteuern. Bei
einem High-Impuls an der Basis von Q3 wird die Basis vom BD auf Masse
gezogen so das dieser sperrt und die Hintergrundbeleuchtung
(kurzzeitig) abschaltet. Kommen die Impulse schnell genug ist kein
flackern der Beleuchtung sichtbar und das Backlight wird "gedimmt"
R3 berechnet sich wie folgt: Braucht die Hintergrundbeleuchtung (Datenblatt lesen) 4,2 Volt bei einem Strom von 270 mA rechnet man nach dem Ohmschen Gesetz R=U/I (5Volt ? 4,2Volt) / 0,27Ampere = 2,96 Ohm.
Dieser krumme Wert gibt es natürlich nicht zu kaufen und man
nimmt
den nächstmöglichen aus der Normreihe, in diesem Fall 2,7 Ohm oder 3,3
Ohm. Dieser Widerstand muss belastbar sein mit P=U*I (5 -
4,2) *
0,27 = 0,216 Watt. 0,5 Watt reicht also Dicke. Braucht die
Hintergrundbeleuchtung weniger als 100 mA, bleibt Pin 15 des FT232BM
unbeschaltet d.h. R1 und Q1 können weggelassen werden. Auch das EEprom
kann man sich sparen.
Die genaue Typenbezeichnung der Transistoren ist nicht kritisch, man
kann statt des BC547 auch einen BC107, 237 o.Ä nehmen (TUN) bei Q2 muss
man nur schauen (Datenblatt), dass er den maximalen Strom der
LCD-Hintergrundbeleuchtung treiben kann.
Hier der komplette Schaltplan:
Karsten Barth hat sich die Arbeit gemacht und die komplette Schaltung mit Eagle neu zu Zeichnen, und zur Verfügung zu stellen. (THX)
Hat der Aufbau geklappt meldet sich beim anschließen der
Schaltung
Windows mit "Neues Gerät blah bla ".
Nun werden die USB und Serial Treiber installiert.
Der Treiber legt eine neue (Virtuelle) Serielle Schnittstelle an mit
der nächstmöglichen freien Portnummer.
Hat man also schon 2 Serielle am Rechner wird Automatisch eine neue
com3 Schnittstelle angelegt.
Jetzt im Gerätemanager (USB-Serial-Port) 19200 Baud einstellen.
Das LCD ist nur soweit kompatibel mit den Cristallfonts_LCDs, dass es
mit jaLCDs läuft. Und das OHNE zusätzlichen Treiber und dll.
Außerdem hab ich Testweise den (bei Cristall) unbenutzten Befehl "16"
benutzt um die 5 freien PortB (PB2-PB6)Leitungen des AVR als Ausgang zu
nutzen.
Ich nenne mal PB2 User0, PB3 User1 usw.
Wenn ich also in eine Zeile in der jaLCDs (configtool) z.B.
$ascii:16§$ascii:3§ eingebe werden User0 und User1
Eingeschaltet
User 2,3 und 4 werden ausgeschaltet.
Da PB0 und 1 am FT angeschlossen sind, wird der wert 2 mal
nach
links geschoben.
Noch ein paar Beispiele:
- $ascii:16§$ascii:1§ = PB2 (User0) Ein, Rest aus
- $ascii:16§$ascii:0§ = alles aus
- $ascii:16§$ascii:16§ = PB6 (User4)Ein Rest aus
Es wird also der binäre Wert des entsprechenden Portbits (ab PB2) als Parameter des Befehl 16 gesendet.
Damit ergeben sich völlig neue Möglichkeiten.
Man kann z.B. eine Lüftersteuerung realisieren in dem man mit ?If? Befehlen MBM nach der Temperatur fragt und abhängig davon mit jaLCDs den Lüfter schaltet.
Die Platine
Zwecks
einfacherem Aufbau,
hab ich mich entschlossen eine einseitige Platine zu entwerfen, bei dem
sich nur der FT232BM (als einziges SMD-Bauteil) auf der Unterseite
befinde.
Die Maße der Leiterplatte sind ca. 3,2 x 10 cm. Die Lochrasterfläche
rechts ist für Erweiterungen des Userports gedacht.
Da die Platine einseitig ausgeführt ist war es nötig 2 Drahtbrücken und
3 Verbindungen auf der Lötseite der Platine anzubringen (im Foto oben
mit Fädeldraht hergestellt), dafür spart man sich aber die aufwendigere
Herstellung einer Doppelseitigen Platine und das Durchkontaktieren.
Stückliste:
Halbleiter:
1
FT232BM
1
AT90S2313
1
93c46(56,66)
1
BD135 (BD137,
BD139)
2
BC547 (BC237,
BC107)
1
LED 3mm
Widerstände:
2 27
Ohm
(alle
Widerstände ausser RX)
1
220
Ohm
1/6 oder 1/8 Watt RM5.08)
1
470 Ohm
1
1 KOhm
1
1,5 KOhm
1
2,2KOhm
3
10 KOhm
1
15 KOhm
1
10 KOhm Trimmer
Kondensatoren:
1
10 nF
1
33 nF
5
100 nF
2
10
uF
Elko
..und dann noch:
1
6MHz
Resonator
1
4MHz Resonator
Anstatt der Resonatoren kann auch ein Quarz benutzt werden, die 27 pF
Cs (siehe Schaltplan) werden dann auf der Lötseite Bestückt.
1
IC-Fassung 8pol
1
IC-Fassung 20pol
1
Wannenstecker
10pol + Passendes Flachbandkabel mit Stecker
1
USB-B Buchse
1
Stiftleiste mit
Jumper 3pol
1
IC-Leiste (ISP)
6pol
Beim Bestücken sollte man sich an die üblichen Regeln halten.
Also
zu erst die niedrigen Bauteile wie Drahtbrücken, Widerstände und sich
zu den größeren Bauteilen vorarbeiten. Zum Schluss wird die USB-B
Buchse eingelötet.
Beim verlöten vom FT232BM sollte man Entlötlitze bereithalten, da es
fast unmöglich ist das Teil zu löten ohne das sich ab und zu Brücken
bilden.
Tipp: Aufbau auf Lochraster
Der
FT232BM Chip hat
einen Pinabstand von 0,8 mm (ein drittel des normalen Lochrasters).
Dass es (gerade) noch möglich ist diese Chips auf Lochraster zu löten
zeigt folgendes Bild von meinem 1. Prototyp.
Ich habe es so gemacht:
Zuerst habe ich den Chip auf die Lochrasterplatine geklebt. Dann habe ich Silberdraht 0,3mm verwendet, den ich immer zuerst von unten auf das Lötpad gelötet habe (wichtig, das fixiert den Draht), danach lässt sich der Silberdraht wunderbar (unter der Lupe) biegen und abschneiden. Da man beim abschneiden des Drahts diesen etwas anheben muss, hab ich ihn vorher mit einem Skalpell etwas angeritzt um die genaue Stelle anzuzeichnen. Durch stärkres anritzen ist es sogar möglich den Draht exakt an der Stelle zu brechen (mehrmals hin und her bewegen). Bei diesem dünnen Silberdraht dauert der Lötvorgang höchstens eine halbe Sekunde. Ich habe in Foren gelesen, das anstatt Silberdraht, auch Kupferlackdraht (Fädeldraht) oder einzelne Litzen von Netzkabeln o.Ä. benutzt werden kann. Auch gibt es Adapterplatinen für den SMD-Chip (diese kosten allerdings ca.4-5 Euro ). Da hilft nur ausprobieren und das Beste für sich herausfinden.
Download
Alle Benötigten USB-LCD Dateien gezippt.