Go Down

Topic: "analogRead" invertiert in "analogWrite" ausgeben (Read 2475 times) previous topic - next topic

laemmen

Moin,

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

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

Udo Klein

Etwa so:

Code: [Select]

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


Das ist genau Dein Ansatz. Was kriegst Du nicht auf die Reihe?
Check out my experiments http://blog.blinkenlight.net

laemmen


Etwa so:

Code: [Select]

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 :smiley-sweat: 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?

Udo Klein

#3
Feb 16, 2012, 06:26 pm Last Edit: Feb 16, 2012, 06:28 pm by Udo Klein Reason: 1
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.
Check out my experiments http://blog.blinkenlight.net

laemmen


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  :)

Gruß
Dennis

rz259

Hallo Dennis,

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

Rudi

Udo Klein

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).
Check out my experiments http://blog.blinkenlight.net

laemmen

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 :D Ich frage nach Alternativlösungen, weil sie unter Umständen auch andere Herangehensweisen aufzeigen oder mir, wie in diesem Beispiel, neue Funktionen zeigen  :)

Gruß und besten Dank!

Dennis

Udo Klein

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

Code: [Select]

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


Und jetzt die Preisfrage: ist das besser oder schlechter? Warum?
Die zweite Frage ist die spannende Frage ;)
Check out my experiments http://blog.blinkenlight.net

laemmen


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

Code: [Select]

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


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


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  :smiley-roll:

Udo Klein

Dann such mal mit Google weiter. Du bist noch beim leichten Teil der Frage ;)
Check out my experiments http://blog.blinkenlight.net


uwefed

#12
Feb 16, 2012, 09:00 pm Last Edit: Feb 16, 2012, 09:02 pm by uwefed Reason: 1
Udo, Dir gefallen die Schiebeoperationen. ;) ;) ;)
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

Joghurt

Oder
Code: [Select]

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


oder
Code: [Select]

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


:)

MaFu

Wenn Ihr so weitermacht springt Dennis aus dem Kellerfenster  XD
_______
Manfred

Go Up