Forum: Compiler & IDEs Zwei Portpins (einer high, der andere low) über if abfragen


von Thomas W. (ram99)


Lesenswert?

Hi
Ich bekomme es nicht hin....
Wie kann ich in einer If Bedingung ein Pin mit high und den anderen mit 
low vom selben Port abfragen z.B Wenn Taster 1 und nicht Taster 2 dann 
True.

Algemein habe ich es noch nicht verstanden wie man zwei Pins in einer if 
abfrägt also auch wenn zwei verOdert oder verUndet werden.

Das verstehe ich noch:
if (PIND &(1<<PIND5))      wenn PIND5 high
if (!(PIND &(1<<PIND5)))   wenn PIND5 low

Gruß und Danke

Thomas

von Mark (Gast)


Lesenswert?

Pseudocode
1
if( ( PIN1 == 1) && ( PIN2 == 0 ) ){
2
   TuWas();
3
}
4
else{
5
   tuWasAnderes();
6
}

von Michael H. (michael_h45)


Lesenswert?

Thomas Webster schrieb:
> Algemein habe ich es noch nicht verstanden wie man zwei Pins in einer if
> abfrägt also auch wenn zwei verOdert oder verUndet werden.

Du willst dir also ein C-Buch oder -Tutorial durchlesen?
Das ist genau das, was du hier sagst ^^

z.B.: 
http://www.c-plusplus.de/tuts/c/c_Informatik_und_C_Skript_Release_2_4_IOE.pdf

von Peter D. (peda)


Lesenswert?

Thomas Webster schrieb:
> Algemein habe ich es noch nicht verstanden wie man zwei Pins in einer if
> abfrägt also auch wenn zwei verOdert oder verUndet werden.

Die Operatoren stehen in jeder C-Referenz. Die muß man griffbereit 
haben, wenn man die Operatoren (noch) nicht auswendig kennt.

Man kann aber auch IFs beliebig schachteln.

von Karl H. (kbuchegg)


Lesenswert?

Mark schrieb:

> if( ( PIN1 == 1) && ( PIN2 == 0 ) ){

Es ist zwar nur Pseudocode, aber an den TO gerichtet:

Das soll nicht bedeutet, dass der explizite Vergleich mit 0 bzw. 
(schlimmer) 1 erstrebenswert wäre. Diese expliziten Vergleiche sind es 
nicht. Ganz im Gegenteil können die gefährlich sein - man schiesst sich 
da ganz schnell ins Knie.

> Das verstehe ich noch:
> if (PIND &(1<<PIND5))      wenn PIND5 high
> if (!(PIND &(1<<PIND5)))   wenn PIND5 low

wo liegt dann jetzt das Problem?

Wieder als Pseudocode ausgedrückt steht doch da

if ( Pin_5_ist_high )
if ( Pin_5_ist_low )

wenn du dir jetzt noch überlegst, was denn der 'Textbaustein' für 
'Pin_5_ist_high' bzw. 'Pin_5_ist_low' ist, dann kann es doch nun 
wirklich kein Problem sein, mehrere dieser Textbausteine mittels 
logischem Und bzw. logischem Oder je nach Anforderung zu kombinieren.

  if( Pin_5_ist_high  UND  Pin_7_ist_high )
     ....

in den then Pfad kommt man ofensichtlich daher nur dann, wenn beide Pins 
high sind. Anstatt der umgangssprachlichen Bausteine setzt du wieder die 
C-Entsprechung dafür ein, nimmst noch den richtigen C-Operator für UND, 
und du hast deine Abfrage. Das ist so einfach wie das 'Lösen' dieser 
8-Teile Puzzles für 3-jährige. Sobald man begriffen hat, das man für das 
jeweilige Loch nur ein Puzzleteil mit genau dieser Form suchen muss, ist 
die Sache gegessen.

von Thomas W. (ram99)


Lesenswert?

Okay, hatte heute morgen um 6.23 (ohne schlaf) einen Denkfehler. Mein 
Code musste in die else Bedingung und ich habe es irgendwie versucht in 
der if zu lassen und hinzubiegen.


@michael_h45

Danke für den Link - kann ich gut gebrauchen

Danke

von Thomas W. (ram99)


Lesenswert?

Eine Frage habe ich aber noch:

if(!(PIND &(1<<PIND5)))    oder
if(!(PIND & 0x20))         in Hex - Führe aus wenn PIND5 = Low

Wie muss das aussehen wenn ich das Binär Codiert machen möchte?

if(PIND & 1011111)  ??
if(PIND = 1011111)  ??  wie ist die Syntax ??

Gruß

von Peter D. (peda)


Lesenswert?

Thomas Webster schrieb:
> wie ist die Syntax ??

Wofür?
Willst Du nur 2 Pins testen oder alle 8 Pins des Ports?

Dadurch, daß Du eine 6-stellige Binärzahl hinschreibst, verschwinden 
nicht magisch irgendwelche Pins.
Du mußt unerwünschte Bits maskieren (AND) und dann auf den gewünschten 
Wert vergleichen.

von Thomas W. (ram99)


Lesenswert?

Peter Dannegger schrieb:
> Thomas Webster schrieb:
>> wie ist die Syntax ??
>
> Wofür?
> Willst Du nur 2 Pins testen oder alle 8 Pins des Ports?
>
> Dadurch, daß Du eine 6-stellige Binärzahl hinschreibst, verschwinden
> nicht magisch irgendwelche Pins.
> Du mußt unerwünschte Bits maskieren (AND) und dann auf den gewünschten
> Wert vergleichen.

Magisch wäre toll...
In dem Fall wollte ich den gesamten Port testen!

von Michael H. (michael_h45)


Lesenswert?

Thomas Webster schrieb:
> if(PIND & 1011111)  ??
> if(PIND = 1011111)  ??  wie ist die Syntax ??

Thomas Webster schrieb:
> @michael_h45
>
> Danke für den Link - kann ich gut gebrauchen

jetzt aber nicht einstauben lassen.
die anzahl der operatoren in C ist wirklich überschaubar und intuitiv...

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.