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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.