Probleme mit float Berechnung

Gast #3835728
Lesenswert?

Hallo!

Ich verwenden den AT32UC3C (AVR Studio6) und berechne in meinem Programm 
float variablen. Das Ganze hat immer funktioniert, nun bin ich auf ein 
neues Board (eigene Hardware) umgestiegen und habe auf einmal Probleme 
mit den float-Variablen.

Hier der Code:
1
void SamplingTimerCallback()
2
{
3
  float voltage = 5.5;
4
  
5
  for (U8 i = 0; i < TEMP_CONTROL_NUM_CONTROLS; i++)
6
  {
7
    control_array[i].Ta_counter++;
8
    if(control_array[i].Ta_counter > control_array[i].Ta * 100 )      // sampling time is reached, * 100 because Ta is adjusted in s, and this callback function is called every 10ms -> * 1000/10
9
    {
10
      S16 adc_value = GetAdcValue(control_array[i].channel_ID);
11
      if(adc_value != ADC_NOT_READY)
12
      {
13
        voltage = (adc_value * TEMP_CONTROL_REF_VOLTAGE) / TEMP_CONTROL_ADC_RANGE;
14
        float res_ntc = TEMP_CONTROL_R_SERIES_NTC / ((TEMP_CONTROL_VOLTAGE_DIVIDER/voltage) - 1);
15
        
16
        // differntiate between different NTCs for carousel temp and heatsinks temp:
17
        float temp_ntc = 0.0;
18
        if(i==0)
19
        {
20
          temp_ntc = (TEMP_CONTROL_NTC_B_VALUE_1 * TEMP_CONTROL_NTC_NOMINAL_TEMP) / (TEMP_CONTROL_NTC_B_VALUE_1 + ( log(res_ntc / TEMP_CONTROL_NTC_NOMINAL_VALUE) * TEMP_CONTROL_NTC_NOMINAL_TEMP)) - 273.15;
21
        }
22
        else
23
        {
24
          temp_ntc = (TEMP_CONTROL_NTC_B_VALUE_2 * TEMP_CONTROL_NTC_NOMINAL_TEMP) / (TEMP_CONTROL_NTC_B_VALUE_2 + ( log(res_ntc / TEMP_CONTROL_NTC_NOMINAL_VALUE) * TEMP_CONTROL_NTC_NOMINAL_TEMP)) - 273.15;
25
        }
26
        // --------------------------------------------------------------------------
27
        
28
        control_array[i].actual_value = temp_ntc;
29
        
30
        PID_control(&control_array[i]);
31
        
32
        control_array[i].ControlFunction(control_array[i].controlled_variable);
33
        
34
        control_array[i].Ta_counter = 0;  
35
      }
36

37
    }
38
  }
39
  TimerRestart(SamplingTimer);
40
}

das Ganze wird einfach alle 10ms aufgerufen und float werte (z.B. 
voltage) berechnet. Alle float variablen haben jedoch sehr hohe werte 
und stimmen überhaupt nicht.

voltage = (adc_value * TEMP_CONTROL_REF_VOLTAGE) / 
TEMP_CONTROL_ADC_RANGE;
adc_value ist ein normaler S16, dessen wert auch immer stimmt (1345)
TEMP_CONTROL_REF_VOLTAGE ist eine Konstante mit 2.345 definiert
TEMP_CONTROL_ADC_RANGE ist eine Konstante mit 2048 definiert.

für voltage kommt jedoch immer die Zahl 1065353216 raus, keine Ahnung 
warum!
Kann mir dabei jemand weiterhelfen?

Danke, lG
#3835734
Lesenswert?

Und weshalb muss man float in eibnen timer rechnen ? Die gezeigten float 
Rechnungen dienen dem benutzerinterface und brauchen daher nur mit 
Userinterface Geschwindigkeit neu berechnet werden.

Zum Problem. Der UC3C hat eine FPU, andere ev nicht, dann macht es die 
Library. Allenfalls in dieser Richtung weitersuchen.

Dann sich Zwischnewerte per UART oder so ausgeben lassen um den fehler 
zu finden.
Gast #3835774
Lesenswert?

Um das Ganze einfacher zu machen:
Hab nun zum test in der Main aingefügt:

float a = 5.3;
float b = 2.4;
float c = a*b;

Wenn ich unmittelbar nach diesen 3 Zeilen einen Breakpoint setzte, und 
mir die werte anschaue:
a= 1084856730
b= 1075419546
c= 1095468320

Siehe Anhang!
Schön langsam verstehe ich die Welt nicht mehr...

Bitte um Hilfe!
Danke!
Angehängte Dateien:
Gast #3835818
Lesenswert?

WOW!
warum wird denn hier auf einmal der speicherwert angezeigt?
das heißt, es ist nur ein anzeigefehler, im Hintergrund wird richtig 
gerechnet?

Wie kann ich denn den tatsächlichen wert anzeigen lassen?

Ihr seid wirklich spitze!
Gast #3836384
Lesenswert?

Hans Peter schrieb:
> Wie kann ich denn den tatsächlichen wert anzeigen lassen?

Float sind Bits, die genauso im Speicher liegen, wie die anderen 
Variablen auch. Wie du die Bits interpretierst und anzeigen läßt, bleibt 
dir überlassen. Int kannst du auch als Dezimal, Hex, Binär oder sonstwie 
anzeigen lassen.
Gast #3846728
Lesenswert?

HAllo,

ich habe nun schon von einigen gehört, dass man das " Use GDB" Flag 
setzen kann, dann funktioniert es wieder. Aber bei mir nicht, wenn ich 
das aktiviere, bekomm ich beim Versuch zu debuggen andauernd 
Fehlermeldungen, der Debugger wird nicht mehr erkannt und das Atmel 
Studio stürzt dauernd ab.

Schön langsam reichts mir mit ATmel Studio, andauernd bringen sie neue 
Versionen raus, die mehr Bugs besitzen wie die alten. Beim 6.1. hat das 
nämlich einwandfrei funktioniert. Ich habe das schon öfters erlebt, dass 
in einer neuen Version auf einmal manche Dinge nicht mehr funktionieren, 
die in der alten Version einwandfrei funktioniert haben.
#3847131
Lesenswert?

m.n. schrieb:
> Joachim B. schrieb:
>> ich weiss warum ich immer noch mit 4.18 arbeite
>>
>> wozu updaten wenns geht ?
>
> Aber die 4.19 könntest Du Dir doch schon gönnen!

hatte ich versucht, aber da gab es auch ein Problem, -> verdrängt ....

wieder 4.18 installiert, geht !

ich progge  gleiche Projekte an 5 Rechnern und da ist es optimal wenn es 
an allen gleich läuft
#3847162
Lesenswert?

@m.n. (Gast)

>> ich weiss warum ich immer noch mit 4.18 arbeite
>> wozu updaten wenns geht ?

EBEN! Mach ich auch so!

>Aber die 4.19 könntest Du Dir doch schon gönnen!

Nö, die hat Probleme mit dem AVR GCC da geht was nicht so richtig. Darum 
"nur" 4.18. Läuft wie geschmiert.
Gast #3847174
Lesenswert?

Joachim B. schrieb:
> hatte ich versucht, aber da gab es auch ein Problem, -> verdrängt ....
>
> wieder 4.18 installiert, geht !

Interessant; werde ich mir für den Fall merken, dass es mal haken 
sollte.

Für AVR32 aber wohl keine Lösung, da diese noch nicht unterstützt werden 
(oder ich es mal wieder nicht raffe und auch nicht brauche).
Auch die ATtiny441/841 sind dort nicht bekannt; das stört mich am 
meisten.

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