www.mikrocontroller.net

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


Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Kasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: Peter Kasi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Conlost (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
eventuell hilft das ja:

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

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

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.