Hi Ich möchte wissen, was man mit dem .db Befehl bewirken kann???? kann mir das jemand kurz erklären??? mfg
Yo, ich (hoff ich)! mit der .db direktive fügst du DataBytes direkt in den code ein. diese bytes (die auserhalb des auszuführenden programmcodes stehen sollten) kannst du dann mit LPM (Load Program Memory) in ein register laden. auf diese weise kannst du z.B. nen langen Text direkt im Flash speicher speicher (schon beim programmieren) und diesen dann mit LPM zeichenweise auf ein LCD ausgeben. hinweis: .db zeilen werden immer mit nullen zu einer graden anzahl bytes aufgefüllt (d.h. zu vollen words), da der programmspeicher wortweise adressiert wird. ich hoffe, das war alles richtig :-) cu jonas
Hi, nur noch als Ergänzung: .db ist kein Prozessorbefehl sondern eine Anweisung an den Assembler, die nachfolgenden Werte an der entsprechenden Stelle im Speicher abzulegen. Ob aber aufgefüllt wird bin ich mir da nicht so sicher. Gruß Markus
naja, so sieht das jedenfalls aus... wenn ich bei mir z.B. .db 0x10 in den code packe, dann is nacher inner hexdatei direkt dahinter 00 (obwohl da ff stehen müsste). noch deutlicher wirds hierdurch: .db 0x10 .db 0x20 sollte, so könnte man annehmen, 2 aufeinanderfolgende bytes, also 1020, erzeugen tatsächlich erhält man aber 10002000. der linux assembler avra warnt sogar: Warning: A .DB segment with an odd number of bytes is detected. A zero byte is added. mfg
Danke vielmals, nun möchte ich die einzelnen String Buchstaben aus dem memory lesen und in ein Register speichern, dass kann ich ja mit dem lpm Befehl, doch wie initialisiere ich den Z- Pointer??? Bei mir kommt nämlich ein Fehler! Vielen Dank Fabian Züsli
Ja, ganz genau, ich weiss, doch ich habe diesen Code eingegeben, um den Z pointer zu initialisieren, aber es kam ein Fehler! Muss ich anstatt (Table_1<<1) etwas anderes einsetzen? ldi ZH, high(Table_1<<1) ; Initialize Z pointer ldi ZL, low(Table_1<<1)
er findet das (Table_1<<1) nicht, muss ich das noch definieren? wie ist das dann kann ich von einem gespeicherte String (z.B. 'Hallo') der dritte Buchstaben herauslesen und auf dem Display ausgeben? Muss ich das mit dem Z-Pointer machen? Mit dem Befehl lpm lade ich das Register 0 habe ich da recht??? vielen dank!
Table_1 markiert die adresse der string konstanten im flash. das <<1 ist nix anderes, als die adresse des labels table_1 mit 2 zu multiplizieren. dies ist notwendig, weil der flash immer aus wörtern (also 2 bytes) besteht. der code muss vollständig so sein: ldi ZH, high(Table_1<<1) ; Initialize Z pointer ldi ZL, low(Table_1<<1) lpm r0,Z+ ;liest den inhalt des flash an position Z in register r0 ein und erhöht dann ; Z lpm r1,Z ; liest vom erhöhten Z (also das nächste zeichen) ... irgendwo später... Table_1: .db 'H','i' Hoffe das is alles richtig, habs nich getestet.
Über den Käse bin ich auch schon mal gestolpert. Man muß die Adresse der Tabelle wirklich mal 2 nehmen: ldi ZH,high(Tabelle*2) ldi ZL,low(Tabelle*2) (ist identisch mit <<1). Bei meinen AVRs (bis 8515) funktioniert der lpm-Befhel nur ohne Parameter: lpm Bedeutet dann soviel wie lpm z,r0. Autoinkrement ist leider nicht drinn. MfG, Sebastian
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.