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.
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.
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.
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?
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.
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. :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.