Hallo,
ich möchte einen VGA-Port ansteuern und habe dazu zunächst einmal die
Signale VSync und HSync erstellt (siehe Anhang).
Ist das so richtig? Die Zeiten stimmen nicht, das weiß ich, aber könnte
das ansonsten so richtig sein?
Thomas
Thomas wrote:
> Ist das so richtig? Die Zeiten stimmen nicht, das weiß ich, aber könnte> das ansonsten so richtig sein?
Eventuell, wenn die Zeiten stimmen. Aber zu dem kleinen Ausschnitt kann
man nicht wirklich was sagen. Von VSync ist da garnichts zu sehen.
Stimmt, man erkennt wirklich nicht besonders viel, im Anhang ist ein
besserer Screenshot.
Eine Frage noch dazu: Angenommen die Zeiten wären richtig, was müsste
ich dann verändern, um die Signale für eine andere Auflösung zu
verwenden?
Ja, die Werte kenne ich, ich hatte nur noch keine Zeit das richtige
Clock-Signal zu erstellen.
Muss ich irgendwas verändern, wenn ich die Signale für eine andere
Auflösung verwenden möchte? Die absoluten Zeiten bleiben ja immer
gleich...
Thomas
Es gibt verschiedene Auflösungen die über die Sync Polarität erkannt
werden. Aber das hat eher historische Gründe. Heutige Multisync Monitore
kommen mit beliebiger Sync Polarität zurecht. Es reicht also das Timing
zu verändern.
Welches Timing? Nur das Timing von R,G und B oder auch das von HSync und
VSync?
Wenn ich die Anzahl der Clocks verkleinere, erhöht isch ja auch die
Pixeltaktfrequenz, so dass das Timing im Endeffekt gleich bleiben
sollte.
Thomas
Thomas wrote:
> Welches Timing? Nur das Timing von R,G und B oder auch das von HSync und> VSync?
Natürlich auch das der Sync Signale. Ansonsten hat der Monitor ja keine
Möglichkeit das Timing zu erkennen.
> Wenn ich die Anzahl der Clocks verkleinere, erhöht isch ja auch die> Pixeltaktfrequenz
Nein. Der Pixeltakt ist der Takt aus dem alle anderen Takte abgeleitete
werden. Wenn du den Pixeltakt erhöhst wird entweder die Framerate höher,
oder du erhöhst die Anzahl an Pixel pro Zeile und pro Bild und erhälst
so eine höhere Auflösung.
Mh, danke.
Was ist denn mit der Excel-Datei? Man sieht dort, dass die Zeiten in den
Spalten F und I identisch sind. Ist das nicht der Beweis dafür, dass das
Timing gleich bleiben kann?
Entschuldigung, wenn ich auf denm Schlauch stehen sollte,
Thomas
Die Zeilenfrequenz ist immer die Bildfrequenz multipliziert mit der
Anzahl der sichtbaren und unsichtbaren Zeilen. Reduzierst du die
Zeilenzahl, wird bei gleicher Zeilenfrequenz die Bildfrequenz höher
oder bei gleicher Bildfrequenz die Zeilenfrequenz niedriger.
Die Exceldatei ist somit nicht richtig. Bei 640x480 kommen die Werte
hin: Die Zeilenzahl ist 31,5kHz / 60 Hz = 525, davon sind 480 sichtbar
und 45 unsichtbar. Bei 320x200 wäre die Anzahl der unsichtbaren Zeilen
325, also deutlich mehr als die der sichtbaren. Das ist Blödsinn.
Um eine vertikale Auflösung von ny zu erhalten, müssen innerhalb des
vertikalen Tdisp logischerweise genau ny HSync-Impulse liegen.
Ok, danke.
Aber wie müssen dann die Anzahl der Pixel und Zeilen und deren Zeiten
aussehen?
Muss ich dann für die kleinere Auflösung auch die Zeilenfrequenz ändern,
ansonsten kann die oben genannte Formel ja nicht stimmten.
Es wäre sehr nett, wenn ihr mir auf die Sprünge helfen könntet und mir
noch einen Tipp geben könntet und/oder mal ein paar Beispielwerte in die
Tabelle eintragen könntet.
Vielen Dank,
Thomas
Hallo,
ich habe die Tabelle verbessert (nur Pixel und Zeilen, Zeiten noch
nicht). Aber ich glaube fast nicht, dass ich das richtig gemacht habe.
:-(
Über eine Hilfe wäre ich wirklich sehr dankbar.
Thomas
Das sieht schon ziemlich gut aus. Du hast jetzt die Werte für 640x480
mit dem Verhältnis der Auflösungen (also 320/640 bzw. 200/480)
multipliziert, um auf die neuen Werte zu kommen. Damit bleibt das
Verhältnis der einzelnen Timing-Parameter gleich, so dass es von
üblichen Monitoren ebenfalls akzeptiert werden sollte.
Wenn du weiterhin einen Pixeltakt von 10MHz nimmst, stimmen allerdings
die angegebenen Werte für Zeilen- und Bildfrequenz nicht mehr.
Eine komplette Zeile (von der fallenden HSync-Flanke bis zur nächsten)
ist 320+8+48+24 = 400 Pixel lang, das sind 400/10MHz = 40µs. Die
Zeilenfrequenz ist also 1/40µs = 25kHz.
Ein komplettes Bild (von der fallenden VSync-Flanke bis zur nächsten)
ist 200+4+1+12 = 217 Zeilen lang, das sind 217/25kHz = 8,68ms. Die
Zeilenfrequenz ist also 1/8,86ms = 115,2Hz.
Sind 115Hz zuviel für den Monitor, und du möchtest lieber 60Hz,
brauchst du nur den Pixeltakt mit dem Faktor 60Hz/115,2Hz zu
multiplizieren. Da du alle Timing-Parameter in Pixeln bzw. Zeilen
angegeben hast, ändert sich das Horizontal- und das Vertikal-Timing
ebenfalls um diesen Faktor. Die Pixelfrequenz wird dann 5,21MHz, die
Zeilenfrequenz 13kHz.
Die Zeilenfrequenz von 13kHz ist jetzt aber sogar noch niedriger als
die Zeilenfrequenz beim Fernsehen (15kHz), wodurch sich ein Dilemma
auftut: Viele Computermonitore können nur Zeilenfrequenzen ab etwa
25kHz und Bildfrequenzen bis etwa 100Hz. Damit sind nur Zeilenzahlen
deutlich über 200 darstellbar. Deswegen werden VGA-Grafikkarten bei
geringen vertikalen Auflösungen meist im so genannten Double-Scan-
Modus betrieben, in dem jede Grafikzeile zweimal hintereinander
ausgegeben wird, um bei gleicher Bildfrequenz die Zeilenfrequenz zu
verdoppeln. Der Monitor "sieht" dann 400 Zeilen anstelle der realen
200.
Thomas wrote:
> Ich habe die Tabelle verbessert, ist das so richtig?
Sieht gut aus.
> Reichen 5MHz Pixeltaktfrequenz überhaupt für eine Auflösung vom 320 x> 200?
Ja. 320x240 TFTs laufen üblicherweise mit 6-8MHz, also auch in etwa in
dem Bereich.
Nur auf einem normalen Monitor wirst du das nicht anzeigen können.
Ich schließe mich Benedikts Aussagen an. Zusätzlich:
> Ich habe die Tabelle verbessert, ist das so richtig?
Da es keine gebrochenen Pixel und Zeilen gibt, würde ich die Werte auf
ganze Zahlen runden, also 320, 4, 25, 12, 200, 2, 1 und 6. Damit
ergeben sich geringfügig andere Ergebnisse für die Pixel- und die
Zeilenfrequenz, wenn man von einer festen Bildfrequenz von 60Hz
ausgeht.
> Reichen 5MHz Pixeltaktfrequenz überhaupt für eine Auflösung vom 320 x> 200?
Wie gesagt, du musst nachschauen, ob Zeilen- und Bidfrequenz im
erlaubten Bereich des eingesetzten Bildschirms liegen. Das sind die
beiden wesentlichen Parameter, die stimmen müssen. 60Hz kann fast
jeder Bildschirm, bei den 13kHz wird es evtl. eng. Weißt du denn
schon, was du an den VGA-Ausgang anschließen möchtest?
Hallo,
danke nochmal für die ganze Hilfe.
Nein, ich weiß noch nicht, was ich an den VGA-Port anschließen will, mir
ist aber egal, ob Fernsehn, PC-Monitor oder was ganz anderes.
Gibt es irgendeine Möglichkeit ein 320 x 200 VGA-Signal zu erzeugen, das
sicher auf einem PC-Monitor angezeigt werden kann?
Thomas
Oh, den Beitrag habe ich noch nicht gesehen, danke.
Aber ich glaube nicht, dass er mir weiterhilft: Am Ende bleibt mehr oder
weniger das gleiche Problem wie ich habe.
Thomas
> Gibt es irgendeine Möglichkeit ein 320 x 200 VGA-Signal zu erzeugen,> das sicher auf einem PC-Monitor angezeigt werden kann?
Ich glaube nicht, dass es ein Timing für 320x200 gibt, das auf jedem
PC-Monitor funktioniert. LC-Monitore und ältere Röhrenmonitore können
meist keine hohen Bildfrequenzen, modernere Monitore keine niedrigen
Zeilenfrequenzen. Selbst es es vom Timing her ginge: Bei 200 Zeilen auf
einem 21"-Röhrenmonitor wäre nur wenig zu erkennen, da die einzelnen
Zeilen bei einer Dicke von 0,3mm oder weniger einen vertikalen Abstand
von 1,5mm hätten. Das Bild wäre also im Wesentlichen schwarz mit ein
paar dünnen, bunten, horizontalen Linien darauf. Ob man da noch eine
Schrift erkennen könnte? Vielleicht mit zusammengekniffenen Augen und
viel Phantasie.
Sofern man "PC-Monitor" eingrenzt auf "PC-Monitor, der VGA-Signale
anzeigen kann", ist eigentlich klar definiert, wie 320x200 anzuzeigen
ist:
Mit einer Zeilenfrequenz von 31.25 kHz und einer Zeilenverdoppelung, so
daß effektiv 320x400 ausgegeben wird.
Die Zeilenfrequenz ist bei allen VGA-Modi identisch, die Anzahl der
ausgegebenen Zeilen und in Folge dessen die Bildwechselfrequenz ändert
sich.
a) 400 Zeilen -> 70 Hz
Das wird bei den Auflösungen 320x200, 640x200 (diese jeweils mit
Zeilenverdoppelung) und im "Text"-Modus mit 720x400 verwendet (80x25
Zeichen in einer 9x16-Matrix).
b) 480 Zeilen -> 60 Hz
Das wird bei 640x480 verwendet.
Die Anzahl der anzuzeigenden Bildzeilen wird dem VGA-Monitor durch die
Polarität der Synchronsignale mitgeteilt; bei 400 Zeilen wird das Bild
vertikal gespreizt (also der Zeilenabstand etwas erhöht), was bei 480
Zeilen nicht geschieht.
Diese VGA-Modi unterstützt auch heute noch jeder Monitor mit analogem
VGA-Anschluss.
Modi mit höheren Auflösungen oder anderen Bildwechselfrequenzen sind
keine VGA-Modi, sondern SVGA/XGA/SXGA-etc.-Modi und müssen daher hier
nicht berücksichtigt werden.
Thomas schrieb:> Gibt es irgendeine Möglichkeit ein 320 x 200 VGA-Signal zu erzeugen, das> sicher auf einem PC-Monitor angezeigt werden kann?
Ja, klar. Allerdings nur dann, wenn deine Hardware in der Lage ist,
Pixel mit 12,nochwas MHz rauszuballern. Damit fallen AVRs flach,
jedenfalls wenn man sie nicht deutlich übertakten möchte. Damit ginge es
höchstens "hochkant", also 200x320.
Aaaber: gibt es überhaupt einen tieferen Grund für genau die genannte
Auflösung? Wenn nicht, machst du einfach eine Auflösung, die der AVR
ohne Übertakten packt.
Das Limit bei Verwendung der USART im SPI-Modus als Schieberegister für
die Ausgabe sind bei 20MHz Takt horizontal 256 Pixel. Eigentlich 254,
aber so genau mißt das kein Monitor nach (kann er garnicht), man macht
die Schwarzschulter einfach um die rund zwei überzähligen Pixel schmaler
als der Standard es vorgibt. Hauptsache, die Zeilenfrequenz paßt.
Also halten wir erstmal fest: 256/8=32 Bytes/Zeile. Der AVR mit dem
größten Speicher hat 16k RAM, damit kommt man dann maximal auf 512
solcher Zeilen, aber es werden nur 480 gebraucht, weil sowieso nur so
viele sichtbar sind.
Es geht also ein Modus mit 256x480 rechteckigen Pixeln, wobei das
PixelAspectRatio ungefähr bei 2,5:1 liegt, die Pixel sind also
zweieinhalb mal so breit wie hoch.
Nun noch das Timing im Detail: Das am nächsten am Standard liegende
Timing wäre mit Teiler 635 für die Zeilenfrequenz, es ergibt sich eine
Zeilenfrequenz von 31496,063 Hz und eine Bildfrequenz von 59,9925 Hz.
Jeder Röhrenmonitor dürfte darauf synchronisieren und auch die
allermeisten LCD-Monitore und -TVs mit VGA-Eingang.
Übrigens: Bei einem 1284P hast du zwei USARTs, die sich im SPI-Modus
betreiben lassen. Bei Halbierung der vertikalen Auflösung auf 240 Zeilen
reicht der Speicher dann auch für eine Vierfarb-Grafik mit 256x240
Pixeln bei einem PAR von 1,25:1. Das ist schon eine ganz brauchbare
Sache.
Nach fast 5 Jahren wird er das Problem wohl gelöst haben, oder? Ich
frage mich, wie dieser Thread überhaupt entdeckt wurde. Jedenfalls ein
Lob der zähen Datenbank von MC.net :-)
Vllt. besser sperren....
Matthias Sch. schrieb:> Nach fast 5 Jahren wird er das Problem wohl gelöst haben, oder?
Wahrscheinlich. Aber 5 Jahre sind eine lange Zeit, in der vielleicht
andere Lösungsmöglichkeiten aufgetaucht sind. Z.B. gab's vor 5 Jahren
noch keinen Mega1284 (jedenfalls nicht wirklich zu kaufen).
c-hater schrieb:> (jedenfalls nicht wirklich zu kaufen)
Unwirklich wohl auch nicht.
Dass ein AVR für VGA-Signale nicht ausreicht, war aber damals schon
bekannt. Daran wird sich auch nach Einführung des ATmega14781 auch
nichts ändern.
Sprachlos schrieb:> Dass ein AVR für VGA-Signale nicht ausreicht
Wieso? Tut er doch offensichtlich, wenn auch nicht in jedem Aspekt der
Sache. Aber eben immerhin gut genug, daß sich Nutzungsmöglichkeiten
ergeben.