www.mikrocontroller.net

Forum: Projekte & Code AVR VGA Terminal


Autor: Sebastian B. (sfreak) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe fuer ein Uni-Projekt diesen Code geschrieben. Er erzeugt ein 
VGA-Signal mit 640x400 Pixeln bei 75Hz Bildwiederholrate. Das Bild wird 
aus einem 80x50 Zeichen Framebuffer erzeugt, das Ganze macht 
ausschlisslich schwarz/weiss Text.

Verwendet wird ein ATmega644P (auf 25MHz uebertaktet) und ein 74HC165 
Schieberegister (AVR gibt 8 Pixel parallel aus, werden im 
Schieberegister serialisiert um die 25 MHz Pixeltakt zu erreichen).

Ein Paar weiter Infos gibt's hier: 
http://www.thebackend.de/microcontroller:dmm_vga

Das ganze ist unter Zeitdruck entstanden, erwartet also keinen 
aufgeraeumten Code und keine hilfreichen Kommentare... aber vielleicht 
hilft's ja auch so dem ein oder anderen.

Sebastian

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch der Schaltplan.


Und ein Video von der Demo die ich mit draufgebaut habe: 
Youtube-Video "AVR VGA Terminal"

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch eine aktualisierte Version.

Habe den Code ein /klein/wenig aufgeraeumt und vor allem die Schrift 
durch eine mit CP437 (DOS) Codierung ersetzt. Damit hat man nun auch all 
die huebschen Liniensegmente zur Verfuegung.

Sebastian

Autor: Christian Berger (casandro) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schön, hättest Du den IC2A durch einen Multiplexer ersetzt, so hättest 
Du ganz einfach Farbe machen können. Trotzdem nicht schlecht.

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Berger schrieb:
> Schön, hättest Du den IC2A durch einen Multiplexer ersetzt, so hättest
> Du ganz einfach Farbe machen können. Trotzdem nicht schlecht.

Mir war wichtig eine Moeglichst hohe Aufloesung zu machen damit das 
ganze als Terminal-Ersatz taugt. So habe ich nur 8 Prozessortakte um 8 
Pixel auszugeben und der Speicher ist auch zu >99% voll. Wo ich da noch 
Farbe machen soll sehe ich nicht so recht. Oder erklaer deine Idee mal 
genauer...

Autor: Christian Berger (casandro) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian B. schrieb:
> So habe ich nur 8 Prozessortakte um 8
> Pixel auszugeben und der Speicher ist auch zu >99% voll. Wo ich da noch
> Farbe machen soll sehe ich nicht so recht. Oder erklaer deine Idee mal
> genauer...

Naja, so ähnlich wie das auch in kommerziellen Lösungen gemacht wird. Du 
speicherst nicht die ganze Zeile mit Zeichen und Farbe, sondern nimmst 
Sonderzeichen her, welche beispielsweise "5 Leerzeichen" oder "schalte 
auf grün" bedeuten. Damit kannst Du zwar nicht jedes Zeichen in jeder 
Farbe darstellen, aber zumindest Textteile hervorheben.

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Berger schrieb:
> Naja, so ähnlich wie das auch in kommerziellen Lösungen gemacht wird. Du
> speicherst nicht die ganze Zeile mit Zeichen und Farbe, sondern nimmst
> Sonderzeichen her, welche beispielsweise "5 Leerzeichen" oder "schalte
> auf grün" bedeuten. Damit kannst Du zwar nicht jedes Zeichen in jeder
> Farbe darstellen, aber zumindest Textteile hervorheben.

Verstehe, das wuerde aber in diesem Projekt nicht funktionieren. Ich 
braeuchte entweder entscheidend mehr Zeit um im Framebuffer noch 
irgendwelche Escape-Sequenzen auszuwerten (also eine viel niedrigere 
Aufloesung) oder mehr Speicher um aus den Escape-Sequencen meinen 
normalen Framebuffer quasi zu rendern :-)

