Zurück zur Schaltungsbeschreibung des Bildröhrenmoduls
Zunächst: Von einem „PAL-Modul“ dürfte hier eigentlich nicht die Rede sein, denn es erfolgt keinerlei Verarbeitung von Farbsignalen – PAL oder „Phase Alternating Line“ ist eines der Verfahren zur Übertragung von Farbe beim analogen Fernsehen. Das im folgenden vorgestellte Modul bereitet im Gegensatz dazu ein Composite-Video-Signal aus, bei dem Synchronimpulse, das Bild und die Farbe in einem einzigen Signal verwoben sind und über ein einziges Kabel transportiert werden. Da aber „PAL“ oftmals auch als Synonym für unsere Fernsehnorm mit ihren 625 Zeilen, einer Bildgröße von 720×576 und den Frequenzen 15.625 kHz und 50 Hz benutzt wird, wird im folgenden von „PAL-Modul“ statt von „Composite-Video-Modul“ gesprochen.
Bereits im vergangenen Jahr hatte ich eine Adapterschaltung entwickelt, die VGA- und Composite-Video-Eingänge für die Bildröhreneinheiten verfügbar macht. Die Schaltung war nicht perfekt, zeigte aber, dass die Röhren durchaus auch mit höherwertigen Signalen umgehen können.
Signaleingang und -aufbereitung
Zur Signalaufbereitung für Composite Video kommt der integrierte Baustein LM1881 zum Einsatz. Dieser nimmt ein komplettes Videosignal entgegen und stellt an seinen Ausgängen verschiedene Varianten davon zur Verfügung: die horizontalen und vertikalen Sync-Signale, Backporch (Austastung) und Odd-Even (zur Erkennung der ungeraden und geraden Halbbilder, weil letztere oben in der Mitte beginnen und vorher keine Bildinformation tragen). Die Sync-Signale werden dem Mikrocontroller (vom Typ ATMega88) an den Eingängen INT0 (horizontal) und INT1 (vertikal) übergeben, das Videosignal gelangt hingegen unverändert (also mit den Sync-Signalen) zur Aufbereitung auf das Bildröhrenmodul.
Von den weiteren Ausgängen des LM1881 wird nur der Odd/Even-Ausgang benutzt. Durch die Nutzung eines Mikrocontrollers wird eine Implementierung des Zeilensprungverfahrens extrem einfach. Das Schaltbild findet sich im folgenden gemeinsam mit der vertikalen Ablenkung.
Vertikale Ablenkung
Ein Schwachpunkt des ersten Entwurfs war die Linearität des vertikalen Sägezahnsignals. Daher sollte von Anfang an ein anderer Weg beschritten werden, der in jeder Lage zu einem stabilen und absolut linearen Signal führt. Nachdem die Mikrocontrollertechnik zur Erzeugung der Synchron- und Austastsignale sich bewährt hatte, wurde nun also ein 12-Bit-D/A-Wandler in Form eines MCP4921 hinzugenommen, der aus den Signalen des MC wieder einen sauberen Sägezahn generieren sollte.
So ein D/A-Wandler ist eine feine Sache. Man sendet ihm eine Zahl, und schon erzeugt er eine Spannung passender Höhe. Damit kann man grundsätzlich beliebige Signalarten generieren, wie später noch zu zeigen sein wird. Hier sollte nun ein Sägezahn entrstehen, und dazu erhöht man einfach eine Variable Schritt für Schritt, bis das Synchronsignal eintrifft und die Variable wieder auf Null gesetzt wird.
Die Erhöhung des Zählers wird clevererweise synchron mit dem Horizontalsignal behandelt, so dass die Reaktion auf das Synchronsignal des LM1881 extrem einfach ausfällt:
ISR(INT1_vect) { // Behandlungsroutine für vertikales Sync-Signal cli(); // Bilder werden ab 1 nummeriert, unser Zähler ist nullbasiert if (even_line) line_count = 1; else line_count = 0; sei(); }
Wenn eine gerade Zeile ansteht, beginnt der D/A-Wandler mit einer etwas höheren Spannung, so dass beide Bilder exakt miteinander verwoben werden. Danach erfolgt eine Erhöhung des Zählers um den Wert 2 bei jeder Zeile, so dass der Abstand immer gewahrt bleibt. Es mag dahingestellt sein, ob das bei kleinen Röhren sinnvoll ist. Bei der D10/191 sollte der Effekt aber bereits erkennbar sein. Grundsätzlich kommt man auch mit einem 10-Bit-Wandler aus, denn wir benötigen für 625 Zeilen genau 625 Schritte.
Um das Signal mit einer möglichst hohen Amplitude zu gewinnen, wird es vor der Ausgabe mit dem Faktor drei multipliziert und dann noch verdoppelt – letzteres ist eine Aufgabe, die der D/A-Wandler von sich aus beherrscht. Insgesamt läuft das Signal dann von 0..3750 oder von 0..4,5V, wenn man die Betriebsspannung von 5V voraussetzt.
Da das Signal ohnehin sowohl in der Amplitude als auch in der Position um den Nullpunkt regelbar sein sollte, wurden pro Kanal (x und y) zwei OpAmps (in einem gemeinsamen Gehäuse) vom Typ NE5532 vorgesehen in ganz ähnlicher Beschaltung wie bei den Eingangsstufen des Bildröhrenmoduls. Hier kommt nun noch ein weiteres Potentiometer hinzu, dass den Eingang E+ des zweiten Operationsverstärkers mit einer von Null abweichenden Spannung versorgt. Um diesen Wert wird dann auch das Ausgangssignal von Null abweichen. Warum macht man das? Weil ich nicht bei jedem Signalwechsel die Bildposition in x- und y-Richtung nachregeln, aber auch keinen Trennkondensator einbauen wollte, weil der das Signal verändern könnte. Der erste Operationsverstärker entkoppelt das Signal lediglich, ist ansonsten aber nicht als Verstärker geschaltet.
Die Austastung der nicht erwünschten vertikalen Bildanteile und Rückläufe erfolgt aus technischen Gründen im Rahmen der horizontalen Ablenkung.
Horizontale Ablenkung
Die horizontale Ablenkung ist der Dreh- und Angelpunkt für die Erzeugung des Rasters.
void Create_Sync_Signals(void); { int i; // Pause einlegen - hier wird das Sync-Signal um fast eine Zeile verzügert // Damit gelangt es auf den linearen Teil der Sägezahnkurve des Ablenkverstärkers // Löst man den Sync-Impuls sofort aus, dann fehlt links ein Teil vom Bild, // weil der Ablenkverstärker nicht so schnell reagiert // wie die Sägezahnkurve des Ablenkgenerators for (i=0;i<PORCH_DELAY;i++) NOP20; // Hochzählen des Vertikalgenerators, dauert etwa 90 Takte Write_Vertical_Data(); // Strahl ausschalten // Jetzt Sync-Impuls ... hsync_on; // ... Pause bis zum Abschalten einlegen ... NOP20; beam_off; NOP20; NOP20; NOP20; NOP10; NOP20; // ... und Sync abschalten hsync_off; // Strahl wieder einschalten if ((line_count >= VERTICAL_ON) && (line_count <= VERTICAL_OFF)) beam_on; }
Das horizontale Sync-Signal wird verzögert erzeugt. Der Grund hierfür ist das Verhalten des horizontalen Endverstärkers auf der BRE-Platine – der folgt dem sägezahnförmigen Signal nicht so ideal, wie man es sich wünschen würde. Würde man nun das Signal synchron anzeigen, dann fehlt am linken Rand ein Stück Bild. Deshalb verschieben wir das Sync-Signal bis fast vor das Eintreffen des nächsten Sync-Signals und erlauben so eine horizontale Bildkorrektur.
Danach wird zunächst der Zähler für das vertikale Signal erhöht und dessen Daten auf den D/A_Wandler geschrieben. Dazu dient die Routine „Write_Vertical_Data()“, die hier nicht im Einzelnen erläutert wird, weil sie außer dem Beschreiben des SPI-Bus nichts wesentliches enthält.
Nun wird das Sync-Signal erzeugt und der Strahl abgeschaltet, um den Rücklauf zu unterdrücken. Der Strahl wird dann wieder aktiviert – allerdings nur dann, wenn er innerhalb des sichtbaren vertikalen Bereichs liegt. Andernfalls bleibt das Bild dunkel, und damit sind auch vertikale Rückläufe oder unbenutzte Bildbereiche ausgeblendet.
Es wurde Wert darauf gelegt, dass auch bei fehlendem Eingangssignal immer ein Raster zu sehen ist – das Bild bricht also nie zusammen. Dazu dient ein interner Ablaufgenerator – nach einer Zeile wird eine Routine aufgerufen, die dann die Zeilenerzeugung aufruft:
ISR(TIMER1_COMPA_vect) { // Diese Routine wird aufgerufen, wenn kein externes Sync-Signal anliegt // und der Ablaufzähler tatsächlich abläuft // Die Horizontalfrequenz liegt dann etwas niederiger als bei FBAS (ca. 15,2 kHZ) Create_Sync_Signals(); }
Dieser Ablaufgenerator wird immer dann angesprungen, wenn eine gewisse Zeit abgelaufen ist, und diese Zeit ist ein bisschen länger als die eigentliche Zeile, so dass das entstehende Raster eine Zeilenfrequenz von etwa 15,2 kHz hat. Der Grund hierfür ist einfach: solange ein echtes Sync-Signal anliegt, soll dieser Ablaufzähler gar nicht zum Einsatz kommen – er springt nur als Backup ein, wenn kein externes Signal anliegt.
Der eigentliche Aufruf des Sync-Signals erfolgt wieder über eine Interrupt-Routine, die außer dem Aufruf nur noch den Zähler für den Ablaufgenerator zurücksetzt, damit er nicht versehentlich angesprungen wird.
ISR(INT0_vect) { // Ablaufgenerator neu starten, damit er nicht ausgelöst wird TCNT1 = 0; Create_Sync_Signals(); }
Die Erzeugung des horizontalen Sägezahns geschieht auf konventionelle Weise per Kondensator und kontrolliertem Ladestrom. Die Spannung am Kondensator ist eine lineare Funktion, sofern der Ladestrom konstant ist. Das gilt natürlich nur innerhalb der Betriebsspannungsgrenzen, die hier zwischen 0 und 5V liegen, und die Amplitude liegt noch deutlich darunter, damit man ein Maximum an Linearität herausholen kann. Die benutzte Schaltung hierfür ist einfach. Ein Transistor erzeugt aus dem Mikrocontroller-Impuls einen Sync-Impuls rund um einen festgelegten Arbeitspunkt, der zweite lädt kontinuierlich einen Kondensator auf, bis über eine Diode der Sync-Impuls eintrifft und den Kondensator entlädt. Es mag ungewöhnlich erscheinen, dass hier PNP-Transistoren zum Einsatz kommen und damit die Ladespannung nicht auf Masse, sondern auf +5V bezogen wird. Letztlich ist das eine Frage der Bewegungsrichtung – das Signal soll von links nach rechts geführt werden, und dazu ist am Eingang des Bildröhrenmoduls ein steigender Sägezahn erforderlich.
Der Rest der Schaltung mit den zwei Operationsverstärkern ist funktional identisch mit dem Vertikalgenerator; nur die Verstärkung wurde wegen der geringeren Amplitudenhöhe anders gewählt.
Bildqualität
Die erzielte Bildqualität ist genau genommen eine Aufgabe der Videoendstufe und daher Teil des Bilröhren-Moduls. Hier soll daher nur die Linearität der Signale betrachtet werden.
Während das vertikale Ablenkung dank des D/A-Wandlers wie erwartet völlig linear verläuft, ist das horizontale Signal nicht vollständig linear – man erkennt links geringfügig größere Abstände bei den Kästchen als rechts. Den Bildeindruck trübt das kaum, aber mehr wäre nur mit höherem Schaltungsaufwand zu erreichen.
Ein paar Worte zur Austastung
Zusätzlich wird am Ausgang PB0 des Mikrocontrollers ein Austastsignal bereitgestellt, das einen etwas größeren Rahmen abdeckt, als es das Sync-Signal tut. Damit sind dann auch Bildteile am linken und rechten Rand sicher aus dem Bild entfernbar. Die Unterdrückung geschieht über einen Transistor, der über einen 150-Ohm-Widerstand an das Eingangssignal angeschlossen ist. Damit wird die Unterdrückung des Signals nicht vollständig – bei voll aufgeregelter Helligkeit erkennt man nach wie vor die ausgeblendeten Bereiche. Ein geringerer Widerstand (75 Ohm – Abschlusswiderstand) wird aber nicht empfohlen, denn diese Unterdrückung beeinflusst auch das Eingangssignal und den am Videoeingang hängenden LM1881 – es kann dann zu Aussetzern beim Sync kommen. Daher wurde diese Alternative gewählt, die bei normaler Helligkeit zu guten Ergebnissen führt.
Allerdings enthält das Videosignal ebenfalls die Austastsignale, was die Qualität der Austastung noch unterstützt.
Das Modul bietet eine Menge Anschlüsse und kann direkt mit dem Bildröhrenmodul verbunden werden. Es enthält eine Mischstufe bestehen aus einem CD4053 mit drei Umschaltern, so dass zwischen externem Eingangssignal und interner PAL-Erzeugung (mit externem Composite-Video-Eingang) umgeschaltet werden kann.
Am rechten Rand finden sich vier Pfostenstecker:
- Ein fünfpoliger Stecker dient als Eingangsquelle für externe Eingangssignale (x, y, z). Zwei Leitungen führen Massepotenzial.
- Ein dreipoliger Stecker ist der Eingang für das Composite-Video-Signal mit einmal Masse außen und einer Leitung, die den Eingangssignal-Umschalter betreibt. Liegt dieser Pin auf Masse, ist das PAL-Signal gewählt. Um externe Signale anzuzeigen, genügt es, ihn frei zu lassen.
- Ein fünfpoliger Stecker dient zur Einspeisung der Betriebsspannungen (-12V, 5V, +12V).
- Ein weiterer fünfpoliger Stecker führt die Ausgangssignale für die Ablenkverstärker und das Videosignal.
Download der Firmware für das PAL-Modul (V1.1)
Ein paar Tipps zum Nachbau: Es hat sich gezeigt, dass in manchen Einbausituationen die OpAmps zu hochfrequenten Schwingungen neigen. Man bekommt diese Schwinger gut in den Griff, indem man zwischen den E-minus-Eingang und den Ausgang einen kleinen Kondensator (100pF oder weniger) schaltet. Dieser wirkt wie ein Integrator und filtert die hohen Frequenzen komplett weg. Außerdem können Kondensatoren am E-plus-Eingang des jeweils zweiten OpAmps (an dem der Mittenabgriff des Poitis für die Bildlage liegt) hilfreich sein, wenn die Regelung zu viele Bocksprünge macht, weil das Poti nicht ganz sauber regelt. Diese Modifikationen sind nicht unbedingt erforderlich – aber sie helfen, wenn die entsprechende Situation eintreten sollte.
Weiter geht’s mit der Beschreibung des ScopeClock-Eingangswahl-Zusatzmoduls.