Forum: Mikrocontroller und Digitale Elektronik Mittelwerte Bilden


von René (Gast)


Lesenswert?

Hallo,

ich möchte gern aus ca. 5-10 Werten die im RAM eines ATMEGA 16 einen 8 
Bit
Mittelwert bilden. Wie stelle ich das am besten an.
Gibt es da elegante methoden.

ich habe das momentan mit

vorher Register mit Ram laden

und dann mit

lsr temp1
lsr temp2
add temp1,temp2

gemacht


bei 10 Werten kommt das ganz schön was an code zusammen

ich suche nach einer eleganteren Methode

Könnt Ihr helfen?

Mfg
René

von Fred S. (Gast)


Lesenswert?

Hi René,

sinnvoller scheint es, die Werte erst aufzuaddieren, dann durch deren 
Anzahl zu dividieren. Lies die Werte doch über X, Y oder Z indirekt ein. 
Ich gehe dabei davon aus, dass die Werte hintereinander im RAM liegen 
und bei Adresse data anfangen. Optimal sollte ANZAHL=2_hoch_n sein

#define ANZAHL 10

.def suml r20
.def sumh r21
.def null r0

.dseg
.org SRAM_START
data: BYTE ANZAHL


.cseg
.org DEINE_ANFANGSADRESSE

;..... anderer Code hier

clr null         ; ist auch für andere Zwecke später zu gebrauchen!

;..... anderer Code hier

mittelw:
    ldi r16, ANZAHL
    clr sumh
    clr suml
    ldi XL, low(data)
    ldi XH, high(data)
lp: ld r17, X+
    add suml,r17
    adc sumh,null
    dec r16
    brne lp
; jetzt suml/sumh "nur" noch durch ANZAHL dividieren......
;    (vielleicht bei 7-10 Werten durch eine Division durch 8 (3*
;        Rechtsshift) annähern (?) -- sonst bleibt Dir nur die "echte"
;         Divisionsroutine (ist von Atmel in Dokument "AVR200"
;           beschrieben)
   asr sumh
   ror suml
   asr sumh
   ror suml
   asr sumh
   ror suml



Gruß

Fred

von Fred S. (Gast)


Lesenswert?

P.S.
Bei 10 Werten kommst Du bei der Mittelwertbildung natürlich nicht um 
eine "echte" Division herum. Du musst überlegen, ob Du es einrichten 
kannst, 2_hoch_n Daten zu haben, oder hinnehmen, dass Du bei 10 
addierten Werten und nachfolgender Division durch 8 eben ein 9 Bit 
Ergebnis bekommst -- oder hinnehmen, eine 16 Bit durch 8 Bit 
Divisionsroutine einzusetzen.

von Jupp (Gast)


Lesenswert?

>Mittelwert bilden. Wie stelle ich das [...] an.

Die Werte einfach addieren und durch die Anzahl der Werte teilen. Ferig!

von Matthias L. (Gast)


Lesenswert?

>vielleicht bei 7-10 Werten durch eine Division durch 8 (3*
;        Rechtsshift) annähern (?) -- sonst bleibt Dir nur die "echte"

Nimm acht Wert für deinen Mittelwert wie  Fred S. (fredhs) es gezeigt 
hat.

Wenn du nach der Division durch 8 (3mal rechtsschieben) das carry noch 
dazu addierst, dann hast du gleich noch gerundet

von René (Gast)


Lesenswert?

Hallo,

sorry das können auch 12 oder mehr Werte sein wenn es die Sache 
vereinfacht umso besser.

von Falk B. (falk)


Lesenswert?

@  René (Gast)

>sorry das können auch 12 oder mehr Werte sein wenn es die Sache
>vereinfacht umso besser.

Dann nimm 16, ist viermal rechts schieben.

MFG
Falk

von René (Gast)


Lesenswert?

Werd ich machen.

danke für die Anregungen an euch.

von Thomas (kosmos)


Lesenswert?

wo kommen deine Werte her für die du einen Mittelwert bilden willst 
evtl. vom AD-Wandler? Dann könntest du nämlich auch einen RC-Filterglied 
nehmen. Wobei es in Software komfortabler wäre wenn man da nach 
verschiedenen Bedingungen die Mittelwertbildung verändern will.

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.