XMC2Go DAVE Kompiliererproblem

Gast #3676304
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!
#3677708
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren