Forum: Compiler & IDEs überprüfen, ob mind 1 von 6 bit am port gesetzt ist


von Kaan A. (deranfaenger)


Lesenswert?

Hi Leute,

irgendwie bin ich zu blöd um das im Titel genannte Problem zu lösen.
Wie kann ich mit einer kurzen Bitoperation/-vergleich überprüfen, ob 
mindestens ein Bit auf high ist?

Meine Idee war folgende:
1
if ((PORTB<<2) > 3) { process(); };
hierbei schiebe ich ja die Bits um 2 nach links, sodass Bit Nr6 und 7 
"verschwinden". Dann wäre jede mögliche Kombination größer 3.
Aber das funktioniert nicht.
Habe ich das Bitshifting nicht ganz verstanden? Werden die 
herausgeschobenen Bits auf der anderen Seite wieder eingeschoben?

Mein anderer Lösungsweg ist dieser:
1
if ((PORTB & 1<<PORTB0)|(PORTB & 1<<PORTB1)|(PORTB & 1<<PORTB2)|(PORTB & 1<<PORTB3)|(PORTB & 1<<PORTB4)|(PORTB & 1<<PORTB5)){
2
    process();
3
};
Allerdigns ist das etwas zu lang.
Das geht bestimmt eleganter.
Außerdem sollte die Operation nicht zu viele Takte in Anspruch nehmen.

Grüße
Der Anfänger

von MaWin (Gast)


Lesenswert?

if(PORTB&0x3F)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Kaan Ayhan schrieb:
> Meine Idee war folgende:
>
>  if ((PORTB<<2) > 3) { process(); };
>
> hierbei schiebe ich ja die Bits um 2 nach links, sodass Bit Nr6 und 7
> "verschwinden".

Die Bits 6 und 7 verschwinden dadurch nicht, da die Schiebeoperation als
int (d.h. mit 16 Bit Breite) ausgeführt wird. Richtig wäre
1
if ((uint8_t)(PORTB<<2) > 3) { process(); };

Statt >3 würde auch schon >0 bzw. !=0 reichen oder einfach
1
if ((uint8_t)(PORTB<<2)) { process(); };

Der übliche Weg, einzelne oder mehrere Bits abzufragen, ist aber die
bitweise Und-Verknüpfing, wie von MaWin gezeigt.

von Falk B. (falk)


Lesenswert?


von Kaan A. (deranfaenger)


Lesenswert?

Ok verstehe. Danke für die schnellen Antworten.

Doch bei diesem vorgehen
> if(PORTB&0x3F)
vergleiche ich doch alle Bits. Sprich das Ergebnis ist gleich 1, wenn 
alle Bits korrekt sind. Oder sagt mir das nur das mindestens eines der 
genannten Bits korrekt ist?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kaan Ayhan schrieb:
> Oder sagt mir das nur das mindestens eines der genannten Bits korrekt
> ist?

s/korrekt/gesetzt/

Aber das war doch deine Fragestellung, oder?

von Kaan A. (deranfaenger)


Lesenswert?

Es war nur ein Verständnisfehler.
Problem ist gelöst danke euch

von Markus F. (mfro)


Lesenswert?

Wenn Du das leichter verstehst, kannst Du auch
1
if (i % 0x40) ...

schreiben. Schneller wird's davon aber nicht ;).

von Kaan A. (deranfaenger)


Lesenswert?

oO Kannst du die Bedingung erläutern?
was genau macht das %?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kaan Ayhan schrieb:
> was genau macht das %?

Spätestens jetzt ist es an der Zeit, dein C-Buch aus dem Bücherregal
zu holen.

von Kaan A. (deranfaenger)


Lesenswert?

Ja hast recht tut mir leid.
Normalerweise google ich immer nebenbei.
Hab gerade nur gedacht so gehts vielleicht schneller :)

von Markus F. (mfro)


Lesenswert?

1
if (i % 0x40) ...

heißt (aber nur weil Fasching ist) "wenn 40% der Bits gesetzt sind".



Ohneflachs: guck' in dein Buch ;)

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.