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.
Hi Das N-Flag wird gesetzt, wenn Bit 7 = 1 ist. 0..7F positiv, FF..80 negativ. MfG Spess
@ 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
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.