www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mittelwerte Bilden


Autor: René (Gast)
Datum:

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

Autor: Fred S. (Gast)
Datum:

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

Autor: Fred S. (Gast)
Datum:

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

Autor: Jupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mittelwert bilden. Wie stelle ich das [...] an.

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

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werd ich machen.

danke für die Anregungen an euch.

Autor: Thomas O. (kosmos)
Datum:

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

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.