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
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.
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 ?
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
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
@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.
Gibt es eine Möglichkeit den kpl. Speicher des LCD's zu löschen um es danach neu zu beschreiben?
sende das clearscreen command ans lcd. schau mal im datenblatt nach
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.
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
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.