www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik .db ???


Autor: Züsli Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

mfg

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MarkusB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MarkusB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, gut zu wissen
THX
Markus

Autor: Züsli Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI!

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

Autor: Züsli Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eigentlich nicht.

welcher fehler kommt denn?

Autor: Züsli Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dafür gipts ja dann adiw z,1

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.