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