Im Moment koennte ich die Farben hoechstens Zeilenweise umschalten... 
das ist glaub ich nicht sehr sinnvoll...

Sebastian

Autor: Christian Berger (casandro) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, Du musst ja kein Zeichen ausgeben, wenn Du ein Escape Zeichen 
hast.

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Berger schrieb:
> Naja, Du musst ja kein Zeichen ausgeben, wenn Du ein Escape Zeichen
> hast.

Naja, es muss aber ja auch das Timing und die Anzahl der Zeichen je 
Zeile stimmen, man will ja trotz Steuersequenzen die volle Zeile 
nutzen... also ganz so einfach wird das hier kaum klappen. Wenn du mal 
in den Code schaust wirst du sehen das waehrend der Ausgabe einer 
Videozeile keine Zeit mehr ist fuer die Auswertung von Escape-Sequenzen. 
Da muss die Verarbeitung jedes Bytes gleich lang sein, sonst gibt's 
schwarze Flecken auf dem Bildschirm.

Hast du sowas schonmal gebaut? Interessieren wuerde mich ein Quellcode 
dazu ja schon.

Sebastian

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also escape-sequenzen sind an der stelle denke ich gar nicht machbar. 
dadurch das man 8 takte zeit hat sich das nächste byte (welches ja aus 
dem textframebuffer mit der entsprechenden verküpfung aus dem char ram 
geholt wird) was wirklich schon echt sehr knapp ist, bleibt keine zeit 
den bytestream zu interpretieren.
das einzige was ginge, wäre über einen multiplexer die vor und 
hintergrundfarbe global zu setzen (z.b. ein separates hc165 um die 
jeweils 3 pins für vor und hintergrundfarbe an jedem frame anfang oder 
ende zu setzen), oder die 3 letzten verbleibenenden pinne pb0-pb2 für 
die text farbe zu nehmen (also schwarz/rot oder schwarz/blau oder 
schwarz/irgendwas aus den 5 möglichkeiten) die dann ebenfalls durch 
einen multiplexer geschaltet werden.

mehr denke ich dürfte da nicht machbar sein. 25 mhz müssen eben sein für 
ein std vga signal. wobei die framerate bei 640x400 bei 25Mhz dann bei 
ca 60Hz liegen dürfte, und nicht 72Hz, da läge man bei ca 30MHz.

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

neue Version: inline Assembler Teil ueberarbeitet. Ist jetzt etwas 
weniger haesslich aber nicht unbedingt leichter zu verstehen ;-)

Die 75 Hz Bildwiederholrate stimmen schon so grob. 800 Takte/Zeile, 421 
Zeilen macht:

Nagut, also 74Hz. Zeigt der Monitor auch so an.

Sebastian

Autor: eku (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht schlecht.

Schau Dir doch mal die Schaltung des ZX80 von Sinclair an. Deutlich 
langsamer getaktet und das Bild wird in einer NMI-Routine des 
Z80-Prozessors ausgegeben. In 1K-RAM haben BASIC-Programm und 
Bildschirmspeicher platz. Die ROM-Routinen zur Erzeugung des 
Videosignals sind sehr aufschlussreicht.

Schaltplan und kommentiertes ROM-Listing gibt es auf 
www.worldofspectrum.org.

Autor: budruz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der ZX Spektrum aber schafft solche Auflösung nicht...

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
25MHz Pixeltakt ist schon eine ordentliche Leistung. Theoretisch sollten 
etwa 40MHz möglich sein (40MHz für das Schieberegister, 20MHz für den 
AVR), allerdings ist das ganze dann ziemlich timingkritisch und benötigt 
64kByte, schnelles, externes RAM, denn nur so schafft es ein AVR ein 
Byte innerhalb von 4 Takten mit sinnvollen Daten zu füllen.
Dafür erhält man aber auch 800x600 Pixel Auflösung die man mit 
beliebigen Daten füllen kann.

Autor: Christian Berger (casandro) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, es geht schon noch mehr als 2xTaktfrequenz. Man könnte 
beispielsweise einen FIFO und einen Timer extern betreiben. Dann schiebt 
man einfach das Bild als RLE raus. Damit geht zwar wohl kein Text, aber 
für Graphiken reicht das.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Berger schrieb:
> Dann schiebt man einfach das Bild als RLE raus.

Geht das so einfach ohne viel Aufwand? Ich hatte mit RLE bisher wenig zu 
tun, aber ich stelle mir das Umwandeln in die Pixeldaten mit 
Standardbauteilen relativ aufwendig vor.

Autor: Sebastian B. (sfreak) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Berger schrieb:
> Naja, es geht schon noch mehr als 2xTaktfrequenz. Man könnte
> beispielsweise einen FIFO und einen Timer extern betreiben. Dann schiebt
> man einfach das Bild als RLE raus. Damit geht zwar wohl kein Text, aber
> für Graphiken reicht das.

Wenn das alles so einfach ist bin ich auf deine Loesung gespannt...

Eigentlich sollte ich noch die Terminal-Emulation im aktuellen Projekt 
in etwas funktionierendes verwandeln... aber ich glaube da hab ich 
erstmal keine Lust mehr drauf und fuer die Uni brauch ichs nicht 
unbedingt :-)

Ich habe hier noch ein 640x200 LCD rumliegen (irgendwo... mal sehen ob 
ichs wiederfinde). Mit dem werd ich mich demnaecht auch noch 
beschaeftigen, sollte ja recht aehnlich gehen. Da gibts hier im Forum 
und bei elm-chan schon einige schoene Ideen.

Sebastian

Autor: Christian Berger (casandro) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benedikt K. schrieb:
> Christian Berger schrieb:
>> Dann schiebt man einfach das Bild als RLE raus.
>
> Geht das so einfach ohne viel Aufwand? Ich hatte mit RLE bisher wenig zu
> tun, aber ich stelle mir das Umwandeln in die Pixeldaten mit
> Standardbauteilen relativ aufwendig vor.

Nunja, man bräuchte beispielsweise einen einfachen Timerbaustein, 
welcher rückwärts zählt, und dann bei 0 einen neuen Wert aus dem FIFO 
einließt. Das ist nicht ganz trivial, hat aber eine Netzliste in der 
Größenordnung der externen RAM Lösung.


Es ist definitiv einfacher als selbst gebauter RAM. :)

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich denke wenn man soviel aufwand treiben muß, lohnt sich dann schon ein 
cpld zur unterstützung ...

Autor: Mw En (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ausbuddel
Nur mal so als Frage, wieso haste denn ein externes Schieberegister 
verwendet?
Der AVR hat doch eins integriert, nennt sich SPI.

Autor: Christian Berger (casandro) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der SPI läuft nur maximal mit der halben Taktfrequenz des Prozessors.

Autor: Mw En (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja da war was
Kopf->Tisch
Sollte Atmel mal ändern...

Autor: Christian Berger (casandro) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das wäre wirklich mal ein geiles Feature. Danach käme noch die 
Möglichkeit das Stoppbit los zu werden und schon Daten rein schreiben zu 
können, während ein Byte gesendet wird. Idealerweise hätte man noch 
mehrere SPIs die man gleichzeitig betreiben könnte. :)

Autor: Krach-Bumm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen, kann die Soft auf ein BAS-Signal angepasst werden? Ich 
brauche da was einfaches das ein Videosignal, H-und V-Sync mit einem 
Gitter oder Balkensignal zum Fernseher (Videoteil) testen erzeugt.
Hat da schon mal einer was gemacht?
Mit dem Analogteil komme ich klar aber der MC.... die gabs noch nicht 
als ich Fernsehtechniker gelernt habe.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.