www.mikrocontroller.net

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


Autor: Chris (Gast)
Datum:
Angehängte Dateien:

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

Autor: andy (Gast)
Datum:

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

Autor: Chris (Gast)
Datum:

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

Autor: andy (Gast)
Datum:

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

Autor: Chris (Gast)
Datum:
Angehängte Dateien:

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

Autor: Hagen (Gast)
Datum:

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

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.