10Bit-ADC-Werte in 16Bit-Werte des Zweierkompliments konvertieren

OP #1247279
Servus,

ich möchte mit dem AVR-GCC 10Bit-ADC-Werte in 16Bit-Werte des 
Zweierkompliments konvertieren, und zwar left adjusted.

Formel: adc_result = ADC*2^6 - 2^15.

Beispiele:
ADC-Wert = 0h -> Zweierkompliment-Wert = 8000h;  niedrigster Wert
ADC-Wert = 200h -> Zweierkompliment-Wert = 0h;  mitteler Wert
ADC-Wert = 3FFh -> Zweierkompliment-Wert = 7FC0h; höchster Wert

Die Frage ist, ob die folgenden Zeilen dafür geeignet sind.
1
int16_t adc_result;
2
adc_result = ADC << 6 -32768;

Gibt's Gefahr vom Ueberlauf?

Gruss
Senmeis
Gast #1247488
>Das Schieben ist überflüssig, für left adjusted einfach nur das Bit des
>ADC setzen.

und dann reicht
1
int 16_t adc_result = -ADC;

um das zu erreichen, was du möchtest.

Das das 2-er Komplement ja nichts anderes ist, als Darstellung negativer 
Zahlen. Das umrechnen machten Compiler bzw. Prozessor schon für dich.


Oliver
Gast #1247521
Nachtrag:

>...um das zu erreichen, was du möchtest.

ist allerdings beim genaueren Hinsehen doch etwas diffus.

>ich möchte mit dem AVR-GCC 10Bit-ADC-Werte in 16Bit-Werte des
>Zweierkompliments konvertieren, und zwar left adjusted.

hat nichts mit

>ADC-Wert = 0h -> Zweierkompliment-Wert = 8000h;  niedrigster Wert
>ADC-Wert = 200h -> Zweierkompliment-Wert = 0h;  mitteler Wert
>ADC-Wert = 3FFh -> Zweierkompliment-Wert = 7FC0h; höchster Wert

Mein Beispiel
1
int 16_t adc_result = -ADC;
bei "right-adjustedtem" Ausgabewert des ADC konvertiert die ADC-Werte 
left adjusted in das entsprecheden 2er-Komplement, und zwar ALLE. Das 
wäre die Lösung zu deine ersten Problembeschreibung

ADC 0 -> 0
ADC 1-> -1 = 0xFFFF
...
ADC 1023 -> -1023 = 0xFC01

Wenn du, wie dein Beispiel zeigt, der niedrigste Wert 0x8000 sein soll, 
und der mittlere 0x00, wäre es eine Verschiebung des Wertebereichs mit 
Skalierung.

ADC 0 -> -32768 = 0x8000
ADC 512 -> 0 = 0x0000
ADC 1023 -> 32704 = 0x7FC0

Bei der nahe liegenden Formel
1
 int16_t adc_wert = ADC * 64 - 32768;
gibt es bei Rechnung mit int16_t tatsächlich einen Überlauf, da alles 
größer 511*64 nicht mehr als int darstellbar ist.
1
 int16_t adc_wert = (ADC-512) * 64;
dagegen geht.

Oliver
Gast #1247615
>>Das ist völliger Quatsch.

ist auch Quatsch. Es erfüllt wörtlich die Anforderung

>ich möchte mit dem AVR-GCC 10Bit-ADC-Werte in 16Bit-Werte des
>Zweierkompliments konvertieren, und zwar left adjusted.

was allerdings nicht das ist, was eigentlich gewünscht ist.

Oliver
#1247626
Oliver wrote:
>>>Das ist völliger Quatsch.
>
> ist auch Quatsch. Es erfüllt wörtlich die Anforderung
>
>>ich möchte mit dem AVR-GCC 10Bit-ADC-Werte in 16Bit-Werte des
>>Zweierkompliments konvertieren, und zwar left adjusted.
>
> was allerdings nicht das ist, was eigentlich gewünscht ist.

Wobei ich mich frage, was denn eigentlich gewünscht wird.
#1247634
Karl heinz Buchegger wrote:
> Wobei ich mich frage, was denn eigentlich gewünscht wird.

Das hatter doch unmißverständlich hingeschrieben:

Owen Senmeis wrote:
> ADC-Wert = 0h -> Zweierkompliment-Wert = 8000h;  niedrigster Wert
> ADC-Wert = 200h -> Zweierkompliment-Wert = 0h;  mitteler Wert
> ADC-Wert = 3FFh -> Zweierkompliment-Wert = 7FC0h; höchster Wert



Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.