Forum: Mikrocontroller und Digitale Elektronik Eingangspegel ungleich Ausgang


von Lokus P. (derschatten)


Lesenswert?

Kann ich in C ohne IF Abfrage, mit einem Befehl den Ausgang eines PINs 
ungleich dem EIngang definieren?

Also wenn Eingang PINC3 = 1 dann Ausgang PIND4 = 0 und umgekehrt. Also 
immer das Gegenteil.

von abc (Gast)


Lesenswert?

!-Operator. Die passende "Funktion" PORTB = .... PINB zu finden ist aber 
ein ziemliches Gewurschtel.

Warum kein if?

von Lokus P. (derschatten)


Lesenswert?

weil ich dann 2 Abfragen machen müßte. Für jeden Zustand eine. Finde ich 
irgendwie unhübsch. Hätte das gerne in einer Zeile gelöst.

von abc (Gast)


Lesenswert?

Manfred W. schrieb:
> Finde ich irgendwie unhübsch. Hätte das gerne in einer Zeile gelöst.
Wenn man direkt auf die Pins zugreifen kann ist es einfach. Einige 
PIC-Compiler können das oder man nutzt eine kunstvolle Konstruktion mit 
struct/enum à la Dannegger. Ansonsten halt eine Zeile kunstvolles 
Kauderwelsch oder eine if-Abfrage, dann sinds halt zwei Zeilen und 
fertig.

von Lokus P. (derschatten)


Lesenswert?

Man bräuchte ja nur den Zustand vom Eingang an den Ausgang übertragen.
Betrifft aber eine ATMEGA.

von abc (Gast)


Lesenswert?

Das
>struct/enum
sollte natürlich
> struct/union
heißen.

von abc (Gast)


Lesenswert?

Manfred W. schrieb:
> Man bräuchte ja nur den Zustand vom Eingang an den Ausgang übertragen.
Dann übertrag mal schön.

Sorry, was soll man auf solch einen Satz antworten? Zum driten Mal: Es 
geht, aber wenn es nur kosmetische Gründe hat ist das if deutlich 
besser. Packs halt in ein Präprozessormakro und verstecks irgendwo oder 
was weiß ich.

von Lokus P. (derschatten)


Lesenswert?

ok, wenn es nicht möglich ist den Zustand eines einzelnen PINs 
auszulesen ist eine If Abfrage natürlich eleganter.

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Manfred W. schrieb:
> Also wenn Eingang PINC3 = 1 dann Ausgang PIND4 = 0 und umgekehrt. Also
> immer das Gegenteil.

Manfred W. schrieb:
> weil ich dann 2 Abfragen machen müßte. Für jeden Zustand eine. Finde ich
> irgendwie unhübsch. Hätte das gerne in einer Zeile gelöst.


(PINC & (1<<3)) ? (PORTD &= ~(1<<4)) : (PORTD |= (1<<4))


...sollte funktionieren (ist mein erster Versuch mit dem 
Bedingungsoperator "?")

Gruß,
Magnetus

von abc (Gast)


Lesenswert?

Magnus Müller schrieb:
> (PINC & (1<<3)) ? (PORTD &= ~(1<<4)) : (PORTD |= (1<<4))

Interessant. Der ?-Operator fiel mir auch direkt ein, aber mit PORTD = 
()?():() wird das nichts. Die Methode hingegen dürfte funktionieren.

von abc (Gast)


Lesenswert?

Magnus Müller schrieb:
> (PINC & (1<<3)) ? (PORTD &= ~(1<<4)) : (PORTD |= (1<<4))

Interessant. Der ?-Operator fiel mir auch direkt ein, aber mit PORTD =
()?():() wird das nichts. Deine Methode hingegen dürfte funktionieren.

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

abc schrieb:
> Magnus Müller schrieb:
>> (PINC & (1<<3)) ? (PORTD &= ~(1<<4)) : (PORTD |= (1<<4))
>
> Interessant. Der ?-Operator fiel mir auch direkt ein, aber mit PORTD =
> ()?():() wird das nichts. Deine Methode hingegen dürfte funktionieren.

Von "PORTD =" hab ich ja auch nix geschrieben.

Ich meinte das so:
1
while (1)
2
{
3
  (PINC & (1<<3)) ? (PORTD &= ~(1<<4)) : (PORTD |= (1<<4));
4
}

Ist von mir mittlerweise getestet worden. Funzt einwandfrei.

von H.Joachim S. (crazyhorse)


Lesenswert?

PIND.4=!PINC.3;

Finde ich persönlich am schönsten.
Leider nicht C-konform, und die meisten Compiler unterstützen das nicht.
CodeVision schon, einer der Gründe, warum ich dabei bleibe.

von abc (Gast)


Lesenswert?

Magnus Müller schrieb:
> Ist von mir mittlerweise getestet worden. Funzt einwandfrei.
Das Gegenteil habe ich auch nicht behauptet. :-) Hab mich oben etwas 
unklar ausgedrückt, "PORTD = ... ()?():()" war meine erste Idee.

H.joachim Seifert schrieb:
> PIND.4=!PINC.3;
>
> Finde ich persönlich am schönsten.
> Leider nicht C-konform, und die meisten Compiler unterstützen das nicht.
Man kann sich da wohl mit einem speziellen ähhh "Konstrukt" behelfen was 
sich irgendwo im Forum findet, ich meine es kommt vom Herrn Dannegger. 
Ist allerdings nicht unbedingt anfängerkompatibel weil nicht ganz 
einfach zu durchschauen (aber ein tolles Beispiel für fortgeschrittene 
C-Konstrukte)...

von (prx) A. K. (prx)


Lesenswert?

Für Verächter bedingter Ausdrücke mit Vorliebe für write-only coding:
  PORTD ^= (PORTD ^ (~PINC << 1)) & (1<<4);
Auf nicht zu alten AVRs gehts auch etwas billiger:
  PIND = (PORTD ^ (~PINC << 1)) & (1<<4);

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.