mikrocontroller.net

Forum: Compiler & IDEs Werte umrechnen


Autor: fernsehkind (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Problem:

Ich muss einen Wert in einen anderen umverteilen.  Die Werte von 20 bis
36 sollen belegt werden.
Aus einer anderen Berechnung bekomme ich Werte zwischen 0 und 255.
Jetzt muss ich diese 256 Werte auf die 17 Werte von 20 bis 36
aufteilen.
Die Werte von ca. 100 bis 156 sollen allerdings immer dem Wert 18
entsprechen. Dadurch kommt eine gewisse Nichtlineraität ins Spiel...
Ohne die Nichtlinearität kein Problem...aber mit??

Wie kann ich dies in C möglichst SCHNELL bewerkstelligen?

Im Moment mache ich es ungefähr so: (Die Werte stimmen nicht, nur ein
Bsp)
if (wert < 10)
    {
    ee = 20;
    }
if ((wert >= 10) && (wert <= 20))
    {
    ee = 21;
    }

Diese Art ist mir aber zu aufwendig, da ich alle Werte (10,20...usw.)
von Hand berechnen muss. Das ist in diesem Beispiel relativ schnell
passiert, aber wie gehts einfacher? Kann mir da jemand weiterhelfen?
Wie würdet ihr sowas machen?

Autor: Peter S. (peter) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst eine Abschnittsweise definierte Funktion:

float m1, m2;
int b1, b2, y;


if (x < 100) {
  y = m1 * x + b1;
} else if (x > 156) {
  y = m2 * x + b2;
} else {
  y = 18;
}


m1, m2, b1, b2 musst du dir mit 2 Punkten, die auf der Geraden liegen
ausrechnen. (m = Steigung, b = y-Achsenabschnitt) b1 währe in deinem
Fall z.B. 20.

Autor: bla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wert/16 + 20

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie kann ich dies in C möglichst SCHNELL bewerkstelligen?

Da's noch keiner geschrieben hat: die Tabelle ist natürlich die
schnellste Lösung.  Für 256 Elemente normalerweise auch kein
Problem, wenn man sie im ROM ablegt.

Autor: fernsehkind (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit der abschnittsweisen Funktion hab ich schon probiert. Leider
führt das teilweise zu einem verschobenen Ergebnis, da das Runden nicht
ganz hinhaut, aber vielen Dank für den Tipp. Sie erfüllt den Zweck in
dieser Aufgabe. Auf so eine einfache Lösung bin ich im ersten Moment
nicht gekommen...

Tabelle ist schön und recht bei 256 Elementen, aber wie gesagt, gibt
auch größere Beispiele bei meinen Problemen...

DANKE

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> da das Runden nicht ganz hinhaut

Im vom Peter geposteten Code wird überhaupt nicht gerundet.
C-Standard ist, dass bei einer Umwandlung von double zu
int, die Nachkommastellen einfach abgeschnitten werden.
Wenn du auf runden aus bist, musst du eine Rundungskorrektur
anbringen:

  y = m1 * x + b1 + 0.5;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.