Forum: Mikrocontroller und Digitale Elektronik Mittelwert aus Array berechenen C


von Andi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe ein Problem bei einer Mittelwertbildung aus einem Array.
Ich habe ein Array aus einer eigenend Struct wodurch die
einzelnen Punkte eine Stromwert, Messpunktnummer und Zeitwert haben.
Dieses Array wird im normal Fall vom ADC beschrieben, das klappt auch.
Zum testsen von einzelnen Funktionen habe ich das Array manuell selbst 
beschrieben.
Nun möchte ich aus 5 Werten den Mittelwert für Strom und Zeit berechnen.
Beispiel Strom:
Arraystelle:   Stromwert[mA]:
0              1000
1              1200
2              1100
3              1200
4              1300

Theoredischer Mittelwert: 1160

Am Ende Prüfe ich meine Mittelwertfunktion mit einem einfachen if auf 
1160
und dann soll eine LED an gehen.
Jedoch bleibt die LED aus. Sie geht an wenn ich auf 960 vergleiche.
Das Ergebnis entsteht wenn man nur die Array Werte 1-4 und nicht 0-4 zur 
Mittelwertbildung benutzt werden. aber warum benutzt mein Code nicht 
0-4?
Meine for schleife geht von 0-4 von daher versteh ichs nicht. Oder leigt 
der fehler noch wo anders?

Gruß und Danke schonmal für die hilfe

von Micha .. (micha68) Benutzerseite


Lesenswert?

Hi!
So wie es aussieht, werden nur die Wert von 1-4 addiert und durch 5 
geteilt, der Wert bei 0 scheint zu fehlen.

Gruss,
Micha

Edit: Hast Du gerade Deinen Text editiert?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> #define SIZE_POINTS 4
> static volatile ADC_MP Points [SIZE_POINTS];

Points ist zu klein!

von Oliver (Gast)


Lesenswert?

Es gibt Fragestellung, für die haben andere Leute Debugger erfunden. 
Deine ist so eine.

Schrittweise durchsteppen, Werte ansehen, und überprüfen, was passiert.

Falls du keinen Debugger hast, der Fehler steckt in dieser Zeile:
>#define SIZE_POINTS 4

Oliver

von NurEinGast (Gast)


Lesenswert?

Du schrebist den Mittelwert in "The_Point.current".
          The_Point.current = (summe_current /5);
Die fragst aber "summe_current" ab. Dort steht noch die Summe, nicht der 
Mittelwert.
         if (summe_current == 1160)

von Karl H. (kbuchegg)


Lesenswert?

Und wenn in einer for-Schleife, die ganz offensichtlich die Aufgabe hat, 
alle Elemente eines Arrays durchzugehen ...

   for (uint8_t i = 0; i<=4; i++)

ein <= bei der Abbruchbedingung auftaucht, dann muessen in dir in 
Zukunft sofort 5 Warnglocken und Sirenen losgehen.

Etwas in der Form sieht praktisch immer so aus
1
#define ANZAHL  5
2
3
int Array[ ANZAHL ];
4
5
6
...
7
8
  for( i = 0; i < ANZAHL; ++i )
9
    mach was mit Array[i];

achte darauf, wie das #define-ment für Anzahl an den einzelnen Stellen 
benutzt wird! Auf die Art stimmt immer alles zusammen.
Und nochwas: Ein Array mit 5 Einträgen, hat gültige Indizes
   0, 1, 2, 3, 4
zähl nach. Sind genau 5 Stück. Bei der Definition eines Arrays gibt man 
an, wieviele Elemente man haben möchte und nicht, welches der höchste 
noch zulässige Index sein soll.

von Andi (Gast)


Lesenswert?

Michael V. schrieb:
> Edit: Hast Du gerade Deinen Text editiert?

nein.
kann man als Gast auch nicht oder?

Oliver schrieb:
> Falls du keinen Debugger hast

eben hab leider keinen...

da hab ich mit der 0 Indizierung bei Arrays vertan.
Hab in der Verwirrung angenommen das wenn ich 4 angebe
zählt das Array 0,1,2,3,4. Sind aber 5 Werte ;)
Danke!

von Andi (Gast)


Lesenswert?

NurEinGast schrieb:
> Die fragst aber "summe_current" ab. Dort steht noch die Summe, nicht der
>
> Mittelwert.
>
>          if (summe_current == 1160)

ja weiß ich. sollte The_Point.current hab ich vergessen zu ändern vorm 
hochladen weil ich da kurzeitig auf 4800 abgefragt hatte.

von Andi (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> #define ANZAHL  5
> int Array[ ANZAHL ];

> ...
>
>
>
>   for( i = 0; i < ANZAHL; ++i )
>
>     mach was mit Array[i];


ja sollte lieber Anzahl angeben das stimmt. aber warum nur < und nicht 
<= ?
mit < fehlt mir doch mein letzter wert oder?

von Karl H. (kbuchegg)


Lesenswert?

Andi schrieb:
> Karl heinz Buchegger schrieb:
>> #define ANZAHL  5
>> int Array[ ANZAHL ];
>
>> ...
>>
>>
>>
>>   for( i = 0; i < ANZAHL; ++i )
>>
>>     mach was mit Array[i];
>
>
> ja sollte lieber Anzahl angeben das stimmt. aber warum nur < und nicht
> <= ?
> mit < fehlt mir doch mein letzter wert oder?

Anzahl sei 5

  0    ist kleiner als 5
  1    ist kleiner als 5
  2    ist kleiner als 5
  3    ist kleiner als 5
  4    ist kleiner als 5

  5    ist nicht kleiner als 5 -> Schleife wird nicht mehr wiederholt
                                  sondern verlassen.

Der Schleifenrumpf wird als mit Werten für i von
    0, 1, 2, 3, 4
durchlaufen. Sobald i zu 5 wird, schlägt die Bedingung zu und die 
Schleife ist beendet.

Was waren noch mal die gültigen Indizes bei einem Array der Größe 5?

    0, 1, 2, 3, 4    (zähl nach, sind genau 5 Stück)

von Andi (Gast)


Lesenswert?

ja logisch. Ich sollte mirn Kaffee holen um wieder denken zu können ;)

Aber danke das du immer so geduldige und gute Antworten gibt.
Hast mir die letzten Wochen schon oft geholfen!

von Martin G. (mager)


Lesenswert?

Tipp: spare Dir die Division durch 5 und vergleiche mit dem 5-fachen des 
Grenzwertes (5*1160=5800).
PS: denk auch dran, den Wertebereich für 16-bit-Zahlen nicht zu 
überschreiten!

von Oliver (Gast)


Lesenswert?

Andi schrieb:
> Oliver schrieb:
>> Falls du keinen Debugger hast
>
> eben hab leider keinen...

Das solltest du schleunigst ändern. Exhte Männer programmieren zwar 
ohne, aber diese Sorte echte Männer gibts auch nur im Film.

Oliver

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.