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)).
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
Hier gibt es ein Video zu einer ähnlichen Aufgabe. Bitweises Auslesen eines Ports: http://et-tutorials.de/1991/bitweises-auslesen-eines-ports/
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.