Mittelwert aus 4-Byte-Zahlen bilden

Gast #107979
Lesenswert?

Hallo,

ich programmiere gerade ein Unterprgramm, das nach jeder Messung
aufgerufen werden soll, um acht Meßwerte zu addieren, durch Division
durch acht den Mittelwert zu bilden und nach dem achten Aufruf
auszugeben ans LCD. Mein Problem ist die Verarbeitung der Überläufe bei
den Additionen, da die Carry-Flags zwischen der einen und der nächsten
Messung zwischen-gespeichert werden müssen und zusätzlich noch ein
Überlauf innerhalb der 4-Byte-Zahl ebenfalls berücksichtigt werden
muß.
Außerdem: ist die Division durch acht bezüglich Überläufen so korrekt?

In der angehängten Datei befindet sich der momentane Stand meiner
Bemühungen. Ist direkt lauffähig im Simulator. Kann mir bitte jemand
mit Tipps weiter helfen?

Gruß
Angehängte Dateien:
Gast #107980
Lesenswert?

Hallo.
Ich habe mir gerade ein Programm zusammengebastelt,welches mir
4 Messwerte die in 4 Registern gespeichert sind zusammenrechnet und
dann durch 4 teilt.Die Anzahl der Register und der Teilfaktor können
leicht geändert werden.Falls Interesse besteht,bescheid sagen,dann
kommentier ich es etwas und schicks dir.
gruss
Andy
Gast #107981
Lesenswert?

"welches mir 4 Messwerte die in 4 Registern gespeichert sind
zusammenrechnet"

Hallo,

bei Dir sind das dann vier 8-Bit Zahlen oder? Bei meinem Problem
handelt es sich um 32-Bit-lange Meßwerte (vier Bytes lang).

Gruß
Gast #107983
Lesenswert?

Hallo,

anbei eine korrigierte Version. Die Reihenfolge, in der die Register
addiert werden, war falsch. Woanders war die Reihenfolge beim Auslesen
der RAM-Plätze falsch. Falsch hingeschrieben und dann nicht mehr
gemerkt ;) Neuderdings werden die Register mit anderen Zahlen
initialisiert.

Die Addition scheint zu stimmen. Wenn man die Division durch acht nicht
auskommentiert, kommt manchmal der richtige Wert (immerhin), bei
etlichen Messungen wieder falsche Werte, dann wieder mal der richtige.


Ich würde mich freuen, falls jemand eine Idee hätte, was an der
korrigierten Version noch falsch sein könnte.

Gruß
Angehängte Dateien:
Gast #107984
Lesenswert?

Statt 32 Bit zu rechnen, wird der Akkumulator der 8 Additionen auf 40Bit
erweitert.

Du definierst also zB. noch Mittel5 = r24. In "addiere" nach der
letzten Addition dann

clr temp1
adc Mittel5, temp1

um das eventuell entstehende Carry=Überlauf zu addieren. Dies kann nur
0 oder 1 sein.

Du addierst so deine 8 mal 32Bit Werte auf diesen 40Bit Wert. Danach
wird dieser 40Bit Wert per 3 Rechtshift mit 8 dividiert.

In deinem Source tuest du dies in den rBin1?? Werten, allerdings aber
falsch.


Statt:

lsr rBin1H;drei mal durch zwei dividieren ergibt Division durch acht
ror rBin1MH
ror rBin1ML
ror rBin1L

ror rBin1H;drei mal durch zwei dividieren ergibt Division durch acht
ror rBin1MH
ror rBin1ML
ror rBin1L

ror rBin1H;drei mal durch zwei dividieren ergibt Division durch acht
ror rBin1MH
ror rBin1ML
ror rBin1L


muß es so sein:

lsr rBin1H;drei mal durch zwei dividieren ergibt Division durch acht
ror rBin1MH
ror rBin1ML
ror rBin1L

lsr rBin1H;drei mal durch zwei dividieren ergibt Division durch acht
ror rBin1MH
ror rBin1ML
ror rBin1L

lsr rBin1H;drei mal durch zwei dividieren ergibt Division durch acht
ror rBin1MH
ror rBin1ML
ror rBin1L


Gruß Hagen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren