"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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.