Forum: Mikrocontroller und Digitale Elektronik LCD Textausgabe mit Zahlen in Assembler


von J. S. (harry_2)


Lesenswert?

Hallo,

ich bin neu hier und möchte um Unterstützung bitten bei folgendem
Problem. Ich möchte folgenden Text auf einem LCD Display ausgeben
" Temperatur xxx °C" (.db " Temperatur xxx °C",0)wobei die xen durch den 
aktuellen Messwert ersetzt werden sollen. Mit er initialisierung des 
Display
und mit der Ausgabe des konstanten Textes habe ich keine Probleme
das funktioniert aber wie bekomme ich den Variablen Messwert
an die Stellen wo nun xxx steht?
Ach ja, das ganze soll in AVR-Assembler passieren.

Gruß
Harry

von Steffen H. (avrsteffen)


Lesenswert?

Hallo

du musst den Messwert in BCD zerlegen und dann an genau die Stelle wo 
deine "xxx" stehen an das Display schreiben. Bedenke dass man erst die 
100er, dann die 10er und dann die 1er schreiben sollte wenn man den 
Adresscounter des Displays auf auto-inc lässt.

Also:

1. Messwert -> BCD
2. Adresse im Display auf Position "xxx" setzen
3. BCD-Werte (100er, 10er, 1er) an das Display schicken
4. nur max. alle 200ms wiederholen (schneller kann man eh nicht ablesen)

Siehe auch 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD#Eine_BCD_Zahl_ausgeben

Gruß Steffen

von J. S. (harry_2)


Lesenswert?

Hallo Steffen,

hat bis zur ersten Antwort ja nicht lange gedauert. Eigentlich ist es ja 
schon zu spät für diese Dinge. Als das mit dem zerlegen in BCD 
funtioniert auch, ich kann den Messwert auch auf dem Display ausgeben 
nur weiß ich halt nicht wie ich das mit dem konstanten Text kombinieren 
kann.
Wenn ich den String in ZH,ZL lade und zeichenweise ausgebe, wie kann ich 
dann dem Assembler begreiflich machen, das ich anstelle der xxx den Wert 
angezeigt haben will. wenn du da einen Codeschnippsel hättest oder eine
für mich begreifliche Erklärung wäre ich schon froh.

von Steffen H. (avrsteffen)


Lesenswert?

Dann musst du deine Konstante "Text" in das SRAM kopieren und an der 
Stelle von "xxx" schreibst du deinen Wert in BCD hin.

Also " Temperatur " hat incl. Leerzeichen 12 Byte, dann kommt mit 3Byte 
dein Wert und  dann noch dein "°C". Macht insgesammt 19 Byte incl. 
Leerzeichen und Abschluss "0".

Du legst dir im SRAM die Speicherstelle TEMPERATUR an die 19 Byte 
reservieren soll.
1
.dseg
2
TEMPERATUR:   BYTE19  ; Temperaturstring im SRAM (Abschluss "0" nicht vergessen)

Jetzt weist du doch dass ab dem 13.Byte der Wert steht. Das heißt: wenn 
du den Wert in BCD wandelst, dann schreibst du den gleich in den SRAM an 
die 13.,14. und 15. Stelle.
1
st   (TEMPERATUR+12), r16  ; WERT BCD 100er
2
st   (TEMPERATUR+13), r16  ; WERT BCD 10er
3
st   (TEMPERATUR+14), r16  ; WERT BCD 1er

Diese Zeilen fügst du einfach in der BCD-Routine an ensprechender Stelle 
ein. Der Offset (TEMPERATUR+12) ist deswegen 12, da ja hier ab 0 gezählt 
wird. Also nicht verwirren lassen.

Wie man einen String aus dem SRAM liest weißt du doch hoffentlich.

Gruß Steffen

von J. S. (harry_2)


Lesenswert?

Genau das wollte ich wissen.
Und dafür Quäle ich mich nun schon eine Woche.
Mit den Displays habe ich noch wenig Erfahrung aber
täglich wird es besser.
Vielen Dank.

von Steffen H. (avrsteffen)


Lesenswert?

Warum möchtest du denn überhaupt jedesmal den Text "Temperatur    °C" 
neu schreiben wenn sich die Temperatur ändert? Das musst du doch gar 
nicht!

Den Text "Temperatur XXX °C" schreibst du einmal in das Display. Dann 
rufst du nur noch deine Routine auf die aus dem Wert die BCD's macht und 
sendest diese alle 200..500ms zum Display. Und zwar genau an die 
Position wo "XXX" steht.

Ist das eine Option für dich?

Gruß Steffen

von Steffen H. (avrsteffen)


Lesenswert?

Ach ja, stell mal dein ganzes Programm hier ein. Dann tappt man hier 
nicht mehr so im Dunkeln..

von Peter D. (peda)


Lesenswert?

Steffen H. schrieb:
> st   (TEMPERATUR+12), r16  ; WERT BCD 100er
> st   (TEMPERATUR+13), r16  ; WERT BCD 10er
> st   (TEMPERATUR+14), r16  ; WERT BCD 1er

Sowas sollte man sich garnicht erst angewöhnen.
Woher soll die Zahlenausgabefunktion wissen, daß sie genau an Byte 12 
schreiben soll?
Das ist total unflexibel und fehlerträchtig.

Definiere einen String so wie in C, d.h. ein Array mit einer 0 als 
Endekennzeichen. D.h. nicht das letzte Element ist 0, sondern das Ende 
des gerade eingeschriebenen String.

Will man nun an diesen String etwas anfügen, zählt man den Pointer 
solange hoch, bis er auf die 0 zeigt. Und nun kann die 
Zahlenausgabefunktion ab da weiter schreiben und muß natürlich wieder 
eine 0 hinten anfügen.

Daß das Array lang genug ist, liegt in Deiner Verantwortung.


Peter

von Steffen H. (avrsteffen)


Lesenswert?

Genau, ich werde ja auch die Temperatur immer an eine andere Stelle 
schreiben. Schon klar Peter..

von J. S. (harry_2)


Lesenswert?

Hallo,
rege Diskusionen. Aber Leute bekommt euch nicht in die Wolle.
Es freut mich aber das ich hier anscheinend auf gleichgesinde
getroffen bin. Aber nochmal, im großen und ganzen komme ich mit
Assembler einigermaßen klar, aber die Sache mit den Displays habe
ich erst angefangen und noch eine menge Fragen, Litaratur die
was bringt gibst da ja nicht so viel.
Steffen zu deiner Frage, natürlich muss nicht der Ganze Text da
neu geschrieben werden mir würde das mit den xxx eigentlich reichen,
ist auch weniger aufwand, aber wie??
Angenehmer wäre mir das schon,noch so eine Frage.

von Karl H. (kbuchegg)


Lesenswert?

Jörg Schütz schrieb:

> Steffen zu deiner Frage, natürlich muss nicht der Ganze Text da
> neu geschrieben werden mir würde das mit den xxx eigentlich reichen,
> ist auch weniger aufwand, aber wie??

Cursor positionieren. Hinschreiben. Fertig.
Allerdings muss man darauf achten, dass die neue Zahlenausgabe die alte 
komplett überschreibt.

Im allgemeinen möchte man nicht das Display komplett neu beschreiben. 
Erstens ist das unnützer Aufwand, zweitens includiert dies meistens ein 
'Display löschen', was dann sehr schnell zum Flackern führt und drittens 
ist es gut, wenn am LCD dieselbe Information immer an derselben Stelle 
steht. Nichts ist so nervend wie eine Zahl, die ständig die Position 
wechselt. Ganz speziell gilt das beim Übergang von zb 2-stellig auf 
1-stellig. Der Deziamlpunkt (selbst wenn es nur ein gedachter 
Dezimalpunkt ist) sollte immer an derselben Stelle stehen bleiben. Dann 
ist auch das Ablesen am angenehmsten.

von spess53 (Gast)


Lesenswert?

Hi

>würde das mit den xxx eigentlich reichen, ist auch weniger aufwand, aber >wie??

Du gibst einmal den konstanten Text aus. Für den Temperaturwert setzt du 
mit dem Befehl 'Set DDRAM address' die Ausgabeposition an die passende 
Stelle und gibst die 3 Zeichen aus.

MfG Spess

von Peter D. (peda)


Lesenswert?

Steffen H. schrieb:
> Genau, ich werde ja auch die Temperatur immer an eine andere Stelle
> schreiben. Schon klar Peter..

Stimmt.
Man will ja noch andere Werte ausgeben mit anderem Text und an anderer 
Stelle (z.B. Innen-, Außentemperatur, Uhrzeit, ...).
Und dazu schreibt man sich ne universelle Zahlenausgabe.


Peter

von spess53 (Gast)


Lesenswert?

Hi

>Man will ja noch andere Werte ausgeben mit anderem Text und an anderer
>Stelle (z.B. Innen-, Außentemperatur, Uhrzeit, ...).
>Und dazu schreibt man sich ne universelle Zahlenausgabe.

Es geht um Assembler. Da kann eine universelle Routine komplizierter, 
größer ... als zwei, drei spezielle Routinen sein.

Wenn nur ein paar Zahlen, gleicher Länge, an verschiedenen Stellen 
ausgegeben werden müssen, reicht es, das Setzen der Cursoradresse und 
die Ausgabe zu trennen.

MfG Spess

von J. S. (harry_2)


Lesenswert?

Hallo zusammen,
es waren hier sehr gute Anregungen dabei. Die Denkanstöße
haben mir sehr geholfen. Ich will damit sagen ich habe jetzt
einiges davon ausprobiert, funktionieren alle nun habe ich nur
noch das Problem mit der Wahl. Wahrscheinlich werde ich den
Vorschlag von Steffen aufgreifen, hab ich auch schon versucht
geht wunderbar und ist zudem wenig Aufwand.
Danke an alle die sich beteiligt haben.

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.