www.mikrocontroller.net

Forum: Compiler & IDEs Und Verknüpfung funktioniert nicht


Autor: Tscheburaschka (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

meine UND-Verknüpfung funktioniert nicht so wie ich will.

Folgenden Code habe ich von einem Kolegen bekommen, das funktioniert 
auch
wie eine UND-Verknüpfung, die Schreibweise ist aber etwas seltsam.


 while(1)
  {
  while((PINC & (1<<PINC0)) || (PINC & (1<<PINC1)));
   {
   do
  {
   PORTA=0b00000000;
   warte_ms(100);
   PORTA=0b11111111;
   warte_ms(100);

    }
  while((PINC & (1<<PINC6)) || (PINC & (1<<PINC7)));
    PORTA=0b11111111;

   }
 }

}

Könnte mir bitte das einer erklären?

Ich würde es so machen:
while((!(PINC & (1<<PINC0))) && (!(PINC & (1<<PINC1))));
   {
tu was
   }

Leider funktioniert es in der Schaltung nicht.
Woran liegt es?

Die Suche hat leider keine Antwort gegeben.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 while((PINC & (1<<PINC0)) || (PINC & (1<<PINC1)));
siehe http://www.imb-jena.de/~gmueller/kurse/c_c++/c_operlo.html, da ist 
eine art wahrheitstabelle, die den "||" ausdruck erklärt.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich würde es so machen:
>while((!(PINC & (1<<PINC0))) && (!(PINC & (1<<PINC1))));

>Leider funktioniert es in der Schaltung nicht.

Sind inzwischen alle verblödet?
Meine Güte rechne dir doch einfach mal die
Zwischenwerte aus:

PINC & (1<<PINC0) = erg1
!(PINC & (1<<PINC0)) = erg2


PINC & (1<<PINC1) = erg3
!(PINC & (1<<PINC1)) = erg4

erg2 && erg4 = ?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da kriecht mir doch noch so ein alter Spruch ins Gehirn:
Negierung der Eingänge und negierung des Ausganges
>= Umkehrung der Logik.

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

Und wenn du das Semikolon am Ende der Zeile
weglässt könnte das evtl. sogar gehen.
Oder gehören die Klammern nicht zum while() ?

Beim do würde ich das so machen:

   do
    {
    } while((PINC & (1<<PINC6)) || (PINC & (1<<PINC7)));

Das erhöht die Übersichtlichkeit ungemein.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist ;) Klammern vergessen:

while( ! ((!(PINC & (1<<PINC0))) && (!(PINC & (1<<PINC1)))))

Autor: Tscheburaschka (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal für die Antworten.

Ich habe es jetzt, es lag tatsächlich an dem Semikolon.

Mit logischer überlegung hat es dann auch mit der do while Schleife 
geklappt.

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.