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


von Matthias L. (Gast)


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

von der mechatroniker (Gast)


Lesenswert?

1
if (!(PINE & (1 << 7)) ^^ (PIND & (1 << 3))) {
2
    ...
3
}

von Johannes M. (johnny-m)


Lesenswert?

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

von Matthias L. (Gast)


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

von Matthias L. (Gast)


Lesenswert?

Das geht net..:
1
if (  ( PINE & (1<<PE6) )  ^^  ( PIND & (1<<PD0) ) )
2
{
3
..
4
}
5
else
6
{
7
..
8
}

der WinAVR bringt folgende Fehlermeldung:

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


Aber was soll mir das sagen?

von Johannes M. (johnny-m)


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...

von Matthias L. (Gast)


Lesenswert?

Hm.. also geht die obige Lösung garnicht??

von Matthias L. (Gast)


Lesenswert?

1
if (    ( (PINE & (1<<PE6) ) &&   ( PIND & (1<<PD0) ) )
2
     || (!(PINE & (1<<PE6) ) &&  !( PIND & (1<<PD0) ) )  )

Einzige Möglichkeit?

von Peter D. (peda)


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:
1
if( !(PINE & 1<<PE6) ^ !(PIND & 1<<PD0) )


Peter

von Zardoz (Gast)


Lesenswert?

Gibt's denn da keine ExOr-Verknüpfung?

Nice week,
Zardoz

von Zardoz (Gast)


Lesenswert?

PS: Sorry, überlesen ...

von Karl H. (kbuchegg)


Lesenswert?

1
if (  (( PINE & (1<<PE6) ) != 0 ) == (( PIND & (1<<PD0) ) != 0 ) ) 
2
{
3
..
4
}

von Matthias L. (Gast)


Lesenswert?

habs jetzt so gelöst, scheint zu funktionieren:
1
if (  ( (PINE>>PE6)^(PIND>>PD0) ) & 0x01  )
2
{
3
...
4
}
5
else
6
{
7
..
8
}

Danke an alle!

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.