mikrocontroller.net

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


Autor: Nette Mann (nette-mann)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (ergoproxy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nette Mann (nette-mann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfangen? KLAR


Nur Kapitel "Timer" hab ich noch nit gelesen.

PS: lerne nur ASM wegen Allgemeinverständnis

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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.
buffer: .byte  xx Buffer im SRAM, xx maximale Textlänge + 2
Die 2 Byte sind für ein Leerzeichen und ein 0-Byte am Ende.
Den Text in den buffer kopieren und Space und \0 hinten dran.
  
Das ist ein langer Text, der ausgegeben werden soll \0

.equ lCD_LEN = 26
.equ TEXT_LEN = 80

.def r16 COUNT
.def r17 TEMP

.desg
buffer:  .byte TEXT_LEN

 ld ZL, low(buffer)
 ld ZH, high(buffer) ; Zeiger auf Textanfang.

ausgabe:
 ldi COUNT, LCD_LEN   ; Länge der Displayzeile

ausgabe_loop:
 ld  TEMP,Z+    ; Byte holen
 tst TEMP       ; auf 0 testen (Ende buffer)
 brne ausgabe_ok  ; nein, ausgeben

 ld ZL, low(buffer)
 ld ZH, high(buffer) ; Zeiger wieder auf Textanfang.
 rjmp ausgabe_loop   ; und Zeichen von dort holen

ausgabe_ok;
 rcall lcd_out ; Zeichen zum Display
 dec r16       ; Zeile komplett?
 brne ausgabe_loop  ; nein, weiter
... 
Passt zu jeder Zeilen- und Textlänge.

Gruß aus Berlin
Michael

Autor: Nette Mann (nette-mann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank da hab ich ja was zum drüber grübeln!

Autor: Nette Mann (nette-mann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.desg
buffer:  .byte TEXT_LEN


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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Muss .dseg heissen.

MfG Spess

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kachel - Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.