Forum: Mikrocontroller und Digitale Elektronik letzten 5 bit abschneide


von Der Peter (Gast)


Lesenswert?

Hallo,

ich möchte in einem C programm (unterm xmega) von einer 32bit zahl die 
letzten 5 bits "abschneiden". Ich habe jetzt schon versucht mit binär zu 
char array konvertieren etc.. Aber das klappt nicht.
Hatt jemand eine lösung für mich?

Grüße,
Der Peter

von BIRNE (Gast)


Lesenswert?

was meinst du mit abschneiden? so das du nachher nurnoch eine 27bit Zahl 
hast (recht rotieren >>) oder das die letzten 5 bit 0 sind? (Maskieren | 
oder &)

von Peter II (Gast)


Lesenswert?

Int32_t zahl = 23423235;

zahl = zahl >> 5;

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

var_neu = var_alt >> 5;

von Der Peter (Gast)


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

von gordon51freeman (Gast)


Lesenswert?

Wo soll da das Problem sein?

von googoo (Gast)


Lesenswert?

Teile die Zahl einfach durch 32!

von BIRNE (Gast)


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?

von Ingo (Gast)


Lesenswert?


von Rolf Magnus (Gast)


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.

von BIRNE (Gast)


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 ;-)

von Random .. (thorstendb) Benutzerseite


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 .-.-.-.-.

von Jens (Gast)


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

von MWS (Gast)


Lesenswert?

Random ... schrieb:
> var &= 1;

Ja, super Lösung um eine 1-Bit Zahl zu erhalten :D

von Random .. (thorstendb) Benutzerseite


Lesenswert?

LOL :-)
im Eifer des Gefechts **grins**

var &= 0xFFFFFFFE; ists latürnich :-)

von BIRNE (Gast)


Lesenswert?

Random ... schrieb:
> LOL :-)
> im Eifer des Gefechts **grins**
>
> var &= 0xFFFFFFFE; ists latürnich :-)

oder
var &= ~1;

der arme Peter tut mir jetzt schon leid, das ist echt zuviel hilfe xD

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...
@ Peter: ist das tatsächlich so?

von Arc N. (arc)


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.

von Werner (Gast)


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.

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.