Forum: Mikrocontroller und Digitale Elektronik astudio mit winavr float a = ?


von Timo P (Gast)


Lesenswert?

Hallo!

Wenn ich ein Float mit 0 initialisiere, egal mit welcher Zahl und es 
dann via

  sprintf(s,"a:%f\r\n");
  uputs(s);

ausgebe, dann sehe ich nur a:?

Wo ist mein Fehler?

Wenn ich eine ausgelagerte Funktion (vom timerinterrupt ausgeführt) 
aufrufe, die Zugriff auf ein Float-array haben soll(via pointer 
übergeben) dann bekomme ich sogar einen Reset!

von Karl H. (kbuchegg)


Lesenswert?


von Peter (Gast)


Lesenswert?

Timo P schrieb:
> sprintf(s,"a:%f\r\n");

und wo gibst du überhaupt die Variable aus?

von Timo P (Gast)


Lesenswert?

die variable gebe ich über die uart aus

an uputs() sollte dies erkennbar sein. Tausend Dank für die Info, dass 
ich sprintf erst floatingpoint-fähig machen muss. kann ich also davon 
ausgehen, dass meine berechnungen mit den floats funktioniert haben, 
dass wirklich nur die ausgabe via sprintf fehlerhaft war?

von Klaus W. (mfgkw)


Lesenswert?

Dem umfangreichen Quelltext, den du hier gezeigt hast, nach zu schließen
sind deine Berechnungen perfekt.

Den perfekt berechneten Wert musst du aber auch noch an sprintf() 
übergeben.

von Timo P (Gast)


Lesenswert?

float temp;


temp =   (float)(adc/1024*5);
sprintf(s,"temp: %f\r\n",temp);
uputs(s);

erzeugt mir eine ausgabe von 0.000000 anstatt einen Wert anzuzeigen, ja, 
adc wird korrekt mit dem Wert angezeigt, wenn ich ihn ausgebe

warum bek. ich nur den Wert 0.0000 ist doch flasch!

von G ast (Gast)


Lesenswert?

Weil adc den Wert 0 hat.

von Peter (Gast)


Lesenswert?

Timo P schrieb:
> temp =   (float)(adc/1024*5);

ich denke mal das cast ist falsch

test mal mit (float)adc/1024*5;

woher kommt das *5?

von Timo P (Gast)


Lesenswert?

10bit auflösung, 5VDC Betriebsspannung

dann kommt noch ein Fatkor (analoge Sensorspannung linear)

von Karl H. (kbuchegg)


Lesenswert?

Timo P schrieb:
> float temp;
>
>
> temp =   (float)(adc/1024*5);

http://www.mikrocontroller.net/articles/FAQ#Datentypen_in_Operationen


> warum bek. ich nur den Wert 0.0000 ist doch flasch!

Weil du das so programmiert hast :-)
Programmiere es richtig, dann kommt auch "das richtige" raus.

von Timo P (Gast)


Lesenswert?

Grundsätzlich kenne ich mich ja mit datentypen und deren umwandlung aus. 
Warum jedoch die Klammern einen fehler verursachen, ist mir nicht klar

wenn ich schreibe             a = 6/7/8/9;
ist das genau das gleiche wie a = (6/7/8/9);

also müsste:

a = (float) 7/2;
a = (float)(7/2);

auch das gleiche sein..... Was habe ich falsch programmiert?

von Klaus W. (mfgkw)


Lesenswert?

Versuche es doch bitte mit einem C-Buch.
Stw. Operatoren und Reihenfolge der Auswertung.

Und lesbare Sätze würden auch weniger nerven.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Timo P schrieb:
> also müsste:
>
> a = (float) 7/2;
> a = (float)(7/2);
>
> auch das gleiche sein

Programmiersprache != Mathematik. Da gelten teilweise andere Gesetze.
Hast du denn den von Karl Heinz angegebenen Artikel

  http://www.mikrocontroller.net/articles/FAQ#Datentypen_in_Operationen

schon  gelesen?

von Karl H. (kbuchegg)


Lesenswert?

Du willst in deinem Buch einmal das Kapitel über "Operator Precedence" 
(Reihung von Operatoren) durcharbeiten.

a = (float)(7/2);


dividiere 7 durch 2. Das ergibt 3.
Wandle das Ergebnis (3) um in einen float
Weise die float 3.0 an a zu


a = (float) 7/2;

Nimm den Integer 7
Wandle ihn in einen float.  Das ergibt 7.0f

Dann dividieren diese 7.0f durch 2.

Da 7.0f ein float ist, wird auch der Integer 2 zu einem float 2.0f 
umgewandelt.

Die Division, die zur Ausführung kommt, lautet also: 7.0f / 2.0f
Und das ergibt 3.5

Weise diese 3.5 an a zu.


Sieht so aus, als ob du mit Datentypen und deren Umwandlung und vor 
allen Dingen wie Operationen ausgewählt werden bzw. wie sie binden, doch 
nicht so vertraut bist, wie du denkst.


Das eigentlich schockierende an der Sache:
Dieser Sachverhalt (und noch viele andere triviale Dinge, die jeden Tag 
hier immer wieder gefragt werden) finden sich in jedem noch so grindigen 
C-Buch. Wenn man also ein C-Buch durchgearbeitet hätte, würde sich diese 
Fragestellung erst gar nicht stellen, weil das Grundlagen sind. Die 
Übungen im entsprechenden Kapitel einmal durchgearbeitet und man 
vergisst das nie wieder.

von Klaus W. (mfgkw)


Lesenswert?

Solange sich hier immer wieder ein Trottel findet, der jede
Kleinigkeit jedem zehnmal erklärt, ist das doch bequemer. :-(

von Klaus W. (mfgkw)


Lesenswert?

PS: KHB: bitte nicht persönlich nehmen, das steht jetzt eher zufällig 
unter einem Beitrag von dir.

von Timo P (Gast)


Lesenswert?

Ja gelesen habe ich den angegebenen link. dort steht nichts von 
klammern, die die zu castenen Daten umgeben.... Wie ich meine Sätze 
lesbarer gestalten kann, weiß ich nicht. Ich denke, dass man mich hier 
sehrwohl verstehen kann.


Karl heinz Buchegger schrieb:
> dividiere 7 durch 2. Das ergibt 3.

Ich dachte, dass im Code ein float value entsteht. Und, dass dieser 
ausschließlich zu einem int wird, wenn ich das Ergebnis dieser 
Berechnung einem int zuweise alla int a = 2/7 dann ist a = 3, das ist 
mir ja bewusst.

aber float a = (2/7) dass dann a = 3 sein soll.....

von Timo P (Gast)


Lesenswert?

so würde ich einfach schreiben float a = 7/(float)2

dann erhalte ich meinem float-wert...

von Klaus W. (mfgkw)


Lesenswert?

Timo P schrieb:
> aber float a = (2/7) dass dann a = 3 sein soll.....

C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!
C-Buch!

von Peter (Gast)


Lesenswert?

Timo P schrieb:
> Ich dachte, dass im Code ein float value entsteht. Und, dass dieser
> ausschließlich zu einem int wird, wenn ich das Ergebnis dieser
> Berechnung einem int zuweise alla int a = 2/7 dann ist a = 3, das ist
> mir ja bewusst.

das wäre ja schlimm, wenn jeden int berechnung intern als float laufen 
würde. Jeder Progamm würde exterm verlangsamt besonders bei CPU ohne 
float Unterstützung

von Karl H. (kbuchegg)


Lesenswert?

Timo P schrieb:
> Ja gelesen habe ich den angegebenen link.

> Karl heinz Buchegger schrieb:
>> dividiere 7 durch 2. Das ergibt 3.
>
> Ich dachte, dass im Code ein float value entsteht.

Ich dachte, du hast den Link gelesen?

Was ist denn 7 (vom Datentyp her)
Was ist denn 3 (vom Datentyp her)

Welche Art der Division kommt daher zum Zug?

(Geh nochmal zum Link und lies den nächsten Abschnitt auch noch mit)

von Karl H. (kbuchegg)


Lesenswert?

Timo P schrieb:
> so würde ich einfach schreiben float a = 7/(float)2
>
> dann erhalte ich meinem float-wert...

Ich würde ganz einfach schreiben

  float a = 7.0 / 2.0;

Wozu einen Integer erst umständlich auf einen float casten, wenn ich 
dieselbe Zahl auch gleich als Floating Point Zahl schreiben kann?

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.