Forum: Mikrocontroller und Digitale Elektronik AVR Z-Register Zahl addieren


von Diether (Gast)


Lesenswert?

Hallo, ich habe im Z-Register folgenden Wert:

<avrasm>
LDI ZH, HIGH(511)
LDI ZL, LOW(511)
</avrasm>

Nun möchte ich den Wert eines anderen Registers addieren. Beispielsweise 
R16 mit 2. Wie mache ich das richtig, so dass auch beim Setzen des 
C-Flags das Highbyte um eins erhöht wird?

Ist
<avrasm>
LDI R16, 2
ADD Z, R16
</avrasm>
korrekt?

Ich habe auch


Wenn nicht, wo kann ich wo kann ich das nachlesen?


mfg
Diether

von Diether (Gast)


Lesenswert?

Hallo, es handelt sich um einen ATMEGA32-Prozessor. Und irgenwie hat das 
mit der Formatierung nicht geklappt. Sorry!


mfg
Diether

von spess53 (Gast)


Lesenswert?

Hi

>korrekt?

Nein. Es reicht ein

[avrasm]
  adiw, ZH:ZL,2
[{avrasm]

MfG Spess

von Theor (Gast)


Lesenswert?

Diether schrieb:
> Hallo, ich habe im Z-Register folgenden Wert:
>
> <avrasm>
> LDI ZH, HIGH(511)
> LDI ZL, LOW(511)
> </avrasm>
>
> Nun möchte ich den Wert eines anderen Registers addieren. Beispielsweise
> R16 mit 2. Wie mache ich das richtig, so dass auch beim Setzen des
> C-Flags das Highbyte um eins erhöht wird?
>
> Ist
> <avrasm>
> LDI R16, 2
> ADD Z, R16
Diesen Befehl, - Addition eines 8-Bit-Registers zu einem 
16-Bit-Registers -, gibt es nicht im AVR Befehlssatz

> </avrasm>
> korrekt?

Also: Nein.

> Wenn nicht, wo kann ich wo kann ich das nachlesen?

Was nicht geht, wird natürlich nirgends beschrieben. Da müsste man ja 
alles beschreiben, einschliesslich des Befehls, der einer Mücke die 
Wurzel zieht. Eintrag: ZEMDW: Gibt es nicht.

:-)


In der Beschreibung des Befehlssatzes steht aber, welche Befehle es 
gibt: http://www.atmel.com/atmel/acrobat/doc2503.pdf


Du wirst die Addition aus den Additionen von zuerst des Low-Teiles von Z 
(also R30) und dann von 0 (also eines Registers, das 0 enthält) 
einschliesslich Carry zu dem High-Teil von Z (R31) zusammensetzen 
müssen. Wahlweise auch als Increment, falls das Carry-Bit gesetzt ist. 
Da kann man kreativ sein.

Viel Spaß!

von Peter D. (peda)


Lesenswert?

Diether schrieb:
> Wenn nicht, wo kann ich wo kann ich das nachlesen?

Im Instruction-Set:

http://www.atmel.com/images/Atmel-0856-AVR-Instruction-Set-Manual.pdf

von asm (Gast)


Lesenswert?

generell addierst Du Register zu zwei anderen mit

add zl,r16
adc zh,r17

wobei r17 hier Null sein muß wenn nur r16 und nicht ein ganzer 16-bit 
Wert hinzuaddiert werden soll. im C-Flag findest Du stets den Übertrag, 
der dann im adc-Befehl weiterverwertet werden kann.

von Theor (Gast)


Lesenswert?

Peter D. schrieb:
> Diether schrieb:
>> Wenn nicht, wo kann ich wo kann ich das nachlesen?
>
> Im Instruction-Set:
>
> http://www.atmel.com/images/Atmel-0856-AVR-Instruction-Set-Manual.pdf

Habe dummerweise oben einen falschen Link (auf das DB vom ATMega32) 
gepostet, der dann noch nicht einmal direkt erreichbar ist. Tut mir 
leid.

Danke Peter, für den richtigen Link.

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.