Forum: Mikrocontroller und Digitale Elektronik lcd Tutorial Probleme


von Christian M (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

nachdem ich mich nun entschieden habe erst eimal  Assembler zu erlernen
befor ich an andern Hochsprachen rummache bin ich nun auf ein zu
erwartendes Problem gestoßen.

 "ich weis nicht mehr weiter"

Ich wollte das Tutorial durcharbeiten um habe einen hänger beim LCD
Display, auch in alten Beiträgen bin ich nicht wirklich auf eine Lösung
gestoßen.

Was mache ich bei dem angehängten Code falsch.
Ich benutze einen Mega8, und ein Display 2x16 von Reichelt (Displaytech
162).
Wenn ich den Code so einspiele erscheint auf dem Display nur ein C.
Im Ram müßte doch die ganze Zeichenfolge wie unter  .db "...", 0
abgelegt stehen.
Was habe ich hier falsch gemacht ??
Die LCD routine habe ich dran gehängt, her habe ich nur etwas
abgeändert an den Delay Zeiten, jedoch ohne Erfolg.

Ich bin mir sicher Ihr könnt mir da weiterhelfen.
Danke im vorraus.

Gruß Christian

von Daniel Nöthen (Gast)


Lesenswert?

Hi,

        lpm          ; durch Z-Pointer adressiertes Byte nach R0 lesen
        mov R16, R0         ; nach R16 kopieren
        rcall lcd_data      ; an PORTB ausgeben
lpm lädt 1 Byte nach R0 und auch nur dieses wird dann ausgegeben.
Du musst also in einer Schleife jedes Zeichen nacheinander ausgeben.

Wie das genau geht, steht aber ebenfalls im Tutorial:


print:
        lpm                               ; Erstes Byte des Strings
nach R0 lesen
        tst R0                            ; R0 auf 0 testen
        breq print_end                    ; wenn 0, dann zu print_end
        mov r16, r0                       ; Inhalt von R0 nach R16
kopieren
        rcall sendbyte                    ; UART-Sendefunktion
aufrufen
        adiw ZL, 1                        ; Adresse des Z-Pointers um 1
erhöhen
        rjmp print                        ; wieder zum Anfang springen
print_end:
        ret


Anstatt rcall sendbyte, rufst du lcd_data auf.

Gruß,
Daniel

von Christian M (Gast)


Lesenswert?

aaaah,

jetzt ist der Großschen gefallen, ich muß den Z Pointer um jeweils 1
erhöhen.
Ich hatte den gedanklichen Fehler, daß im Register 0 dann der ganze
String steht, geht ja gar nicht.

Danke für Deine Hilfe

von Daniel Nöthen (Gast)


Lesenswert?

Na wunderbar.

Wieso postet Du immer doppelt?

von Christian M (Gast)


Lesenswert?

Das würde mich auch interessieren,
wenn es diemal nicht passiert, dann liegt es daran daß der Router keine
verbindung hat beim herstellen anscheinend 2 mal sendet.
Wenn doch ???
Oder Vielleicht prellt meine Maus.
Mal schaun ob die auch assembler versteht.

von Andi (Gast)


Lesenswert?

Hier noch eine kleine Optimierung da Du ja sosiwso den Mega8 und nicht
einen altertühmlichen µC verwendest:

print:
        lpm r16,Z+                        ; Erstes Byte des Strings
nach R0 lesen
        tst R16                           ; R0 auf 0 testen
        breq print_end                    ; wenn 0, dann zu print_end
kopieren
        rcall lcd_data                    ; UART-Sendefunktion
aufrufen
erhöhen
        rjmp print                        ; wieder zum Anfang springen
print_end:
        ret


"lpm r16,Z+" lädt direkt das Zeichen vom Flash nach r16 und macht
auch noch ein 'Post Inkrement' (erhöhung von Z (ZH:ZL) um 1 nach
laden in r16).
Dabei spart man sich dann das "mov r16,r0" und "adiw zl,1", also
insgesamt 3 Takte je Zeichen und 2 Words (4 Bytes) an Code.

Bei den ganz kleinen oder früheren Atmel-µC gibs nur "lpm" was den
Inhalt der durch Z adressierten Flash-Adresse nur nach r0 laden kann.

Gruß
Andi

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.