mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik lcd Tutorial Probleme


Autor: Christian M (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Nöthen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian M (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Nöthen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na wunderbar.

Wieso postet Du immer doppelt?

Autor: Christian M (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.