Dieses VFD (Vakuum-Fluoreszenz-Display) hätte eigentlich im Firmenmüll landen sollen. Nachdem ich es vor der Tonne gerettet und recht umständlich das Datenblatt besorgt hatte, blieb die Frage: "Was anstellen mit dem Ding?". Die Antwort war schnell gefunden: Es sollte ein "elektronisches Buch" werden!
Als Buch habe ich mich für die Bibel entschieden, was nicht religiös motiviert ist, sondern weil die Bibel...
- ...allein wegen ihres Umfangs eine Herausforderung ist.
- ...schön hierarchisch gegliedert ist in Bücher, Kapitel und Verse – optimal zum Durchblättern und schnellen Auffinden bestimmter Stellen.
- ...kostenlos in digitaler Form (ASCII) im Netz erhältlich ist.
- ...sehr bekannt ist.
- ...ich sie immer schon mal lesen wollte, aber einst irgendwo in den Chronika *gääähn* versackt bin.
Herz und Hirn des eBook ist ein AVR ATmega8, ein kleiner 8-Bit-µController. Er liest den Text aus dem Datenspeicher und stellt ihn auf dem Display dar.
Über drei Taster sind Geschwindigkeit der Anzeige sowie Helligkeit einstellbar. Zudem kann eingestellt werden, ob der momentane Buch-Name sowie Kapitel- und Versnummer angezeigt werden sollen oder nicht. Die Einstellungen werden dauerhaft gespeichert und überstehen das Trennen des eBook von der Versorgungsspannung.
Bei entspannter Lesegeschwindigkeit dauert es etwa eine Woche, um die Bibel einmal komplett anzuzeigen.
Der Speicher: EEPROMs
Den Datenspeicher für das Buch bilden vier 1-MByte EPROMs. Eine popelige SD-Karte wäre zwar wesentlich billiger und einfacher gewesen – sowohl was deren Programmierung und Ansteuerung als auch das Layout der Platine angeht – aber diese modernen Medien wie SD und MMC sind lange nicht so rustikal wie die guten alten EPROMs, die freien Blick auf den Silizium-Chip gewähren.
Um die EPROMs zu brennen musste allerdings erst ein Eprommer gebaut werden, der deutlich mehr Arbeit war als das ganze eBook! Aber das ist eine andere Geschichte...
Jedes EPROM fasst 8 MBit, die jeweils in 1 Mega × 1 Byte organisiert sind. Der Adressbus, mit dem der kompletten EPROM-Speicher adressieren werden kann, muss also 22 Bit breit sein. Über die beiden oberen Bits werden die ChipEnable-Signale zur Auswahl des richtigen EPROMs erzeugt, und die unteren 20 Adressbits wählen das zu lesende Byte innerhalb des gewählten EPROMs.
Die Anzeige: Ein VFD
Die Anzeige ist ein Noritake itron CU16025ECBP, ein 2×16-Zeichen Vakuum-Fluoreszens-Display (VFD), im Endeffekt also eine Elektronenröhre.
Die Kathode besteht aus dünnen, waagerecht vor den Anoden gespannten Filamenten. Beim Betrieb wird die Kathode beheizt, was man im Dunkeln an den dunkelrot glimmenden Kathoden-Fäden erkennt. Die Kathoden sind über eine Spannvorrichtung geführt, damit diese auch bei Erwärmung und dadurch bedingter Längenausdehnung straff bleiben. Aufgrund der Erwärmung der Kathode treten durch Glühemission Elekronen aus ihr aus.
Die Anoden sind mit einem fluoreszierenden Substrat beschichtet. Wird an einen Anoden-Pixel eine Spannung angelegt, dann werden von der Kathode Elektronen abgesaugt und auf dem Weg zur Anode durch das elektrische Feld beschleunigt. Treffen diese Elektronen auf der fluoreszierenden Anode auf, leuchtet diese aufgrund ihrer fluoreszierenden Beschichtung in Phosphorgrün. Anoden-Pixel, die nicht unter Spannung stehen, bleiben duster.
Im Gegensatz zu einem LCD ist ein VFD selbstleuchtend und auch bei hellem Tageslicht gut aus allen Betrachtungswinkeln ablesbar. Die Anzeige ist deutlich schneller als bei handelsüblichen LCD-Modulen, was einen einigermaßen gut lesbaren Fliesstext erst ermöglicht. Ein VFD braucht aber wesentlich mehr Strom als LCDs, die ja praktisch stromlos betrieben werden können. Ausserdem ist ein VFD dicker, schwerer und teurer als ein vergleichbares LCD.
Das Display-Modul wird über ein fast-HD44780-kompatibles Interface angesprochen und ist damit so einfach anzusteuern wie jedes handelsübliche LCD-Modul. Das Protokoll ist um ein paar Befehle erweitert, z.B um die Helligkeit des VFD einstellen zu können. Auf dem Modul befindet sich neben dem Display-Controller auch ein Aufwärtswandler, der die "Hochspannung" für das VFD erzeugt. Versorgt wird das Modul mit einer Gleichspannung von 5 Volt, die Ein-/Ausgänge sind TTL-kompatibel.
Datenblatt zum Download: "CU16025ECPB-W6J" (pdf, 450 kByte)
Die Hauptplatine
Die Hauptplatine dient als Träger für das VFD. "Hirn" ist ein AVR ATmega8, der die Daten aus den EPROMs liest, verarbeitet und auf dem VFD anzeigt.
Es gibt drei Taster, mit deren Hilfe einfach im eBook auf Buch-, Kapitel- oder Vers-Ebene vor- und zurücknavigiert werden kann. Helligkeit, Geschwindigkeit der Anzeige und weitere Einstellungen werden ebenso über die Taster vorgenommen.
Ein LowDrop-Festspannungsregler LM2940-Z5 regelt die Eingangsspannung von 6–9 V auf die benötigten 5 Volt ein.
Der Datenfluss auf dem Board geschieht im Wesentlichen in drei Bussen:
- 1-Bit serieller Adress- und CE-Bus
- Da der ATmega8 nicht über genügend Ports verfügt, geschieht die Ausgabe der 20 Adress-Leitungen und der 4 ChipEnable-Leitungen (CEn) über einen SPI-Bus mit drei 74*595 Portexpandern. Der 20-Bit Adressbus und die 4 CE-Leitungen entspringen an den Portexpandern.
- 8-Bit paralleler Datenbus
- Ein Parallelbus für die Nutzdaten. Diesen Bus nutzt der ATmega8 einerseits, um Daten aus den EPROMs zu lesen und andeserseits, um Daten und Kommandos an das VFD auszugeben.
- 20-Bit paralleler Adressbus
-
Die Adresseingänge der EPROMS hängen parallel am Adressbus. Nachdem der gewünschte EPROM über seine CE-Leitung ausgewählt und die Adresse angelegt wurde, kann ein Datenbyte aus dem Speicher gelesen werden.
Intern ist der Adressbus 22 Bit breit. Während die unteren 20 Bits über die Portexpander ausgegeben werden, dienen die oberen beiden Bits A20 und A21 dazu, um die Pegel der vier CE-Leitungen zu berechnen.
Es dauert 167 Sekunden, um die 4188215 Bytes des eBook einmal komplett einzulesen. Das entspricht einer Übertragungsrate von 3 kByte pro Sekunde und MHz CPU-Takt. Für den eingestellten Takt von 8 MHz ergibt sich also eine Leserate von 24.5 kByte/s bzw. knapp 200 kBaud.
Die Datenrate auf dem SPI-Bus ist mehr als dreimal höher. Zum Lesen eines Bytes werden 3 Byte Adresse ausgegeben, und bei der Messung der SPI-Datenrate wird nicht aus dem EPROM-Speicher gelesen. Die SPI-Übertragungsrate liegt bei ca. 11.5 kByte/(s·MHz), für den ATmega8-Takt von 8 MHz also bei 93 kByte/s bzw. 740 kBaud.
Schaltplan, Bauteile und Signale
- Bauteile
-
- X2
- Anschluss der Spannungsversorgung, ca. 6 V=
- IC1-IC4
- 27C080: Die EPROMs speichern die Nutzdaten des eBook
- IC5-IC7
- 74HC595: 8-Bit-Schieberegister mit Ausgangs-Latch, genutzt als Portexpander
- IC8
- AVR ATmega8: µ-Controller als zentrale Steuereinheit
- IC9
- LM2940-Z5: Low-Drop-Festspannungsregler (5 Volt)
- VFD1
- VFD
- ISP1
- Adapter zum Update der Firmware (ISP via SPI)
- S1, S2, S3
- Drei Taster zum Blättern, um Einstellungen zu machen, etc.
- C4-C8, C10, C15
- Kondensatoren zum Glätten der Versorgungsspannung
- R1
- PullUp-Widerstand für RESET-Leitung
- R2
- PullUp-Widerstand für OE (EPROM OutputEnable)
- R3, R7
- PullDown-Widerstand für VFD-RESET bzw. VFD-RW
- R5
- PullDown-Widerstand für S1, S2, S3
- R4, R6, T4, SPK1
- nicht bestückt
- Signale
-
- VCC, GND
- Spannungsversorgung von 5V=
- S1-S3
- Signalleitungen der Taster S1-S3: Taster→µC
- D0-D7
- 8-Bit-Datenbus: EPROMs→µC↔VFD
- VFD-RS, VFD-RW, VFD-RESET, VFD-E
- Steuersignale zum VFD: µC→VFD
- SER1-SER3, SCK, RCK
- SPI-Bus für A0-A19, CE0-CE3: µC→Portexpander
- A0-A19
- 20-Bit-Adressbus: Portexpander→EPROMs
- CE0-CE3
- Chip Enable: Portexpander→EPROMn
- OE
- Output Enable: µC→EPROMs. Aktiviert die Ausgangsstufe des selektierten EPROMs zum Lesen der Daten.
- SPK
- Hier könnte eine LED oder ein kleiner Beeper angeschlossen werden: µC→T1 (pnp)
- RESET, VFD-RS, VFD-E, SPK
- Diese Signale werden auch vom In-System-Programmer verwendet, um den µC zu programmieren und Firmware-Updates einzuspielen (RESET, MISO, MOSI, SCK): ISP→µC
Daten
Die Daten des eBook sind auf 4 EPROMs verteilt. Die Daten sind unkomprimierter Text.
Verse sind voneinander durch Zeilenumbrüche ('\n', ASCII-Code 10) getrennt. Jeder Vers beginnt in einer neuen Zeile und enthält keine Umbrüche. Vers-Nummern sind nicht gespeichert. Kapitel sind markiert durch Einträge wie "_1 Mose 3" für das 1. Buch Mose, Kapitel 3. Auch diese Einträge fangen in einer neuen Zeile an und werden mit einem Zeilenumbruch abgeschlossen.
Ausgepackt wird das Archiv z.B. mit dem folgenden Kommando. Das Archiv enthält nur eine Datei namens bible.txt.
> tar xfj ./bible.tar.bz2 > ls -l -h insgesamt 4,0M -rw-r--r-- 1 john users 4,0M 2005-06-13 16:39 bible.txt > head bible.txt _1 Mose 1 Im Anfang schuf Gott den Himmel und die Erde. Und die Erde war wüst und leer, und es lag Finsternis auf der Tiefe, und der Geist Gottes schwebte über den Wassern. Und Gott sprach: Es werde Licht! Und es ward Licht. Und Gott sah, daß das Licht gut war; da schied Gott das Licht von der Finsternis; und Gott nannte das Licht Tag, und die Finsternis Nacht. Und es ward Abend, und es ward Morgen: der erste Tag. Und Gott sprach: Es soll eine Feste entstehen inmitten der Wasser, die bilde eine Scheidewand zwischen den Gewässern! Und Gott machte die Feste und schied das Wasser unter der Feste von dem Wasser über der Feste, daß es so ward. Und Gott nannte die Feste Himmel. Und es ward Abend, und es ward Morgen: der zweite Tag. Und Gott sprach: Es sammle sich das Wasser unter dem Himmel an einen Ort, daß man das Trockene sehe! Und es geschah also.
Falls deine Version von tar das bzip2-Format noch nicht unterstützt, dann kann man bzip2 auch separat aufrufen. tar und bzip2 sind übrigens bei WinAVR dabei.
> bunzip2 --keep bible.tar.bz2 > tar xf bible.tar
Datei zum Download als bz2-Archiv: bible.tar.bz2 (ca. 1 MB, ausgepackt ca. 4 MB).
Software
Eingehendere Dokumentation der einzelnen C-Module befinden sich jeweils in den Headern, teilweise in den C-Dateien. Dokumentation zu den make-Targets befinden sich im Makefile.
Compiler ist avr-gcc 3.4.6 zusammen mit binutils 2.16.1.
- ebook/
-
C-Quelldateien
- main.c
- Das Hauptprogramm. Koordiniert die einzelnen Module, interpretiert Tastendrucke, verwaltet Einstellungen, Anzeige der EPROM-Daten als Fließtext.
- ebook.c
ebook.h
index.c -
eBook-Basis-Funktionen wie Bedienen der 74*595 Port-Expander,
Daten aus den EPROMs lesen,
Suchen von Büchern, Kapiteln und Versen, etc.
Um beim Blättern ein schnelles Auffinden der Buchanfänge zu realisieren, sind die Adressen der Buchanfänge in der generierten Datei index.c gelistet. - vfd-put.c
vfd-put.h - printf-ähnliche Benutzerschnittstelle zur einfachen Ausgabe von Texten auf das VFD, Cursor-Positionierungen, Scrollen u.ä.
- vfd.c
vfd.h
vfd-symbols.c - VFD-Basis-Funktionen wie Kommunikation mit dem VFD-Controller, Schreiben eigener Sonderzeichen, etc.
- timer.c
timer.h - Macht die Zeitbasis durch Timer1-Interrupts und implementiert eine Struktur mit asynchronen Countdown-Zählern.
- taster.c
taster.h - Erkennen von Taster-Eingabe (kurz, lang, auto-repeate) für die drei angeschlossenen Taster S1, S2 und S3.
- ports.h
- Zentrale für die Port-Zuordnungen
- eBook.pnproj
- Projekt-Datei für Programmer's Notepad
- ebook/include/
- Weitere Header-Dateien, die unabhängig von diesem Projekt sind.
- ebook/obj/
-
In diesem Verzeichnis werden die erzeugten Dateien wie hex-Files und
Zwischendateien wie Assembler-Ausgaben des Compilers, List- und Map-Files
abgelegt.
- Makefile
- make-Steuerdatei. Eine Beschreibung der make-targets befindet sich dort.
- ebook/data/
-
- bible.txt
- Die Daten des eBook. Werden gebraucht, wenn ein neuer Index (index.c) erstellt werden soll. Die eBook-Datei ist wegen ihrer Größe nicht im Archiv enthalten. Falls sie gebraucht wird, muss sie separat heruntergeladen und in dieses Verzeichnis kopiert werden.
- ebook/source/
- Java-Quellen, die das Erstellen des Index bewerkstelligen.
C-Quellcode zum Download als bz2-Archiv: ebook.tar.bz2 (ca. 35 kB, ausgepackt ca. 190 kB).
Ausgepackt werden die Quellen genauso wie die eBook-Daten. Das Entpacken erzeugt das oben beschriebene Verzeichnis ebook.
> bunzip2 --keep ebook.tar.bz2 > tar xf ebook.tar
oder mit
> tar xfj ebook.tar.bz2