Forum: Mikrocontroller und Digitale Elektronik LCDAnzeige


von Frank (Gast)


Angehängte Dateien:

Lesenswert?

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)

von Hubert (Gast)


Lesenswert?

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?

von Lötnix (Gast)


Lesenswert?

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

von Andi (Gast)


Lesenswert?

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

von Andi (Gast)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.