Forum: Mikrocontroller und Digitale Elektronik Fehlersuche in AVR Studio


von Nino K. (lnino)


Lesenswert?

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
using namespace std;
7
8
void main(void)
9
{
10
11
  int vorkommaanteil = 12;
12
  int nachkommaanteil = 34;
13
14
  float floatvorkomma,floatnachkomma,summe;
15
16
  string sumstring;
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);
43
  printf("\n\n");
44
45
  char buffer [50];
46
  sprintf(buffer, "%.3f", summe);
47
48
  printf("\n\nBuffer ist: %s",buffer);
49
  
50
    system( "pause" );
51
}

AVR Studio Beispiel in C:
1
// ======================
2
#define F_CPU 16000000UL        // Taktfrequenz 16 MHz
3
4
// notwendige Includes
5
#include <avr/io.h>            // AVR spezifisch
6
#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
int vorkommaanteil = 12;
16
int nachkommaanteil = 34;
17
18
19
int main(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
  float floatvorkomma = vorkommaanteil;   // Cast zur Typkonvertierung von int nach float
27
  float floatnachkomma = nachkommaanteil;  // Cast zur Typkonvertierung von int nach float
28
29
  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.
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
  float summe=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
    char buffer [50];
42
  sprintf(buffer, "%fl", summe);
43
  //oled_print(210,130,buffer,BIG);    // Ausgabe von char auf dem OLED Display
44
45
  while(1)                                // Endlosschleife
46
    {
47
    
48
    }
49
}

von holger (Gast)


Lesenswert?

>dann bekomme ich eine Fehlermeldung von AVR.

Welche?

von Nino K. (lnino)


Angehängte Dateien:

Lesenswert?

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.

von Hc Z. (mizch)


Lesenswert?

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.

von Nino K. (lnino)


Lesenswert?

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.

von Flo (Gast)


Lesenswert?

kommt das sprintf mit float zurecht?
das "fl" haste in deinem PC-Code nicht, kanns daran liegen?

von Hc Z. (mizch)


Lesenswert?

> AVR Studio habe ich schon neu installiert.

Die Fehlermeldung betrifft ein gcc-Verzeichnis.  Hast Du WinAVR auch 
nochmal installiert?

von Nino K. (lnino)


Lesenswert?

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.

von SF (Gast)


Lesenswert?

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.

von Nino K. (lnino)


Lesenswert?

Vielen Dank für deine Bemühungen. Ich werde mir gleich den von dir 
geposteten Link studieren.

von Rainer (Gast)


Lesenswert?

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

von ... (Gast)


Lesenswert?

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

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.