Hallo Nicht meckern, aber ich habe Probleme mit dem LCD (hd44780 16 Characters 2lines).Mit dem ASM Programm im Anhang, was ich aus dem Tuto. kopiert und etwas abgeändert habe, zeigt das LCD nur den Anfangs Buchstaben den ich in den Flash geladen habe an. Ich wollte natürlich den ganzen Text auf dem LCD haben. Kann mir jemand einen Tipp gheben was im Code falsch ist. Danke Gruss Frank AVR Atmega8 mit (8MHZ)
Ich bin nicht gut genug in asm, aber hast du den Code schon mal im Debugger vom AVR-Studio laufen lassen. Holt er sich auch wirklich den nächsten Buchsteben zum ausgeben?
Hallo Frank, mit dem Befehl rjmp Start lädtst Du ja wieder den ertsen Buchstaben. Du musst vor dem lpm Befehl einspringen So sollte es klappen. Allerdinmgs fehlt dann immer noch die Erkennung, wann die 0 aus dem String kommt (also der String endet. In der momentanen Variante, schreibst Du die weiteren FF auch raus. ldi ZL, LOW(text*2) ldi ZH, HIGH(text*2) start: lpm mov temp1, R0 rcall pause rcall lcd_data adiw ZL, 1 rcall pause rjmp start
In Deiner "Start-Schleife" setzt Du Z immer auf das erste Zeichen zurück. Desweiteren hast Du eine Abfrage auf das "0-Byte" vergessen. Das ganze muss so aussehen, damit es alle Zeichen ausgibt: start: ldi ZL, LOW(text*2) ldi ZH, HIGH(text*2) start1: lpm tst R0 ;Text-Ende erreicht? breq Ende ;Dann Ende. mov temp1, R0 rcall pause rcall lcd_data adiw ZL, 1 rcall pause rjmp start1 Ende: rjmp Ende Mach es doch lieber gleich als Unterprogramm: start: ldi ZL, LOW(text*2) ldi ZH, HIGH(text*2) rcall Print Stop: rjmp Stop .... .... Print: lpm temp1,Z+ ;Zeichen von Adresse Z in temp1 und Z+1 tst temp1 ;Text-Ende erreicht? breq PrintEnde ;Dann Ende. rcall pause rcall lcd_data rcall pause rjmp start1 2 mal eine Pause wird eigentlich nicht benötigt. Normalerweise Gibt man ein Zeichen aus und dann kommt EINE Pause. Man kann das natürlich auch umdrehen, also zuerst ne Pause und dann die Ausgabe. Aber nicht unbedingt vorher und nachher. Gruß Andi
Habe mal wieder was vergessen! Das 2. Beispile als UP muss so aussehen: start: ldi ZL, LOW(text*2) ldi ZH, HIGH(text*2) rcall Print Stop: rjmp Stop .... .... Print: lpm temp1,Z+ ;Zeichen von Adresse Z in temp1 und Z+1 tst temp1 ;Text-Ende erreicht? breq PrintEnde ;Dann Ende. rcall pause rcall lcd_data rcall pause rjmp Print PrintEnde: ret Gruß Andi
Hallo Vielen Dank für die Antworten. Mit dem Code von Andi hats geklappt. Habe tatsächlich immer wieder den ersten Buchstaben geladen und angezeigt. Gruss Frank
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.