Es war nur der Fehler mit dem Zweierkomplement.
Hmm... das wesentliche fehlt mir allerdings...das ist dort echt sehr gut beschrieben.
Was ist das Einerkomplement einer Zahl X?
Die Zahl Y sodaß gilt X+Y=0xFF (bei mehrbytigen Zahlen entsprechend mehr "F"s)
Das Bitweise Komplement, es wird jedes einzelne Bit umgekehrt. Um das Einerkomplement einer Zahl X zu berechnen wird also effektiv 0xFF - X gerechnet.
Da wir Menschen zehn Finger besitzen, haben wir uns ein Leben lang an dezimale Zahlen gewöhnt, was wäre das äquivalent im Dezimalsystem?
Genau dasselbe - die Zahl Y, sodaß gilt X + Y = 999...999, also eine 0 wird zur 9, eine 1 zur 8 usw...
Und das Zweierkomplement?
Nunja, stell Dir das mal (aufmalen!) als Zifferblatt ähnlich einer Uhr vor (wieder nur ein Byte). Oben (12) ist die 0x00 (&B0000_0000). Jetzt zählst Du im Uhzeigersinn bis zu 1/4 (3), dort steht die 0x40 (&B0100_0000). Bei 1/2 (6) die 0x80 (&B1000_0000). Bei 3/4 (9) die 0xC0 (&B1100_0000). Als letztes vor der 12 steht die 0xFF (&B1111_1111).
Es werden die 256 Zahlen dargestellt, von 0x00 bis 0xFF.
Und die negativen Zahlen? zB -1? Das ist eben 0-1, also einen Schritt gegen den Uhrzeigersinn. Du landest bei 0xFF. Also von 0x00 aus im Uhrzeigersinn die positiven Zahlen, gegen den Uhrzeigersinn die negativen. Und wo ist die Grenze? Bei 0x80 (&B1000_0000), das ist nämlich die letzte Zahl gegen den Uhrzeigersinn, die noch 'ne 1 als MSB hat. 0x80 (-128) ist also die "negativste" Zahl, 0x7F (+127) die "positivste".
Damit wird auch klar, warum der Weg auf addi's Seite zum selben ergebnis kommt. Es soll erst das Einerkomplement gebildet werden (also 0xFF - X), und danach eins addiert (also zusammen 0xFF - X + 1). Stellen wir das um zu 0xFF + 1 - X, kann man den ersten Teil ausrechnen, und es bleibt 0x00 - X.
Als Hochsprachler braucht Dich das aber alles ar nicht interessieren, Da Deine gewählten Datentypen den ganzen Hintergrund vor Dir Verstecken, fernhalten.
Die "normalen" Binärzahlen sind Ganzzahlen ohne Vorzeichen, in C also UINT8, 16 usw... (Dirk, ggf bitte korrigieren), Binärzahlen in "Zweierkomplement-Darstellung" sind vorzeichenbehaftete Ganzzahlen, in C also INT8, 16 usw. Um den konkreten Rechnkram kümmert C sich.
Dein DAC kann die empfangenen Vorgabewerte nun auf zwei Arten interpretieren. Bei "normal binar" entspricht 0=0V, 65536=2*Vref.
Bei "Zweierkomplement" entspricht -32768=0V, 32767=2*Vref. 0=1*Vref.
Wird der DAC also auf "Zweierkomplementmodus" gesetzt (DF-Bit im Command-Register), verschiebt sich effektiv der "Nullpunkt" von 0V zu 1*Vref. Deine übertragenen, vorzeichenbehafteten Integer beziehen sich also Plus/Minus auf Vref.
Im "normalen binären" Dataformat beziehen sich Deine vorzeichenlosen (also immer positiven) Integer Plus auf 0V, wobei dann im Maximum 2*Vref erreicht werden.
Alles klar?