Forum: Mikrocontroller und Digitale Elektronik Mittelwert aus 4-Byte-Zahlen bilden


von Chris (Gast)


Angehängte Dateien:

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ß

von andy (Gast)


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

von Chris (Gast)


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ß

von andy (Gast)


Lesenswert?

Hallo.
Hab ich bei deinem Text übersehen.Klar,es handelt sich um vier 8-Bit
Zahlen.
gruss
Andy

von Chris (Gast)


Angehängte Dateien:

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ß

von Hagen (Gast)


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

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.