www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UND Verknüpfung


Autor: Wertenbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian L. (lorio)
Datum:

Bewertung
0 lesenswert
nicht 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:
while(~(PINC & (1<<PINC0)) && ~(PINC & (1<<PINC1))) {

}

BTW:

Der Strichpunkt nach der Schleifenbedingung ist falsch.

Autor: Stefan Ernst (sternst)
Datum:

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

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

Autor: Wertenbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Christian L. (lorio)
Datum:

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

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

}

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?

Autor: Wertenbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

   }

}

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schonmal überlegt, die semikolons nach dem while wegzunehmen?

Autor: ... (Gast)
Datum:

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

Autor: mandrake (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.