INT TO DOUBLE funktioniert nicht

OP #1287647
Lesenswert?

Hallo Leute

ich habe ein Problem mit der Umsetzung von Integer in Double.
Hier mein Code:
1
  int16_t solldrehzahl;
2
  double drehz_takt;
3

4

5
  solldrehzahl = 123;
6
  drehz_takt = solldrehzahl / 10.0;

Ich benutze AVR-Studio 4.12 und einen ATMega 162.
Der Fehler macht sich bemerkbar, dass die LED's am Controller nicht 
richtig
blinken, bzw. meine Betriebs-LED zu langsam blinkt. Ausserdem 
funktioniert meine UART nicht mehr.

Ändere ich den Code in ...
1
  int16_t solldrehzahl;
2
  double drehz_takt;
3

4

5
  solldrehzahl = 123;
6
  drehz_takt = 333 / 10.0;  //<<<<<<<<<<<<

... funtioniert alles wieder einwandfrei.

Wo ist das Problem bei der Umsetzung. Ich habe schon viele Foren 
durchgewühlt und bei Google geschnüffelt, habe dementsprechend auch was 
am Code verändert, aber ohne erfolg.
Zum Rechnen brauche ich aber Komma-Zahlen.

Danke
#1287673
Lesenswert?

Ed M. schrieb:
> blinken, bzw. meine Betriebs-LED zu langsam blinkt. Ausserdem
> funktioniert meine UART nicht mehr.

Dann hast Du wohl zuviel SRAM verbraucht (Strings im SRAM?).

Die standard float Lib verbraucht 264 Byte SRAM, Du mußt den 
Linkerschalter -lm angeben.

Außerdem, double kann der AVR-GCC nicht, er macht float daraus.


Peter
Gast #1287690
Lesenswert?

danke für die Antworten

Mein SRAM ist bei ca. 75%, zumindest wird das beim Übertragen mit 
PonyProg angezeigt.
Strings benötige ich nicht.
1
Die standard float Lib verbraucht 264 Byte SRAM, Du mußt den
2
Linkerschalter -lm angeben.
Wo muss ich dieses einschalten?
1
Außerdem, double kann der AVR-GCC nicht, er macht float daraus.

Ich habe es auch schon mit FLOAT gemacht, hatte aber auch keinen erfolg.
1
drehz_takt = (double)(solldrehzahl) / 10.0;
funktioniert auch nicht.


mfg Edmu
#1287694
Lesenswert?

>Du musst die solldrehzahl explizit nach double casten
> drehz_takt = (double)(solldrehzahl) / 10.0;

Kann mir nicht vorstellen, was das bringen soll... der Compiler müsste 
sich doch ohnehin für den mächtigeren Datentyp entscheiden - oder 
entscheidet der sich bei C für den Typ des linken Operators?
#1287768
Lesenswert?

Kai Giebeler schrieb:
>>Du musst die solldrehzahl explizit nach double casten
>> drehz_takt = (double)(solldrehzahl) / 10.0;
>
> Kann mir nicht vorstellen, was das bringen soll... der Compiler müsste
> sich doch ohnehin für den mächtigeren Datentyp entscheiden - oder
> entscheidet der sich bei C für den Typ des linken Operators?

Nein.
Der 'Tip' war einfach nur Quatsch.

Ich denke mal, dass -lm (wie von PeDa beschrieben) das Problem löst oder 
aber der TO hat einen anderen Bug im Programm, bei dem er sich den 
Speicher so zerschiesst, das sich das beschriebene Problem zeigt.
#1287882
Lesenswert?

Karl heinz Buchegger schrieb:
> Ich denke mal, dass -lm (wie von PeDa beschrieben) das Problem löst oder
> aber der TO hat einen anderen Bug im Programm, bei dem er sich den
> Speicher so zerschiesst, das sich das beschriebene Problem zeigt.

Sorry for off-topic, aber: Was heißt eigentlich TO? Thread-Originator?
#1287905
Lesenswert?

Karl heinz Buchegger schrieb:
> Kai Giebeler schrieb:
>>>Du musst die solldrehzahl explizit nach double casten
>>> drehz_takt = (double)(solldrehzahl) / 10.0;
>>
>> Kann mir nicht vorstellen, was das bringen soll... der Compiler müsste
>> sich doch ohnehin für den mächtigeren Datentyp entscheiden - oder
>> entscheidet der sich bei C für den Typ des linken Operators?
>
> Nein.
> Der 'Tip' war einfach nur Quatsch.

Stimmt natürlich. 10.0 ist ja schon ein double (bzw. Float)
Was anderes wäre es, wenn man 2 Integer-Variablen dividiert. Hier ist 
der Cast nach double erforderlich (falls man nicht auf 
Festkommaarithmetik zurückgreift)

Also ich tipp auch darauf (nach nochmaligen Lesen des OP), dass die 
Floatlib den Speicher zumüllt. Ein
1
drehz_takt = 333 / 10.0;  //<<<<<<<<<<<<
funktioniert vermutlich deshalb, weil der Wert schon zur Compilezeit 
berechnet wird.

Gruß
Roland
#1287926
Lesenswert?

Karl heinz Buchegger schrieb:
> Mark Brandis schrieb:
>
>> Sorry for off-topic, aber: Was heißt eigentlich TO? Thread-Originator?
>
> Thread Opener
>
> In deutschen Foren ist auch OP gebräuchlich: Originaler Poster

Hm, www.acronymfinder.com meint dazu:

OP  Original Poster (internet newsgroups and message boards)

Scheint also nicht auf deutsche Foren beschränkt zu sein :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren