mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mittelwert aus Array berechenen C


Autor: Andi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Micha ... (micha68) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> #define SIZE_POINTS 4
> static volatile ADC_MP Points [SIZE_POINTS];

Points ist zu klein!

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: NurEinGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
#define ANZAHL  5

int Array[ ANZAHL ];


...

  for( i = 0; i < ANZAHL; ++i )
    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.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Martin Gerken (mager)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.