Forum: Compiler & IDEs VT100 ESC Sequenzen + LCD


von Reda (Gast)


Lesenswert?

Hallo zusammen,

ich habe eine konkrete Frage:
wie kann ich den Befehl z.B ESC [ D (d.h. setze Cursor 1 left) in C Code
einsetzen ???
wenn ich die befehele in mein programm eingebe:
        lcd_data(0x1B);  // ESC
  lcd_data(0x5B);   // [
  lcd_data(0x44);   // D
wird der kursor nicht nach links verschoben, ich bekomme einfach [D.

Es geht um ein  KS0070B kompatibles LCD mit Atmega32 angesteurt.

Danke im vorraus

von Andreas K. (a-k)


Lesenswert?

Woher kommt die Vorstellung, dass der KS0070 VT100-Sequenzen verstehen 
würde?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das von Dir verwendete LC-Display versteht keine VT100-Escape-Sequenzen. 
Das tut übrigens auch kein anderes Display.

Stattdessen wirst Du im Datenblatt/Programmierhandbuch des 
LC-Controllers (KS0070B resp. HD44780) nachsehen müssen, wie dort die 
Cursorsteuerung funktioniert.
Kleiner Hinweis: Du wirst die DDRAM-Adresse verändern müssen.

von Reda (Gast)


Lesenswert?

Danke für die schnelle Antwort.


ich habe auch vermutet, dass dies Display keine VT100-Befehle 
ünterstützt.

an >> Rufus t. Firefly:

ich habe einfach die Routinen von der Seite hier übernommen, ich denke 
da steht keine Spure von DDRAM-Adresse oder ?

Wie wäre es mit ein anderem Tipp bitte :)

Danke schön nochmal

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> ich habe einfach die Routinen von der Seite hier übernommen,
> ich denke da steht keine Spure von DDRAM-Adresse oder ?

Das Wort Datenblatt hast Du in meinem Beitrag geflissentlich 
überlesen, wie?

von Reda (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Rufus t. Firefly,
anbei ist das Datenblatt was ich habe :
ich denke das hilft nicht viel oder ?
Gruss

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es geht nicht um das Datenblatt des Displays, sondern um das des 
darauf verbauten Controllers, in Deinem Falle also des KS0070B.
Schrieb ich ja auch schon.

Wobei auch im von Dir geposteten Datenblatt auf Seite 4 der Befehl "Set 
DD RAM Address" auftaucht.

von Reda (Gast)


Lesenswert?

Ok! danke !
Ich habe jetzt das Datenblatt von KS0070B.

Ich möchte jetzt einfach wissen ob diese Aufgabe "DDRAM ändern" 
kompliziert ist ?
Soll ich viel in meinen programm ändern ?

Ich muss nämlich andere ESC-Sequenzen umsetzen.

Danke für deine Hilfe

von lkmiller (Gast)


Lesenswert?

>Soll ich viel in meinen programm ändern ?
Nicht mehr als nötig.

>Ich muss nämlich andere ESC-Sequenzen umsetzen.
Am einfachsten:
Du machst dir eine Nachbildung des Displays im uC-Speicher und bildest 
darauf die ESC-Sequenzen ab. Anschliessend schreibst du die Nachbildung 
auf das Display raus.

Und: Datenblatt lesen. DDRAM enthält das, was das Display anzeigt.
Zum Trost: es gibt noch wesentlich längere und unverständlichere 
Datenblätter

von Simon K. (simon) Benutzerseite


Lesenswert?

lkmiller wrote:
>>Soll ich viel in meinen programm ändern ?
> Nicht mehr als nötig.
>
>>Ich muss nämlich andere ESC-Sequenzen umsetzen.
> Am einfachsten:
> Du machst dir eine Nachbildung des Displays im uC-Speicher und bildest
> darauf die ESC-Sequenzen ab. Anschliessend schreibst du die Nachbildung
> auf das Display raus.

Oder du parst die ESC-Sequenzen in deiner LCD-Schreibfunktion.

von Oliver (Gast)


Lesenswert?

Für jemanden, der so etwas noch nie gemacht hat, ist das schon 
schwierig.

Hier gibt es die Procyon AVRlib

http://hubbard.engr.scu.edu/avr/avrlib/docs/html/index.html

darin findest du auch Sourcen zur Ansteuerung deines LCDs.

Oliver

von lkmiller (Gast)


Lesenswert?

>Oder du parst die ESC-Sequenzen in deiner LCD-Schreibfunktion.
Schenkelklopf: ich hatte paarst gelesen ;-)

von Reda (Gast)


Lesenswert?

Danke Oliver für die interessante Seite.

Ich bin einfach zu faul für Programmierung :)

