Forum: Mikrocontroller und Digitale Elektronik Z-Zeiger zeigt auf Register, aber wie komme ich dorthin?


von Matthias Pues (Gast)


Lesenswert?

Hi,
Ich wollte die Umwandlungsroutine Binär zu ASCII von
http://www.avr-asm-tutorial.net/avr_de/rechnen/konvert.html#bin2asc
benutzen, um eine Zahl über UART/serielle schnittstelle an den PC
senden. nun zeigt der Z-Zeiger zwar auf das register, in der die erste
zahl steht, aber wie bekomme ich das nur über den UART, und die
restlichen 5 register, geschrieben. ich hab schon ewig im datenblatt
von mega8, den benutz ich übrigens, gesucht, finde aber keinen befehl
oedr konstruktion dafür. im endeffekt müsste ja soetwas herauskommen
(in anlehnung an "UART" von tutorial hier):
ldi temp, r(inhalt von r30)
rcall serout
ldi temp, r(r30+1)
rcall serout
ldi temp, r(r30+2)
usw.
das einzige, was mir eingefallen wäre, wäre 15mal vergleichen, ob
r30=00, dann zu subroutine 00, die bei register 0 anfängt, dann
vergleinen ob r30=01 -> subrout.01 die register 01 bis 06 versendet
usw. Aber das ist sehr dämlich und umständlich...
Matthias

von Sebastian Wille (Gast)


Lesenswert?

Hallo Matthias,

ich hoffe, ich habe Dich richtig verstanden.

Der Z-Pointer r31:r30 (=ZH:ZL, also 16Bit) zeigt auf eine bestimmte
Adresse, z.B. 0xA7F6.

Möchtest Du nun die nächste Adresse, also 0xA7F7 auslesen, mußt Du den
Inhalt (!) des Z-Pointers erhöhen, am besten mit adiw ZL,1. Damit
erhöht sich auch ZH, falls es beim ZL zum Überlauf kommt.

Sebastian

von crazy horse (Gast)


Lesenswert?

entweder das Zeigerregister incrementieren (wie schon gesagt), damit
lässt sich das ganze auch in einer Schleife programmieren:

ldi ZL, low_adresse_datenanfang
ldi ZH, high_adresse_datenanfang
ldi loop, anzahl_der_zu_sendenden_bytes
ser_out_loop:
ld temp, Z+  ;lädt zu sendendes byte nach temp und incrementiert den
Zeiger
rcall serout
dec loop
brne  ser_out_loop

Alternativ kannst du auch die ldd-Befehle nutzen

ldi ZL, low_adresse_datenanfang
ldi ZH, high_adresse_datenanfang
ldd temp, Z+0  ;lädt zu sendendes byte nach temp
rcall serout
ldd temp, Z+1  ;2.Byte
rcall serout
ldd temp, Z+2  ;3.byte
rcall serout

Erstere Variante ist besser und flexibler, eignet sich für beliebige
Anzahl von Bytes, kann auch ohne loop-Zähler verwendet werden, wenn
eine Ende-Zeichen vereinbart ist (i.a. 0)

ldi ZL, low_adresse_datenanfang
ldi ZH, high_adresse_datenanfang

ser_out_loop:
ld temp, Z+  ;lädt zu sendendes byte nach temp und incrementiert den
Zeiger
tst temp
breq ende
rcall serout
rjmp  ser_out_loop
ende:

von Matthias Pues (Gast)


Lesenswert?

Hmm, ich glaub ich habs nicht richtig erklärt. im prog von
avr-asm-tutorial.net zeigt der z-zeiger auf das register. fängt die
zahlenkette in ASCII bei r3 an und hört bei r7 auf, ist in r30 (ZL)
0x03.
Matthias

von crazy horse (Gast)


Lesenswert?

Ja und? Geht doch trotzdem.
ldi ZL, 3
ldi ZH, 0
und dann weiter wie oben beschrieben.

von Hannes Lux (Gast)


Lesenswert?

Hi Mathias...

RAM fängt bei $60 an weil darunter Register und I/O wie RAM
angesprochen werden... (Siehe Datenblatt...)

Bit- & Bytebruch... - ...HanneS...

von Matthias Pues (Gast)


Lesenswert?

@crazy horse:
ich hab meinen post vor deinem geschrieben...

von crazy horse (Gast)


Lesenswert?

du sprichst in Rätseln, ich kann dir nicht mehr folgen.

von Matthias Pues (Gast)


Lesenswert?

'tschuldigung, ich hat grad eben wenig zeit. ich meinte nur, daß ich in
dem post in dem ich meinte, daß ichs wohl falsch erklärt hätte deinen
post nuch nicht gelesen hatte, weil der erst ein pssr minuten vorher
kam.

von Matthias Pues (Gast)


Lesenswert?

So, jetzt bin ich endlich zu hause und kommte mir das ganze in ruhe
durchlesen.
@crazy horse:
danke schön, das hat geholfen, ich dachte bei "Ld temp, z+" wird der
inhalt von Z nach temp geschoben und nicht der inhalt von dem register
auf das Z zeigt, deswegen hab ich den befehl nicht ausprobiert. naja, n
bissel dämlich...
Gruß
Matthias

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.