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
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
@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é
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é
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é
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
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
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
@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é
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.