www.mikrocontroller.net

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


Autor: Matthias Pues (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Ich wollte die Umwandlungsroutine Binär zu ASCII von
http://www.avr-asm-tutorial.net/avr_de/rechnen/kon...
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

Autor: Sebastian Wille (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Matthias Pues (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Mathias...

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

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

Autor: Matthias Pues (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@crazy horse:
ich hab meinen post vor deinem geschrieben...

Autor: crazy horse (Gast)
Datum:

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

Autor: Matthias Pues (Gast)
Datum:

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

Autor: Matthias Pues (Gast)
Datum:

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

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.