AVR - Pin-Abfrage invertieren

Gast #4471127
Lesenswert?

Hallo!

Bei
if ( PINA && ( 1 << PINA0 ) ) { }
wird der Funktionsblock ausgeführt, wenn Pin A0 auf HI liegt.

Der Funktionsblock soll aber nur ausgeführt werden, wenn Pin A0 auf LO 
liegt.

Das kann man vermutlich erreichen, wenn man die Abfrage invertiert.

Geht das möglicherweise so?

if (!(PINA && ( 1 << PINA0 )) ) { }
Gast #4471153
Lesenswert?

jow schrieb:
> if ( PINA && ( 1 << PINA0 ) ) { }

Das Nachdenken über den negierten Ausdruck kannst Du auch dem Compiler 
überlassen:
1
bool pin_is_high =  PINA & ( 1 << PINA0 ) ;
2
if (!pin_is_high)
3
{
4
    // ......
5
}
Das ist auch für die Nachwelt (Du in 2 Wochen ;) ) etwas lesbarer.
Moderator (Firma: Titel) Persönliche Seite #4471216
Lesenswert?

Tom schrieb:
> Das Nachdenken über den negierten Ausdruck kannst Du auch dem Compiler
> überlassen
Ich würde mich aber nicht unbedingt darauf verlassen, dass der das dann 
auch immer sauber rausoptimiert...

Wenn schon, dann würde ich das über ein #define machen:
1
#define pinA0_is_high (PINA & (1<<PINA0))
2

3
....
4

5
if (!pinA0_is_high)
6
{
7
    // ......
8
}
Gast #4471257
Lesenswert?

jow schrieb:
> Bei
> if ( PINA && ( 1 << PINA0 ) ) { }
> wird der Funktionsblock ausgeführt, wenn Pin A0 auf HI liegt.
>
> Der Funktionsblock soll aber nur ausgeführt werden, wenn Pin A0 auf LO
> liegt.

Liebe Leute,

der TO hat doch geschrieben:
WENN PA0 == LOW,
DANN mache irgendwas.

Eine Anfrage a la
if (!(PINA & ( 1 << PINA0 )) ) { }

bedeutet aber:
WENN irgendetwas anderes außer PA0 Low ist
DANN mache was.

Sobald mann zwei Eingänge (z.B. Taster, die nach GND schalten) getrennt 
voneinander beutzen will gibt es hier jawohl ein Problem.

Richtig wäre in dem Fall:

if (~PINA & ( 1 << PINA0 )) ) { }

Werner
Gast #4471283
Lesenswert?

U. C. schrieb:
> #define pinA0_is_low (PINA | (1<<PINA0))

Werner schrieb:
> Eine Anfrage a la
> if (!(PINA & ( 1 << PINA0 )) ) { }
> [bedeutet]
> "WENN irgendetwas anderes außer PA0 High ist"


Das bestätigt ein klein wenig den Vorschlag, das nicht schwierige, aber 
unübersichtliche Invertieren von Bedingungen (egal ob man die 
ursprüngliche Bedingung jetzt in einer dokumentierenden 
Zwischenvariablen, einem Makro oder einer Funktion versteckt) besser dem 
Compiler zu überlassen.
#4471300
Lesenswert?

@ Werner (Gast)

>> Der Funktionsblock soll aber nur ausgeführt werden, wenn Pin A0 auf LO
>> liegt.

>der TO hat doch geschrieben:
>WENN PA0 == LOW,
>DANN mache irgendwas.

Stimmt.

>Eine Anfrage a la
>if (!(PINA & ( 1 << PINA0 )) ) { }

>bedeutet aber:
>WENN irgendetwas anderes außer PA0 Low ist
>DANN mache was.

Stimmt nicht. Siehe Bitmanipulation.

>Sobald mann zwei Eingänge (z.B. Taster, die nach GND schalten) getrennt
>voneinander beutzen will gibt es hier jawohl ein Problem.

Nö.

>Richtig wäre in dem Fall:
>if (~PINA & ( 1 << PINA0 )) ) { }

Nö, das wäre nur der Fall, wenn du deinen LOW aktiven Taster per 
Software als HIGH aktiv auswerten willst.
Gast #4471569
Lesenswert?

Werner schrieb:
> Eine Anfrage a la
> if (!(PINA & ( 1 << PINA0 )) ) { }
>
> bedeutet aber:
> WENN irgendetwas anderes außer PA0 Low ist
> DANN mache was.

Bei mir im Programm funktioniert es tadellos mit drei verschiedenen 
A-Pins gleichzeitig.


Falk B. schrieb:
>>Richtig wäre in dem Fall:
>>if (~PINA & ( 1 << PINA0 )) ) { }
>
> Nö, das wäre nur der Fall, wenn du deinen LOW aktiven Taster per
> Software als HIGH aktiv auswerten willst.

So ganz verstehe ich das nicht. Kann man das an einem konkreten Beispiel 
aufzeigen?
#4471587
Lesenswert?

@ jow (Gast)
>>>if (~PINA & ( 1 << PINA0 )) ) { }
>> Nö, das wäre nur der Fall, wenn du deinen LOW aktiven Taster per
>> Software als HIGH aktiv auswerten willst.

>So ganz verstehe ich das nicht. Kann man das an einem konkreten Beispiel
>aufzeigen?

Ganz einfach. Meist sind Taster low aktiv angeschlossen, so wie hier.

https://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Hardware

Taste nicht gedrückt -> Input Bit = 1
Taste       gedrückt -> Input Bit = 0

Wenn man das intern alles auf high aktive Logik umwandlen will, 
invertiert man einfach PINx beim Lesen. Damit ist alle Logik in der 
Software high aktiv und man muss nicht immer umdenken.

if (~PINA & ( 1 << PINA0 )) { /*PA0 Taste gedrückt*/ }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren