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é
Hab' ich auch nur aus der Hilfe zu AVR-Studio... (Dein PC hat doch sicherlich auch eine F1-Taste, oder?)
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é
Online-Help des AVR-Studio. Cursor auf den ASM-Befehl, dann F1... (wie damals bei QBASIC...) Frohen Rest vom Fest...
Kann mir nochmal kurz jemand sagen wozu es noch die X und Y Register gibt? Wird da evtl. in SRAM, EEPROM und FLASH unterschiedem?
Schau dir die LD- und ST-Befehle an. Was willst du beim EEPROM mit einem Pointer?? - Der wird doch durch EEADR(L/H) adressiert... ...
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. ...
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.