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


von Simon (Gast)


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ß

von Mike (Gast)


Lesenswert?

Ich empfehle ein gutes C-Buch für die Grundlagen.

von flo (Gast)


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

von Mike (Gast)


Lesenswert?

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

von crazy horse (Gast)


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

von Simon (Gast)


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);
}

von crazy horse (Gast)


Lesenswert?

Hm, versteh ich jetzt nicht.

von Simon (Gast)


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

von Tobi (Gast)


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

von Simon (Gast)


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

von Martin Hofmann (Gast)


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.

von crazy horse (Gast)


Lesenswert?

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

von Martin Hofmann (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.