"analogRead" invertiert in "analogWrite" ausgeben

Moin,

ich komme mit meinem beschränken C-Wissen nicht weiter :blush:

Ich brauche eine Umkehrfunktion die den Wert aus "analogRead" invertiert in "analogWrite" ausgibt.

Beispiel:

ist der Eingabewert/4 = 0 soll der Ausgabewert = 255 sein
ist der Eingabewert/4 = 255 soll der Ausgabewert = 0 sein
ist der Eingabewert/4 = 100 soll der Ausgabewert = 155 sein
ist der Eingabewert/4 = 160 soll der Ausgabewert = 95 sein
...

mein Ansatz war den Eingabewert/4 von 255 abzuziehen und als Ausgabewert zu nehmen, das bekomme ich nur nicht auf die Reihe. :~

Ich bin für jede Hilfe dankbar!

Gruß
Dennis

Etwa so:

analogWrite(3, 255 - analogRead(A0)/4);

Das ist genau Dein Ansatz. Was kriegst Du nicht auf die Reihe?

Vielen Dank! Mir fehlt leider noch die Logik beim Programmieren :sweat_smile: ich denke zu kompliziert bzw. stelle mir die Lösung zu komplex vor. Gibt es eventuell noch eine besser Variante als die Werte zu subtrahieren?

Was verstehst Du unter "besser"? Soll heißen, wenn Du willst kannst Du das auch mit "Map" http://www.arduino.cc/en/Reference/Map erledigen. Ob das besser ist kann man sehen wie man will.

Mit besser meine ich effizienter. Aber map scheint ja quasi dasselbe nur anders zu machen, indem es 1023 auf 255 runterbricht. Vielen Dank auch für den Hinweis an dieser Stelle :slight_smile:

Gruß
Dennis

Hallo Dennis,

eine wichtige Regel beim Programmieren ist, erst dann zu optimieren, wenn du wirklich Performance-Probleme hast und nicht schon vorher.

Rudi

Dennis: Du bist ja ein Scherzkeks. Du hast ja nach anderen Lösungen für das gleiche Problem gefragt. Alle Lösungen werden diese Ergebnis erreichen sonst sind sie keine Lösungen. Ich frage mich immer noch was Du mit "besser" meinst.

Was Rudi sagt ist außerdem auch wichtig. Erst muß ein Programm funktionieren. Erst dann wird optimiert (falls das überhaupt nötig ist).

Ihr habt ja beide Recht, aber hätte ich nicht gefragt, wüsste ich jetzt nicht, dass es eine "map"-Funktion gibt und wofür ich sie benutzen kann :smiley: Ich frage nach Alternativlösungen, weil sie unter Umständen auch andere Herangehensweisen aufzeigen oder mir, wie in diesem Beispiel, neue Funktionen zeigen :slight_smile:

Gruß und besten Dank!

Dennis

OK, dann habe ich noch was für Dich:

analogWrite(3, 255 - (analogRead(A0)>>2));

Und jetzt die Preisfrage: ist das besser oder schlechter? Warum?
Die zweite Frage ist die spannende Frage :wink:

hmm soweit ich es in der Reference verstanden habe, verschiebt die Bitshift left/right Anweisung die Position der Bits um einen definierten Wert. Keine Ahnung wozu das gut sein soll :roll_eyes:

Dann such mal mit Google weiter. Du bist noch beim leichten Teil der Frage :wink:

ich komme nicht weiter :0

Udo, Dir gefallen die Schiebeoperationen. :wink: :wink: :wink:
Um die Zahl von 255 wegzuzählen könntest Du auch das 2 Kompliment machen?

laemmen:
1 bit nach rechts verschieben entspricht einem Teilen durch 2.
Ein Verschieben um 1 bit nach links um ein Multipliziern mit 2.
2 Bit verschieben sind dann eine Multiplication/Teilung durch 4.

Grüße Uwe

Oder

analogWrite(3, 0xFF ^ analogRead(A0)>>2);

oder

analogWrite(3, 0xFF & ~analogRead(A0)>>2);

:slight_smile:

Wenn Ihr so weitermacht springt Dennis aus dem Kellerfenster XD

Man sollte unterscheiden zwischen optimieren und kryptisieren :%

Also gut, hier die Auflösung für die erste Frage: ">>" ist oft schneller als "/". Und nun die Preisfrage: was ist besser und warum :wink: