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
>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.
@ 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
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
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
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?