Forum: Mikrocontroller und Digitale Elektronik CPC (AVR) geht nicht wie erwartet


von Michael S. (smtschmidt)


Lesenswert?

Hallo zusammen!

Ich möchte das Ergebnis einer Addition (in Assembler) auf einen 
Maximalwert begrenzen:

add Tmp0, Tmp1
cpc MaxWert, Tmp0
brcc SprungmarkeFertig
mov Tmp0, MaxWert

Nach cpc ist das Carry gesetzt, wenn das Ergebnis der Addition größer 
als MaxWert ist.
Wenn aber bei der Addition ein Überlauf auftritt (0xF0 + 0x20 = 0x10 + 
Carry) funktioniert das nicht mehr. Dabei sollte doch cpc genau dieses 
Carry mit beachten.

Wo liegt mein Fehler?
Danke!
Michael

von Falk (Gast)


Lesenswert?

RTFM.

CPC berechnet

tmp0 - maxwert - carry

(wobei carry nur 1 oder 0 sein kann). Effektiv ist ein cp(c) Befehl 
identisch mit einem sub(c), nur dass das Egebnis nicht geschrieben wird.

Da du ja in einem Register nur 8 Bit unter kriegst, hat cpc keinen Sinn. 
cpi ist das mittel der Wahl. CPC ist nur sinnvoll bei 16 Bit 
Vergleichen, siehe Assembler Dokumentation für CPC.

MFG
Falk

von Michael S. (smtschmidt)


Lesenswert?

Hallo Falk!
RTFM hab ich schon:

This instruction performs a compare between two registers Rd and Rr and 
also takes into account the previous carry.

 Rd - Rr - C
Also anderherum!

hier:
 MaxWert - Tmp0 - C
(Wobei MaxWert auch ein Registerinhalt ist. Hatte ich vergessen 
anzugeben.)

Wenn man eine Addition durchführt und danach das Carry mit 
berücksichtigt hat man eben neun Bits zur Verfügung. Soweit die Theorie.

Noch ne Idee?

von Karl H. (kbuchegg)


Lesenswert?

Michael Schmidt wrote:
>
> Wenn man eine Addition durchführt und danach das Carry mit
> berücksichtigt hat man eben neun Bits zur Verfügung. Soweit die Theorie.

Nix Theorie.
Das ist so.

Effektiv versuchst du ja einen 9 Bit Wert mit einem 8 Bit
Wert zu vergleichen. Ergo: Kann das mit einem Befehl der
nur 8 Bit berücksichtigt nichts werden (Der CPC berücksichtigt
schon das Carry, aber anders als du es hier brauchst).

>
> Noch ne Idee?

gleich nach der Addition testen, ob Carry gesetzt ist.
Ist es dass, dann ist das Ergebnis auf jeden Fall schon
mal größer als dein zulässiger Maximalwert (der ja 8
Bit gross ist).
Ist es nicht gesetzt, blieb also die Addition im 8 Bit
Raum, dann verglichst du noch mit dem MaxWert.

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.