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
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
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:
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
Ja und? Geht doch trotzdem. ldi ZL, 3 ldi ZH, 0 und dann weiter wie oben beschrieben.
Hi Mathias... RAM fängt bei $60 an weil darunter Register und I/O wie RAM angesprochen werden... (Siehe Datenblatt...) Bit- & Bytebruch... - ...HanneS...
@crazy horse: ich hab meinen post vor deinem geschrieben...
du sprichst in Rätseln, ich kann dir nicht mehr folgen.
'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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.