Forum: Mikrocontroller und Digitale Elektronik Mehrfachverzweigung


von Luigi A. (spok)


Lesenswert?

Hi zusammen, ich verstehe einen Vorgang bei der Mehrfachverzweigung 
nicht.
Währe um eine Erklärung oder Hinweise in Form von Links etc. dankbar.

Beim Befehl  ldi  ZL,low(Sprungtabelle*2) und ldi 
ZH,high(Sprungtabelle*2)
wird die Adresse der Sprungtabelle x2 genommen. Begründung im Tutorial 
ist
das Bit0. Hier entscheidet das Bit0 ob das High oder Low Byte gelesen 
werden soll.

Ich verstehe nicht warum dann der Zeiger mal 2 genomme werden muss.
Zeigt der dann nicht auf eine völlig andere Adresse?

Danke euch.

von Paulo (Gast)


Lesenswert?

Luigi Aronica schrieb:
> Ich verstehe nicht warum dann der Zeiger mal 2 genomme werden muss.

Vielleicht ist das eine (Byte-)Adresse für eine Tabelle mit 2-Byte 
Werten. Anhand so einem Programmfragments läßt sich das allerdings 
schlecht beurteilen.

von (prx) A. K. (prx)


Lesenswert?

ROM-Adressen sind im AVR Assembler Wortadressen, d.h. die Adressen 
zweier aufeinander folgender Codeworte unterscheiden sich um 1. 
Entsprechende Labels im ROM-Bereich des Programms enthalten also 
Wortadressen.

Der byteweise arbeitende (E)LPM Befehl jedoch verwendet Byteadressen, 
d.h. die Adressen zweier aufeinander folgender ROM-Worte unterscheiden 
sich darin um 2, nicht um 1. Die Byteadresse einer ROM-Position ist 
also das doppelte der Wortadresse.

Deshalb kommt ein AVR mit 128KB ROM zwar mit einem 16-Bit Program 
Counter für 64K Worte aus, benötigt aber 17 Adressbits um diesen 
Speicher als Daten zu lesen.

Im GNU-Assembler ist das übrigens anders.

von Luigi A. (spok)


Lesenswert?

DANKE! Habe es verstanden ( glaube ich) der LPM Befehl arbeitet mit 2 
Wortfolgen ,also 2x 16 Bit da ein Wort aus 2x 8 Bit (2x 1 Byte)besteht.

Daher der Faktor 2..

Richtig?

von (prx) A. K. (prx)


Lesenswert?

Luigi Aronica schrieb:
> Richtig?

Keine Ahnung. Um das zu bewerten müsste ich nämlich meinerseits deinen 
Text verstehen können.

> da ein Wort aus 2x 8 Bit (2x 1 Byte)besteht

Das zumindest kann ich bestätigen.

von Luigi A. (spok)


Lesenswert?

so habe mir jetzt mal die Definitionen (Wort, Byte..) nochmal 
angeschaut.
1 Wort = 2 Byte = 16 Bit. ROM Adressen sind 16 Bit Breit.

der LPM Befehl arbeitet aber Byteweise (lädt also immer 8 Bit)

Das LSB der Adresse wird dafür verwendet um zu bestimmen ob das low oder 
high Byte in das Zielregister geladen wird und fällt raus. Daher die 
Multiplikation mal 2 um das Muster eins nach links zu schieben.

Hoffe liege richtig und habe es so erklärt dass prx mich versteht. :-)

von Falk B. (falk)


Lesenswert?

Steht doch ausführlich erklärt im Artikel.

https://www.mikrocontroller.net/articles/AVR-Tutorial:_Mehrfachverzweigung#Z-Pointer_leicht_verst.C3.A4ndlich

Einfach mal den GANZEN Artikel in RUHE lesen und drüber NACHDENKEN. GGf. 
mehrfach.

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.