Forum: Mikrocontroller und Digitale Elektronik Rechenproblem 10Bit nach 9Bit


von Herman Uh. (Gast)


Lesenswert?

Hallo,

ich bekomme über den ADC einen Wert von 0 - 1023 rein. Diesen möchte ich 
als 9 Bit signed darstellen.

int16_t adc = (adc_read(0)>>1)-255;

Jedoch ist der Wert am Ende doch falsch. Mit >>1 wird aus meinen max. 
1023 511. Davon subtrahiere ich 255. Somit ist bei einem Vollausschlag 
aber positive Wert 256 und nicht 255.

Setze ich den Wert aber in der Formel auf 256, dann passt der im 
positiven Bereich, doch wenn der adc Rückgabewert = 0 ist, wird adc -256

von Karl H. (kbuchegg)


Lesenswert?

Herman Uh. schrieb:


> Davon subtrahiere ich 255. Somit ist bei einem Vollausschlag
> aber positive Wert 256 und nicht 255.

Was du gerade rausgefunden hast, das ist, dass es bei einer geraden 
Anzahl an Werten kein exakt in der MItte liegendes mittleres Element 
gibt.

mal mit kleineren Werten probieren.
ANgenommen dein ADC liefert ausschliesslich die Werte 0, 1, 2, 3, wobei 
3 den größtmöglichen Wert repräsentiert.

Welcher Wert soll nach der Transformation die 0 spielen?
1
   0    1    2    3
2
   |    |    |    |
3
   v    v    v    v
4
   -1   0    1    2
1
   0    1    2    3
2
   |    |    |    |
3
   v    v    v    v
4
   -2   -1   0    1


eine gewisse Asymetrie ist systemimanent und mit einer simplen 
Transformation kannst du nichts dagegen tun, wenn du eine 0 erhalten 
willst.

von Peter II (Gast)


Lesenswert?

Herman Uh. schrieb:
> Setze ich den Wert aber in der Formel auf 256, dann passt der im
> positiven Bereich, doch wenn der adc Rückgabewert = 0 ist, wird adc -256

das ist doch aber gut, was stört dich daran?

von Gaast (Gast)


Lesenswert?

int16_t adc = ((int16_t)(adc_read(0) >> 1)) - 255;

von c-hater (Gast)


Lesenswert?

Herman Uh. schrieb:

> ich bekomme über den ADC einen Wert von 0 - 1023 rein. Diesen möchte ich
> als 9 Bit signed darstellen.

9<10.

D.h.: du wirst Information abwerfen müssen, um dein Ziel zu erreichen, 
nämlich genau ein Bit.

Also einfach eins nach rechts schieben (ergibt einen Bereich zwischen 0 
und 511) und dann 256 abziehen, was einen Bereich zwischen -256 und 255 
ergibt.

0 -> -256
512 -> 0
1023 -> 255

Trivialste Scheiße. Kein Assemblerprogrammierer würde darüber auch nur 
eine Sekunde lang ernsthaft nachdenken müssen.

Fazit: C verblödet ganz offensichtlich seine Benutzer!

von Karl H. (kbuchegg)


Lesenswert?

c-hater schrieb:

> Fazit: C verblödet ganz offensichtlich seine Benutzer!

[ ] Ich hab verstanden, was das 'Problem' des Fragestellers ist
[ ] Ich habs nicht verstanden.

> Kein Assemblerprogrammierer würde darüber auch nur eine Sekunde lang ernsthaft 
nachdenken müssen.

Auch ein Assemblerprogrammierer wird sich beim ersten mal darüber 
Gedanken machen, wo diese Asymetrie in den positiven und negtaiven 
Zahlenbereichen eigentlich herkommt.

von wendelsberg (Gast)


Lesenswert?

Karl Heinz schrieb:
> Auch ein Assemblerprogrammierer wird sich beim ersten mal darüber
> Gedanken machen,

Korrekt, das sollte unabhaengig von der Programmiersprache sein.
Genau das hatte der TO aber nicht (oder zumindest nur oberflaechlich) 
gemacht. Statt dessen werden heutzutage eben Postings in Foren erstellt.

wendelsberg

von c-hater (Gast)


Lesenswert?

Karl Heinz schrieb:

> [x] Ich hab verstanden, was das 'Problem' des Fragestellers ist
> [ ] Ich habs nicht verstanden.

Das Problem ist, daß er nicht "ganz unten" angefangen hat.

> Auch ein Assemblerprogrammierer wird sich beim ersten mal darüber
> Gedanken machen, wo diese Asymetrie in den positiven und negtaiven
> Zahlenbereichen eigentlich herkommt.

Öhem. Was meinst du mit "das erste Mal"? Natürlich muß man auch als 
Asm-Programmierer irgendwann die Zahlenrepräsentationen (z.B. im 
Zweierkomplement) erstmal lernen und verstehen, das ist doch sowas von 
klar, dass man das garnicht diskutieren muss.

Der Unterschied ist halt nur: Als Asm-Programmierer bist du sehr früh 
hart dazu gezwungen, das zu lernen und aus dem ff zu beherrschen. Und 
das ist sowas von GUT und hilfreich...

Selbst noch bei der Programmierung in echten Hochsprachen der 4. 
Generation ist das der Fall (obwohl das dort nach der reinen Lehre 
eigentlich garkeine Rolle mehr spielen sollte... ;o) und bei der 
Programmierung in diesem gräßlichen Makroassembler-Dialekt namens C 
natürlich erst recht...

von Martin S. (led_martin)


Lesenswert?

Bei der Zahlen-darstellung im 2er-Komplement ist es allgemein üblich, 
daß der Bereich im Negativen einen Wert mehr enthält. z.B. 16-Bit int: 
-32768 .. 0 .. 32767. Bei dieser Darstellung ist das oberste Bit das 
Vorzeichen-Bit, ist es gesetzt, ist die Zahl negativ. Bei der 0 ist es 
nicht gesetzt, die 0 wird also den positiven Zahlen zugeordnet. Da es 
immer genau so viele negative wie positive Zahlen gibt, ergibt sich die 
oben genannte Verteilung. Mit der Variante -256 .. 0 .. 255 bist Du bei 
der gebrauchlicheren Variante, was die weitere Verarbeitung der Werte 
eventueller unproblematischer macht, Du könntest z.B. mit 128 
multiplizieren, und der Wert füllt einen 16-Bit int aus, ohne für 
Überläufe zu sorgen. 256 * 128 geht da schon nicht mehr, aber -256 * 128 
geht gerade noch.

Mit freundlichem Gruß - Martin

von Karl H. (kbuchegg)


Lesenswert?

c-hater schrieb:
> Karl Heinz schrieb:
>
>> [x] Ich hab verstanden, was das 'Problem' des Fragestellers ist
>> [ ] Ich habs nicht verstanden.

Falsch angekreuzelt.

> Öhem. Was meinst du mit "das erste Mal"? Natürlich muß man auch als
> Asm-Programmierer irgendwann die Zahlenrepräsentationen (z.B. im
> Zweierkomplement) erstmal lernen und verstehen, das ist doch sowas von
> klar, dass man das garnicht diskutieren muss.

Das ist kein Problem der Programmiersprache und die Frage des TO hat 
auch nichts mit 2-er Komplement zu tun.
Das ist ein ganz normales Matheproblem.

Bei einer geraden Anzahl an möglichen Werten in einer streng monoton 
steigenden Menge mit aufeinander folgenden Zahlen, ist der Median nicht 
Teil der Wertemenge bzw. ist es nicht möglich die Menge so in 2 
Teilmengen und ein einzelnes Element aufzuteilen, dass die Teilmengen 
gleiche Mächtigkeit haben.

Setzen, 6.

Schön langsam wirds lächerlich mit deinem C-Bashing. Was kommt als 
nächstes? Ist C auch am Ukraine Konflikt Schuld? Am internationalen 
Terrorismus? Wäre Merkel beliebter, wenn sie Assembler programmiert und 
wann gibts das erste Oktoberfest-Fahrgeschäft, in dem man nur Zutritt 
hat, wenn man die Flags im Statusregister von mindestens 5 CPUs 
auswendig weiß?

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.