Forum: Mikrocontroller und Digitale Elektronik Float Initialisierung scheitert MSP430F5438


von Benedikt D. (benedikt_d)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Benedikt D. schrieb:
> float fTest = (float)78643200;

Probier mal

> float fTest = 78643200.0;

von Benedikt D. (benedikt_d)


Lesenswert?

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.

von Jörg S. (joerg-s)


Lesenswert?

Magst du jetzt nur die Anzeige im Debugger nicht, oder rechnet er 
tatsächlich falsch?

von Benedikt D. (benedikt_d)


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.

von Jörg S. (joerg-s)


Lesenswert?

So richtig schau werde ich aus deiner Antwort nicht. Könntest du 
vielleicht ein Beispiel bringen.

von Benedikt D. (benedikt_d)


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

von Christian G. (christian_g83)


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.

von Benedikt D. (benedikt_d)


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?

von Karl H. (kbuchegg)


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.

von Benedikt D. (benedikt_d)


Lesenswert?

hab nochmal nachgesehen.. Optimizer ist nun auf 0 gestellt also aus laut 
Beschreibung. Beim Debuggen beschneidet er weiterhin die Variable im 
oberen WORD. Angelegt wird sie auch noch nicht.

von Christian G. (christian_g83)


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.

von Benedikt D. (benedikt_d)


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.

von Ben j. (scarab)


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

von float (Gast)


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

von Ben j. (scarab)


Lesenswert?

Sicherlich muss man in der IDE noch Einstellen welchen MSP430 man genau 
nimmt. Vielleicht ist das Falsch?

von float (Gast)


Lesenswert?

Ben jamin schrieb:
> Sicherlich muss man in der IDE noch Einstellen welchen MSP430 man genau
> nimmt.

Bei SW-Emulation für Floating Point?

Neeee.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

float schrieb:
> Bei SW-Emulation für Floating Point?

Könnte schon sein, da es FP-Routinen geben wird, die den 
Hardwaremultiplikator verwenden, der nicht in allen MSP430-Varianten 
vorhanden ist.

von float (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> den
> Hardwaremultiplikator verwenden, der nicht in allen MSP430-Varianten
> vorhanden ist

Die 5er Serie hat den 32x32 durchgängig.

von Jim M. (turboj)


Lesenswert?

Probier doch mal
1
 float fTest = 78643200.0f;

Wenn ich mich recht entsinne, hatten einige C Compiler Bugs beim 
Konvertieren von Double nach Float. Dann half es, das "f" ranzuhängen, 
nur dann sind die Konstanten nämlich "float" und nicht "double".

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.