Forum: Mikrocontroller und Digitale Elektronik Mittelwertbildung aus 10 Werten im Ram Mega16


von René (Gast)


Lesenswert?

Hallo,

ich möchte gern aus 10 Werten die Im Ram des Controllers stehen auslesen
und den Mittelwert des Ganzen bilden.
Gibt es da im Assembler Lösungsansätzte?

Mittelwert = Wert von (1+10) / Anzahl

von Johannes M. (johnny-m)


Lesenswert?

Müssen es wirklich 10 Werte sein? Mit 8 oder 16 wäre es trivial...

von D. W. (dave) Benutzerseite


Lesenswert?

Können es auch 8 oder 16 Werte sein? Das wäre wohl einfacher.

Was meinst du mit Lösungsansätze?
Jeden Wert holen und zu einem Register hinzuaddieren. Am Ende dann durch 
10 teilen. Das Teile wird nicht einfach, aber dazu googlen. Wenn du wie 
oben gesagt jedoch auf 8 oder 16 Werte kämst, würde sich ein 3 oder 
4facher Shift Right anbieten.

von Karl H. (kbuchegg)


Lesenswert?

René wrote:
> Hallo,
>
> ich möchte gern aus 10 Werten die Im Ram des Controllers stehen auslesen
> und den Mittelwert des Ganzen bilden.
> Gibt es da im Assembler Lösungsansätzte?

Das würde ich straight forward machen.
Je nachdem, wie gross die Zahlen sind, entsprechend
viele Register für die Summe bereitstellen und darin
die einzelnen Werte aufsummieren. Bei Byte-Werten, reicht
es aus, wenn in 16 Bit summiert wird, also 2 Register.
Ansonsten wirst du wohl mit 24 Bit Arithmetik arbeiten
müssen. Ist aber zumindest im Bereich des Aufsummierens
kein Problem.

Aus dem Fundus an Routinen eine Divisionsroutine hervorgekramt
(16/8 oder 32/8, 24/8 haben wohl die wenigsten vorrätig)
und durch 10 dividieren.

PS: Ich würde mir auch überlegen, ob es unbedingt 10 Werte
sein müssen, oder ob nicht 8 oder 16 auch gehen würden. Denn
dann wäre die Division einfacher :-)

von Johannes M. (johnny-m)


Lesenswert?


von René (Gast)


Lesenswert?

Hallo,

können aus 8 oder 16 sein 16 ist sogar noch besser.

von Johannes M. (johnny-m)


Lesenswert?

René wrote:
> können aus 8 oder 16 sein 16 ist sogar noch besser.
Also, wo genau liegt das Problem?

von René (Gast)


Lesenswert?

also alles aufaddieren

maximal also 8 * 256 = 2048 da Reicht also eine 16 Bit addition und dann
3 mal lsr ror hintereinander.

meint Ihr das so?

Mfg
René

von Johannes M. (johnny-m)


Lesenswert?

René wrote:
> also alles aufaddieren
>
> maximal also 8 * 256 = 2048 da Reicht also eine 16 Bit addition und dann
> 3 mal lsr ror hintereinander.
Zum Beispiel. Bei 16 Werten dann einmal mehr schieben...

von Jan E. (Firma: Austriamicrosystems AG) (jankey)


Lesenswert?

Google --> IIR Filter

von Luther B. (luther-blissett)


Lesenswert?

René wrote:
> Hallo,
>
> ich möchte gern aus 10 Werten die Im Ram des Controllers stehen auslesen
> und den Mittelwert des Ganzen bilden.
> Gibt es da im Assembler Lösungsansätzte?
>
> Mittelwert = Wert von (1+10) / Anzahl

Du kannst durch bekannte Konstanten (=10) auch mit festen shifts+add 
dividieren. Siehe hier:

http://www.cs.uiowa.edu/~jones/bcd/divide.html

Seine Beispiele sind in C, lassen sich aber spielend in Assembler 
übertragen.

von rene (Gast)


Lesenswert?

Mit noch weniger Aufwand, speziell wenn's schnell gehen muss :
http://www.ibrtses.com/embedded/exponential.html

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.