Geschätztes Forum,
ein kleines Beispiel wie mit einem ATmega1284p 20MHz ein 640x480 60Hz
VGA-Signal generiert werden kann.
Effektiv können 164x120 RGB-Pixel in 8 Farben dargestellt werden (Rot,
Grün, Blau, Gelb, Magenta, Cyan, Schwarz und Weiß), ein Pixel besteht
aus 4 VGA-Zeilen.
Leider nur 164 X-Pixel, mehr gibt der Pixeltakt nicht her.
Diese Version kann ein Pixel an der Position X,Y setzen, geometrische
Figuren und ASCII-Zeichen beherrscht sie noch nicht.
Ein sogenannter "Turbo-Modus" beschleunigt die Graficdarstellung. Jede
VGA-Zeile wird auf RGB-Dateninhalt geprüft, liegen keine RGB-Daten vor,
dann wird sofort die Interruptroutine verlassen und das Hauptprogramm
kann weiter bearbeitet werden.
Es wird nur ein 16 Bit CTC-Timer benötigt, welcher auch eine
Taktkorrektur vornimmt, denn ein Interrupt wird nicht immer mit der
gleichen Anzahl von Takten angesprungen. Die VGA HSYNC und VSYNC-Impulse
müssen absolut jitterfrei generiert werden, ansonsten zappelt das Bild
oder der VGA-Monitor schaltet sogar ab.
Stimmt etwas mit der Taktkorrektur nicht, dann leuchtet die rote LED.
Ein paar Worte zum Bildspeicheraufbau:
Der Bildspeicher befindet sich im SRAM. Jedes SRAM-Byte speichert 2
Pixel.
164x120=19.680 Pixel :2 Pixel pro Byte = 9.840 Byte
Bit[0] = Rot (linkes Pixel)
Bit[1] = Grün (linkes Pixel)
Bit[2] = Blau (linkes Pixel)
Bit[3] = Reserve (linkes Pixel)
Bit[4] = Rot (rechtes Pixel)
Bit[5] = Grün (rechtes Pixel)
Bit[6] = Blau (rechtes Pixel)
Bit[7] = Reserve (rechtes Pixel)
Die RGB-Pixel werden wie folgt ausgegeben:
1 | LD temp,Y+ ; aus SRAM laden (2 Pixel)
|
2 | out PORTB,temp ; linkes PIXEL ausgeben (unteres Nibble)
|
3 | SWAP temp ; Bit-Umkehr
|
4 | nop ; Pause
|
5 | out PORTB,temp ; rechtes PIXEL ausgeben (oberes Nibble)
|
Für Hinweise und Vorschläge bin ich sehr dankbar.
Bernhard