Forum: Mikrocontroller und Digitale Elektronik XMC2Go DAVE Kompiliererproblem


von Gabriela (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit folgendem Kode. Dieses Kode habe ich zum 
Easymain.c vom Dave XMC2Go Initial Startprojekt hinzugefügt. ADC 
Auslesen und der ADC-Wert(0-1023) ausgeben funktionieren wunderbar, aber 
wenn ich entsprechende Spannungswert berechnen möchte, hängt das 
Programm komischerweise. Ich habe viele Sachen ausprobiert, aber konnte 
nicht feststellen, ob das Problem beim int/float Casting oder beim 
sprintf() liegt. Es kann wohl ein Bug sein.

1
uint16_t result;
2
float voltage;
3
result = XMC2GO_Adc_Read();
4
voltage = (float)result * 3.3 / 1023;
5
sprintf(arr, "Voltage value1 = %f \r\n", voltage);
6
for(j = 0; j < strlen(arr); j++)
7
{
8
USIC0_CH0->IN[0] = arr[j];
9
}

Vielen Dank im Voraus!

von Detlef K. (adenin)


Lesenswert?

Das übliche:
Ich sehe, was was Du nicht siehst und das beginnt mit arr
Leute, holt schon mal eure Glaskugeln raus, das wird wieder lustig.

von Gabriela (Gast)


Lesenswert?

arr wurde richtig als char array deklariert. Oben habe ich es vergessen 
das hinzufügen.

von Uwe B. (derexponent)


Lesenswert?

Gabriela schrieb:
> Hallo,
>
> aber konnte
> nicht feststellen, ob das Problem beim int/float Casting oder beim
> sprintf() liegt.

der Quelltext den du gepostet hast, hat keinen Fehler
(event. ist dein String zu klein dimensioniert, muss >= 30 Zeichen sein)

wenn die Ausgabe von Dezimalzahlen klappt, liegt es
vermutlich aber eher daran, das dein sprintf keine Floats umwandeln kann

benutz mal das hier :
1
#define  STRING_BUF_SIZE     50   // maximum Grösse vom String
2
char STRING_BUF[STRING_BUF_SIZE];
3
#define  STRING_FLOAT_FAKTOR     1000   // 1000 = 3 Nachkommastellen
4
#define  STRING_FLOAT_FORMAT "%d.%03d"  // Formatierung
5
6
7
void FloatToDezStr(float wert)
8
{
9
  int16_t vorkomma;
10
  uint16_t nachkomma;
11
  float rest;
12
13
  if((wert>32767) || (wert<-32767)) {
14
    // zahl zu groß oder zu klein
15
    sprintf(STRING_BUF,"%s","OVF");
16
    return;
17
  }
18
19
  vorkomma=(int16_t)(wert);
20
  if(wert>=0) {
21
    rest = wert-(float)(vorkomma);
22
  }
23
  else {
24
    rest = (float)(vorkomma)-wert;
25
  }
26
  nachkomma = (uint16_t)(rest*(float)(STRING_FLOAT_FAKTOR)+0.5);
27
28
  sprintf(STRING_BUF,STRING_FLOAT_FORMAT,vorkomma,nachkomma);
29
}
30
31
32
main() {
33
34
  uint16_t result,j;
35
  float voltage;
36
  char arr[50];
37
38
  result = XMC2GO_Adc_Read();
39
  voltage = (float)result * 3.3 / 1023;
40
  
41
  FloatToDezStr(voltage);
42
43
  sprintf(arr, "Voltage value1 = %s \r\n", STRING_BUF);
44
  for(j = 0; j < strlen(arr); j++)
45
  {
46
    USIC0_CH0->IN[0] = arr[j];
47
  }
48
 
49
}

Gruss Uwe

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.