Forum: Mikrocontroller und Digitale Elektronik VT100 Terminal auf dem ATmega328


von Ralph S. (jjflash)


Lesenswert?

Ich möchte einen ATmega328, an dem ein graphisches Display "hängt" über 
die serielle Schnittstelle an einen Linux Rechner anschließen. Der Linux 
Rechner sendet seine Ausgaben mittels TTYS0 an den AVR. Soweit so 
einfach und die Ausgaben des Linux - Rechners kommen auch auf dem 
Display an.

Mein "Problem" ist nun, dass ich gerne die ESC-Sequenzen (VT100) auf dem 
graphischen Display interpretieren möchte.

Hat schon einmal jemand eine VT100 Emulation auf einem ATmega 
geschrieben oder kennt jemand einen Link ?

(okay, ich gebs zu: selber schreiben wäre nicht schlecht, aber an sich 
wollte ich eigentlich an meinem Projekt weiter werkeln und mich nicht an 
einem Terminal "verkünsteln").

Also, an alle die, die da sagen: schreibs doch selbst ... ich gebs zu 
... ich bin dafür zu faul (warum das Rad immer wieder neu erfinden)

von Hans-Georg L. (h-g-l)


Lesenswert?

Im letzten Jahrhundert habe ich sowas für 8080/8085 Assembler 
geschrieben ;)

Aber jetzt im Ernst ..

Nur die Escape Sequenzen zu dekodieren ist ja recht simpel und du musst 
das ja nicht vollständig implementieren. Aber woher soll jemand deine 
Grafikroutinen und ihren Aufruf kennen. Was fertig gebackenes, das genau 
auf dein System passt wird dir keiner liefern können.

von Karl H. (kbuchegg)


Lesenswert?

Ralph S. schrieb:

> (okay, ich gebs zu: selber schreiben wäre nicht schlecht, aber an sich
> wollte ich eigentlich an meinem Projekt weiter werkeln und mich nicht an
> einem Terminal "verkünsteln").
> Also, an alle die, die da sagen: schreibs doch selbst ... ich gebs zu
> ... ich bin dafür zu faul (warum das Rad immer wieder neu erfinden)

Im Prinzip schon richtig.
Allerdings verwenden die meisten Programme (über geschätzte 95%) einen 
recht kleinen Subset der Möglichkeiten. Cursor positionieren, eventuell 
invers schreiben, Display löschen. Recht viel mehr kommt in den meisten 
Programmen nicht vor.
Das geht zum Implementieren relativ rasch, da du im Grunde dich ja nur 
auf die Erkennung eines Escape konzentrieren musst. Nach dem Escape 
kommen ein par Zeichen, die in den meisten Fällen mit einem Buchstaben 
abgeschlossen werden (das Sonderzeichen nach dem Escape verrät dir, wann 
nicht). Der Buchstabe sagt dir, was du mit dem Teil zwischen Escape und 
Buchstabe anfangen musst (den du dir zwischengespeichert hast). Kannst 
du mit dem Buchstaben nichts anfangen, dann gibst du das 
Zwischengespeicherte einfach im Nachhinein aus und gut ists.

Alles in allem eine Sache auf ein paar Stunden, je nachdem wie 
kompliziert dein restlicher Teil aufgebaut ist. Alles in allem halb so 
wild
http://ascii-table.com/ansi-escape-sequences-vt-100.php

: Bearbeitet durch User
von Ralph S. (jjflash)


Lesenswert?

smile, die "Grafikroutinen" benötge ich ja nicht (außerdem werde ich das 
Display nur mit buntem Text füttern).

Ich wollte mich schlicht um das Parsing der ESC-Sequenzen drücken. 
Prinzipiell reicht mir ja auch schon ein "normaler" C-Quelltext (egal 
für welchen Prozessor).

Im Moment bin ich ja dran am Programmieren ! Hrmpf (weil mir jetzt dann 
die Zeit für anderes fehlt)

von Karl H. (kbuchegg)


Lesenswert?

Ralph S. schrieb:
> smile, die "Grafikroutinen" benötge ich ja nicht (außerdem werde ich das
> Display nur mit buntem Text füttern).
>
> Ich wollte mich schlicht um das Parsing der ESC-Sequenzen drücken.
> Prinzipiell reicht mir ja auch schon ein "normaler" C-Quelltext (egal
> für welchen Prozessor).

Ach komm:
Nach dem Erhalt eines Escape ein Flag setzen, so dass die nächsten 
Zeichen nicht direkt ausgegeben werden sondern erst mal in einem Array 
landen ist jetzt nicht wirklich Raktenetechnik für jemanden der die 
Grafikfunktionen bereits geschrieben hat.

> Im Moment bin ich ja dran am Programmieren ! Hrmpf (weil mir jetzt dann
> die Zeit für anderes fehlt)

Ich sag jetzt nicht, dass das eine Sache auf ein paar Minuten ist, aber 
soooo massig viel Zeit geht da auch nicht rein. Der 
Escape-Zwischenspeicher Mechanismus ist eine Sache für Abends, wenn man 
schon müde ist und noch eine halbe Stunde investieren kann. Und die 
halbe Handvoll Escape Sequenzen, die in der Praxis tatsächlich vorkommen 
sind dann nur noch das Sahnehäubchen. Da dauert es wesentlich länger, 
sich aus einem vorhandenem Code, dessen Anbindung an die Anzeige 
vollkommen anders als bei dir ist, sich die relevanten Stellen per 
Copy&Paste rauszuschneiden und anzupassen.

Manchmal erfindet man das Rad neu, weil es schneller geht als erst mal 
nach einem passenden Rad zu suchen und das dann anzupassen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> schon müde ist und noch eine halbe Stunde investieren kann. Und die
> halbe Handvoll Escape Sequenzen, die in der Praxis tatsächlich vorkommen
> sind dann nur noch das Sahnehäubchen.


Wenn nach einem Escape kein '[' kommt, würde ich erst mal sowieso den 
Escape Behandelteil wieder abschalten. Und von dem, was dann noch an 
Kommandos übrig bleib, kannst du getrost mindestens 80% aller Kommandos 
wegen praktischer Irrelevanz erst mal ignorieren.

Mein erstes Subset wäre
1
<ESC>[<l>;<c>H       wobei <l> und <c> auch fehlen dürfen und damit als 0 gelten
2
<ESC>[<v>K           <v> darf auch wieder fehlen
3
<ESC>[<v>J           <v> darf fehlen
4
<ESC>[<v>A
5
<ESC>[<v>B
6
<ESC>[<v>C
7
<ESC>[<v>D
8
und eventuell noch ein paar aus <ESC>[<v>m
das dürfte für die meisten ansteuernden Programme völlig ausreichen. Was 
dann noch fehlt, ergibt sich dann schon.

: Bearbeitet durch User
von Hans-Georg L. (h-g-l)


Lesenswert?

Und nicht vergessen, das das VT100 nicht nur die Escape Sequenzen 
versteht sondern auch die "normalen" ASCII Steuerzeichen (CR,LF,VT,HT,BS 
usw).

Auch wenn du keine Linien echte Grafik willst brauchst doch die Routinen 
zum Zeichen löschen oder Cursor verschieben usw.

von Hans-Georg L. (h-g-l)


Lesenswert?


: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Ralph S. schrieb:
> Hat schon einmal jemand eine VT100 Emulation auf einem ATmega
> geschrieben oder kennt jemand einen Link ?

Warum sollte das auf einem AVR anders aussehen als auf einem PC?

: Bearbeitet durch User
von Ralph S. (jjflash)


Lesenswert?

Smile, ich habs ja jetzt (fast) schon (fertig) geschrieben .... lach

von Klausb (Gast)


Lesenswert?

Die ATMEL Appl. Note AVR313 gibt auch was für den VT100 her.

von Guido L. (guidol1970)


Lesenswert?

Ralph S. schrieb:
>
> Hat schon einmal jemand eine VT100 Emulation auf einem ATmega
> geschrieben oder kennt jemand einen Link ?

schau doch mal hier:
http://www.msarnoff.org/terminalscope/

The Terminalscope is a full, bidirectional serial terminal that uses a 
PS/2 keyboard for input and displays 54x24-character output on an 
oscilloscope or XY display. It can be connected to a PC via USB-to-TTL 
adapter or directly to another microcontroller.

Features include:

7-bit ASCII character set plus box-drawing characters
Flicker-free 60Hz picture
Most ANSI/VT100 escape sequences interpreted
Reverse video attribute supported
All your favorite ncurses terminal programs (vi, nano, top, links, mc, 
irssi, etc.) display fine
Graphical configuration menu
Selectable baud rate (2400-38400), data bits, parity, and stop bits
Two configuration profiles (stored in EEPROM) quickly selectable with an 
external switch

von Mike (Gast)


Lesenswert?

Beim Umschalten auf Grafiksymbole: wo liegen die denn im Zeichensatz? 
Ich meine bei Unicode ist das 0x2500 bis 0x257f, wo sitzen sie dann in 
der ASCII-Tabelle?

von Karl H. (kbuchegg)


Lesenswert?

http://vt100.net/docs/vt100-ug/


Besser
http://www.vt100.net/docs/vt100-tm/ek-vt100-tm-002.pdf

Tabelle A9 auzf Seite A-12


Generell: zu Zeiten eines VT100 war die Welt noch einfach: es gab nur 7 
Bit ASCII und die blieben im wesentlichen auch immer gleich. Höhepunkt 
in der 7-Bit ASCII Welt war es, ob ein Pfund Zeichen oder ein 
Paragrafen-Symbol angezeigt wird. Alles mit Codes großer 0x7F war 
vollkommen vom Hersteller vorgegeben. Es gab da keinen Standard, das 
machte jeder wie er wollte. Quasi als Ausgleich dafür gab es aber in 
dieser Zeit noch Unterlagen und Dokumentationen die ihr Geld wert waren 
und die man zum Gerät einfach so dazu bekam. Da stand dann zwar auch 
drinnen, dass man einen zum Kauf des Gerätes beglückwünscht, aber im 
Gegensatz zu heute nicht in 24 Sprachen und sonst nichts mehr, sondern 
es gab dann noch ein paar Zig Seiten, auf denen alles haarklein 
beschrieben war.

: Bearbeitet durch User
von A. H. (ah8)


Angehängte Dateien:

Lesenswert?

Hallo,

vielleicht nützen Dir ja die beigefügten Perl-Skripte etwas. Sie 
enthalten am Ende eine Spezifikation der VT100/VT102 ESC-Sequenzen. 
Diese Spezifikation kann man als Beschreibung eines 
nichtdeterministischen endlichen Automaten (NFA) interpretieren. Das 
Skript macht daraus durch Teilmengenkonstruktion (nach Myhill, siehe 
z.B. ISBN 978-0321486813) einen äquivalenten deterministischen endlichen 
Automaten (DFA), den es in Form eines bash-Skripts ausgibt. Du kannst 
dieses Skript einfach in einen bash pipen und es wird Dir übersetzbaren 
Code erzeugen. Dabei wird jeder Zustand des DFA in eine Funktion 
abgebildet, die das nächste Eingangszeichen als Input erhält, 
gegebenenfalls die entsprechende Grafikroutine aufruft und als 
return-Wert den Folgezustand des DFA liefert.

Ich habe das damals für ein C++ Projekt gebraucht, daher wird C++ Code 
erzeugt, es sollte aber durch ein paar Änderungen im Perl-Skript ohne 
Probleme auch C Code (im Prinzip auch jede andere vergleichbare 
imperative Sprache) möglich sein. Natürlich wirst Du die Grafikroutinen 
sowie eine geeignete Laufzeitumgebung für den DFA implementieren müssen. 
(Der DFA selber ist nicht mehr als eine einfache Schleife.)

Ich hatte dieses Skript damals geschrieben, da ich mehrere sich 
teilweise widersprechende Spezifikationen des VT100/VT102 Terminals 
hatte und ich mir die Möglichkeit einer schnellen und sicheren Anpassung 
der Emulation an eine geänderte Spezifikation offen halten wollte. Das 
hat auch sehr gut funktioniert.

Die implementierte Simulation sollte dem Original schon sehr nahe 
kommen. Wenn ich mich richtig erinnere fehlt lediglich die Möglichkeit, 
die dargestellten Zeichen auf doppelte Breite bzw. Höhe umzustellen.

Hinweis: Es gibt einige Steuerzeichen, die vom VT100 übergeordnet zu 
ESC-Sequenzen ausgewertet werden. Folglich gibt es auch in der Emulation 
eine Routine, die diese Zeichen auswertet, ohne dass sie an den DFA 
weitergereicht werden. Daher ist der Zustand 0 des DFA trivial und 
enthält insbesondere keinen Übergang in den Zustand 1. Dies geschieht 
eine Ebene höher. Die übergeordnete Routine nimmt auch die mögliche 
Umschaltung in den VT52-Mode vor, der in einem eigenen DFA implementiert 
ist. Der DFA des VT52-Modes ist analog implementiert, nur deutlich 
einfacher.

Viel Spaß

von Georg (Gast)


Lesenswert?

Mike schrieb:
> Beim Umschalten auf Grafiksymbole: wo liegen die denn im Zeichensatz?
> Ich meine bei Unicode ist das 0x2500 bis 0x257f

VT100 war lange lange vor Unicode. Soweit ich mich erinnere gab es die 
256 1-Byte-Zeichen basierend auf ASCII, aber was die Zeichen der oberen 
Hälfte betrifft konnte man zwischen mehreren (3?) Zeichensätzen 
umschalten.

Am besten besorgst du dir das VT102-Manual (EK-VT102-UG-003). 
Andrerseits erhebt sich die Frage, ob und warum du in allen Punkten 
VT100-kompatibel sein willst, du könntest ja auch den PC-Zeichensatz 
verwenden mit Umlauten und Block-Grafik, so dumm war der ja nicht.

Georg

von Mike (Gast)


Lesenswert?

Karl Heinz schrieb:
> Besser
> http://www.vt100.net/docs/vt100-tm/ek-vt100-tm-002.pdf
>
> Tabelle A9 auzf Seite A-12

danke!

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.