C DAC1220 (Digital Analog Wandler)

Es war nur der Fehler mit dem Zweierkomplement.
das ist dort echt sehr gut beschrieben.
Hmm... das wesentliche fehlt mir allerdings...
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?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)