Berechnung eines Wertes in ANSI C

Gast #148034
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ß
Gast #148038
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
Gast #148039
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);
}
Gast #148041
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
Gast #148043
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
Gast #148044
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.
Gast #148046
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.