www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Z-Pointer?


Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: ...HanneS... (Gast)
Datum:

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

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: ...HanneS... (Gast)
Datum:

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

Frohen Rest vom Fest...

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

...

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.