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