Forum: Mikrocontroller und Digitale Elektronik Inhalt von FLAGS auf ungleicheit prüfen...


von AVRli (Gast)


Lesenswert?

Hi!

Ich muss mich mal wieder mit einer Frage an Euch wenden...
Ich möchte gerne abfragen ob der Zustand von 2 FLAGS unterschiedlich
ist. Wie macht man sowas.

Ich habe ein FLAG welches gesetzt ist und eines welches nicht gesetzt
ist. Nun bräuchte ich die Information...

Ist FLAG1<>FLAG2 dann...

.euq FLAG1 = 7
.euq FLAG2 = 8

Nur dieser Verglaich mit (FLAG1!=FLAG2) ergibt immer 1
da diese ja nie gleich sind. Da er ja immer nur 7 mit 8 Verglaicht
nicht aber den Status "gesetzt" oder "gelöscht"...

MfG AVRli

von Peter Kasi (Gast)


Lesenswert?

Ok, ich versuchs mal (ohne Anspruch auf Perfektion/Effizienz)

Ich geh mal davon aus, du meinst mit Flag1 das 7te Bit und mit Flag2
das 8te

if((Flag1 & 0x40) << 1) != (Flag2 & 0x80))


// Bits ausmaskieren durch '&' und dann das 7te Bit auf die 8te
Stelle schieben, anschließend kannst du die beiden Zahlen vergleichen

Gruß
Peter

von André Kronfeldt (Gast)


Lesenswert?

@Peter: Hiermit vergleicht er aber nur, ob 0 != 0, da
7 & 0x40 Null ergibt (unabhängig vom shiften) und 8 & 0x80 ist auch
null. Wenn dann sowas wie xxx & 1 << Flag1 und xxx & 1 << Flag2 zum
maskieren. Da die Bitstellen alleine schon unterschiedlich sind, wirste
nie den Zustand 'gleich' haben. Möglich wäre aber sowas:

if((*Flagregister >> (8 - Flag1)) & 1 != (*Flagregister >> (8 - Flag2))
& 1))

Das sorgt dafür, daß der Inhalt der Register nach rechts geschoben wird
(Flag1 und Flag2 sind übrigens 0...7 und nicht 1...8) und dann nur das
untere Bit eingeblendet wird. Dann kann man auch vergleichen.

Je nach verwendetem Compiler. Aber nun das ganze prozessorspezifisch
und in ASM ;-)

@AVRli (das impliziert wohl AVRs, oder?):
In Assembler würd ich das so lösen:

;Vergleiche ob Carry != T
    sbcs C1    ; Springe, wenn C gesetzt
    brtc equal ; Springe, wenn T gelöscht
C1: brts equal ; Springe, wenn T gesetzt

notequal:
;- T != C
equal:
;- T = C

Grüße,
André

von André Kronfeldt (Gast)


Lesenswert?

Nachtrag:

'xxx & 1 << Flag1' ist dasselbe wie 'xxx & (1 << Flag1)'. Shiften
bindet  stärker als Verknüpfung. Ich hätte doch besser Klammern setzen
sollen. Nicht, daß das noch verwirrt.

Grüße,
André

von André Kronfeldt (Gast)


Lesenswert?

Nachtrag2:

if((*Flagregister >> (8 - Flag1)) & 1 != (*Flagregister >> (8 -
Flag2))
& 1))

ist falsch.

if((*Flagregister >> Flag1) & 1 != ((*Flagregister >>  Flag2) & 1))

ist besser.

@André: Denk vorher nach, bevor Du klugscheißt ;-)

Grüße,
André

von Peter Kasi (Gast)


Lesenswert?

Natürlich hast du recht André,
meine (fehl)Interpretation ging mehr in die Richtung:
Er hat zwei Variablen: Flag1 und Flag2 und er will das 7te Bit in Flag1
und das 8te Bit in Flag2 miteinander vergleichen. Hab mich durch
(FLAG1!=FLAG2) verwirren lassen :)





Gruß
Peter

von AVRli (Gast)


Lesenswert?

Hi ihr beiden, ;-)

vielen Dank das ihr euch mein Problem angenommen habt.
Die Zeilen mit dem "if" sind wohl C oder Bascom Sachen...
Ich verwende aber nur das Assembler von Atmel also "AVR Studio"

Sorry tut mir echt Leid aber das hätte ich euch auch sagen können :-(

Wobei ich sagen muss das ich bei den Hinweisen mit dem
C und T Flag vergleichen auch noch nicht ganz schlau geworden bin.

Ich werde mal versuchen herauszubekommen wovür das T Flag da ist...
C ist klar... also das wird gesetzt wenn man die obere bzw untere
Grenze eines Bytes überschreitet...

MfG AVRli

von Conlost (Gast)


Lesenswert?

Hallo,
eventuell hilft das ja:

http://www.atmel.com/dyn/resources/prod_documents/DOC0856.PDF

Dort findest du unter anderem etwas über das Statusregister
und die verschiedenen Flags und wodurch die gesetzt werden.
Ich hoffe ich konnte helfen.

Gruß,
Arno

von André Kronfeldt (Gast)


Lesenswert?

@AVRli:

C und T sind natürlich nur Beispielflags. Befehle sind bei anderen
Flags natürlich entsprechend anzupassen. Wenn Du nur einzelne Bits in
bestimmten Registern auf Gleichheit testen willst geht das auch
anders.
Kommt halt darauf an, was man unter 'Flags' versteht. Im AVR haste
ein paar davon. Kannst natürlich auch 'customized Flags' nehmen, also
Flags, die Routinen von Dir setzen. Die haben natürlich nichts mit den
Prozessorflags zu tun.

Grüße,
André

von AVRli (Gast)


Lesenswert?

Hi!

Dann beschreibe ich mal nochmal neu... ;-)
Also es sind selbst definierte "FLAGS"...

.equ FprgRmb = 3
.equ FprgRmbSav = 4

...das Register in welchem sie abgelegt werden ist...

.def FLAGprg = r22   ;Programm FLAG's

...ok?

Nun setzen und löschen der Zustände 1 bzw 0 der Flags geschiet mit...

sbr FLAGout,1<<FprgRmbOn
cbr FLAGout,1<<FprgRmbOn

... soweit ist alles klar... ;-D

Nun zu dem was ich nicht hinbekomme... ;-(
Ich möchte nun Befehle abarbeiten wenn sich das "FprgRmb" vom
"FprgRmbSav" unterscheidet.

Man könnte ja ein zweites Register verwenden aber das ist doch
Verschwendung... ;-I

Versuche mit != schlugen fehl da er immer die Position 3 mit 4, welche
sich ja hinter dem "Namen" FprgRmb und FprgRmbSav versteckt,
verglichen hat... Ergebniss wahr immer 1... ;-(

Nun das kann doch nicht so schwer sein... oder doch...?

Allen ein schönes Wochenende!!! AVRli ;-D

von André Kronfeldt (Gast)


Lesenswert?

Aha. Customized also ;-)
Dann also mal gleich in assembler ;-)

1. WARNUNG: Wenn Du mit 1<<FprgRmbOn Flags setzt und löschst, kriegste
spätestens Probleme bei '.euq FLAG2 = 8' Bitte nur zwischen 0 und 7
die Bitnummern setzen. So. Jetzt der Code:

     SBRC Flagregister, FLAG1
     jmp FLAG1_IS_1
     SBRC Flagregister, FLAG2
     jmp notequal
     jmp equal
FLAG1_IS_1:
     SBRC Flagregister, FLAG2
     jmp equal
notequal:
     ...

Grüße,
Andre

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.