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
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.
Magst du jetzt nur die Anzeige im Debugger nicht, oder rechnet er tatsächlich falsch?
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.
So richtig schau werde ich aus deiner Antwort nicht. Könntest du vielleicht ein Beispiel bringen.
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
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.
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?
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.
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.
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.
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.
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 ;)
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
Sicherlich muss man in der IDE noch Einstellen welchen MSP430 man genau nimmt. Vielleicht ist das Falsch?
Ben jamin schrieb: > Sicherlich muss man in der IDE noch Einstellen welchen MSP430 man genau > nimmt. Bei SW-Emulation für Floating Point? Neeee.
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.
Rufus Τ. Firefly schrieb: > den > Hardwaremultiplikator verwenden, der nicht in allen MSP430-Varianten > vorhanden ist Die 5er Serie hat den 32x32 durchgängig.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.