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
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 &)
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
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?
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.
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 ;-)
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 .-.-.-.-.
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
LOL :-) im Eifer des Gefechts **grins** var &= 0xFFFFFFFE; ists latürnich :-)
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
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.