Forum: Mikrocontroller und Digitale Elektronik UND Verknüpfung


von Wertenbach (Gast)


Lesenswert?

Hallo,
verstehe nicht ganz was da passiert bzw ich verstehe schon aber es macht 
nicht
das was es soll.

Ich will erreichen dass beim betätigen (auf Masse gezogen von 1 auf 0) 
von PIN0 und PIN1 es in die schleife gesprungen wird. Ich habe es 
getestet und es funktioniert wie eine oder Verknüpfung.
Mache ich anstatt logisch und(&&) logisch oder(||) so funktioniert es 
wie gewünscht aber warum????

while((PINC & (1<<PINC0)) && (PINC & (1<<PINC1)));
 {

 }

Die Suche habe ich auch schon bemüht aber nichts brauchbares gefunden.

von Christian L. (lorio)


Lesenswert?

Wertenbach wrote:
> Hallo,
> verstehe nicht ganz was da passiert bzw ich verstehe schon aber es macht
> nicht
> das was es soll.
>
> Ich will erreichen dass beim betätigen (auf Masse gezogen von 1 auf 0)
> von PIN0 und PIN1 es in die schleife gesprungen wird. Ich habe es
> getestet und es funktioniert wie eine oder Verknüpfung.
> Mache ich anstatt logisch und(&&) logisch oder(||) so funktioniert es
> wie gewünscht aber warum????
>
> while((PINC & (1<<PINC0)) && (PINC & (1<<PINC1)));
>  {
>
>  }
>
> Die Suche habe ich auch schon bemüht aber nichts brauchbares gefunden.

Bei deinem Code springt man auch nur in die Schleife, wenn BEIDE High 
sind (also NICHT auf Masse gezogen sind). Wenn du willst, dass er erst 
rein springt, wenn BEIDE auf Low sind musst du negieren. Also:
1
while(~(PINC & (1<<PINC0)) && ~(PINC & (1<<PINC1))) {
2
3
}

BTW:

Der Strichpunkt nach der Schleifenbedingung ist falsch.

von Stefan E. (sternst)


Lesenswert?

Christian L. wrote:
1
while(~(PINC & (1<<PINC0)) && ~(PINC & (1<<PINC1))) {

Nein, das funktioniert genauso wenig. Man braucht hier ein logisches 
Not, kein binäres.
1
while(!(PINC & (1<<PINC0)) && !(PINC & (1<<PINC1))) {

von Wertenbach (Gast)


Lesenswert?

Also bei mir ist es genau anders rum

Beide Pins sind auf 1 --> es wird nicht in die Schleife rein gesprungen
Ein Pin ist auf 0 --> es wird in die Schleife gesprungen

Wie du es beschrieben hast funktioniert es:
while(~(PINC & (1<<PINC0)) && (PINC & (1<<PINC1)));

Aber warum wird ohne Invertierung, aus einer und Verknüpfung eine oder 
Verknüpfung gemacht???

von Christian L. (lorio)


Lesenswert?

Stefan Ernst wrote:
> Christian L. wrote:
>
>
1
> while(~(PINC & (1<<PINC0)) && ~(PINC & (1<<PINC1))) {
2
>
>
> Nein, das funktioniert genauso wenig. Man braucht hier ein logisches
> Not, kein binäres.
>
>
1
> while(!(PINC & (1<<PINC0)) && !(PINC & (1<<PINC1))) {
2
>

OH, stimmt!
Lange nichts mehr gecoded.
Jo, ~ ist ja der Negierer auf Bitebene.
Sorry, Stefan hat recht.
1
while(!(PINC & (1<<PINC0)) && !(PINC & (1<<PINC1))) {
2
3
}

Das ist was du suchst.



EDIT:
@Wertenbach:
1. Sicher, dass du IN die Schleife und nicht heraus springen willst?
2. Sicher, dass du die Pins von VCC aud GND ziehst?


Egtl müsste "while(~(PINC & (1<<PINC0)) && (PINC & (1<<PINC1))){};" 
IMMER logisch wahr sein, oder irr ich mich? Beide Teilausdrücke sind 
doch IMMER ungleich 0 und somit wahr?

von Wertenbach (Gast)


Lesenswert?

Ja ich bin sicher dass ich in die Schleife springen will.
Ja die Pins werden von 1 auf 0 gezogen.

Hier
der ganze Code

while(1)
{
  while(!(PINC & (1<<PINC0)) && !(PINC & (1<<PINC1)));
  {
       do
   {
   PORTA=0b00000111;
   }
   while(!(PINC & (1<<PINC6))) && !(PINC & (1<<PINC7)));
         PORTA=0b00000000;

   }

}

von Martin (Gast)


Lesenswert?

schonmal überlegt, die semikolons nach dem while wegzunehmen?

von ... (Gast)


Lesenswert?

1
while((PINC & ((1<<PINC0) | (1<<PINC1))) == 0) {
2
  ...
bzw.
1
while(!(PINC & ((1<<PINC0) | (1<<PINC1)))) {
2
  ...

von mandrake (Gast)


Lesenswert?

>>Aber warum wird ohne Invertierung, aus einer und Verknüpfung eine oder
>>Verknüpfung gemacht???

Das ist das Gesetz von De Morgan.
Dieses De Morgan'sche Gesetz besagt:
!a & !b = !(a || b)
!a || !b = !(a & b)

Gruß Mandrake

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.