Forum: Compiler & IDEs Bitmaskierung Aufgabe


von Bernd O. (predator7)


Lesenswert?

Hallo ich habe diese Aufgaben zu Bitmaskierung aber ich verstehe da was 
nicht. Die Lösungen sind hier schon eingetragen.



1) Use of the Port4 pins as input from external signal sources. Write a 
loop, which waits
until P4(2) is reset to 0.

#include <mpp1.h> /* at the beginning of the source */
...
while( (PORT4 & 0x04) ==0x04); /* shorter: while( (PORT4 & 0x04)) ; */
...


2) Write a while-loop, which waits until P2(1) and P2(0) is set from 
external signal to 1

#include <mpp1.h> /* at the beginning of the source */
...
P2DR=0xFD; /* optional set P2(1) und P2(0) as input */
...
while ((PORT2 & 0x02) !=0x02) && ((PORT2 & 0x01) !=0x01));
/* same as while (!(PORT2 & 0x03) ==0x03); */





Bei 1) dieses while( (PORT4 & 0x04) ==0x04), kommt da aus der Klammer 
nicht entweder true oder false raus, da es ein bitweise UND ist. Dann 
wird es ja noch mit ==0x04 verglichen, aber man kann doch nicht true 
oder false damit vergleichen, oder habe ich hier einen Denkfehler?



Bei 2) dieser Ausdruck while (!(PORT2 & 0x03) ==0x03): könnte man da 
nicht auch das schreiben while ((PORT2 & 0x03) !=0x03) oder das while 
(!(PORT2 & 0x03)), wäre es nicht das gleiche?


Und nochmal bei 2) dieser Ausdruck while ((PORT2 & 0x02) !=0x02) && 
((PORT2 & 0x01) !=0x01)), könnte man da nicht auch so schreiben, while 
(!(PORT2 & 0x02)) && (!(PORT2 & 0x01)) oder so while (!(PORT2 & 0x02) 
==0x02) && (!(PORT2 & 0x01) ==0x01)).

von Oliver (Gast)


Lesenswert?

bernd olsen schrieb:
> Bei 1) dieses while( (PORT4 & 0x04) ==0x04), kommt da aus der Klammer
> nicht entweder true oder false raus, da es ein bitweise UND ist.

Da kommt aus der Klammer das Ergebnis eines bitweises Und raus.

Lies mal in deinem C-Buch das Kapitel zu "boolean" durch. Es könnte 
sein, daß es das da gar nicht gibt, weil C kein boolean mit "true" und 
"false" als eigenständige Typen kennt. C interpretiert in logischen 
Vergelichen den Wert 0 als false, alle anderen Werte (!!!) als true.

Wenn du dir unter diesem Gesichtspunkt deine Aufgaben nochmals ansiehst, 
sollte dir das klarer werden.

Oliver

von Garden (Gast)


Lesenswert?

Hier gibt es ein Video zu einer ähnlichen Aufgabe.

Bitweises Auslesen eines Ports:

http://et-tutorials.de/1991/bitweises-auslesen-eines-ports/

von Yalu X. (yalu) (Moderator)


Lesenswert?

bernd olsen schrieb:

> while ((PORT2 & 0x02) !=0x02) && ((PORT2 & 0x01) !=0x01));
> /* same as while (!(PORT2 & 0x03) ==0x03); */

Da hat die Lösungsvorlage bereits einen Fehler: Die erste Variante ist
noch richtig, bei der zweiten ist die Bedingung nie erfüllt, das das
Regebnis des logischen NOT (!) niemals 0x03 ist.

> Bei 1) dieses while( (PORT4 & 0x04) ==0x04), kommt da aus der Klammer
> nicht entweder true oder false raus, da es ein bitweise UND ist.

Nein, gerade weil es ein bitweises UND ist, kommt eine Bitfolge, also
eine Integer-Zahl heraus. Ein logisches UND (&&) würde True oder False
liefern.

> Bei 2) dieser Ausdruck while (!(PORT2 & 0x03) ==0x03): könnte man da
> nicht auch das schreiben while ((PORT2 & 0x03) !=0x03)

Nein, das würde warten, bis mindestens eines der beiden Bits gelöscht
ist. Gefragt war aber nach einer Schleife, die wartet, bis beide Bits
gelöscht sind.

> oder das while (!(PORT2 & 0x03)), wäre es nicht das gleiche?

Das wiederum ist richtig.

von Karl H. (kbuchegg)


Lesenswert?

bernd olsen schrieb:

> Bei 1) dieses while( (PORT4 & 0x04) ==0x04), kommt da aus der Klammer
> nicht entweder true oder false raus

nein

>, da es ein bitweise UND ist.

eben.
Genau deshalb kommt da KEIN logischer Wert raus

Angenommen PIN Register würde bitmässig liefern

    01011100

dann wird verundet, und zwar Bit für Bit


      01011100
 &    00010000
    ----------
      00010000

und das Ergebnis hat deswegen diese eine 1, weil in dem was vom PIN 
Register kam, an dieser Stelle ebenfalls eine 1 war. Denn 1 UND 1 ergibt 
ja wieder 1, während für die andern Bitpositionen eine 0 rauskommt. Denn

   0 UND 0   ergibt 0
   0 UND 1   ergibt 0
   1 UND 0   ergibt 0

D.h. die Maske (die untere Zeile) ist cleverer Weise genau so gewählt, 
dass nur die eine interessierende Bitposition überhaupt eine 1 liefern 
kann. Alle anderen Bitpositionen liefern mit Sicherheit eine 0, weil ja 
in der Maske an dieser Stelle ein 0-Bit liegt.


Übrigens: Man muss das PIN Register abfragen und nicht das PORT 
register, wenn man Eingänge einlesen will.

> Dann
> wird es ja noch mit ==0x04 verglichen, aber man kann doch nicht true
> oder false damit vergleichen, oder habe ich hier einen Denkfehler?

Vernünftigerweise vergleicht man gar nicht.
Das gibt nur Fehler.

   PINB & 0x04

liefert ein Ergebnis. Dieses Ergebnis ist entweder nicht 0 oder es ist 
0. Und genau das passt wieder zu C, welches jedes Ergebnis ungleich 0 
als logisch wahr wertet.

>
> Bei 2) dieser Ausdruck while (!(PORT2 & 0x03) ==0x03): könnte man da
> nicht auch das schreiben while ((PORT2 & 0x03) !=0x03) oder das while
> (!(PORT2 & 0x03)), wäre es nicht das gleiche?

Probiers aus!

! ist die logische Negation
Alles ungleich 0 (als logisch wahr) wird zu 0 (als logisch falsch)
Alles gleich 0 (also logisch falsch) wird zu 1 (also logisch wahr)

> Und nochmal bei 2) dieser Ausdruck while ((PORT2 & 0x02) !=0x02) &&
> ((PORT2 & 0x01) !=0x01)), könnte man da nicht auch so schreiben, while
> (!(PORT2 & 0x02)) && (!(PORT2 & 0x01)) oder so while (!(PORT2 & 0x02)
> ==0x02) && (!(PORT2 & 0x01) ==0x01)).

IM einfachsten Fall.
Nimm eine BItbelegung an und probiers durch.
So lernst du am meisten dabei.

Aber Achtung: welches sind logische Operationen und welches sind 
Bitoperationen!

logische Operationen liefern immer 0 oder 1, während Bitoperationen 
einfach auf die Einzelbits eines Bytes operieren.

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.