- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Berechnung falsch

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256

    Frage Berechnung falsch

    Anzeige

    Praxistest und DIY Projekte
    Hallo
    ich möchte auf meinem AVR folgende Rechnung durchführen.
    Code:
     
    uint16_t line_estimate = 0;
    uint32_t wa_numerator = 0;
    uint16_t wa_denominator = 0;
    
    uint16_t line_values[8];  //Werte zwischen 0...1023
    
    [...] //line values werden eingelesen und befüllt
    
     for(uint8_t i=0;i<8;i++)
    {
      wa_numerator += line_values[i] * (i+1) *1000;
      wa_denominator += line_values[i];
    }
    
    line_estimate = wa_numerator/wa_denominator;
    
    //Ausgabe
    char buffer[20];
        lcd_puts(itoa(line_estimate, buffer, 10));
    Allerdings funktioniert das nicht richtig. Wenn z.b alle Elemente von line_values 0 sind und nur das 1 einen anderen Wert hat müsste line_estimate 1000 sein, es schwankt aber nur "wild" hin und her und erreicht zeitweise negative bzw. Werte kleiner 1000 die es niemals erreichen dürfte. Meine Vermutung ist das ich noch irgendwo "typecasten" muss, ich weiss aber nicht wo
    Hat irgendjemand eine Erklärung für dieses seltsame Verhalten bzw. kann mir sagen wo der Fehler liegt?
    Geändert von Chypsylon (12.02.2012 um 19:40 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Diese Berechnung
    Code:
    line_values[i] * (i+1) *1000
    erfolgt in uint16_t. Für line_values[7] z.B. läuft das schon für alles >8 über.
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256
    Zitat Zitat von sternst Beitrag anzeigen
    Diese Berechnung
    Code:
    line_values[i] * (i+1) *1000
    erfolgt in uint16_t. Für line_values[7] z.B. läuft das schon für alles >8 über.
    Deswegen ist wa_numerator ja auch als 32bit deklariert?

    Code:
     
    uint32_t wa_numerator = 0;
    ...
    wa_numerator += line_values[i] * (i+1) *1000;
    Oder seh ich grad den Wald vor lauter Bäumen nicht

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Chypsylon Beitrag anzeigen
    Deswegen ist wa_numerator ja auch als 32bit deklariert?
    Und?
    Der Typ auf der linken Seite einer Zuweisung hat keinerlei Einfluss darauf, wie auf der rechten Seite der Ausdruck ausgewertet wird.
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256
    Ich hab auch schon probiert die rechte Seite als long zu casten, hat aber nicht wirklich was geändert...

    Code:
    wa_numerator += (long)(line_values[i]) *((i+1) *1000);
    bzw.
    wa_numerator += (long)(line_values[i] *((i+1) *1000));

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Was soll das "bzw." denn bedeuten? Die beiden Zeilen sind in ihrem Verhalten grundverschieden. Was genau hast du denn nun ausprobiert?
    MfG
    Stefan

  7. #7
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256
    Ich hab beide Varianten probiert. Meinem Verständnis nach sollte die erste eigentlich richtig sein

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Dann liefere doch mal ein konkretes Beispiel. Was steht in line_values und was kommt als Ergebnis raus?
    MfG
    Stefan

  9. #9
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256
    line_values[0] ist 600 die anderen sind 0.

    Das Ergebnis ändert sich jedoch ständig (Abstand zwischen den Messungen ist ca. 100ms)

    Offensichtlich wird das Ergebnis ständig dividiert und der Divisior wird proportional kleiner (siehe angehängte Grafik)

    00016
    00016
    00016
    00016
    00016
    00016
    00016
    00016
    00016
    00016
    ...(16 blieb anfangs ziemlich lange)
    02412
    01061
    00684
    00507
    00405
    00337
    00290
    00255
    00228
    00206
    00188
    00174
    00161
    00151
    00142
    00134
    00127
    00121
    00115
    00110
    00106
    00102
    00098
    00094
    00091
    00088
    00086
    00083
    00081
    00079
    00077
    00075
    00073
    00071
    00070
    00068
    00067
    00066
    00064
    00063
    00062
    00061
    00060
    00059
    00058
    00057
    00056
    00055
    00054
    00054
    00053
    00052
    00052
    00051
    00050
    00050
    00049
    00049
    00048
    00047
    00047
    00046
    00046
    00046
    00045
    00045
    00044
    00044
    00043
    00043
    00043
    00042
    00042
    00042
    00041
    00041
    00041
    00040
    00040
    00040
    00039
    00039
    00039
    00039
    00038
    00038
    00038
    00038
    00037
    00037
    00037
    00037
    00036
    00036
    00036
    00036
    00036
    00035
    00035
    00035
    00035
    00035
    00034
    00034
    00034
    00034
    00034
    00034
    00033
    06794
    02412
    01471
    01061
    00831
    00684
    00582
    00507
    00450
    00405
    00368
    00337
    00312
    00290
    00271
    00255
    00240
    00228
    00216
    00206
    00197
    00188
    00181
    00174
    00167
    00161
    00156
    00151
    00146
    00142
    00138
    00134
    00130
    00127
    00124
    00121
    00118
    00115
    00113
    00110
    00108
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Unbenannt.PNG  

  10. #10
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Und mit welcher Code-Variante sind diese Ergebnisse nun entstanden? Die 16 passt jedenfalls genau zu einer "Überlauf-Version".

    Das Ergebnis ändert sich jedoch ständig (Abstand zwischen den Messungen ist ca. 100ms)
    Und hast du mal kontrolliert, ob die Ausgangswerte überhaupt gleich bleiben? Das Ergebnis ändert sich schließlich nicht "einfach so".
    MfG
    Stefan

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Berechnung des DMS
    Von Unregistriert im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 3
    Letzter Beitrag: 21.02.2012, 19:10
  2. Antworten: 5
    Letzter Beitrag: 07.08.2008, 17:38
  3. CTC- Falsche Berechnung
    Von Spurius im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 24.07.2008, 22:49
  4. NTC-Berechnung
    Von Easter im Forum Sensoren / Sensorik
    Antworten: 10
    Letzter Beitrag: 04.05.2008, 18:57
  5. LED Berechnung
    Von mg im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 30.03.2006, 14:57

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus