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.