Forum: Mikrocontroller und Digitale Elektronik Z-Pointer?


von Thomas O. (Gast)


Lesenswert?

Hallo,

ich probiere gerade etwas mit dem Z-Pointer was eigentlich auch ganz
gut funktioniert. Da ich aber nicht so der Profi in Assembler bin wollt
euch mal nach einer Alternative fragen.

Gibt es eine elegantere Lösung als
"ldi ZL,Low(Tabelle2*2)" und
"ldi ZH,High(Tabelle2*2)" in die Poiter zu laden
um Sie auf die 2te Zeile zu bringen oder sollte ich einfach die Daten
zusammenhängen und dann die Pointer um die entsprechende Reichweite
erhöhen tabelle1: .db
1,2,4,8,16,32,64,128,255,128,64,1,2,3,4,5,6,7,8,9,10

Also danke schonmal im Vorraus

Programmcode
main:  ldi ZL,Low(Tabelle1*2)
  ldi ZH,High(Tabelle1*2)
  ldi temp,9
  add    zl,temp  ;Zähler ZL wird um 9 erhöht
  lpm    ;Lädt den Wert 64 nach R0=Zeichen
        out PortB,zeichen
tabelle1: .db 1,2,4,8,16,32,64,128,255,128,64
tabelle2: .db 1,2,3,4,5,6,7,89,10

Also danke schonmal im Vorraus

von André Kronfeldt (Gast)


Lesenswert?

Hi,

zur 2. Methode:
Da im PGM Bytes in Wörtern gespeichert werden (deswegen acuh
Tabelle1*2) sollte man doch 2*9 addieren, oder? Außerdem zeigt er dann
auf '128', nicht auf '64'. Nach einem "add zl, temp" kannst Du
auch einen Überlauf haben. Entweder also noch ein 'adc th, 0' oder
gleich ein addiw.

Grüße,
André

P.S.: Bin noch nicht ganz wach. Kann auch sein das davon nix stimmt ;-)

von Thomas O. (Gast)


Lesenswert?

Hallo,

erstmal zeigt er auf die erste Zahl dann wird 9 dazuadiert also zeigt
er dann auf die 10te Zahl. Hast Recht, habe mich da vertan die Tabelle
sollte nur 10 Bereiche haben.

Wieso Überlauf man hat doch  einen 16bit Zeiger also 65536 Stellen auf
die er zeigen kann und flash hat nur 8KB also reicht der Bereich doch
locker aus. Oder meinst du das Lowbyte? Da sollte man die Rechnung dann
schon so machen das das Überlaufbit bzw. Carrybit auf das Highbyte
mitdraufkommt.

addiw sagt mir gerade nicht denke mal das ist für größere Sprünge als
255. Muss mal nachschauen.

von ...HanneS... (Gast)


Lesenswert?

ADIW:
Addiert zum 16-Bit-Pointer eine 6-Bit-Konstante (1...63). Kümmert sich
dabei auch um den Übertrag zwischen den beiden Registern.
Man sollte aber beide Register angeben, nicht nur das L-Register.

Es gibt auch SBIW... (das subtrahiert)

Programmcode
main:  ldi ZL,Low(Tabelle1*2)
       ldi ZH,High(Tabelle1*2)
       adiw ZH:ZL,9  ;Zähler ZH:ZL wird um 9 erhöht...

Tabelle1:
.db bla,bla

Frohen Rest vom Weihnachtsfest...
...HanneS...

von André Kronfeldt (Gast)


Lesenswert?

Hallo,

dachte immer bei adiw wird nur das ZL angegeben. Das Teil weiß doch,
daß das ZH (oder welches HI-Byte auch immer) im Registerset eins drüber
liegt. Also "adiw ZL,9" sollte doch genügen. Kommt aber auf den
Assembler an. Opcode ist jedenfalls 1001 0110 KKdd KKKK
Viel zuwenig Platz in d für beliebige Register
(d=24,26=XL,28=YL,30=ZL?)
Aber schöner ist "ZH:ZL, 9". Läßt sich wohl besser lesen.

Grüße,
André

von André Kronfeldt (Gast)


Lesenswert?

Hi,

hab gerade gesehen das Du 'solltest' geschrieben hast.

> Man sollte aber beide Register angeben, nicht nur das L-Register.

Ich kannte nur die Methode ohne ':'. Wieder was gelernt.

Grüße,
André

von ...HanneS... (Gast)


Lesenswert?

Hab' ich auch nur aus der Hilfe zu AVR-Studio...
(Dein PC hat doch sicherlich auch eine F1-Taste, oder?)

von André Kronfeldt (Gast)


Lesenswert?

Hi,

Ja. Mein PC hat sowas. Aber ich benutze F1 immer wenn ich was wissen
will oder Hilfe brauche, nicht wenn ich eigentlich mit meinem Wissen
zufrieden bin. Wenn man halt davon ausgeht, daß es nur "addiw
Reg,Konst" gibt, wieso dann F1?

Grüße,
André

von ...HanneS... (Gast)


Lesenswert?

Online-Help des AVR-Studio.
Cursor auf den ASM-Befehl, dann F1...
(wie damals bei QBASIC...)

Frohen Rest vom Fest...

von Thomas O. (Gast)


Lesenswert?

Kann mir nochmal kurz jemand sagen wozu es noch die X und Y Register
gibt? Wird da evtl. in SRAM, EEPROM und FLASH unterschiedem?

von ...HanneS... (Gast)


Lesenswert?

Schau dir die LD- und ST-Befehle an.

Was willst du beim EEPROM mit einem Pointer?? - Der wird doch durch
EEADR(L/H) adressiert...

...

von Thomas O. (Gast)


Lesenswert?

Hallo,

wo landen bei meinem ersten Beispiel die Daten im Flash oder? Wenn ich
sie ins EEPROM haben will mus ich doch einfach vor Tabelle1 .ESEG
schreiben.

Da ein Pointer ja auch 16bit Breit ist kann man diesen doch ans
EEADR(L/H) übergeben oder nicht. Wenn nicht dann kann man das
EEADR(L/H) ja ganz normal erhöhen in dem man addiert.

von dave (Gast)


Lesenswert?

EEADR ist nen I/O Register.. da kannste nix rechnen. Du kannst eines der
Doppelregister (von r24 - r31) nehmen, und da den Wert drinlassen...
dann kannste jedesmal ADIW (lowbyte), 1 und dann musste es aber wieder
an EEADR ausgeben..

dave

von ...HanneS... (Gast)


Lesenswert?

Du hast dir also die LD/ST-Befehle nicht näher angeschaut.

Denn sonst würdest du wissen, dass du mit dem X, Y und Z -Pointer auf
Register, I/O und SRAM zugreifen kannst, die ja einen gemeinsamen
linearen Adressbereich haben. Und das sehr vorteilhaft mit
Auto-In/Decrement des Pointers.

Vielleicht solltest du dir mal alle verfügbaren Speicherbereiche (auch
Register und I/O-Register sind Speicherbereiche) auflisten und
untersuchen, wie sie anzusprechen sind, denn du wirfst da noch einiges
durcheinander.

...

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.