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:
1
#include<stdio.h>
2
#include<iostream>
3
#include<string>
4
#include<math.h>
5
#include<stdlib.h>
6
usingnamespacestd;
7
8
voidmain(void)
9
{
10
11
intvorkommaanteil=12;
12
intnachkommaanteil=34;
13
14
floatfloatvorkomma,floatnachkomma,summe;
15
16
stringsumstring;
17
18
printf("Betrag des Vorkommaanteils ist: %d",vorkommaanteil);
19
printf("\nBetrag des Nachkommaanteils ist: %d",nachkommaanteil);
20
21
floatvorkomma=(float)vorkommaanteil;// Cast zur Typkonvertierung von int nach float
22
floatnachkomma=(float)nachkommaanteil;// Cast zur Typkonvertierung von int nach float
23
24
// Ausgabe der Variabeln in Float
25
26
printf("\n\nBetrag des Float Vorkommaanteils ist: %f",floatvorkomma);
27
printf("\nBetrag des Float Nachkommaanteils ist: %f",floatnachkomma);
28
29
// Die Nachkommazahl wird so lange durch 10 dividiert bis nur mehr 0,.... dasteht
30
31
while(floatnachkomma>=1)
32
{
33
floatnachkomma=floatnachkomma/10;
34
}
35
36
printf("\n\nBetrag von Nachkomma nach Division ist: %f",floatnachkomma);
37
38
// Berechnung der Summe zwischen den beiden Float Variabeln Vorkomma und Nachkomma
39
40
summe=floatvorkomma+floatnachkomma;
41
42
printf("\n\nDie Summe der Float Variabeln ist: %f",summe);
#include<avr/interrupt.h> // AVR spezifisch zum Interrupthandling
7
#include"clock.h" // Takteinstellungen für CPUclk
8
#include"OLED.c" // Fkt. des OLED- Display
9
#include<math.h>
10
#include<stdlib.h>
11
#include<stdio.h>
12
#include<stdint.h>
13
14
// Variabelndeklaration
15
intvorkommaanteil=12;
16
intnachkommaanteil=34;
17
18
19
intmain(void)
20
21
{
22
clock_init(F_CPU);// Taktquelle initialisieren
23
oled_init();// OLED Display initialisieren
24
oled_clr();// OLED Display löschen
25
26
floatfloatvorkomma=vorkommaanteil;// Cast zur Typkonvertierung von int nach float
27
floatfloatnachkomma=nachkommaanteil;// Cast zur Typkonvertierung von int nach float
28
29
unsignedinttemp=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.
30
31
while(temp>=1)// Die Nachkommazahl wird so lange durch 10 dividiert bis nur mehr 0,.... dasteht
32
{
33
floatnachkomma=floatnachkomma/10;
34
temp=temp/10;
35
}
36
37
floatsumme=floatvorkomma+floatnachkomma;// Berechnung der Summe zwischen den beiden Float Variabeln Vorkomma und Nachkomma
38
39
// Rückkonvertierung der Float Summe in Char, damit diese auf dem OLED Bildschirm ausgegeben werden kann.
40
41
charbuffer[50];
42
sprintf(buffer,"%fl",summe);
43
//oled_print(210,130,buffer,BIG); // Ausgabe von char auf dem OLED Display
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.
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.
Stimmt, aber für meinen Test ist das im Moment ausreichend.
AVR Studio habe ich schon neu installiert. Kann mir nicht vorstellen,
dass es am Programm liegt, zumal es ja nur auftritt wenn der "sprintf"
cast gemacht wird.
Vielleicht gibt es jemanden der viel mit dem AVR Studio zu tun hat.
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.
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&file=viewtopic&t=92287.
Dort ist gegen Ende das Problem beschrieben und es gibt dort auch
scheinbar eine Lösung dafür.
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/WinAVR/20090313/WinAVR-20090313-install.exe/download
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 :)