letzten 5 bit abschneide

Gast #2667702
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
Gast #2667706
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 &)
Gast #2667717
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
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.