Datentabelle in Assembler

Gast
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
Gast
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.
Gast
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
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
Gast
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 ?
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.