Forum: Mikrocontroller und Digitale Elektronik VT100 Menu per uC


von Marco G. (grmg2010)


Angehängte Dateien:

Lesenswert?

Moin,

ich würde gerne ein Menü per UART(Wie im Anhang zu sehen)realisieren. 
Ich dachte daran, das ganze mittels VT100 auszuführen. Merkwürdigerweise 
wird ohne weitere delays der Code extrem langsam. Weiß jemand, was 
ich(grundsätzlich) falsch  mache? Oder ist es normal, dass code mit 
vielen VT100 befehlen langsam wird?

Welche Alternative gibt es, solch ein Menü zu realisieren?

Gruß

von Peter M. (Gast)


Lesenswert?

Ohne den Code zu sehen, ist das schwer zu sagen.
Die UART-Ausgabe machst Du per Interrupt?

von Marco G. (grmg2010)


Lesenswert?

Nein, außer der VT100 Ausgabe läuft nur noch ein Counter und eine 
Berechnung. Aber das bringt mich auf eine Idee. Wahrscheinlich kann ich 
mir viele befehle sparen. Ich werde mal versuchen, das Grundbild beim 
start zu erschaffen und dann nur noch die dynamischen Inhalte zu 
aktualisieren.

von Sinus T. (micha_micha)


Lesenswert?

Das hängt auch von deiner Baudrate ab. Das VT100 braucht z.B. für die 
Cursorpositionierung 8 Zeichen plus das Zeichen, das du ausgeben willst. 
Wenn du mit 9600Baud arbeitest, braucht ein Zeichen ca. 1ms. Wenn du 
viel Positionierungen drin hast, wird das sehr langsam.

von Marco G. (grmg2010)


Lesenswert?

Heißt das, wenn ich die Baudrate auf 115kBaus erhöhe, wird dadurch auch 
die ausgabe schneller?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Marco G. schrieb:
> Welche Alternative gibt es, solch ein Menü zu realisieren?

Schau Dir mal MCURSES an.

von Peter M. (Gast)


Lesenswert?

Marco G. schrieb:
> Baudrate auf 115kBaus erhöhe

Klar wird die Ausgabe dadurch schneller und Dein µC verbraucht weniger 
Zeit im TX-Interrupt.
Zusätzlich solltest Du deine Idee, nur noch die Deltas auszugeben, 
weiter verfolgen. Wenn der RAM von Deinem µC groß genug ist, dann kannst 
Du den Bildschirm als Array definieren und dort die Änderungen 
hineinschreiben.
Dann rufst Du bei Bedarf eine Update-Routine auf, die nur die Deltas aus 
dem Array an das Terminal ausgibt.
Dann wird das sehr zügig.

von Marco G. (grmg2010)


Lesenswert?

Ok, dann werde ich es mal mit einer höheren Baudrate probieren. Wie 
genau kann ich ein ganzes Bildschirmbild als Array abspeichern?

von Wolfgang (Gast)


Lesenswert?

Peter M. schrieb:
> ... und Dein µC verbraucht weniger Zeit im TX-Interrupt.

Geht es bei 115kBd schneller, das nächste Byte ins Transmit Register zu 
schreiben, als bei 9600Bd?

von Peter M. (Gast)


Lesenswert?

Wolfgang schrieb:
> Geht es bei 115kBd schneller, das nächste Byte ins Transmit Register zu
> schreiben, als bei 9600Bd?


Was ich geschrieben habe:

Peter M. schrieb:
> Dein µC verbraucht weniger
> Zeit im TX-Interrupt.

ist nicht ganz korrekt beschrieben.
Was ich damit sagen wollte ist, dass das Versenden der Daten, bedingt 
durch die höhere Baurate, schneller geht.

Der TX-Interrupt wird in kürzeren Zeitabständen aufgerufen.

Damit wird auch das Transmit Register, logischer Weise, schneller mit 
dem nächsten Wert geladen.

Und, was ich annehme, da Marco das Versenden im Pollingmodus macht, hat 
die höhere Baurate auch darauf direkten Einfluß.

Marco G. schrieb:
> Wie
> genau kann ich ein ganzes Bildschirmbild als Array abspeichern?


