mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem Negative-Flag?


Autor: Torsten O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich war immer der Meinung die Statusbits des µC verstanden zu 
haben. Offensichtlich ist dem nicht so. Ich habe ein Problem mit dem 
"N"-Flag. Wenn ich eine kleine Zahl von einer großen abziehe ist das 
Ergebnis doch eigentlich positiv, wieso wird dann das "N" - Flag im 
Simulator gesetzt? Ich arbeite mit dem ATMega48.

Beispielcode:

ldi    R16, 0xf0
subi  R16, 0x64

ldi    R16, 0xf0
ldi    R17, 0x64
sub    R16, R17

loop:

rjmp  loop


Vielen Dank im voraus



lg Torsten

Autor: Klugscheisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn ich eine kleine Zahl von einer großen abziehe ist das
>Ergebnis doch eigentlich positiv, wieso wird dann das "N" - Flag im
>Simulator gesetzt?

In der Befehlsbeschreibung steht, mit einer gewissen Absicht, NICHT das 
das N-Flag bei "negativen Zahlen" gesetzt ist, SONDERN, das es gesetzt 
ist wenn "das MSB des Ergebnisses" gesetzt ist.

Die erwähnte Absicht hat mit der benutzten Zahlenrepräsentation zu tun.
Du sagst, das 0xF0 eine "grosse" Zahl, insbesondere eine groessere als 
0x64, sei. Das soll so sein, aber ein anderer Programmierer würde das 
mit Fug und Recht anders sehen können, wenn er will ;-) Stichwort 
Zweier-Komplement.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Das N-Flag wird gesetzt, wenn Bit 7 = 1 ist. 0..7F positiv, FF..80 
negativ.

MfG Spess

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Torsten Ohne (tome28)

>Ergebnis doch eigentlich positiv, wieso wird dann das "N" - Flag im
>Simulator gesetzt? Ich arbeite mit dem ATMega48.

Weil das N-Flag nur für vorzeichenbehaftete Zahlen sinnvoll verwendet 
werden kann und es bei der Berechnung keine Über/Unterläufe geben darf, 
sonst ist das N-Flag nämlich sinnlos.

>ldi    R16, 0xf0
>subi  R16, 0x64

0x0F - 0x64 = 0x8C
240  - 100  = 140 im EINERKOMPLEMENT (ohne Vorzeichen)
-16  - 100  = -116 im Zweierkomplement (mit Vorzeichen)

MFG
Falk

Autor: Torsten O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm... an das 2er-Komplement habe ich natürlich nicht gedacht, vielen 
Dank für die schnelle Hilfe und einen schönen Abend noch.


lg Torsten

Autor: Torsten O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich doch noch am Verzweifeln :(

Nochmal etwas genauer zu meinem Problem. Ich versuche einen gewandelten 
10bit-Wert des ADC's auszuwerten. Ich habe mir im Tutorial mal 
angeschaut wie das funktionieren soll und habe dazu mal ein kleines 
Beispiel geschrieben.


; **************************************
; *** Vergleich :  0x150 > 0x130 ??? ***
; **************************************

ldi    r16, 0x01
ldi    r17, 0x50

ldi    r20, 0x01
ldi    r21, 0x30

cp    r16, r20
cpc    r17, r21

; "S" und "N" werden nicht gesetzt ---> i.O.

; ***************************************
; *** Vergleich :  0x012f < 0x130 ??? ***
; ***************************************

ldi    r16, 0x01
ldi    r17, 0x2f

ldi    r20, 0x01
ldi    r21, 0x30

cp    r16, r20
cpc    r17, r21

; "S" und "N" werden gesetzt ---> i.O.

; ***************************************
; *** Vergleich :  0x00ff < 0x130 ??? ***
; ***************************************

ldi    r16, 0x00
ldi    r17, 0xff

ldi    r20, 0x01
ldi    r21, 0x30

cp    r16, r20
cpc    r17, r21

; "S" und "N" werden gesetzt ---> i.O.

; ***************************************
; *** Vergleich :  0x0208 > 0x130 ??? ***
; ***************************************

ldi    r16, 0x02
ldi    r17, 0x08

ldi    r20, 0x01
ldi    r21, 0x30

cp    r16, r20
cpc    r17, r21

; "S" und "N" werden gesetzt ---> NICHT i.O. !!!

loop:

rjmp  loop


Im letzten Vergleich stimmt das Ergebnis des Statusregisters nicht, also 
anders gesagt ich habe wohl immer noch ein Problem mit dem 7. bit 
welches als Vorzeichen fungiert.

Ich möchte quasi den Wert des ADC's mit 0x0130 vergleichen und 
herausfinden ob er über bzw. unter dem Schwellwert von 0x0130 liegt.

Wie kann ich denn dieses Problem lösen?

Vielen Dank im voraus


lg Torsten

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab nur flüchtig raufgeschaut, aber Du vergleichst falschrum. Erst 
L-Byte und dann H-Byte mit Übertrag des Low-Vergleiches.
Ist schließlich nur eine Subtraktion, das Compare, bei der die Register 
nicht verändert werden und das Ergebnis die Flags setzt.

Gruß aus Berlin
Michael

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torsten Ohne wrote:
> cpc    r17, r21
>
> ; "S" und "N" werden gesetzt ---> NICHT i.O. !!!
Versuch mal, anhand der Befehlssatzdokumentation zu verstehen, was cp 
bzw. cpc überhaupt machen! Die machen beide nichts anderes, als 
implizit den zweiten Operanden vom ersten abzuziehen. Und wenn der 
zweite Operand größer ist als der erste, was in diesem Fall der Fall 
ist, dann kommt ein im Zweierkomplement negativer Wert heraus. Dadurch 
werden selbstverständlich das N- und S-Flag gesetzt.

Wenn Du vorzeichenlose Zahlen betrachten willst, dann hast Du mit den 
beiden genannten Flags überhaupt nichts zu tun! Die sind nur für die 
Behandlung von im Zweierkomplement dargestellten Zahlen interessant.

Du schreibst übrigens auch nichts darüber, was Du mit dem Ergebnis des 
Vergleiches überhaupt anstellst. Welchen Branch-Befehl verwendest Du?

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.