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
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 ;-)
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.
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...
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é
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é
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é
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.
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
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.
...