Forum: Mikrocontroller und Digitale Elektronik Assembler 2x24 Zeichen nach Zeichen 25 "rausschieben"


von Nette M. (nette-mann)


Lesenswert?

Also ich hab nun erfolgreich das AVR Tut bis zum Punkt LCD abgeschlossen 
und da mal ne Frage:

Habe ein 2x24 LCD und möchte nun z.B. nen Text ÜBER 24 Zeichen laufen 
lassen in der gleichen Zeile der sich wieder holt. Klingt simpel aber 
ich hab keine Ahnung wie ich das umsetzen kann.

Daher: Ich suche Inspiration und Hilfe um auf die Sprünge zu kommen.



Verlange keinen fertigen Code! Schnipsel reichen denke auch ansonsten 
lern ich ja nix.

von Andreas K. (ergoproxy)


Lesenswert?

Ist eigendlich ganz einfach:

Du hast ja das LCD schon angesteuert bekommen. Jetzt schreibst du 
einfach den Text auf das Display und zwar in der Reinfolge 1. Buchstabe 
= 1. Zeichen usw.. Jetzt nimmst du den Timer und jede Sekunde schickst 
du den Text nochmal. Diesmal setzt du den 1.Buchstaben an die 2.Stelle 
des LCD und den letzten lässt du weg oder aber setzt ihn an die erste 
Stelle.
Du lässt es einfach so laufen, das es sich jedesmal alles um eine Stelle 
verschiebt. Wenn du willst das er von hinten nach vorne läuft müsstest 
du es umgekehrt machen. Leider kann ich dir mit Code nicht helfen ich 
kann "nur" C/C++. Assambler war mir wenn ich ehrlich bin immer etwas zu 
naja sagen wir nicht hochsprachlich genug ^^

Ich hoffe du kannst was damit anfangen.

12345678901234
Hello World
 Hello World
  Hello World
   Hello World
d   Hello Worl
ld   Hello Wor
rld   Hello Wo
orld   Hello W

Gruß ErgoProxy

von Nette M. (nette-mann)


Lesenswert?

Anfangen? KLAR


Nur Kapitel "Timer" hab ich noch nit gelesen.

PS: lerne nur ASM wegen Allgemeinverständnis

von Michael U. (amiga)


Lesenswert?

Hallo,

in ASM halte ich das immer so: Ram für die Länge des Textes + ein 
Leerzeichen + ein 0 Byze im Ram reservieren und den Text + Leerzeichen 
da rein.

Also z.B.
Am Ende ist ein Leerzeichen und ein Nullbyte.
Den Kram in einen Puffer im SRAM ablegen.
1
buffer: .byte  xx Buffer im SRAM, xx maximale Textlänge + 2
2
Die 2 Byte sind für ein Leerzeichen und ein 0-Byte am Ende.
3
Den Text in den buffer kopieren und Space und \0 hinten dran.
4
  
5
Das ist ein langer Text, der ausgegeben werden soll \0
6
7
.equ lCD_LEN = 26
8
.equ TEXT_LEN = 80
9
10
.def r16 COUNT
11
.def r17 TEMP
12
13
.desg
14
buffer:  .byte TEXT_LEN
15
16
 ld ZL, low(buffer)
17
 ld ZH, high(buffer) ; Zeiger auf Textanfang.
18
19
ausgabe:
20
 ldi COUNT, LCD_LEN   ; Länge der Displayzeile
21
22
ausgabe_loop:
23
 ld  TEMP,Z+    ; Byte holen
24
 tst TEMP       ; auf 0 testen (Ende buffer)
25
 brne ausgabe_ok  ; nein, ausgeben
26
27
 ld ZL, low(buffer)
28
 ld ZH, high(buffer) ; Zeiger wieder auf Textanfang.
29
 rjmp ausgabe_loop   ; und Zeichen von dort holen
30
31
ausgabe_ok;
32
 rcall lcd_out ; Zeichen zum Display
33
 dec r16       ; Zeile komplett?
34
 brne ausgabe_loop  ; nein, weiter
35
...
Passt zu jeder Zeilen- und Textlänge.

Gruß aus Berlin
Michael

von Nette M. (nette-mann)


Lesenswert?

Vielen Dank da hab ich ja was zum drüber grübeln!

von Nette M. (nette-mann)


Lesenswert?

.desg
buffer:  .byte TEXT_LEN


kann es ein das du dich da vertippt hast? weil desg kennt das AVR Studio 
nicht

von spess53 (Gast)


Lesenswert?

Hi

Muss .dseg heissen.

MfG Spess

von Michael U. (amiga)


Lesenswert?

Hallo,

ja, Tippfehler...

.equ lCD_LEN = 26
muß natürlich 24 sein bei 24 Zeichen/Displayzeile...
und
 dec r16       ; Zeile komplett?
sollte besser
 dec COUNT
heißen, der Lesbarkeit wegen...

Ich verspeche auch nicht Fehlerfreiheit, der Ablauf sollte aber 
nachvollziehbar sein.

Ob man Z dafür reserviert halten kann, ist auch von der konkreten 
Anwendung ab, sonst eben in 2 SRAM-Plätzen sichern.
Der Text kann natürlich auch im Flash liegen, dann eben lpm benutzen 
usw. usw.

Das zusätzliche Leerzeichen kann ist, damit nach dem Textende nicht 
sofort der Anfang folgt.
Kann man auch anders lösen, z.B. so:
[pre}
...
 brne ausgabe_ok  ; nein, ausgeben

 ld ZL, low(buffer)
 ld ZH, high(buffer) ; Zeiger wieder auf Textanfang.
 ldi TEMP,' '        ; Leerzeichen als Trennung laden

ausgabe_ok;
[/pre]

Spart ein Byte im Ram.

Gruß aus Berlin
Michael

von Kachel - Heinz (Gast)


Lesenswert?

Vielleicht auch mal über die Scrollfunktion des LCDs nachdenken. Das LCD 
hat 2 mal 40 Zeichen Anzeige-RAM, aber nur 2 mal 24 Zeichen Anzeigeplatz 
auf dem Glas. Da lässt sich was scrollen...

Ich nutze das Scrollen aber nicht, ich benutze dafür einen 
Bildschirmspeicher im SRAM des AVRs (Update des realen LCDs erfolgt im 
Millisekundentakt im Hintergrund), was die Ausgaberoutinen sehr schnell 
macht. Da bereitet versetztes Neuschreiben des Textes keine Probleme. 
Das kann z.B. durch einen zusätzlichen Offset beim Adressieren der Texte 
im Flash erfolgen. Ein Beispiel kann ich jetzt nicht liefern, ich hatte 
diese Funktion bisher noch nicht gebraucht.

KH

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.