mikrocontroller.net

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


Autor: Michael Schmidt (smtschmidt)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Schmidt (smtschmidt)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.