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


von Torsten O. (Gast)


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

von Klugscheisser (Gast)


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.

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von Falk B. (falk)


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

von Torsten O. (Gast)


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

von Torsten O. (Gast)


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

von Michael U. (amiga)


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

von Johannes M. (johnny-m)


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?

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.