"wenn Ausgang != Eingang mach was" - Brett vorm Kopf

Gast #2400626
Lesenswert?

Hey zusammen, einen schönen Sonntag wünsche ich!

Ich möchte eine Schützüberwachung realisieren, sprich feststellen wenn 
ein angesteuertes Schütz entweder kleben bleibt oder nicht anzieht.

Das Schütz wird mit log.1 angesteuert, der Eingang liefert bei 
Ansteuerung log.0.

Eigentlich ganz einfach dachte ich. Denn wenn beide Signale log.1 sind 
oder beide log.0 sind liegt ein Fehler vor (natürlich wird die 
Ansprechzeit des Schützes berücksichtigt).


Ich dachte diese Zeile wär der Schlüssel zum Erfolg...

if( (PINB & (1<<PB2)) == (PINC & (1<<PC0)) )

...aber die Geschichte klappt nur beim klebenbleiben des Schützes, 
sprich Ausgang=0 und Eingang=0 (angesteuert). Für den entgegengesetzten 
Fall klappt es nicht...

Ich habe alle möglichen Umstellungen, XOR mit Negierung probiert, sehe 
aber nun nach 1,5 Std den Wald vor lauter Bäumen nicht mehr.

Hat jemand von Euch einen Tipp für mich?

Danke und Gruß
Danny
Gast #2400656
Lesenswert?

ich war der Meinung bei das beim Vergleich (==) der Ausdruck in den 
Klammern in 0/1 umgesetzt, bzw. so gewertet wird... und nun fragt bitte 
nicht warum :)


wie schaut denn für diesen Fall eine elegante Lösung aus?
Folgendes ist denke ich leicht verständlich und funktioniert aber platt 
gefragt: "macht man das so"?   :)

if( ((PINB & (1<<PB2))>>PB2) == (PINC & (1<<PC0)) )
Persönliche Seite #2401177
Lesenswert?

Stefan Ernst schrieb:
> Simon K. schrieb:
>> Leute, Leute, Leute. Code muss selbsterklärend sein!
>
> "selbsterklärend" liegt aber zum Teil auch im Auge des Betrachters. ;-)
>
> Ich würde z.B. folgende Variante als noch "selbsterklärender"
> favorisieren:
>
1
if ((_Bool)(PINB & (1<<PB2)) == (_Bool)(PINC & (1<<PC0)))

Und was ist _Bool? Wo gibt es den Datentyp? Und zwar in einer derartigen 
Definition, dass er das von dir gewünschte Verhalten erzeugt?
Persönliche Seite #2401179
Lesenswert?

Samuel K. schrieb:
> Stimmt, ich war irgendwie beim bitweisen &.
>
> Da fällt mir ein: Warum nicht kompliziert? Dann lernt man wenigstens
> komplizierter zu denken.

Aus einem einfachen Grund: Wartbarkeit. Wenn man irgendwann mal wieder 
nach ein paar Jahren was ändern oder debuggen möchte und dann sowas 
sieht:
1
(PINB&(1<<PB2))>>PB2

Dann ist man erst mal damit beschäftigt das Statement zu verstehen. Da 
das Statement aber nicht viel "Geschäftslogik" in sich verbirgt ist das 
sinnlos verschwendete Lebenszeit.
Persönliche Seite #2401188
Lesenswert?

Stefan Ernst schrieb:
> Simon K. schrieb:
>> Und was ist _Bool? Wo gibt es den Datentyp? Und zwar in einer derartigen
>> Definition, dass er das von dir gewünschte Verhalten erzeugt?
>
> Im C-Standard seit C99.

Okay, dann ist die Variante lesbarer. Vorausgesetzt man kennt den _Bool 
Typen. ;-)

Wenn C99, dann sollte der GCC (das gewählte Subforum) das auch 
unterstützen.
#2401411
Lesenswert?

1
if( !(PINB & (1<<PB2)) == !(PINC & (1<<PC0)) )

Die Erklärung ist, der !-Operator liefert 0 (falsch) oder 1 (wahr) als 
Ausgabe.
Als Eingabe gilt aber 0 = falsch, !0 = wahr.
Er wandelt also int in bool um.

In diesem Fall stört die Negation nicht, da auf beiden Seiten.
Profis schreiben oft auch:
1
if( !!(PINB & (1<<PB2)) == !!(PINC & (1<<PC0)) )
Damit entfällt die Negation und man wird mit dem Holzhammer drauf 
hingewiesen, das bool rauskommen soll.


Peter

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