Museum für mißbrauchte Bauteile

Abteilung "DRAMs und ihre versteckten Möglichkeiten"
Um in die digitale Bildverarbeitung einzusteigen, sind größere Investitionen unvermeidlich. Das teuerste an der Ausrüstung ist eine Kamera, deren Signal digitalisiert und in den Speicher eines Computers eingelesen wird.
Es geht jedoch auch anders, wenn Anprüche an die Auflösung und die Wandelzeit nicht so groß sind.
Ein gezielter Griff in die Grabbelkiste und die artfremde Verwendung eines dynamischen Speicherchips (DRAMs) ist alles, was nötig ist
.

Die aufwendigste, qualitativ beste Methode zur Bilderfassung ist, das Ausgangssignal einer normalen Videokamera zu digitalisieren. Der Schaltungsaufwand dazu ist jedoch erheblich. Es muß ein schneller D/A-Wandler, genügend schneller Speicher und ein Interface zum Computer bereitgestellt werden. Für einfache Experimente ist dieser Aufwand einfach zu hoch. Eine CCD-Kamera mit Computer- Interface ist da schon um einiges billiger zu haben, doch sprengt auch sie mit Leichtigkeit das Hobby-Budget, wenn man bedenkt, daß für einfache Anwendungen in der Mustererkennung auch eine geringere Auflösung ausreicht.

Ein Ausweg aus diesem Dilemma bietet der unkonventionelle Einsatz eines Speicherchips. DRAMs können als optischer Sensor mißbraucht werden. Vor einigen Jahren hat die Firma Micron Technology (ein amerikanischer Speicherchiphersteller ) dies erkannt und eine spezielle Version eines 64k-DRAMs - mit einem Fenster versehen - als Image-Sensor verkauft. Da auch die Geometrie des Chips bekannt war, konnte man mit wenig Aufwand eine einfache Kamera bauen. Leider werden diese Chips nicht mehr angeboten, so daß auch dieser Weg zu einer Computer-Kamera versperrt schien.

Doch eines Tages entdeckte ich beim Ausschlachten eines Computers eine Platine mit DRAMs, die in ein Keramikgehäuse mit Metalldeckel verpackt waren. Der Deckel war schnell entfernt, ein Glasstück als Schutz angebracht, doch was nun? Um mit geringstmöglichem Aufwand mit Experimenten beginnen zu können, modifizierte ich schnell denn Druckerport eines PCs (er hat genau die richtige Zahl von I/O-Leitungen) ein kleines bischen und schrieb zwei kleinere Assemblerprogramme zur Ansteuerung. Und - oh Wunder - nach einigen Versuchen konnte man tatsächlich auf dem Computerbildschirm etwas erkennen.

Wie funktionierts ?

Ein 64k-DRAM enthält 65536 Speicherzellen, die in Matrixform angeordnet sind, um einen einfachen Zugriff zu ermöglichen. Im Falle des hier verwendeten D4164 von NEC sind es vier Matrizen zu je 64x256 Speicherzellen.

Jede Speicherzelle besteht aus einem Kondensator und einem Transistor. Im Kondensator wird Information in Form elektrischer Ladung gespeichert. Der Transistor dient dem Zugriff auf diesen Kondensator. Ist eine Zeile der Matrix selektiert, so schalten alle 256 Transistoren dieser Zeile durch und verbinden den jeweiligen Kondensator mit einem von 256 Verstärkern. Liegt die Spannung an einem Verstärker oberhalb einer bestimmten Schwelle, so wird angenommen, daß eine logische 1 gespeichert wurde, sonst erscheint am Ausgang des Vertärkers eine logische 0 (Die Interpretation von Ladung als logischer 1 und keiner Ladung als logischer 0 ist willkürlich und kann - auch auf dem selben Chip - für verschiedene Speicherzellen unterschiedlich sein). Von den 256 Verstärkerausgängen wird durch die Zeilenadresse einer ausgewählt, dessen Signal dann am Ausgang des DRAM erscheint.

Da nun ein Kondensator auf einem Speicherchip nicht ohne Verluste ist - der Kondensator verliert langsam aber sicher die aufgebrachte Ladung - muß der Inhalt eines DRAMS regelmäßig aufgefrischt werden. Dazu wird beim Lesen einer Zeile das Ausgangssignal der Verstärker in die Kondensatoren zurückgeschrieben. Wird der Speicher nicht aufgefrischt, ist die Ladung irgendwann einmal verloren, das entsprechende Bit kippt.

Durch Belichten des Kondensators wird dieser Effekt verstärkt, der Kondensator entlädt sich schneller, das Bit kippt früher. Die Zeit in der der Kondensator entladen wird ist also ein direktes Maß für die Lichtintensität an dieser Stelle.

Um diesen Effekt zu nutzen, wird wie folgt vorgegangen:

Ein DRAM ist ein Speicherbaustein, deshalb ist die Zuordnung einer logischen Adresse zu einem physikalischen Ort nicht trivial. Um diese Zuordnung herauszufinden sind einige Versuche vonnöten.

Bei einem DRAM, dessen Adressen in zwei Portionen als Zeilen- und Spaltenadresse angelegt werden, kann man davon ausgehen, daß sich dies auch in der physikalischen Struktur des Chips wiederspiegelt. Wie sich gezeigt hat, ist es tatsächlich so, daß logische Zeilenadressen physikalischen Zeilen und logische Spaltenadressen physikalichen Spalten entsprechen. Die logischen Adressen innerhalb einer Zeile entsprechen allerdings nicht dem physikalischen Ort der Speicherzelle auf dem Chip. Im ausgelesenen Bild zeigt sich diese falsche Zuordnung durch vertauschte Zeilen und Spalten. Durch Vertauschen von Adressbits lässt sich dieser Fehler beheben, dazu ist jedoch einiges Experimentieren erforderlich. Die Geometrie von Chips verschiedener Hersteller kann natürlich völlig anders sein. Die Schaltung und die dazugehörende Programme funktionieren so nur mit dem NEC 4164. Für andere Speicherbausteine müssen sie wahrscheinlich geändert werden, das Prinzip ist jedoch dasselbe.

Nun wird deutlich, daß unser Chip aus vier Matrizen besteht, die nebeneinander liegen. Die zwei äußeren Matrizen sind von den zwei mittleren durch einen relativ großen Zwischenraum getrennt; es fehlt ein Stück des Bildes. An dieser Stelle befindet sich wahrscheinlich die Dekodierlogik. Die zwei mittleren Matrizen sind durch einen viel kleineren Zwischenraum getrennt, so daß sie als eine 128x256-Matrix angesehen werden können. Aus diesem Grund werde nur die beiden mittleren Matrizen als Sensor benutzt, die toten Zonen sind relativ störend. Ein Blick mit einer Lupe auf den Chip läßt die Matrixstruktur deutlich erkennen.

Jetzt ist die Möglichkeit da, das Objektiv scharfzustellen. Bei genauem Hinsehen (und einigem Nachdenken) fällt auf, daß immer noch einige Zeilen und Spalten lokal vertauscht sind. Zwei Zeilen werden korrekt abgebildet, die nächsten zwei sind dann miteinander vertauscht. Die Leseroutine korrigiert diesen Fehler. Als letztes erfolgt noch die Korrektur der Spaltenadressen, von denen vier richtig, die nächsten vier in der falschen Reihenfolge sind.

Das Herausfinden der korrekten Zuordnung ist nicht ganz einfach, da eine einigermaßen solide Optik notwendig ist, die möglichst scharf abbildet. Ob die Abbildung scharf ist sieht man wiederum nur dann, wenn die Zuordnung richtig ist!

Am besten beginnt man zunächst mit einer weißen Fläche, auf der dann einfache Objekte angebracht und bewegt werden. Durch sorgfältiges Beobachten, messerscharfes Schließen und einige Geduld ist es dann möglich, zuerst die groben Störungen und dann die lokalen Eigenheiten des Chips herauszufinden. Die groben Störungen findet man am einfachsten mit schwarzen Linien, die lokalen mit einem Kreis, der etwas hin- und hergeschoben wird.

Bei den meisten PC-Parallel-Ports sind keine Modifikationen nötig. es muß nur dafür gesorgt werden, daß das DRAM seine Verorgungsspannung erhält. Diese kann z.B. vom Tastaturanschluß abgenommen werden (oder über einen nicht benutzten Pin des Druckeranschlusse zugeführt werden). Das Kabel zum DRAM sollte auch nicht zu lang werden - 50 bis 70 cm sind aber gut machbar.

Bei einfachen Parallelports, die mit einem hochintegrierten Baustein aufgebaut sind, sind dessen Ausgänge manchmal direkt mit den Druckeranschlüssen verbunden, kein sehr feiner Zug, denn hier muß ein Treiber zwischengeschaltet werden.

Nun werden die Druckeranschlüsse mittels eines Kabels mit der IC-Fassung verbunden, auf die später das DRAM gesteckt werden soll. Diese Fassung sollte eine gute Qualität haben (vergoldete, gedrehte Kontakte oder eine ZIF-Fassung), da der Chip ja doch öfters gewechselt wird.

Sehr wichtig ist auch der Entkopplungskondensator zwischen Pin 8 und Pin 16 des DRAM, da es beim Zugriff einen hohen Strom benötigt (ca. 100 mA). Dieser Kondensator wird direkt an der IC-Fassung angelötet (Polung beachten! Pin 8 ist +5 Volt, Pin 16 ist Masse - umgekehrt wie bei den meisten TTLs!). Ohne diesen Kondensator funktioniert überhaupt nichts!

Mechanischer Aufbau der Optik

Die nutzbare Fläche des NEC 4164 beträgt etwa 1.2 mm* 6 mm, wenn man auf die äußeren beiden Matrizen verzichtet. Die Optik sollte dieser Tatsache Rechnung tragen und entsprechend ausgewählt werden.
Ein Objektiv mit 8 mm Brennweite entspricht etwa einem 50 mm Standardobjektiv an der Kleinbildkamera. In Frage kommen also Brennweiten von 5 bis 35 mm.

Es lohnt sich, sich nach einem billigen gebrauchten Objektiv umzusehen. In Frage kommen Optiken aller Art; wir verwenden ein Objektiv, das für eine Super-8-Kamera gedacht war (f = 25mm). Besser ist ein Objektiv noch kürzerer Brennweite (alte Schmalfilmkamera, defekte Videokamera etc.). Der Fotohändler um die Ecke hat vielleicht etwas passendes. Aber auch ohne hochwertiges Objektiv lassen sich durch Verwendung einer Linse kurzer Brennweite gute Ergebnisse erzielen. Die Abbildungsqualität einer einfachen Linse muß nicht hinter der eines richtigen Objektives zurückstehen, da der "Film", also der Speicherchip ohnehin nicht das Auflösungsvermögen einer Fotoemulsion hat.

Eine Standardbauanleitung kann wegen der Vielzahl der möglichen Optiken nicht gegeben werden; es geht einfach darum, das Objektiv im richtigen Abstand vor dem Chip zu plazieren. Es ist darauf zu achten, daß der Aufbau gut zentriert ist und das die Optik genau auf die "Filmebene" abbildet.

Lichtempfindlichkeit

Der Chip ist natürlich nicht auf eine hohe Lichtempfindlichkeit hin entwickelt worden, so daß die Belichtungszeiten deutlich länger ausfallen, als bei einer CCD-Kamera. Die Zeiten bewegen sich (je nach Beleuchtung) zwischen einigen Hundertstel und 20 Sekunden. Längere Zeiten sind nicht möglich, da sonst das Bild zu sehr verrauscht. Durch diese langen Belichtungszeiten ist die Verwendung eines Statives dringend angeraten, zumal man die Hände frei haben sollte, um auf der Tastatur die Belichtungszeit zu korrigieren und gelungene Bilder abzuspeichern. Der Chip ist im roten Bereich deutlich empfindlicher als im blauen, möglicherweise reicht die spektrale Empfindlichkeit bis ins Infrarote.

Software

Das Initialisieren und Auslesen des Speicherchips wird von Assembler-Routinenerledigt, die in ein Turbo-Pascal- Programm eingebunden sind.

Initialisieren

Die Routine INITRAM initialisiert den Speichechip. Da dem Vorhandensein von Ladung in den von uns genutzten Speicherzellen des NEC 4164 einer logischen "1" entspricht, werden alle Speicherzellen mit einer "1" beschrieben. Zur Ansteuerung des Chips muß das etwas komplizierte DRAM-Timing eingehalten werden.

Zuerst wird die Zeilenadresse an die Adresseingaänge des Speicherbausteins gelegt. Der Eingang RAS wird anschließend auf "0" gezogen, das DRAM übernimmt die Zeilenadresse. Dann wird die Spaltenadresse angelegt, DIN auf den gewünschten Pegel (hier eine logische "1") gesetzt, danach CAS auf "0" gezogen. Das DRAM hat nun die Spaltenadresse und das Datenbit übernommen. Dieser Vorgang wird für alle 32768 benutzte Speicherzellen wiederholt; jetzt ist das DRAM initialisiert, alle Kondensatoren sind mit einer Ladung versehen.

Entsprechend der gewünschten Belichtungszeit wird nun das Auslesen der Information verzögert. Während dieser Belichtung geht die Ladung der Speicherzellen entsprechend der Intensität des einfallenden Lichtes verloren und der logische Inhalt wechselt.

Auslesen der Information

Ausgelesen wird der Speicherchip mit der Prozedur LESERAM Es wird wie bei INITRAM vorgegangen. Die Inhalte der Speicherzellen werden einzeln hereingeholt, um in Bildinformation umgewandelt zu werden. Dabei werden auch die lokalen Zuordnungsfehler (Vertauschungen der Zeilen/Spalten) korrigiert. Jeweils 8 Bit werden in einem Byte abgelegt. Ein Bild benötigt also 4096 Byte, da nur der halbe Speicherchip benutzt wird. Diese Daten werden dann dem Hauptprogramm übergeben.