Gruss

von Reda (Gast)


Lesenswert?

A propos LCD-Ansteuerung, das LCD funktonniert sehr gut, ich möchte 
jetzt einfach die Cursor Positionierung ansteuern, und andere 
Kleinigkeiten.

von Raphael (Gast)


Lesenswert?

Hallo zusammen,

ich finde immer noch keine Lösung um die ESC Sequenzen für mein LCD 
einzusetzen.
Wenn keiner das weisst, er kann das ruhig sagen, aber bitte keine banale 
Antworten.

Danke trotzdem

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du könntest Dir ja mal eines der --geschätzt-- 43 Milliarden Tutorials 
ansehen, die sich mit dem HD44780 beschäftigen.

Hier mal eines aus diesem Forum

http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD#Welche_Befehle_versteht_das_LCD.3F

von Raphael (Gast)


Lesenswert?

ich weiss wie das Display funktionniert, und habe das display 
angesteurt.
Ich kümmere mich jetzt um die Cursor Positionnierung durch ESC Sequenzen 
einzusetzen.

ich kann z.b die 2. zeile des LCD löschen und den Cursor auf die 
1.Stelle platzieren, etc

Mit dem Cursor geht nicht.

Die Frage jetzt wie kann ich z.B den Befehl "ESC [ D" (d.h Cursor nach 
links)
in mein C- programm umsetzten.

Danke

von swedisch (Gast)


Lesenswert?

irgendwie blickt hier langsam glaub ich keiner mehr durch. was willst du 
denn genau?wenn du den cursor auf die zweite zeile, erstes zeichen 
setzen kannst, dann kannste doch auch nach links gehen, oder? musste 
doch nur von der aktuellen position eins abziehen.
Ich seh dein Problem einfach nicht.

von Oliver (Gast)


Lesenswert?

@Raphael

Kannst du eigentlich auch lesen, oder nur schreiben?

Rufus t. Firefly schrieb:
>Du könntest Dir ja mal eines der --geschätzt-- 43 Milliarden Tutorials
>ansehen, die sich mit dem HD44780 beschäftigen.

>Hier mal eines aus diesem Forum

>http://www.mikrocontroller.net/articles/AVR-Tutori...


In diesem Tutorial steht der folgende Absatz:

>[bearbeiten] Cursor/Scrollen: 0b0001srxx
>Bewegt den Cursor oder scrollt das Display um eine Position entweder >nach rechts 
oder nach links.

>s = 1, Display scrollen
>s = 0, Cursor bewegen
>r = 1, nach rechts
>r = 0, nach links

Fällt dir daran irgend eine Ähnlichkeit zu deiner Aufgabenstellung auf?

Oliver

von Reda (Gast)


Lesenswert?

das habe ich auch gemacht, indem ich ein zähler jedes mal inkremntire, 
wenn ein zeichen an das lcd gesendet ist.
Das pasiert aber nur einmal in main funktion, wie wäre es mit einem 
kleinen code.
Aber mit ESC sequenzen kann man mehrere sachen auf dem lcd umsetzen, 
aber WIE ???

von Oliver (Gast)


Lesenswert?

>wie wäre es mit einem kleinen code.

Nö.

>Ich bin einfach zu faul für Programmierung :)

Ich auch.

Oliver

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Reda wrote:

> Aber mit ESC sequenzen kann man mehrere sachen auf dem lcd umsetzen,
> aber WIE ???

Indem du dir einen VT100-kompatiblen Terminalemulator schreibst.

Das ist keine Aufwärmübung für einen Mittwochabend.  Folglich liegen
die Dinger auch nicht gerade auf der Straße rum, zumindest nicht in
Implementierungsformen, die man auf einem Microcontroller einsetzen
könnte.  Für Unix-Maschinen gibt es deren mehrere im Quellcode,
beispielsweise im bekannten Paket "screen".  Diese setzen als Backend
dann typischerweise auf curses auf, einer Bibliothek, die ungefähr
das macht, was die direkte Ansteuerung deines LCDs auch macht
(Positionieren des Cursors, Löschen einer Zeile oder des ganzen
Bildschirms, etc.).  [Der Unterschied ist dabei, dass curses eine
Abstraktion bietet, die zur Laufzeit frei konfigurierbar für das
jeweils tatsächlich vorhandene Terminal ist.]

