Forum: Mikrocontroller und Digitale Elektronik Aus 32 Bit mache 16


von Hier könnte ein Name stehen (Gast)


Lesenswert?

Moing

Ich bin neu in Assembler und habe ein kleines Problem:

Ich kriege den 10Bit ADC Wert, Multipliziere diesen und habe dann ein 32 
Bit Resultat welches in den Registern R16-R19 abgelegt wird.

So weit so toll.
Ich will für die weiteren Berechnungen aber nur 16Bit benutzen und die 
unteren 16 Bit vergessen ohne den dezimal wert zu verändern (also nur 
genauigkeit verlieren da nur die 3 bz. 2 vordersten dezimalzeichen vor 
dem Koma sind )

Meine bisherigen überlegung:
Ich könnte die unteren 16 Bit weglasen und dann die oberen 16 
entsprechend multiplizieren..toll dann habe ich wieder eine lange zahl.

da stehe ich gerade vor einer wand..kann mir jemand ein Tipp geben wie 
ich das angehen kann?
Muss nicht ein ganzes tut sein....darf aber ;)

von Bitler (Gast)


Lesenswert?

Schreibe ein Zahlenbeispiel hier rein. A/D Wert, deine Rechnung und das 
was rauskommen soll.

von Hier könnte ein Name stehen (Gast)


Lesenswert?

Okey...Ich probier mal ein beispiel zu machen ;)

Alle Angaben sind dezimal

1. Faktor (ADC Wert) = 911
2. Faktor = 1207464
Das Produkt im 32Bit Akku = 1099999704

Und nun möchte ich das in 1099 umwandeln, konkret die hinteren 6 dez. 
stellen vergessen und in ein 16 Bit register speichern..

Ich das irgendwie möchglich?

von Sam .. (sam1994)


Lesenswert?

Die Variable 16 mal nach rechts schieben. Der Compiler erkennt das und 
nimmt verwirft die unteren 2 Bytes.

von Bitler (Gast)


Lesenswert?

Samuel K. schrieb:
> Die Variable 16 mal nach rechts schieben.

Das will er nicht, er will durch 1.000.000 teilen.

Hier könnte ein Name stehen schrieb:
> Und nun möchte ich das in 1099 umwandeln, konkret die hinteren 6 dez.
> stellen vergessen und in ein 16 Bit register speichern.

Einfach das Ergebnis durch 1.000.000 teilen und dann nur das low Byte 
übernehmen.

Was wird gemessen, wie soll es skaliert werden und welche Genauikgeit 
wird gewünscht. Ich finde die Rechnung irgendwie komisch. Da gibt es 
vielleicht andere Möglichkeiten.

von spess53 (Gast)


Lesenswert?

Hi

>Die Variable 16 mal nach rechts schieben. Der Compiler erkennt das und
>nimmt verwirft die unteren 2 Bytes.

Das wäre eine Division durch 65536. Der TO will aber eine Division durch 
1000000. Außerdem verwirft der Assembler nichts.

@Hier könnte ein Name stehen (Gast)

Wenn du sowieso etwas verwerfen willst, warum dann der Faktor von 
1207464?

Aber,wenn du mit 79132 (1,207464*65536) multiplizierst, dann bekommst du 
durch weglassen der unteren 16 Bits deinen gewünschten Wert.

MfG Spess

von Hier könnte ein Name stehen (Gast)


Lesenswert?

spess53 das ist GENIAL!

Thx das ist genau dass was ich brauche =D

Geniale Idee! Natürliche kenne ich das Binäre Zahlensystem, Aufbau, 
umrechnen u.s.w. einigermassen..aber ich frage mich immer: "Wie kommt 
man auf diese Ideen?"

Gruss und danke für alles
[Immer noch KEIN Name]

von spess53 (Gast)


Lesenswert?

Hi

>Geniale Idee! Natürliche kenne ich das Binäre Zahlensystem, Aufbau,
>umrechnen u.s.w. einigermassen.

Dein Controller 'denkt' nun mal binär. Also musst du auch so denken. 
Nicht nur umrechnen.

>.aber ich frage mich immer: "Wie kommt man auf diese Ideen?"

Wenn du in 30 Jahren noch Assembler programmierst geht das automatisch.

MfG Spess

von Ralph (Gast)


Lesenswert?

such mal nach dem Stichwort "festkomma arithmetik"

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.