www.mikrocontroller.net

Forum: Compiler & IDEs zwei Portpins auf gleichheit prüfen


Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe folgendes vor:
(pseudocode)

if ( PINE7 = PIND3)
{
...
}

Also die Bedingung soll erfüllt sein, wenn beide Pins Low oder beide 
High sind..
Wie mache ich das am effektivsten..

PS: die beiden Pins liegen nicht auf dem selben Port.

Danke schonmal

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (!(PINE & (1 << 7)) ^^ (PIND & (1 << 3))) {
    ...
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matthias:
BTW: Der Vergleichs -Operator in C ist das "==". "=" macht eine 
Zuweisung!

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Johannes M. (johnny-m):

Das weiß ich, wollte ja nur das Problem darstellen und hab deshalb 
pseudocode drübergschrieben

Danke für die Antworten

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht net..:
if (  ( PINE & (1<<PE6) )  ^^  ( PIND & (1<<PD0) ) )
{
..
}
else
{
..
}

der WinAVR bringt folgende Fehlermeldung:

../propuhr_bl.c:255: error: expected expression before '^' token


Aber was soll mir das sagen?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"^" ist ein bitweiser Operator (ein logisches EXOR gibt es in C nicht). 
"^^" ist schlicht und ergreifend ein Syntaxfehler, weil es einen solchen 
Operator nicht gibt und deshalb der Compiler zwei bitweise EXOR direkt 
hintereinander sieht...

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm.. also geht die obige Lösung garnicht??

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (    ( (PINE & (1<<PE6) ) &&   ( PIND & (1<<PD0) ) )
     || (!(PINE & (1<<PE6) ) &&  !( PIND & (1<<PD0) ) )  )

Einzige Möglichkeit?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann den bitweisen Operator als logischen Operator mißbrauchen, wenn 
sichergestellt ist, das beide Ausdrücke nur 0 oder 1 sein können, z.b. 
durch eine logische Negation:

if( !(PINE & 1<<PE6) ^ !(PIND & 1<<PD0) )



Peter

Autor: Zardoz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt's denn da keine ExOr-Verknüpfung?

Nice week,
Zardoz

Autor: Zardoz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Sorry, überlesen ...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (  (( PINE & (1<<PE6) ) != 0 ) == (( PIND & (1<<PD0) ) != 0 ) ) 
{
..
}

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs jetzt so gelöst, scheint zu funktionieren:
if (  ( (PINE>>PE6)^(PIND>>PD0) ) & 0x01  )
{
...
}
else
{
..
}

Danke an alle!

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.