Forum: Mikrocontroller und Digitale Elektronik .db ???


von Züsli Fabian (Gast)


Lesenswert?

Hi

Ich möchte wissen, was man mit dem .db Befehl bewirken kann????
kann mir das jemand kurz erklären???

mfg

von Jonas Diemer (Gast)


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

von MarkusB (Gast)


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

von Jonas Diemer (Gast)


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

von MarkusB (Gast)


Lesenswert?

Ah, gut zu wissen
THX
Markus

von Züsli Fabian (Gast)


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

von Jonas Diemer (Gast)


Lesenswert?

HI!

steht doch in atmels beschreibung (doc0856.pdf, seite 91).

von Züsli Fabian (Gast)


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)

von Jonas Diemer (Gast)


Lesenswert?

eigentlich nicht.

welcher fehler kommt denn?

von Züsli Fabian (Gast)


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!

von Jonas Diemer (Gast)


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.

von Sebastian (Gast)


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

von Jonas Diemer (Gast)


Lesenswert?

dafür gipts ja dann adiw z,1

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