www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Moving Average zu wenig RAM in MSP430


Autor: Dennis A. (dennis999)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe einen kontinuierlichen Strom an Messwerten und möchte mir aus 
diesen einen gleitenden Durchschnitt errechnen. Habe mir dazu einen 
Vektor mit den Werten angelegt und bilde über diesen den Mittelwert - 
bei einem neuen Messwert wird der älteste entfernt und der neue 
hinzugefügt.

So weit so gut. Da es aber eigentlich 3 Messdatenströme mit long Werten 
sind und die Mittelwerte am besten über ca. 500 Werte gebildet werden 
ist das schon eine Menge Speicherbedarf.

Der MSP430FG439 hat 2kB RAM und da ich die Vektoren mit den Messwerten 
als globale Variablen speicher scheint es ein Problem mit dem RAM zu 
geben. Zumindest gibt mir die IAR Workbench ab ca. 150 Messwerten zur 
Mittelung beim Linken folgende Fehlermeldung:
Error[e16]: Segment DATA16_Z (size: 0xb18 align: 0x1) is too long for segment definition. At least 0x31a more bytes needed. The problem occurred while  
processing the segment placement command "-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=0200-09FF", where  
at the moment of placement the available memory ranges were "CODE:201-9ff" 
   Reserved ranges relevant to this placement: 
   200-9ff              DATA16_I 

Das beste wäre es den RAM zu entlasten - aber wie kann ich das machen?

Auf andere Berechnungs-Methoden wie z.B.:

MW(n+1) = ( MW(n) * (N-1) + x(n) ) / N

möchte ich eigentlich nicht zurückgreifen.

Wäre toll, wenn jemand eine Idee dazu hätte.

Autor: Jobst M. (jobstens-de)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, 3x500 LWords = 6000Byte passen da einfach nicht rein ...

3x150 LWords = 1800Byte - ja, da ist irgendwo die Grenze.

Benötigst Du einen kontinuierlichen Mittelwert, oder reicht einer alle 
500 Samples?


Gruß

Jobst

Autor: gtf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dennis,
schlage vor, vorausgesetzt dass die Umgebung es zulässt,
und dazu noch Paar I/O frei sind, den gebrauch von Seriellen SRAM’s zu 
machen.
Díese gibt’s beispielsweise von Microchip.
http://www.microchip.com/stellent/idcplg?IdcServic...

Eine Softwarelösung kann ich dir leider nicht bieten.

Gruß
gtf

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis A. schrieb:
> Auf andere Berechnungs-Methoden wie z.B.:
>
> MW(n+1) = ( MW(n) * (N-1) + x(n) ) / N
>
> möchte ich eigentlich nicht zurückgreifen.

was spricht denn gegen den mittelwertsatz ? performance probleme oder 
sorgen um die genauigkeit ? normalerweise nimmt man den gerade für sowas

Autor: Jobst M. (jobstens-de)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis A. schrieb:
> möchte mir aus
> diesen einen gleitenden Durchschnitt errechnen

... ziehe meine Frage zurück :-)


Gruß

Jobst

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

Bewertung
0 lesenswert
nicht lesenswert
Dennis A. schrieb:

> So weit so gut. Da es aber eigentlich 3 Messdatenströme mit long Werten
> sind und die Mittelwerte am besten über ca. 500 Werte gebildet werden
> ist das schon eine Menge Speicherbedarf.

Idee:
Wie wäre es, wenn du jeweils zb 10 Messwerte zusammenfasst und von 
diesen den Mittelwert speicherst. Dann sampelst du erneut 10 Messwerte, 
bildest davon den Mittelwert, schmeisst den ältesten 10-er Mittelwert 
raus, den neuen rein und mittelst über diese 50 Mittelwerte.

Anstelle von 500 Werten musst du nur 50 speichern und hast trotzdem über 
500 Messwerte gemittelt, die du allerdings nur alle 10 Werte 
aktualisieren kannst.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit ein wenig schummeln kann man sogar die Aktualisierungsrate gleich 
der Messrate halten:
Einfach beim Messen+Aufsummieren der neuen 10 Werte noch die fehlenden 
Messwerte für den Mittelwert durch den Ältesten Mittelwert ersetzen.

Gruß Anja

Autor: Dennis A. (dennis999)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für eure Antworten,

werde die Lösung von  Karl heinz Buchegger implementieren, die könnte 
genau das sein was ich brauche.

Wenn es dann zu langsam wird, dann ist zusätzlicher RAM sicher eine 
Überlegung wert.

Autor: Dennis A. (dennis999)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Andi D.

Den Mittelwertsatz möchte ich nicht verwenden, da ich immer eine 
definierte Anzahl an vergangenen Messwerten betrachten möchte. Mein 
Messdatenstrom ändert sich mit der Zeit, und mit dem Mittelwertsatz 
gewichte ich ja über alle Messungen. Sprich wenn mein Pegel 100000 
Messwerte auf 1 bleibt und dann für 100 Messwerte auf 2 springt, tut 
sich beim Mittelwert nicht viel und ich bekomme den Sprung somit nicht 
mit.

Deswegen möchte ich eben nur die letzten Werte betrachten und nicht 
alle.

Im Prinzip möchte ich nur den Noise in meinem Datenstrom etwas glätten.

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst ein IIR Filter nehmen. Je nach Ordnung / Grenzfrequenz filtert 
es dir dein Noise weg und den Sprung bekommst du auch mit.

Gruss Helmi

Autor: Tauwetter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>und den Sprung bekommst du auch mit.

Da stellt sich dann die Frage, wie die Sprungantwort sein soll/darf :-)

Autor: Heinz Döpkemeier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu wenig RAM in MSP430


Mit const unsigned char Array[] versuchen


Gruß Heinz

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht so ungeduldig Heinz.
Da mußt Du schon deutlich länger warten als nur 4 Jahre, um den Preis 
für die längste Leitung zu erhalten.

Autor: Detlef Kunz (adenin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, aber die 4 Jahre Forschung, um zu der genialen Erkenntnis zu 
gelangen: "Wenn man keinen RAM hat, dann schmeißt man das Zeug eben in 
den ROM", sind nicht umsonst.
Sie dienen als (extrem) schlechtes Beispiel.

Und wie bekommt man die 16Bit-Werte in ein char?
Ganz einfach. Man speichert nur die Anzahl der gesetzten Bit ab.
He, so kann man bis zu 255 gesetzte Bit in einen char quetschen. ;)
:D

: Bearbeitet durch User
Autor: Helmut S. (helmuts)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum sind die Messwerte überhaupt "long". Hast du einen A/D Wandler mit 
mehr als 16bit?
Für 500Werte a' 16bit benötigt man nur 1kByte. Da ist dann immer noch 
1kB übrig.

Autor: Detlef Kunz (adenin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die sind nicht long, die sind too long. ;)
Und es ist auch too long her. ;)

Den Thread sollte man schließen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so long, and thanks for all the RAM, ähhh, fish

Autor: fish tales (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
How much is the fish?

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.