Forum: Mikrocontroller und Digitale Elektronik Assembler: Problem mit Registerpaar


von Uwe Naumann (Gast)


Lesenswert?

Hallo,

auf meinem AVR (AT90S2313) sind lt. Doku die oberen acht Register
jeweils als Registerpaar anzusprechen, also r24/r25 quasi als ein
Register.

Ich habe nun folgenden Code:

.def      pulsesL      = r24
.def      pulsesH      = r25

adiw   pulsesL, 1               ; Zaehlerwert inkrementieren

Wenn ich die Doku zu adiw richtig verstanden habe, dann wird beim
Overflow von r24 dieser nach r25 weitergegeben. Ich müsste also bis
65535 zählen können.

Bei mir wird aber nach 255 wieder auf Null gesprungen. Warum?

Gruß Uwe

von Conlost (Gast)


Lesenswert?

Hallo Uwe,

versuche mal das:

.def      pulsesL      = r24
.def      pulsesH      = r25

adiw   pulsesH:pulsesL, 1          ; Zaehlerwert inkrementieren

Gruß,
Arno

von Uwe Naumann (Gast)


Lesenswert?

Hmpf. Hätte man eigentlich selber drauf kommen können. Steht ja auch
genauso in der Befehlsreferenz.

Das wars aber nicht.

Das Problem scheint zu sein, das es trotz das es so in der Doku steht
einfach nicht mit r24/r25 funktioniert.

Ich habe es testweise mal mit XL/XH versucht (also r26/r27), und siehe
da:

adiw r26, 1

macht genau das was es soll. Beim Overflow von r26 wird entsprechend
r27 hochgezählt.

Also werde ich wohl für meine Zwecke r26/r27 missbrauchen, auch wenns
mir nicht so recht gefällt.

Gruß Uwe

von Conlost (Gast)


Lesenswert?

Ich habe mal beide Versionen mit r24/r25 im Studio simuliert
und es gingen beide.
Der Fehler liegt nicht bei den beiden Registern, sondern woanders.
Womit hast du das Program geschrieben und assembliert?

Gruß,
Arno

von Uwe Naumann (Gast)


Angehängte Dateien:

Lesenswert?

AVR Studio 4.08 / AVR Assembler

Ich hab mal den Code rangehangen.

Gruß Uwe

von Conlost (Gast)


Lesenswert?

Hast du vergessen auf AT90S2313 umzustellen, im Listing steht
oben noch:
;* Target  : AT90S1200 @ 4Mhz

Der AT90S1200 kennt den Befehl "adiw" nicht, kann es sein das
da was falsch eingestellt ist im Studio oder Assembler?

Gruß,
Arno

von Uwe Naumann (Gast)


Lesenswert?

Nee, passt schon, war nur noch ein alter Kommentar.

Gruß Uwe

von thkais (Gast)


Lesenswert?

Könnte es sein, daß der 2313 das nicht kann? Im Datenblatt des 2313 ist
nur die Rede von X,Y,Z. Das Addieren von R24/R25 steht nur im
allgemeinen Instruction Set. Wäre nicht der einzige Befehl, der beim
2313 nicht zur Verfügung steht.

von Chris (Gast)


Lesenswert?

Hallo,

"Das Addieren von R24/R25 steht nur im allgemeinen Instruction Set."

Das geht beim 2313 auch. r25 wird dann bei Überlauf des r24
weitergezählt. Erfordert Befehl adiw.

GRuß

von crazy horse (Gast)


Lesenswert?

kann ich bestätigen, habe ich auch schon mal in einem Programm
eingesetzt.

von Uwe Naumann (Gast)


Lesenswert?

Also ich habe nicht ins Datenblatt geschaut, sondern in zwei meiner
Bücher. Und die behaupten auch beide, das es beim 2313 geht. Es werden
wohl kaum beide Autoren falsch abgeschrieben haben ;-)

Na ja, jetzt läufts via XL/XH, bei dem projekt brauche ich die nicht.

Gruß Uwe

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.