www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Berechnung eines Wertes in ANSI C


Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich Habe an meinem AVR ein Sensor auf µC basis angeschlossen von dem
ich einen wert bekomme. nachdem der wert (2 bytes) angekommen sit, muss
der  AVR den Wert umrechnen:

Ergebniss = -40 + 0.01 * Word

Nun meine Fragen:
1.) Gibt es irgendwo eine Gute beschreibung über das arbeiten mit word
variablen ?

2.) Wie führe ich die Rechnung durch ? ich sollte den Wert auf 2
Nachkommastellungen ausrechnen. Wie mach ich das am besten? Ich habe
schon gesehen, dass Leute Spannungen vom ADC auf einem Display
angezeigt haben. Und das auf 3 Nachkommastellen. Die müssen das ja auch
erst umrechnen !?

Gruß

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich empfehle ein gutes C-Buch für die Grundlagen.

Autor: flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

Programmieren in C (Kernighan und Ritchi) ist ein Klasse Buch.

Aber müsste es nicht so gehen?

float ergebnis = 0.01 * (int) word + 40;

schau mal unter http://www.schellong.de/c.htm.

Florian

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int = word;
float ergebnis = 0.01 * (float) word + 40.0;

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermeide float-Zahlen möglichst  und verwende lieber Integer-Zahlen
(genauer und schneller).

Ergebniss = -40 + 0.01 * Word

Ergebnis=-4000+Word;

//Je nach möglichem Wertebereich von "Word" evtl mit long-Variablen
arbeiten
//behält die volle Genauigkeit, den Faktor 0,01 erst bei der Ausgabe
beachten

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau Darum gehts mir. Ich will möglichst float und double zahlen
vermeiden weil die GCC klasse sehr viel speicher braucht.

welches der beiden bytes im speicher muss ich denn an meine float
übergeben ? das erste oder das 2. ? kann ich das so machen ?:

float a;
a[0] = byte1;
a[1] = byte2;

oder kann ich das irgendwie gleich bei der zuweisung machen ?:

float a;
for (int i = 0;i < 16;i++)
{
   a = a << 1;
   a[0] = Get_bit(i);
}

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, versteh ich jetzt nicht.

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;) ok, war n bissle komisch was ich geschrieben hab. Ich will
möglichst gleitkommazahlen vermeiden, wenn es möglich ist es trotzdem
auf 2 nachkommastellen auszurechnen (mit kommaverschiebung).

Aber Wenn es nicht möglich ist, müsst ich auf float zurückgreifen. Nur
wie mach ich das am besten? (siehe letzter beitrag von mir)

MfG

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nur mal so als stichwort: wie wäre es mit festkommazahlen, wenn du genau
weisst, dass du nur 2 stellen nach dem komma brauchst

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mann da hätt ich auch selber draufkommen müssen.

int i_z = Word - 4000
und dann ein komma nach der 2. stelle von rechts. Eigentlich ganz
einfach.

Aber ich komm immer noch nicht so ganz mit dem arbeiten mit words
zurecht. Wie weise ich einem word eine zahl zu die aus 2 bytes besteht
?

MfG

Autor: Martin Hofmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist denn mit "word" gemeint? - Mal angenommen, das "natürliche"
Wort der Architektur vorzeichenlos interpretiert, also der C-Datentyp
"unsigned int"; und die 2 Bytes, die den Wert bilden, ebenfalls
vorzeichenlos:

    unsigned wert;
    unsigned char lobyte, hibyte;

Dann kann "wert" gesetzt werden durch:

    wert = (unsigned)hibyte << 8 + lobyte;

Das nimmt an, dass ein Byte (Datentyp char) tatsächlich 8 Bit hat,
also CHAR_BIT == 8 ist. C garantiert nur, dass CHAR_BIT >= 8. Um
jeweils 8 Bit aus "lobyte" und "hibyte" zu übernehmen, müssen die

höherwertigen Bits wegmaskiert werden:

    wert = (hibyte & 0xFFu) << 8 + (lobyte & 0xFFu);

Der Cast im ersten Ausdruck verhindert, dass "hibyte" zu int
erweitert
wird und aus Datenbits Vorzeichen werden. Im zweiten Ausdruck ist kein
Cast nötig, weil bei den Operanden von "&" unsigned (rechte Seite)
gegen int oder unsigned int (linke Seite) gewinnt.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Simon: genau das hatte ich dir um 12.20 geschrieben, deswegen auch die
Rumeierei danach nicht :-)

Autor: Martin Hofmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, übersehen, dass "+" stärker bindet als "<<" ...! Oben
fehlen also noch Klammern:

    wert = ((unsigned)hibyte << 8) + lobyte;

bzw.

    wert = ((hibyte & 0xFFu) << 8) + (lobyte & 0xFFu);

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.