Eine Korrekturroutine gleicht unterschiedliche Empfindlich- keiten einzelner Pixel aus. (Die Speicherzellen am Rande einer Matrix sind empfindlicher als die im Zentrum)

Da auch zwischen den beiden mittleren Matrizen (NEC4164 !) ein kleiner Zwischenraum ist, ist noch eine zweite Korrekturroutine vorhanden. Diese zieht die beiden Hälften des Bildes um 5 Pixelbreiten auseinander und füllt den entstehenden Zwischenraum (einigermaßen) sinnvoll aus. Unter Umständen ist es sinnvoll, auf diese Korrektur zu verzichten, oder den Füllalgorithmus zu verbessern.

Die drei Routinen INITRAM, LESERAM und die Korrekturen sind in der Prozedur "Belichte" zusammengefasst und werden mit Angabe der Belichtungszeit und eines Feldes zur Aufnahme der Bildinformation aufgerufen.
Die Prozedur "ANZEIGE" dient zur schnellen Ausgabe des Bildes auf VGA-Karten. Dabei wird die Bildinformation direkt in den Bildspeicher geschrieben, was eine wesentliche Beschleunigung zur Folge hat. Die vertikalen Abstände der einzelnen Speicherzellen sind leider doppelt so groß wie die horizontalen, das wird in der Anzeigeroutine dadurch ausgeglichen, daß die Zeilen doppelt dargestellt werden. Zur Anpassung an andere Bildschirmadapter muß dieses Unterprogramm angepasst werden.
Die Prozeduren "SPEICHERN" und "LESEN" schreiben bzw. lesen ein Bild im .BMP-Format auf bzw. von der Festplatte.

Weitere Programme

Die oben erläuterten Routinen, werden von verschieden Anwendungsprogrammen genutzt.

Das Programm "KUCKUCK" ist das wichtigste davon; mit ihm können einzelne Aufnahmen sowie Bildserien mit 2, 4 oder 10 Graustufen aufgenommen werden. Das aktuelle Bild wird immer auf dem Monitor dargestellt und kann mit Druck auf die Leertaste abgespeichert werden.

Prinzipiell kann die Kamera natürlich nur Bilder mit 2 Helligkeitswerten aufnehmen, jedoch lassen sich durch Mehrfachbelichtungen auch Bilder mit Grauwerten erzeugen. Die Einzelbelichtungen der Halbtonbilder werden in einer großen Datei (".3" bzw ".9") hintereinander abgespeichert und müssen zur weiteren Verarbeitung mit den Programmen "Grau3", "Grau4" und "Dither" umgewandelt werden: Das Programm "Grau3" erzeugt aus 3 Einzelbelichtungen eine Bitmap-Datei mit 4 Graustufen. (4 Bit/Pixel Information, genutzt werden nur die Farben 0,7,8 und 15 entsprechend schwarz, hellgrau, dunkelgrau und weiß auf der VGA-Karte) Für eine schnelle Bildschirmausgabe der Halbtonbilder ist eine andere Umwandlung nötig: "Grau4" wandelt die gleichen Eingabedaten wie "Grau3" in ein anderes Format um: Eine Datei, deren 4 Einzelteile den 4 Bitplanes der VGA-Karte entsprechen, wird erzeugt.

Die neun Einzelbelichtungen der ".9"-Dateien werden mit dem Programm "Dither" in ein Schwarzweiß-Bild (jeweils 3 mal so breit und hoch wie ein Original) umgewandelt. Je nach Anzahl belichteter Pixel in den neun Einzelbildern wird für jeden Bildpunkt eine 3*3-Matrix mit Zufallspunkten gedithert. Das Programm "FilmAb" dient zum Abspielen fertiger Bildsequenzen, die mit "KUCKUCK" erstellt worden sind. So können kurze "Videoclips" mit 2 oder 4 Graustufen erstellt und abgespielt werden. Die Abspielgeschwindigkeit kann dabei frei gewählt werden.

Da das Format 128*256 Bildunkte ungewohnt hoch ist, zumal der Abstand der Zeilen doppelt so groß ist wie der der Spalten können Bilder auch im "Halbformat" mit 128*128 Pixeln aufgenommen werden. Vor allem beim Anfertigen von "Videoclips" ist es sinnvoll diese Option zu beanspruchen, um Plattenplatz zu sparen.

Die einzelnen Bilder können mit Windows-Programmen weiterverarbeitet werden, die Bitmap-Dateien lesen können (z.B. Paintbrush).


Beispielaufnahmen


Aufnahme gedithert (hier verkleinert)

Stilleben mit Bierflasche Montage aus mehreren Aufnahmen


Liste der einzelnen Programme und Routinen:

alle Programme sind als Source und Binaries (für MSDOS, Turbo-Pascal 4.0) verfügbar.


Literatur

Diagramme und Bilder: