Float Initialisierung scheitert MSP430F5438

#2671926
Lesenswert?

Hallo,

ich habe leider ein paar Probleme mit meiner Programmierung eines 
MSP430F4538, ich programmiere ihn in CCS in C. Leider hab ich einige 
Probleme ihm beizubringen mir eine float zu erstellen. Ich nehme an das 
es ganz einfach ist und ich einfach nur ein Brett vorm Kopf habe. 
Vielleicht sieht einer von euch gleich den Fehler:

Programmcode:
  float fVRef = (float)5018;            //Referenzspannung
  float fResult = (float)lResponse;     //Hat einen maximalwert von
                                              //0x00FFFFFF(long)
  float fTest = (float)78643200;
  fResult = fVRef * fResult;
  fResult = fResult / fTest;
  SPI_FloatToString(fResult);

Leider schreibt er zwar werte in die Variablen allerdings werte wie 
4,5e41 was mir nicht so ganz schlüssig ist.

vll. sieht jemand den fehler
#2672004
Lesenswert?

ich habe mit zwar eine float to array function geschrieben allerdings 
kann ich diese nicht überprüfen, sollte sie richtig funktionieren 
rechnet er falsch. Andernfalls stimmt nur die Anzeige in Debugger nicht. 
Die Funktion hingegen ist getestet und gibt das richtige aus wenn ich 
sie mit einer initialisierten Variable füttere.
#2672052
Lesenswert?

Dann schreibe ich mal auf was so im debug kommt:

Programm:
float fTestFunction = 3.1412141215;
  -> Value = 3.141214

float fVRef = 5018.0;
  -> Value = 7.461634e-41

float fResult = (float)lResponse;
  -> Value = 4.755727e-41
  -> lResponse ist global mit dem Wert 0x00494249h

float fTest = 78643200.0;
  -> Value = 0.0
int iI;
for(iI = 0; iI<3;iI++)
{SPI_ShowResponse(stRes[iI]);}
  -> Die Funktion gibt die Werte von lResponse als Gruppe von 3 Strings
     wieder: 0x49h,0x42h,0x49h und dient nur dafür das ich im 
Hyperterminal
     die Werte ablesen kann (Antwort eines 24Bit ADCs bei 3V an 5V
     Referenz)

fResult = fVRef * fResult;
  -> Value = 1.581365e-41

fResult = fResult / fTest;
  -> Wird im Debugger übersprungen

SPI_FloatToString(fTestFunction);
  -> Schachtel die einzelnen stellen der Float in ein String um ihn
     auszugeben

SPI_FloatToString(fResult);
  -> Wie oben nur mit Messwert

Ich hoffe das hilft dir mehr.b
#2672069
Lesenswert?

Benedikt D. schrieb:

> float fVRef = 5018.0;
>   -> Value = 7.461634e-41

Das ist schon seltsam.

Der Float-Wert 5018.0 sieht in Hex-Darstellung so aus:

459CD000

Der Float-Wert 7.461634e-41 sieht in Hex-Darstellung so aus:

0000D000

Da scheint irgend etwas das höherwertige Wort abzuschneiden. Das gilt 
übrigens auch für die anderen Fälle. Schau dir mal einen Speicher-Dump 
der entsprechenden Variablen an.
#2672078
Lesenswert?

Ok das ist mir bisher noch garnicht aufgefallen. Irgendwo ist der Wurm 
drin ich kann mir nicht mal im Memory Browser den Speicherort der 
Variablen öffnen. Bei der FunctionTest Variablen geht es sehr wohl. Er 
scheint also schon ein Problem beim Anlegen der Variablen zu haben.
Noch eine andere Frage beim Versuchen habe ich es auch mal mit einer 
Double versucht. Gehe ich recht in der Annahme das der MSP430 keine 
Double kann sonder sie als Float deklariert?
#2672088
Lesenswert?

Frage:
Hast du den Optimizer eingeschaltet?

Wenn ja, darfst du nicht allem trauen, was dir der Debugger so sagt.


Das hier ...
> Irgendwo ist der Wurm drin ich kann mir nicht mal im Memory Browser
> den Speicherort der Variablen öffnen.
... wäre ein starkes Indiz dafür, dass da der Optimizer seine Fingern im 
Spiel hat.
#2672117
Lesenswert?

Benedikt D. schrieb:

> Angelegt wird sie auch noch nicht.

Was meinst Du damit? Wird sie nicht initialisiert? Was ist, wenn Du ein 
Stückchen Code schreibst, das den Wert der Variablen überprüft. Ich 
traue irgendwie Deinem Debugger nicht. Meinetwegen sowas:
1
float fVRef = 5018.0;
2
if (fVRef - 5018.0 < 1e-3)
3
  good();
4
else
5
  bad();

Vielleicht ist es ja wirklich nur die Debugger-Anzeige, die kaputt ist.
#2672138
Lesenswert?

sry, mit anlegen meine ich, dass wenn ich versuche die Speicherstelle im 
MemoryBrowser zu öffnen ich die Fehlermeldung bekommen.
   Unable to view memory of fVRef.
ich habe mal die Abfrage eingebaut und noch ein wenig Modifiziert. Er 
ruft dabei good() auf obwohl laut Anzeige die Funktion bad() aufgerufen 
werden müsste. Das lässt ja darauf schließen das die Anzeige im Debugger 
spinnt. Allerding verstehe ich nicht warum ich keine Speicherstelle 
zurückgegeben bekomme.
#2672469
Lesenswert?

Benedikt D. schrieb:
> hab ich geht leider nicht er schreibt nicht mal werte in die variablen.
> Soweit ich gesucht hatte kann der MSP430 aber float. bei der berechnung
> schreibt er dann irgendwas zusammen, allerdings kommt das auch aus der
> fehlenden Initialisierung.

Benedikt D. schrieb:
> Gehe ich recht in der Annahme das der MSP430 keine
> Double kann sonder sie als Float deklariert?

der MSP430 kann weder float noch double... der hat nämlich keine FPU.
Wenn du in deinem Programm Gleitkommazahlen verwendest dann fügt dein 
Compiler Bibliotheken ein die die Gleitkommaoperationen mit dem umsetzt 
was der MSP430 kann. Wenn du willst dann gibt es sicher auch eine 
Möglichkeit mit 128Bit oder 256Bit Gleitkomma zu rechnen...

War jetzt zwar keine Hilfreiche Antwort aber musste trotzdem sein ;)
Gast #2672582
Lesenswert?

Also, mein IAR zeigt bei
1
#include "io430.h"
2

3
static float fl;
4

5
int main( void )
6
{
7
  // Stop watchdog timer to prevent time out reset
8
  WDTCTL = WDTPW + WDTHOLD;
9
  
10
  fl = (float) 78643200;
11
...
fl : 7.86432E+7 im Debugger

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