Du legst Dir ein Array von der Größe des Bildschirms an. Bspw. 80x25 
Bytes groß, also 2000 Bytes, an.
array[0] ist dann Zeile 1 Spalte 1. array[1] ist Zeile 1 Spalte 2, usw.
Wenn Du nur mit ASCII Zeichensatz arbeitest, dann kannst Du das MSB (Bit 
7) benutzen um eine Änderung zu kennzeichnen.
Die Update (Ausgaberoutine) überprüft dann, ob dieses Bit gesetzt ist 
und
gibt nur den neuen Wert für diese Position aus.
Nach der Ausgabe wird das Bit gelöscht.

Das klingt vielleicht etwas kompilziert, verbessert jedoch die gesamte 
Performance bei der Ausgabe.
Und Du hast den Vorteil, dass Du nur dann die Bildschirmausgabe machen 
musst, wenn es notwendig ist.

Alternativ kopiert die Ausgaberoutine das gesamte Array, ohne Bewertung 
des Bit 7 auf den Bildschirm. Bit 7 wäre in diesem Fall obsolete.
Und zwar so, dass nur eine Positioniersequenz an den Bildschirmanfang 
ausgegeben wird und danach die Daten an einem Stück ausgegeben werden.
D.h., ohne ESC-Sequenzen zur Positionierung.
Das Terminal macht nach dem 80. Zeichen, meist automatisch einen Sprung 
in die nächste Zeile.
Die alten VT100 konnten das, ob es Putty kann, weiss ich nicht.

Das sind meine Überlegungen dazu.

Nachtrag:

Wenn Du mit einem Array arbeitest und die alternative Methode zur 
Ausgabe benutzt, dann löschst Du den Bildschirm in dem Du 0x20 
(Leerzeichen) in das array schreibst.
Ein weiterer Vorteil ist, dass intern mit Distanzen auf das array 
zugreifen kannst.
Ich meine damit, dass Du das Grundbild direkt bei der Definition des 
Arrays anlegen kannst und Dir per #define die Distanzen dazu erstellst.
D.h., die Distanzen zeigen auf den Anfang des Feldes in Deiner Maske, 
die mit den entsprechenden Daten gefüllt werden.

Viel Erfolg!

von Wolfgang (Gast)


Lesenswert?

Peter M. schrieb:
> Damit wird auch das Transmit Register, logischer Weise, schneller mit
> dem nächsten Wert geladen.

Die Zeit, die der µC zum Laden des Registers in der ISR verbringt, hängt 
einzig und alleine von der Datenmenge ab und ist völlig unabhängig von 
der Datenrate. Die Übertragung geht bei höherer 
Übertragungsgeschwindigkeit natürlich schneller, weil das Produkt aus 
Geschwindigkeit und Zeit immer gleich dem Datenvolumen ist.

von Peter M. (Gast)


Lesenswert?

Wolfgang schrieb:
> Die Zeit, die der µC zum Laden des Registers in der ISR verbringt, hängt
> einzig und alleine von der Datenmenge ab und ist völlig unabhängig von
> der Datenrate.

Das ist nicht korrekt!
Die Datenmenge hat damit überhaupt nichts zu tun.
Schauen wir uns einmal so einen Vorgang einmal an:


Die UART-ISR wird nach dem versenden des ersten Bytes aufgerufen,
lädt das nächste Byte in den TX-Buffer und kehrt zurück.
Und genau darum geht es:
Bei 115200 Baud ist das Byte schneller versendet, als bei 9600 Baud und
die UART-ISR wird entsprechend schneller wieder aufgerufen. In diesem 
Fall
12 fach schneller!
Es ist unerheblich wieviel Bytes gesendet werden soll, an der 
Aufruffrequenz der UART-ISR ändert dies nichts!

Das Laden des TX-Registers dauert allerdings immer die gleiche Zeit, da 
dies von Taktrate des Prozessors abhängig ist und NICHT von der 
Baudrate.

Wolfgang schrieb:
> ist völlig unabhängig von
> der Datenrate.

Diese Aussage ist schlicht Quatsch!

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.