AVR-Grafik auf Bildschirmen

Wenn man mit einem Mikrocontroller der AVR-Serie eine Grafikkarte bauen möchte, benutzen möchte, hat man mit vielen Einschränkungen zu kämpfen. Insbesondere ist dessen Taktrate mit 20 MHz so gering, dass die Zeit kaum genügt, alle Bildpunkte einer Zeile anzusteuern. Hochauflösende Bilder sind auf diese Weise also nicht möglich. Für die Ansteuerung eines PAL-Bildschirms (720×576 bei 25 Hz) oder per Standard-VGA (640×480 bei 60 Hz) mit Texten genügt dessen Performance jedoch; es bleibt sogar noch etwas Zeit für zusätzliche Aufgaben. Ich fand  auf den Seiten des russischen Bastlers Ibragimov Maxim Rafikovich eine passende Grundlage für meine Arbeiten.

Um Text auf der Bildröhre anzuzeigen, bedarf es einer Entkopplung verschiedener Aufgaben und Anforderungen, aber auch Einschränkungen:

  • Jede handelsübliche PC-Grafikkarte kann Text anzeigen – bestimmte Buchstaben an bestimmten Positionen, die vorher festgelegt sind. Das vereinfacht den Aufbau der Textdarstellung, die daher auch noch bei größten Störungen meist fehlerfrei funktioniert.
  • Die Beschränkung auf einen festgelegten Zeichensatz vereinfacht darüber hinaus noch die Art und Weise, wie der Text ausgegeben wird. Wenn der Text nämlich als fertiges Bitmuster vorliegt, dann erfordert dessen Ausgabe auf dem Bildschirm nur das Auslesen dieses Bitmusters und das Hell- und Dunkeltasten bestimmter Bereiche des Bildes. Es muss also nicht erst ein Bild der Einzelbuchstaben generiert werden – dieses Bild liegt bereits vor.
  • Auf der anderen Seite sind dann auch nur bestimmte Zeichen darstellbar – in unserem Fall werden es 256 unterschiedliche sein, wobei die Grundlage der ASCII-Zeichensatz bildet. Deutsche Sonderzeichen sind berücksichtigt.
  • Außerdem sind die Zeichen auch nur in bestimmten Größen darstellbar, da das Bitmuster von vornherein festliegt. Es sind allenfalls ganzzahlige Vergrößerungen möglich, die aber das Bild pixelig machen.

Wenn man einen Mikrocontroller der AVR-Serie benutzen möchte, hat man noch mit weiteren Einschränkungen zu kämpfen. Es ist nämlich nicht möglich, einzelne Bildzeilen sehr hochaufgelöst auszugeben – bei etwa 200 Linien ist Schluss, weil der Prozessor darüber hinaus nicht mehr genug Dampf hat.

Das hier vorgestellte Konzept dient natürlich in erster Linie dazu, Monitore oder Fernseher anzusteuern. Für die Philips-Bildröhren geht es schon fast zu weit – mehr als 12  Zeichen und 3 Zeilen sind dort kaum zu entziffern (6105), weil der Bildschirm einfach zu klein ist. Das hier vorgestellte Modul ist daher mehrfach umschaltbar – im BRE-Modus zeigt es große Schriften mit wenig Zeichen pro Zeile, im Monitor-Modus hingegen die maximal mögliche Anzahl Zeichen an. Es sind nun folgende Auflösungen möglich:

  • FBAS
    • 48 Zeichen in 20 Zeilen
    • 48 Zeichen in 10 Zeilen (doppelte Höhe)
    • 25 Zeichen in 5 Zeilen
    • 13 Zeichen in 2 Zeilen (die optimale Auflösung für die BRE)
  • VGA
    • 24 Zeichen in 20 Zeilen
    • 24 Zeichen in 10 Zeilen (doppelte Höhe)
    • 12 Zeichen in 5 Zeilen
    • 12 Zeichen in 2 Zeilen (die optimale Auflösung für die BRE)

Das Bild zeigt die möglichen Auflösungen dargestellt auf einem PC-Monitor. Die beispielhafte Darstellung der Zeichen ist im hier dargestellten Modul abrufbar als Demonstrationsmodus.

Auflösungen

Grundsätzlich sind Grafikkarten nach dem immer gleichen Prinzip aufgebaut. Um einen Bildspeicher als zentrales Element herum arbeiten zwei Baugruppen: Die eine ist für den Aufbau des Bildes verantwortlich – bei heutigen Grafikkarten übernimmt diese Aufgabe der Grafikprozessor. Auf der anderen Seite steht eine Einheit, die den Speicher regelmäßig ausliest, um den Signalausgang entsprechend zu beeinflussen. Die Grafikkarte erzeugt zudem auch Synchronsignale für die horizontale und vertikale Position. Ein- und Ausgabe des Bildspeichers sind bei günstigen Grafikkarten (Stichwort „DRAM“) miteinander verknüpft – es darf nur geschrieben (gerendert) werden, wenn gerade nicht gelesen wird, um Bildstörungen zu vermeiden. Schnellere Grafikkarten verwenden VRAM – dort kann ohne Probleme gleichzeitig gelesen und geschrieben werden. Um sogenanntes Tearing (also das Verziehen einzelner Bildteile) zu Verhindern, sollten Lese- und Schreibvorgänge aber zumindest auf das vertikale Synchronsignal abgestimmt werden. Falls dem Leser ähnliche Begriffe schon einmal beim Kauf oder der Konfiguration der Grafikkarte (meist bei Spielen) begegnet sind, kennt er jetzt den Hintergrund.

Dieses Projekt vereinfacht den Prozess noch einmal. Rafikovich hat eine clevere Schaltung vorgelegt, bei der Rendering und Bildausgabe miteinander verbunden werden. Die AVR-Prozessoren besitzen ein sogenanntes SPI, das „Serial Peripheral Interface„. Dieses dient zum Datenaustausch mit Peripherie, und genau dazu wird es hier auch benutzt – zwischen den Zeilensynchronsignalen werden fortwährend Daten ausgegeben, die zeitlich den einzelnen Pixeln der Zeichen entsprechen. Auf diese Weise entsteht ein fortwährender synchroner Datenstrom, der den Bildinhalt Zeile für Zeile enthält.

Aufgrund der etwa doppelt so hohen Zeilenfrequenz bei VGA erklärt sich auch, warum hier nur 24 Zeichen dargestellt werden können, während es bei FBAS 48 sind.

Es sollte nicht verschwiegen werden, dass diese Form der Ansteuerung ein paar kleine Nachteile hat:

  • Wenn die Daten auf dem SPI-Bus zu schnell geschrieben werden, werden sie ignoriert. man muss also das Timing sehr genau einhalten, damit alle Zeichen sichtbar werden – und nicht nur die Hälfte.
  • Das SPI schaltet den benutzten Ausgang automatisch auf einen High-Pegel, wenn es nicht benötigt wird. Wenn der Buchstabe fertig geschrieben wurde, steht also automatisch ein High-Pegel am Ausgang; das Bild wird hell. Da man die Ausgabe nicht so exakt takten kann, dass Buchstabe auf Buchstabe folgt, führt dies zu hässlichen weißen vertikalen Streifen, wenn man weiße Buchstaben auf schwarzem Grund ausgeben möchte. Aus diesem Grund ist der gesamte benutzte Font (der Zeichensatz) invertiert und das Bild mit schwarzer Schrift auf weißem Grund – der Effekt bleibt dann unsichtbar.

Zurück zum Hauptartikel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.