Forum: Projekte & Code Atmega8 VGA - SPI mit 16 statt 18 Takten pro Zeichen


von Stefan K. (x2701)


Angehängte Dateien:

Lesenswert?

Guten Abend,

der Code im Anhang erzeugt ein 640x400 70Hz VGA Signal. Darstellbar sind 
24x25 Zeichen. Die Spannung an den eingängen PC0 bis PC3 wird am 
Bildschirm dargestellt. Das SPI Modul braucht normalerweise 18 Takte. 
Jedoch füllt PB0 durch im Hintergrund laufende rol, lsl und swap 
Operationen das fehlende Pixel auf. Es entsteht ein Bild ohne Leerpixel 
wie z.B. bei Beitrag "AVR Videogenerator, 40x25 Zeichen, nur 60% CPU Auslastung !"

Die Schaltung ist denkbar einfach. Man benötigt einen 16MHz Quarz. 
Weiters wird PB0 mit PB3 (MOSI) verbunden. Über einen ca. 600 Ohm 
Widerstand wird PB3 (MOSI) mit den R,G,B Leitungen des VGA-Ports 
verbunden. Die vsync PB2 und hsync (PB1) Leitungen können direkt 
verbunden werden.

Das Macro spi übernimmt die Bildausgabe. Die Logik dieser Funktion ist 
im Anhang zu finden. Das erste Byte (in der Tabelle Z genannt) wird 
ausgegeben. Die nächsten zwei Byte - Byte 0 und Byte 1 - werden geladen. 
Bit 7 von Byte0 Wird ins Carry geschoben. Jetzt wird PB0 in Abhängigkeit 
vom C Flag gesetzt. Danach wird Bit7 von Byte 1 in Bit0 von Byte0 
geschoben. Nach dem 16ten Zyklus wird MOSI (PB3) als Eingang gesetzt und 
PB0 als Ausgang. Dadurch wird der Wert aus dem C Flag auf dem Bildschirm 
geladen. Nach 2 Zyklen (16+2=18) wird PB0 wieder als Eingang 
Konfiguriert und MOSI als Ausgang.

Das Ganze wiederholt sich nach dem 9ten Byte. Durch den lückenlosen 
Pixelstream sind 24 statt 22 Zeichen in einer Zeile möglich. Oder auch 
Bitmap bilder. Die Funktion kann natürlich auch für ein PAL Video Signal 
verwendet werden. Wenn die Anzahl der Zeichen nicht exakt durch 9 
Teilbar ist z.B 24 Zeichen pro Zeile geht man wie folgt vor:

1. 2x spi makro aufrufen = 18 Zeichen und 6 Zeichen rest.
2. Makro adaptieren sodass nach dem 6ten Zeichen abgebrochen wird.

Die Funktion ist sehr Zeitkritisch. Daher ist eine Schleife mit Abfragen 
nicht möglich.

Grundlage für den Source Code ist 
Beitrag "AVR Videogenerator, 40x25 Zeichen, nur 60% CPU Auslastung !"

Die Font kommt von 
http://searle.hostei.com/grant/MonitorKeyboard/index.html

Falls ich eine Quellenangabe vergessen habe bitte melden!

Schöne Grüße

Stefan

von Stefan K. (x2701)


Angehängte Dateien:

Lesenswert?

Update: Ausgabe von 192x200 Pixel Bitmap Files.

von Stefan K. (x2701)


Angehängte Dateien:

Lesenswert?

Diese Version unterstützt PS/2 Tastaturen. Der Scancode der Tastatur 
wird am Bildschirm in Hex angezeigt. Die Tastatur wird an INT0 (CLK) und 
INT1 (DATA) angeschlossen. Während des Bildaufbaus wird geprüft ob neue 
Daten an der Tastatur anliegen. Außerhalb des sichtbaren Bildes wird 
eine Interrupt Routine aufgerufen falls ein neues Bit von der Tastatur 
übertragen wird.

Das Timing ist recht zeitkritisch. Kommandos zur Tastatur werden nicht 
unterstützt. Falls es noch ideen gibt den Code zu optimieren, bitte 
posten.

Schöne Grüße

von Stefan K. (x2701)


Angehängte Dateien:

Lesenswert?

Source Code für Bitmap Ausgabe.

von Bernhard S. (bernhard)


Lesenswert?

Hallo Stefan,

ein sehr schönes Projekt und sehr gut erklärt, werde es die nächsten 
Tage mal testen.

Bernhard

: Bearbeitet durch User
von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Hallo Stefan,

mit diesem kleinen Projekt konnte ich schnell ein paar Tests an diversen 
Monitoren durchführen.

Vermutlich muss die Horizontal- und Vertikal-Frequenz bei den heutigen 
Monitoren nicht so exakt sein.

Den 16 MHz Prozessortakt konnte ich bei einem Monitor-Exemplar zw.
15,3...17,6 MHz varieren ohne das der Monitor einen Fehler meldet oder 
sogar abschaltet.

Bernhard

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.