letzten 5 bit abschneide

Gast #2667717
Lesenswert?

ja, ich möchte sozusagen aus einer 32bit zahl eine 27bit zahl machen.
Ich lese aus einem ADC eine 24bit zahl in eine 32bit variable(int32_t) 
und möchte die letzten "schwankenden" 5 bits "wegschneiden" also das er 
nicht mehr schwankt
Gast #2667761
Lesenswert?

naja, wenn die nichtmehr zappeln sollen, dan sollte er sie wohl besser 
mit 0 oder 1 beschreiben, damit sie einen definierten wert haben und 
nicht nach rechts rotieren, da es sonst Einfluss auf den rest der 
Programms hat. Aber das ist ja eigentlich alles nur Definitionssache.

Zahl &= 0xFFFFFFE0;
damit maskierst du die Zahl mit 111111....1100000b und damit werden die 
letzten 5 mits auf 0 gesetzt.
alternativ:
Zahl |= 0x0000001F;
damit setzt du die letzten 5 bit auf 1;

Aber warum gleich die letzten 5 bit abschneiden? bei nem ADC zappeln 
doch normal nur die letzten 1-2 bit (steht im datenblatt). Oder ist dein 
Eingangssignal zu zappelig?
Gast #2667839
Lesenswert?

BIRNE schrieb:
> naja, wenn die nichtmehr zappeln sollen, dan sollte er sie wohl besser
> mit 0 oder 1 beschreiben, damit sie einen definierten wert haben und
> nicht nach rechts rotieren, da es sonst Einfluss auf den rest der
> Programms hat.

Da man in C aber sowieso mit den oben genannten Methoden nicht rotiert, 
sondern  schiebt, erledigt sich das ja eh schon von selbst.
Gast #2667923
Lesenswert?

Rolf Magnus schrieb:
> BIRNE schrieb:
>> naja, wenn die nichtmehr zappeln sollen, dan sollte er sie wohl besser
>> mit 0 oder 1 beschreiben, damit sie einen definierten wert haben und
>> nicht nach rechts rotieren, da es sonst Einfluss auf den rest der
>> Programms hat.
>
> Da man in C aber sowieso mit den oben genannten Methoden nicht rotiert,
> sondern  schiebt, erledigt sich das ja eh schon von selbst.

nein, denn er hat dann, wie du selbst sagst aus seiner 24bit Zahl eine 
19bit zahl gemacht und nicht eine 24bit Zahl bei der die letzten 5bit 
einen festen Wert haben.
Selbstverständlich kann man in C nur "rotieren mit Nullen nachschieben". 
Im gegensatz dazu hat man in Assembler meist mehr Möglichkeiten wie, 
"richtiges rotieren", "richtiges rotieren übers Carry bit" oder eben 
auch "rotieren mit Nullen nachschieben".
Was Peter jetzt wirklich will kann nur er wissen, denn wie immer haben 
wir keine Glaskugel die was taugt ;-)
Persönliche Seite #2667938
Lesenswert?

Der Peter schrieb:
> ja, ich möchte sozusagen aus einer 32bit zahl eine 27bit zahl machen.
> Ich lese aus einem ADC eine 24bit zahl in eine 32bit variable(int32_t)
> und möchte die letzten "schwankenden" 5 bits "wegschneiden" also das er
> nicht mehr schwankt

Wenn du eine 24Bit Zahl in eine 32Bit Variable liesst, behält die Zahl 
latürnich eine max. Auflösung von 24Bit. Was da schwankt ist idR. Bit0, 
das kriegst du mit
1
var &= 1;
platt. Ist dir das immernoch zu zappelig, mach var &= 3;

Schiebst du aber jetzt die 32Bit variable um 5 Bit nach rechts (also 5 
Bit abschneiden), bleiben dir (wie oben schon erwähnt) nur noch 19Bit 
vom ADC.

Besser wäre es, einen gleitenden Mittelwert zu implementieren, z.B. über 
die letzten 10 Werte, also da wild rumzuschnippeln .-.-.-.-.
Gast #2667947
Lesenswert?

definiert setzen:

adc_wert|=0x1F;

definiert zurücksetzen:

adc_wert&=0xFFE0;

weg"schieben"

adc_wert>>=5;

dann ist die Zahl allderdings durch 32 geteilt, das muss bei der Ausgabe 
oder Weiterverarbeitung berücksichtig werden.

Gruß,
JJ
#2668107
Lesenswert?

Lothar Miller schrieb:
> BIRNE schrieb:
>> der arme Peter tut mir jetzt schon leid
> Mir auch. Aber vor allem, weil von seinem teuren 24-Bit-Wandler nur noch
> 19 Bits übrig sind...

So teuer sind die nun auch wieder nicht

> @ Peter: ist das tatsächlich so?

Warum nicht? Wenn die 1.25V VREF aus dem anderen Thread stimmen, sind 
das etwas mehr als 4 uV was je nach Wandler/Abtastrate völlig normal 
sein kann.
Gast #2668270
Lesenswert?

BIRNE schrieb:
> Selbstverständlich kann man in C nur "rotieren mit Nullen nachschieben".

"Shift" heißt das dann für gewöhnlich.

Aber Vorsicht bei negativen Int32_t Variablen. Da muß man dann noch 
nacharbeiten, damit die geschobene Zahl wieder eine anständige Int32_t 
ist.

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