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ß
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
"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ß
Hallo. Hab ich bei deinem Text übersehen.Klar,es handelt sich um vier 8-Bit Zahlen. gruss Andy
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.