Dein Code ist korrekt, wenn auch etwas umständlich. Vielleicht liegt der
Fehler in der Ausgabe des Ergebnisses.
Falls das Ganze auf einem 8-Bit-Controller laufen soll, solltest du auf
die long-Arithmetik verzichten, da sie hier gar nicht benötigt wird. Ein
paar weitere Dingen lassen sich optimieren, bspw. kannst du
die Zeile
1 | b = (signed short)(a&0x01FF)-512;
|
ersetzen durch
1 | b = (signed short)a-1024;
|
Falls dein Controller zufälligerweise ein AVR sein sollte, würde ich den
ADC so konfigurieren, dass das Ergebnis nicht left-adjustiert wird
(ADLAR=0). Dann sparst du dir die Shifterei.