Hallo, ich versuche ein BMP180 an einem MSP430 mit CCS6 zum Laufen zu bekommen. Leider sind die Ergebnisse der Berechnungen völliger Quatsch: B5 ist definiert als long und abhängig von der Temperatur zur Zeit 3446.
1 | |
2 | |
B6 = -272302634
|
Anzeige
|
Berechnungen in C fehlerhaftHallo, ich versuche ein BMP180 an einem MSP430 mit CCS6 zum Laufen zu bekommen. Leider sind die Ergebnisse der Berechnungen völliger Quatsch: B5 ist definiert als long und abhängig von der Temperatur zur Zeit 3446.
B6 = -272302634
Gast
#4011510
Womit gestestet ? Womit und wie ausgegeben ? Womit kompiliert ? Womit den Wert von b5 geprüft ? Wie in 99% der fälle wird es anwendungsfehler sein...mit mehr details lässt der sich auch finden ;)
Gast
#4011514
Was hat B5 für einen Datentyp ? Eine Prise meer source, bitte! Danke Robert
Gast
#4011517
du musst dein B6 als signed deklarieren und ggf. je nach compiler vorher b5 auch auf signed umcasten, wenns nicht automatisch passiert Thomas schrieb: > du musst dein B6 als signed deklarieren long ist signed.
Gast
#4011542
Der Code unsigned a = 3446; unsigned b = 4000; long c = a - b; würde doch a-b unsigned berechnen und anschließend auf signed long casten, oder? foobar schrieb: > würde doch a-b unsigned berechnen und anschließend auf signed long > casten, oder? Beim MSP430 ja, aber nicht casten, sondern konvertieren. Nur kommt dabei kein -272302634 raus.
Gast
#4011568
auch wieder wahr... Dann wären vielleicht doch ein etwas umfangreicherer Codeauszug und ein paar Infos über die Umgebung hilfreich. -272302634 sind 0xEFC4FDD6
0xFDD6 sind -554 Das Ergebnis
Wo kommt der Müll im HighWord her?
A. K. schrieb: > foobar schrieb: >> würde doch a-b unsigned berechnen und anschließend auf signed long >> casten, oder? > > Beim MSP430 ja, aber nicht casten, sondern konvertieren. Nur kommt dabei > kein -272302634 raus. Allrdings ist dieses Ergebnis in Hex 0xEFC4FDD6 und das unsigned Ergebnis von 3446 - 4000 macht 0xFDD6 Aufffallend ist, dass das Lower-Word übereinstimmt. Da steckt irgendwo ein Datentypfehler im nicht gezeigten Code. Fazt, und man möchte hinzufügen: eigentlich so wie fast immer, zeig deinen ganzen Code und nicht nur die 3 Zeilen, die du für relevant hältst Denn wenn dort der Fehler wäre, hättest du ihn (normalerweise) längst schon selbst gesehen. Hast du aber nicht. Ergo sizt das Problem woanders (ausser das es eigentlich vor der Tastatur sitzt) Der erzeugte Code wär möglicherweise auch interessant. H. D. schrieb: > B5 ist definiert als long Mach Dir das Leben leichter (und Deinen Code portabler) mit:
Gast
#4011598
Hm... welcher Datentyp ist den 4000? .-) Olaf Olaf schrieb: > Hm... welcher Datentyp ist den 4000? .-) Wenns oben nicht gelogen ist, dann steht da long = long - int Und das ist völlig harmlos. Hier die entsprechenden Funktionen. Bei p kommt mist raus, weshalb ich mich auf die Suche gemacht habe.
A. K. schrieb: > long = long - int > Und das ist völlig harmlos. Nur wenn man keinen Unterlauf produziert, denn dieser erzeugt undefiniertes Verhalten. H. D. schrieb: > Hier die entsprechenden Funktionen. Bei p kommt mist raus, weshalb ich > mich auf die Suche gemacht habe. Die Variablennamen sind wirklich zum Abgewöhnen :-( B6 ist long B5 ist long also sollte doch das hier reichen: B6 = B5-4000L; ich muss doch nix casten ausser die 4000 als L ong zu benennen. aber ich kenne nur gcc
Gast
#4011657
Hallo, b5 sollte bei 25 Grad einen Wert von 4000 haben. B6 ist mit Vorzeichen, und ädert das Vorzeichen bei 25 Grad. Ludger Mark Brandis schrieb: > Die Variablennamen sind wirklich zum Abgewöhnen :-( Übernomen aus dem Datasheet ... Joachim B. schrieb: > B6 ist long B5 ist long also sollte doch das hier reichen: > > B6 = B5-4000L; keine Wirkung: B5 = 3324; --> B6 = -1392181924 Joachim B. schrieb: > B6 = B5-4000L; > > ich muss doch nix casten ausser die 4000 als L ong zu benennen. Unnötig. B5 ist schon long, also auch 4000. H. D. schrieb: > Mark Brandis schrieb: >> Die Variablennamen sind wirklich zum Abgewöhnen :-( > > Übernomen aus dem Datasheet ... > > Joachim B. schrieb: >> B6 ist long B5 ist long also sollte doch das hier reichen: >> >> B6 = B5-4000L; > > keine Wirkung: > > B5 = 3324; > --> B6 = -1392181924 wo hast du den Wert her? Machst du eine Ausgabe oder bist du in irgendeinem Debugger? (Hintergrund: Mit diesen Zahlen sieht das so aus, als ob im High-Word Schmutz wäre. Das soll es bei Debuggern schon gegeben haben, dass sie mit manchen Datentypen nicht zurecht gekommen sind. Letzten Endes sind die tatsächlich in B6 vorhandenen Bytes wichtig.) Ich benutze Code Composer Studio 6 und die Werte guck ich mir bei einem Breakpoint an. Optimizer eingeschaltet? Optimization level: 0 (Register Optimizations) Speed vs. Size trade-offs: None. Nur um sicher zu gehen. Kannst du mal ein neues Projekt aufsetzen, in dem tatsächlich nur diese Berechnung
drinn ist (natürlich mit den entsprechenden Variablen und Datentypen wie in deinem Projekt) uns sonst nichts anderes? Hast du dort dasselbe fehlerhafte Ergebnis?
Gast
#4011841
Hallo, ich benutze auch die Funktionen aus dem Datenblatt, auf einem AVR. Funktioniert tadelos. Wie sehen denn deine Rohwerte für druck und Temperatur aus ? Ludger Bist Du sicher dass B5 vorher auch wirklich 3446 war? Wie stellst Du das fest? Was ist mit dem left shift bei X2 weiter oben, kommt an der Stelle vielleicht der Müll in das high word von B5? Ist B5 überhaupt initialisiert, wird Temp180() wirklich vor Pres180() aufgerufen? Und zwar auch beim ersten Mal? Fragen über Fragen... Karl Heinz schrieb: > Nur um sicher zu gehen. > Kannst du mal ein neues Projekt aufsetzen, in dem tatsächlich nur diese > Berechnung >
> drinn ist (natürlich mit den entsprechenden Variablen und Datentypen wie > in deinem Projekt) uns sonst nichts anderes? > Hast du dort dasselbe fehlerhafte Ergebnis? Geht nicht, weil er das wegoptimiert. Ergänze ich die Funktion von oben durch:
T5 = -667; T6 = 1014431077; Das Ding will mich doch verarschen! Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|