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?". Das eBook in Aktion 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 EPROM (Detail) 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 VFD (Detail) 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 eBook zerlegt: Hauptplatine von oben und VFD von unten 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


Schaltplan
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