Wie kann ich einen CGA-Bildschirm mit einem Arduino steuern?

Ich bekomme einen von diesen http://www.old-computers.com/museum/computer.asp?st=1&c=446

Ich plane, einen Server darin zu bauen. Und ich dachte daran, den eingebauten CGA-Monitor als Statusanzeige zu verwenden (LCDInfo-Stil, oder was auch immer die coolen Geeks heutzutage verwenden). Der Bildschirm ist einfarbig bernsteinfarben, daher würde er wahrscheinlich ein bisschen wie die Planar EL-Bildschirme aussehen, die einige in ihren Mods verwendet haben. Und ich möchte ein Arduino (oder so ähnlich) als Middleware-Lösung verwenden ... PC -> Arduino -> Screen

Ich habe ein bisschen nachgesehen, und CGA ist ein RGBI-Signal, das TTL-Kommunikation verwendet. 4 Zeilen (RGB + Intensität), kombiniert mit HSYNC (15,75 KHz) und VSYNC (60 Hz). Die 4 "Farbeingänge" sind logisch ein- oder ausgeschaltet. Die Kombination daraus erzeugt bis zu 16 Farben. Da dies jedoch ein gelber Bildschirm ist, wäre es wahrscheinlich am einfachsten, mit "All-High" oder "All-Low" zu beginnen ... Weiß und Schwarz.

Das Problem ist also folgendes ... Ich könnte das Arduino wahrscheinlich sowohl verdrahten als auch codieren, um die TTL-Leitungen ein- und auszuschalten, aber ich bin mir nicht sicher, was ich mit den HSYNC- und VSYNC-Eingängen mache. Und wie man die TTL-Flips zeitlich so einstellt, dass sie den Pixeln auf dem Bildschirm entsprechen. (Die Standard-CGA-Auflösung beträgt 320 x 200).

Ich bin nicht sehr gut in Elektronik, aber ich bin sehr gut darin, Anweisungen zu befolgen und Hinweise zu befolgen

Hat das schon mal jemand probiert?

EDIT : Könnte ich vielleicht eine modifizierte Version davon verwenden? http://www.eosystems.ro/deogen/deogen_en.html

EDIT2 : Ich brauche kein Arduino . Aber ich möchte es so einfach wie möglich halten.

EDIT3 : Es scheint, dass der fragliche Monitor tatsächlich ein Composite-Monitor und kein "echter" CGA-Eingangsmonitor ist. Das macht die Sache wahrscheinlich etwas einfacher. Aber ich interessiere mich immer noch dafür, wie man mit einem Mikrocontroller ein reines CGA-Signal erzeugt ...

Antworten (5)

Die hsync- und vsync-Signale sind nur relativ kurze, negative Impulse, die den Elektronenstrahl der CRT auf die linke bzw. obere Seite des Bildschirms zurücksetzen.

Da CGA im Grunde nur NTSC (AKA RS-170) mit separater Synchronisation und Komponenten war, sollte das Timing der Impulse gleich sein. Der hsync würde etwa alle 63,5 Mikrosekunden und der vsync etwa alle 16,7 Millisekunden auftreten. Das vertikale Timing sollte innerhalb der Fähigkeiten eines Arduino liegen, aber die Horizontalen könnten eine größere Herausforderung darstellen.

Während des aktiven horizontalen Scans müssen Sie die Luminanz entsprechend der horizontalen Auflösung aktualisieren, für die Sie entwerfen. Um 640 Pixel zu erhalten, müssen Sie unter der Annahme, dass Sie etwa 53 us der horizontalen Trace-Zeit verwenden, um die HS-Dauer zu ermöglichen, und Ränder, um sicherzustellen, dass Ihre Ausgabe nicht über die Ränder der CRT hinausläuft, etwa alle 82 ein neues Pixel ausgeben Nanos,. Nun, 82 ns sind (wahrscheinlich) viel zu schnell, um direkt von einem Arduino zu kommen, aber wenn Sie ein externes 8-Bit-Schieberegister verwenden, müssen Sie dieses nur etwa alle 660 ns laden, dh in der Größenordnung von einer halben Mikrosekunde. Natürlich könnten Sie sich für 320 Pixel entscheiden und das Timing weiter vereinfachen.

Wenn es Ihnen vernünftig erscheint, diese Art von Timing einzuhalten, können Sie die genauen Zahlen leicht durch leichtes Googeln erhalten. Das sieht zum Beispiel nach einem ziemlich guten Beispiel aus.

Bist du auf einen Arduino eingestellt?

Der Parallax Propeller kann alle Arten von Videosignalen nativ erzeugen. Es ist Code zum Generieren von VGA- und Composite-Videosignalen verfügbar, und alle Quellen sind ebenfalls verfügbar, sodass Sie sie bei Bedarf optimieren können. Intern verfügt es über eine Reihe spezialisierter Video-Timing-Erzeugungslogiken. Es sollte möglich sein, das System so zu konfigurieren, dass es diesen Bildschirm ohne allzu große Probleme ansteuert, obwohl es möglicherweise ein wenig externen SRAM erfordert, wenn Sie in der Lage sein möchten, die volle Bewegung vollständig anzuzeigen (na ja, so voll wie es wird, wenn man bedenkt, dass es ein Bernstein ist Anzeige) Farbe.

Außerdem ist es viel stärker als ein Arduino.

Nein, ich bin nicht auf einen Arduino eingestellt :) Und ich werde kein Fullmotion-Video anzeigen. Ich möchte das Display genauso verwenden wie ein LCD für Systeminformationen.
Nun, der Propeller hat eine interne Rasterzeichentabelle im ROM zum Anzeigen von Text auf Bildschirmen, also klingt es genau so, wie Sie es wollen.

http://code.google.com/p/arduino-tvout/ ist wahrscheinlich das, was Sie brauchen. Wenn Sie Glück haben, akzeptiert der interne Monitor ein NTSC-Signal.

Nun, vielleicht ... Aber ich möchte wirklich die Auflösung von 320 x 200, und vielleicht nicht ...
Dieser Code erzeugt genau die von Ihnen erwähnten Frequenzen, die mit einem NTSC-Signal identisch sind. Der Original-CGA hat einen Composite-Video-Ausgang und einen Monitorstecker. Es ist ziemlich wahrscheinlich, dass der interne Monitor dieser Dinger das Composite-Signal verwendet, nach Schlussfolgerung und oberflächlicher Betrachtung von Vintage-Hardware-Foren. Warum sollten sie sich überhaupt die Mühe machen, ein Vollfarbsignal an einen gelben Bildschirm zu senden?
Eine Erweiterung von Joes Kommentar wäre, dass es wahrscheinlich am einfachsten wäre, eine Grafikkarte zu bekommen, die bereits Composite hat, und das Arduino zu überspringen :(
Sie alle verfehlen den Punkt ... Ich möchte nicht, dass irgendein Monitor ein zusammengesetztes Signal anzeigt ... Ich möchte ein "natives" CGA-Signal erzeugen und es mit einem CGA-Monitor verwenden.
Sie denken, der interne Monitor ist CGA. Ich denke, du liegst sehr wahrscheinlich falsch. Komm wieder, wenn du die Ausrüstung hast.
Hmm ... Sie könnten Recht haben ... Wenn Sie den Wikipedia-Artikel darüber lesen, heißt es Composite-Monitor ... Jede andere Quelle sagt CGA-Monitor ... Na dann ...

Ich habe CGA noch nie verwendet, aber Sie können möglicherweise eines der (vielen) Arduino VGA-Projekte an Ihren Zweck anpassen.

Ich habe ein VGA-Pong-Spiel um einen ATMega168 herum gebaut, was ein guter Ausgangspunkt sein könnte (Links 1 2 ). Ich habe die AVGA-Bibliothek verwendet , die das gesamte VGA-Timing unter Interrupt durchführt, sodass sich Ihr Vordergrundcode nur mit dem Verschieben von Sprites befassen muss.

Eine andere Möglichkeit könnte sein, eine YBox zu modifizieren .

Eigentlich ist es überhaupt kein VGA. VGA ist analoges Komponenten-RGB, während CGA digitales TTL-RGBI ist.

Der IBM Portable PC verhielt sich so, als wäre der interne Monitor mit dem Composite-Ausgang einer Standard-CGA-Karte verbunden. Einer der Nebeneffekte davon war, dass, wenn der Modus auf "Farbe" 80 Spalten eingestellt war, Farben als graue Streifenmuster und nicht als Grauschattierungen erschienen. Dies wiederum würde viele Vordergrund-Hintergrund-Kombinationen (z. B. Blau auf Schwarz) fast vollständig unleserlich machen. Dies war ziemlich lästig, da (1) der interne Monitor monochrom war und daher Chroma-Informationen für ihn nutzlos wären; (2) Selbst bei Verwendung eines externen Composite-Monitors wurde das Colorburst-Signal im 80-Spalten-Modus falsch getimt, sodass man sowieso keine Farbe erhalten konnte.

Übrigens scheint der interne Monitor des Compaq einzigartig zu sein; Es verwendet die horizontale NTSC-Abtastrate, aber die vertikale Abtastung kann entweder 60 Hz oder 30 Hz betragen. Ich bin mir nicht sicher, warum Compaq sich entschieden hat, 30 Hz ohne Zeilensprung zu verwenden, anstatt die vertikale Schaltung des Monitors zu verhexen, damit sie gut mit dem nicht ganz richtigen Interlaced-Ausgang des 6485 zusammenarbeitet, aber es ist die einzige Maschine, die ich je mit einem gesehen habe 30-Hz-Display-Scan.