von Reda (Gast)


Lesenswert?

Hallo Jörg Wunsch,
danke erstmal für deine wichtige Antwort.

Viele schreiben mir hier nur quatsch und bla bla und denken das ist so 
einfach, die ESC Sequenzen bei der LCD-Ansteuerung einzusetzen.

Endlich hat jemand die Aufgabe richtig verstanden.-----> Respekt


Ich bräuchte vielleicht einen keinen C-code, damit ich weiter arbeiten 
kann.

Danke

von Oliver (Gast)


Lesenswert?

>Endlich hat jemand die Aufgabe richtig verstanden.

Klar. Du suchst immer noch einen Blödmann, der dir deine Hausaufgaben 
macht.

>Ich bräuchte vielleicht einen keinen C-code, damit ich weiter arbeiten
>kann.

Wie ich schon mal schrieb - wenn du auch mal lesen, und nicht immer nur 
schreiben würdest, wärst du jetzt schon fertig.

In der avrlib, die ich oben verlinkt hatte, ist sowohl ein 
VT100-Emulator mit ESC-Sequenzen, als auch ein LCD-Treiber für dein LCD 
drin, alles im Sourcecode.

Faul sein ist ja ok, aber zu faul nervt.

Oliver

von Reda (Gast)


Lesenswert?

Hallo Oliver,

ich meinte dich nicht, deine antwort war ganz ok !

diese seite finde ich interessant : 
http://hubbard.engr.scu.edu/avr/avrlib/docs/html/index.html,
ich habe die Datei für Pinkonfigration 'lcdconf.h' nicht gesehen :)
Aber es bleibt trotzdem ein Problem, nämlich
Bei mir ist  die Pinbelgug so :

Pin     LCD     Pin-µC
1  Vss  GND
2  Vcc  5V
3  Vee  GND
4  RS  PD4 am AVR
5  RW  GND
6  E  PD5 am AVR
7  DB0  offen
8  DB1  offen
9  DB2  offen
10  DB3  offen
11  DB4  PD6 am AVR
12  DB5  PD7 am AVR
13  DB6  PD2 am AVR
14  DB7  PD3 am AVR

Bei der 'lcdconf.h' steht nicht jeder Pin einzel definiert, damit ich 
die eigene Pinbelegung anpassen kann.


Danke wirklcih für deine Antwort

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mit der Pinbelegung wirst du es schwer haben.  Warum zum Geier[tm] hast
du nicht auch die vier Datenpins hintereinander angeordnet?  Es ist ja
nicht, dass man nicht auch völlig zusammenhanglose Bits miteinander
verknüpfen könnte, aber es ist halt dramatisch einfacher, wenn man
vier hinteinanderliegende Bits hat, dann muss man nur noch maskieren
und schieben.

von Reda (Gast)


Lesenswert?

Ich hatte am anfang die 4 Datenbits DB4 bis DB7 hintereinander mit der 
PD0 bis
PD3 des AVR verbunden, nur ich musste nachher die beide Pins PD0 und PD1 
extra frei für die UART Schnittstelle. deswegen.
Gruss

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Reda wrote:
> Ich hatte am anfang die 4 Datenbits DB4 bis DB7 hintereinander mit der
> PD0 bis
> PD3 des AVR verbunden, nur ich musste nachher die beide Pins PD0 und PD1
> extra frei für die UART Schnittstelle. deswegen.

Dann hättest du doch lieber alle nach oben schieben können.

Ich habe selbst auch mal 'ne HD44780-Implementierung geschrieben, nein,
freiwillig will man die Datenbits nicht noch zusätzlich alle einzeln
behandeln.  Ganz davon abgesehen, wird der Code dadurch uneffektiver.

von Reda (Gast)


Lesenswert?

Hallo Jörg,
ich hatte nur 2 Pins frei am Port D deswegen !

Wenn ich die 4 Datenbits DB4 ... DB7 vom LCD NACHEINANDER an die Pins 
PC4...
PC7 am PORTC verbinde, wird das funktionnieren oder ?
Ich habe am Port C noch  6 Pins frei (PC2 ...PC7)

Danke nochmal

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Reda wrote:

> Wenn ich die 4 Datenbits DB4 ... DB7 vom LCD NACHEINANDER an die Pins
> PC4...
> PC7 am PORTC verbinde, wird das funktionnieren oder ?

Ich kenne die avrlib-Implementierung nicht, würde aber erwarten, dass
das dann geht.

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.