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.
!-Operator. Die passende "Funktion" PORTB = .... PINB zu finden ist aber ein ziemliches Gewurschtel. Warum kein if?
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.
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.
Man bräuchte ja nur den Zustand vom Eingang an den Ausgang übertragen. Betrifft aber eine ATMEGA.
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.
ok, wenn es nicht möglich ist den Zustand eines einzelnen PINs auszulesen ist eine If Abfrage natürlich eleganter.
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
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.
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.
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.
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.
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)...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.