.db ???

Gast #1539
Lesenswert?

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
Gast #1540
Lesenswert?

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
Gast #1541
Lesenswert?

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
Gast #1543
Lesenswert?

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
Gast #1545
Lesenswert?

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)
Gast #1547
Lesenswert?

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!
Gast #1548
Lesenswert?

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.
Gast #1549
Lesenswert?

Ü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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren