Datum:
Hi an alle.
Erstmal möchte ich zu dieser umfangreichen Seite gratulieren.
Ich bin bei meinem xmega auf ein Problem gestoßen.
Ich habe als Eingabe zwei Integer Variabeln.
("vorkommaanteil" und "nachkommaanteil").
Anschließend sollen beide Variablen in Float gecastet werden.
Danach wird die Variable "nachkommaanteil" so lange durch 10 dividiert
bis sie als 0,.... dasteht. Diese Variable wird nun mit der Variable
"vorkommaanteil" addiert.
Das Ergebnis dieser Addition wird nun in char gecastet um dieses dann
auf dem Oled Display ausgeben zu können.
Ich habe diesen Code in C++ gut realisieren können.
Wenn ich aber selbiges versuche im AVR Studio zu realisieren, dann
bekomme ich eine Fehlermeldung von AVR. Es dürfte an der Zeile mit
"sprintf" liegen, da die Fehlermeldung nicht kommt, wenn ich diese
auskommentiere.
Anbei habe ich den Code aus dem Visual Studio gepostet und jene aus dem
AVR Studio.
Visual Studio Beispiel in C:
#include <stdio.h> #include <iostream> #include <string> #include <math.h> #include <stdlib.h> using namespace std; void main(void) { int vorkommaanteil = 12; int nachkommaanteil = 34; float floatvorkomma,floatnachkomma,summe; string sumstring; printf("Betrag des Vorkommaanteils ist: %d",vorkommaanteil); printf("\nBetrag des Nachkommaanteils ist: %d",nachkommaanteil); floatvorkomma = (float)vorkommaanteil; // Cast zur Typkonvertierung von int nach float floatnachkomma = (float)nachkommaanteil; // Cast zur Typkonvertierung von int nach float // Ausgabe der Variabeln in Float printf("\n\nBetrag des Float Vorkommaanteils ist: %f",floatvorkomma); printf("\nBetrag des Float Nachkommaanteils ist: %f",floatnachkomma); // Die Nachkommazahl wird so lange durch 10 dividiert bis nur mehr 0,.... dasteht while(floatnachkomma>=1) { floatnachkomma=floatnachkomma/10; } printf("\n\nBetrag von Nachkomma nach Division ist: %f",floatnachkomma); // Berechnung der Summe zwischen den beiden Float Variabeln Vorkomma und Nachkomma summe=floatvorkomma+floatnachkomma; printf("\n\nDie Summe der Float Variabeln ist: %f",summe); printf("\n\n"); char buffer [50]; sprintf(buffer, "%.3f", summe); printf("\n\nBuffer ist: %s",buffer); system( "pause" ); } |
AVR Studio Beispiel in C:
// ====================== #define F_CPU 16000000UL // Taktfrequenz 16 MHz // notwendige Includes #include <avr/io.h> // AVR spezifisch #include <avr/interrupt.h> // AVR spezifisch zum Interrupthandling #include "clock.h" // Takteinstellungen für CPUclk #include "OLED.c" // Fkt. des OLED- Display #include <math.h> #include <stdlib.h> #include <stdio.h> #include <stdint.h> // Variabelndeklaration int vorkommaanteil = 12; int nachkommaanteil = 34; int main(void) { clock_init(F_CPU); // Taktquelle initialisieren oled_init(); // OLED Display initialisieren oled_clr(); // OLED Display löschen float floatvorkomma = vorkommaanteil; // Cast zur Typkonvertierung von int nach float float floatnachkomma = nachkommaanteil; // Cast zur Typkonvertierung von int nach float unsigned int temp = nachkommaanteil; // Ich habe als Variable für die Verweilbedingung einen Integer verwendet, da es bei mir mit float nicht geklappt hat. In C++ geht das seltsamerweise. while(temp>=1) // Die Nachkommazahl wird so lange durch 10 dividiert bis nur mehr 0,.... dasteht { floatnachkomma=floatnachkomma/10; temp=temp/10; } float summe=floatvorkomma+floatnachkomma;// Berechnung der Summe zwischen den beiden Float Variabeln Vorkomma und Nachkomma // Rückkonvertierung der Float Summe in Char, damit diese auf dem OLED Bildschirm ausgegeben werden kann. char buffer [50]; sprintf(buffer, "%fl", summe); //oled_print(210,130,buffer,BIG); // Ausgabe von char auf dem OLED Display while(1) // Endlosschleife { } } |
Datum:
Angehängte Dateien:Sorry. Eigentlich hätte ich einen Screenshot angehängt, aber das hat irgendwie nicht geklappt. Wenn ich auf "Build Active Configuration" klicke, dann steht da 0 Fehler. Wenn ich aber auf "Build and Run" klicke, dann geht ein Fenster so ähnlich wie ein Dateibrowser auf. Da steht oben: Please browse to the present location for files orignially found at: c:\avrdev\gcc\build-avr\gcc Ordner: Cframe Ich versuche nochmal den Screenshot anzuhängen.
Datum:
Zwar nicht die Antwort auf Deine Frage, aber die Methode, den Nachkommaanteil zu ermitteln, ergibt bei Nachkommavariablen-Wert von z.B. 1, 10, 100 oder 1000 immer dieselbe Float, nämlich 0,1. Ich denke, das ist nicht im Sinne des Erfinders. Was die Fehlermeldung anbelangt, sieht sie mir danach aus, als ob eine Datei nicht dort ist, wo sie AVR Studio erwartet. Also ggfs. AVR Studio (oder AVR-gcc) neu installieren. Aber ich habe nicht wirklich viel Erfahrung mit AVR Studio.
Datum:
kommt das sprintf mit float zurecht? das "fl" haste in deinem PC-Code nicht, kanns daran liegen?
Datum:
Hc Zimmerer schrieb: >> AVR Studio habe ich schon neu installiert. > > Die Fehlermeldung betrifft ein gcc-Verzeichnis. Hast Du WinAVR auch > nochmal installiert? Ja WinAVR ist auch schon neu installiert. Flo schrieb: > kommt das sprintf mit float zurecht? > das "fl" haste in deinem PC-Code nicht, kanns daran liegen? Hab auch schon "f" probiert, hat auch nichts geholfen. Es muss irgendwas mit den Variablen zu tun haben. Habe jetzt einen fixen float Wert genommen ohne Berechnung und dieser hat dann mit "sprintf" funktioniert.
Datum:
Es liegt nicht an AVRSTudio sondern am Compiler WinAVR. Bei der aktuellen Version ist leider bei ein paar *.a Dateien vergessen worden, die Pfadinformationen des Buildsystems, auf dem der Compiler compiliert worden ist, zu entfernen: "c:\avrdev\gcc\build-avr\gcc". Anscheinend versucht AVRStudio manchmal diese falschen Pfade zu benutzen. Wenn man nach "c:\avrdev\gcc\build-avr\gcc" in Google sucht so findet man entsprechende Artikel auf AVRFreaks. So auch diesen: http://www.avrfreaks.net/index.php?name=PNphpBB2&f.... Dort ist gegen Ende das Problem beschrieben und es gibt dort auch scheinbar eine Lösung dafür.
Datum:
Vielen Dank für deine Bemühungen. Ich werde mir gleich den von dir geposteten Link studieren.
Datum:
Bei der vorletzten Version von WinAVR tritt dieser Fehler nicht auf, also ist es die einfachste Lösung, diese statt der aktuellsten zu installieren: http://sourceforge.net/projects/winavr/files/WinAV...
Datum:
Rainer schrieb: > Bei der vorletzten Version von WinAVR tritt dieser Fehler nicht auf, > also ist es die einfachste Lösung, diese statt der aktuellsten zu > installieren: > > http://sourceforge.net/projects/winavr/files/WinAV... Nicht ganz. Bei der letzten Version (20100110 vom 20.01.2010) tritt das Problem nur bei einigen wenigen AVR-Typen auf. Bei der vorletzten Version (20100110 vom 10.01.2010) bei allen. Dein Link ist die vorvorletzte Versoin :)
