www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik "komische" Zeichen auf dem LCD


Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Menuesteuerung auf einem Standart 4x20 LCD realisiert.
Leider werden in verschiedenen Menuepunkten (s. Anhang) willkürliche
Zeichen dargestellt.
Das komische an der Sache ist das, das wenn ich den Code erweitere,
z.B. Tastenabfrage einfüge, andere Menuepunkte die Fehler aufweisen und
die die welche hatten keine mehr.
Das Timing habe ich mehrfach überprüft und für i.O. befunden.
Desweiteren frage ich auch das Busy-Flag des LCD's ab. Alle meine
Bemühungen waren bisher ohne Erfolg. Vielleicht weiß einer von Euch wie
ich das Problem in den Griff bekommen kann.

Vielen Dank... Peter

Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und so sieht ein korekter Menuepunkt aus.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vergaß vielleicht noch zu erwähnen, das ich das Programm für einen
ATMega128 in ASM geschrieben habe (AVRStudio 4.07) und es mit
STK500/501 progge.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne jetzt deine genauen Routinen zu kennen, würde ich sagen, dass 20
Zeichen ans LCD gesendet werden (pro Zeile) aber nur 15-17 mit
sinnvollem Inhalt gespeichert sind, bzw. sich zwei Speicherbereiche
Überschneiden. Gibt es irgendwo Text der mit "Tem" anfängt ?

Autor: leo9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würde zwar die Fragestellung mit einer glatten 5 bewerten, aber
ad.hoc. stelle ich drei Behauptungen auf: Du programmierst in
assembler, gibst die Werte mit einem 8Bit Zeiger auf den Speicher aus
und deine Texte liegen an der Grenze eines 256 Byte-Blocks.
und wenns nicht stimmt liegts an deiner Frage ;-)

grüsse leo9

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich nehme mal an, du meinst mit willkürlichen Zeichen das "Tem"
rechts oben; sonst ist ja alles gleich.

Das sieht irgendwie aus, das du ein Buffer auf dem Display ausgibst, in
dem noch irgendwas altes bzw. was undefiniertes steht. Passiert auch,
wenn man weniger Zeichen in einen Buffer schreibt, als eigentlich rein
gehen würde und dann vergisst, die kürzere Zeichenfolge mit '\0' zu
terminieren. Folge: der gesamte Buffer wird ausgegeben ohne die
Nullterminierung zu beachten.

Ich hoffe, ich habe mich verständlich ausgedrückt.

Thorsten

Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Benedikt

Ja, gibt es. Das in dem Menue "Tem" steht ist reiner Zufall. Bei
anderen Menuepunkten sind andere Zeilen und Stellen betroffen. In den
steht z.B. "$%tg$&6".


@leo9

1. Ich progge in Assembler
2. Ich progge mit einem 8Bit Zeiger
3. Alles liegt im Bereich von 256


@alle

Ein Auszug aus meinem Code findet Ihr im Anhang.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es eine Möglichkeit den kpl. Speicher des LCD's zu löschen um es
danach neu zu beschreiben?

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sende das clearscreen command ans lcd. schau mal im datenblatt nach

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das vorherige Löschen bringt auch nix :(

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute mal hier den Fehler:
inc  zl    ; Incrementiere Z-Pointer LOW
brcc  no_carry  ; Springe falls Carryflag gelöscht
inc  zh    ; Incrementiere Z-Pointer High

schau mal, ob da alles richtig läuft, vor allem ob inc das C-Flag
setzt, und ob Du nicht besser brnz (non-zero) verwenden solltest.

Autor: Dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da kann man doch einfach  adiw (add immediat to word) nehmen, oder hab
ich da was falsch verstanden..

hast du x und y schon belegt, oder warum nimmst du z?

dave

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für Eure schnelle Hilfe. Es lag tatsächlich daran, das
"brne" nicht das C-Flag beeinflußt. Hatte wohl ein Brett vorm Kopf.
Desweiteren habe ich "adiw" benutzt, anstelle von "inc".
Hier mein geänderte Code:

msg_out:
  ldi  temp4,20
loop_msg:
  lpm
  mov  temp1,r0
  rcall  sendedaten
  adiw r30,1
  dec  temp4
  brne  loop_msg
  ret

Nochmals vielen Dank an Euch... Peter

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermutlich kannst Du die
  ldi  zl,low(menue72*2)
  ldi  zh,high(menue72*2)
für die Zeilen 2-4 wegsparen, da der Pointer (nach Ausgabe der
vorhergehenden Zeile) bereits dorthin zeigt.

Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Du hattest mit Deiner Vermutung recht Profi, man kann sich das erneute
Zuweisen sparen. Und ich dachte er verliert den Zeiger, wenn ich ein
"rcall" mache.
Wer Interesse hat, der kann den geänderten Ausschitt meines Codes im
Anhang finden. Durch die letzten Modifikationen konnte ich den Code um
224 Bytes verkleinern.

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.