Forum: Mikrocontroller und Digitale Elektronik Datentabelle in Assembler


von Jörn (Gast)


Angehängte Dateien:

Lesenswert?

Hi

Ich möchte eine Datentabelle für ein AVR programm programmiren. Aus 
dieser Tabelle soll er dann werte auslesen.
Wie geht das. Die Tabelle ist die im anhang.

MFG Jörn

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Erst mal musst du alle ".byte" in ".db" umwandeln, und dann solltest du 
dich über den Befehl "lpm" informieren, z.B. hier: 
http://www.mikrocontroller.net/tutorial/memory.htm

von Jörn (Gast)


Lesenswert?

Danke, damit kann ich was anfangen.

von Jörn (Gast)


Lesenswert?

print:
  lpm
        tst R0
        breq print_end
        mov r16, r0
        rcall sendbyte
        adiw ZL, 1
        rjmp print


text:

.db 84, 101, 115, 116, 0
.db 8, 10, 11, 16, 5, 0

Wenn ich das richtig verstanden habe, steht der wert 84 nach dem ersten 
durchlauf in r16. Doch wie komme ich in die nächste Datenzeile??

MFG Jörn

von crazy horse (Gast)


Lesenswert?

spielt keine Rolle, in welcher Zeile die .db stehen, solange du Z 
incrementierst, wird das nächste Byte gelesen. Willst du direkt ein 
andere Zeile anspringen, solltest du lieber symbolische Marken einfügen 
und dann mit Hilfe dieser Z laden.

von Jörn (Gast)


Lesenswert?

ich will von der Zeile 1 in die 2. Zeile springen, das muss doch möglcih 
sein oder? Also angenommen in der variable x steht der wert 1 dann liest 
das prog. die erste zeile aus, steht in der der variable aber 2 dann 
nimmt das prog. die zweite zeile.


Zeile1: .db 84, 101, 115, 116, 0
Zeile2: .db 8, 10, 11, 16, 5, 0

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Schreib doch einfach mal wozu das ganze gut ist, dann kann man dir 
besser helfen.

von Peter D. (peda)


Lesenswert?

Wenn das nicht nur 2 Zeilen sein sollen, dann nimmst Du eine 2. Tabelle, 
in der erstmal alle Byte-Adressen drinstehen:

Adressen: .dw 2*zeile1, 2*zeile2 ;usw.
Zeile1: .db 84, 101, 115, 116, 0
Zeile2: .db 8, 10, 11, 16, 5, 0

Zuerst lädst Du Z mit 2*Adressen und addierst den Index 2* dazu (da 2 
Byte je Adresse). Dann holst du die beiden Bytes, lädst diese nach Z und 
somit zeigt Z auf die gewünschte Zeile.

Peter

von Andi_K (Gast)


Lesenswert?

Hallo,

Da ihr schon mal dabei seid, jemandem beizubringen, wie
man eine Tabelle in den Ram speichert und diese bei bedarf
ausliest, möchte ich mich gleich mal mit hinten anstellen.

Ich habe nämlich ähnliches (oder sogar selbiges?) vor:

Möchte jedem gelesenen AD-Wert (256 Werte@8Bit)
eine gewisse Zahl zuordnen. Soll für eine Temperatur-
ausgabe werden.
Beispiel: AD-Wert ist "154" , es soll eine "024" zugerodnet
werden, welche ich dann irgendwo hin als Temperatur ausgebe.

Von LPM habe ich mal flüchtig gehört. Das scheint
das richtige zu sein. Wie arbeite ich aber damit ?
Und wie kriege ich die Wertetabelle in den Ram ?

von Jörn (Gast)


Lesenswert?

Hallo

Ja so was ähnliches wie Andi_K habe ich auch vor, nur das der ASCII wert 
also von 0-?? einen bestimmten Datensatz bestehend aus je 8 zeichen 
zugeordnet werden soll.

Bsp:  Asciicode = 3

      .de 6, 5, 98, 50, 66, 66
      .de 4, 3, 58, 59, 20, 44
  *   .de 5, 8, 55, 88, 44, 55   *  diese Zeile soll nun wert für wert 
ausgelesen werden und jeder wert per spi an ein display (Nokia 3310 
gesendet werden.

MFG Jörn

von Thomas Fischl (Gast)


Lesenswert?

Hallo Jörn,

also ich würde den Z-Pointer einfach "asciicode"-mal um 6 erhöhen. Also 
so in der Art:

ldi ZH, HIGH(text<<1)
ldi ZL, LOW(text<<1)

tst asciicode
breq loopend

loop:
adiw ZL, 0x06
dec asciicode
brne loop
loopend:

Dann sollte der Z-Pointer auf die von dir gewünschte "Zeile" zeigen.

Thomas

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.