Forum: Mikrocontroller und Digitale Elektronik Rechnen mit negativen Dualzahlen


von Chris (Gast)


Lesenswert?

Hallo,

ich möchte das in den Application Notes (AVR200.asm) aufgeführte
Unterprogramm "mpy8s" - 8x8 Bit Signed Multiplication verwenden, um
Werte eines 8-Bit-AD-Wandlers zu verarbeiten. Der aktuelle und der
vorhergehende Wert sollen mit verschiedenen Faktoren multipliziert
werden und die Ergebnisse anschließend vorzeichenrichtig addiert
werden.

Erwartet "mpy8s" die beiden Werte in Zweierkomplementdarstellung?
In welcher Darstellung negativer Zahlen erscheint das Ergebnis?
Ist es richtig, vom Wert, den der AD-Wandler ausgibt, zunächst 127
abzuziehen, um für "mpy8s" eine passende negative Zahl zu erhalten?
Muß man irgendwo das zweierkomplement bilden?

Programmierung erfolgt in Assembler für AVR.

Gruß

von Chris (Gast)


Lesenswert?

Hallo,

hat noch keiner mit den Unterprogrammen aus AVR200.asm etwas
programmiert?

Zusatzinfo:
Der AD-Wandler liefert bei 0V 00000000, bei 2,5V 10000000, bei 5V alle
Bits eins.

Gruß

von crazy horse (Gast)


Lesenswert?

und warum willst du da mit signed arbeiten?

von Chris (Gast)


Lesenswert?

Hallo,

letztendlich soll durch die oben beschriebene Rechenvorschrift ein
einfaches digitales Filter realisiert werden. Das bedeutet, daß das
Eingangssignal eine Wechselspannung ist und Werte über 2,5V als positiv
anzusehen sind und Werte unter 2,5V als negativ anzusehen sind. Am
Ausgang soll dann ebenfalls eine Wechselspannung herauskommen mit
gleicher Polarität. Man müßte also ausgehend von der "Mitte" = 2,5V =
128 binär, den Betrag bilden und erst mit diesem Betrag in die
Multiplikation gehen, dann hinterher wieder das Vorzeichen berichtigen
und es bei der Addition weiter verarbeiten. Oder man hat eine
signed-Multiplikation, die nach kleiner Umwandlung das von selbst
richtig macht. Klar ist, daß Werte über 2,5V immer das MSB=1 haben,
also in Zweierkomplement-Darstellung als negativ anzusehen sind, obwohl
das für die Wechselspannung die positiven Werte sind.

Gruß

von crazy horse (Gast)


Lesenswert?

tja, dann, adiere zu deinem Wandlerergebnis 128 und ignoriere das carry,
so wird aus 255 unsigned 127 signed, aus 128 wird 0 und aus 0
-128 (hoffentlich stimmt das jetzt?)

von Chris (Gast)


Lesenswert?

Hallo,

ich komm' da selbst immer ins Schleudern, deshalb die Fragerei. Du
schlägst "vorwärtsherum" vor, meine bisherige Idee mit dem Abziehen
von 127 ging "rückwärtsherum". Scheint das gleiche zu ergeben (ohne
Nachprüfen). Also mit diesen Werten könnte man jetzt in die Rechnung
gehen.
Zum test von "mpy8s" habe ich bisher immer die negativen Zahlen
mittels Windows-eingenem Rechner gebildet und auf "mpy8s" als
Eingangswerte gegeben, um herauszufinden, wie das Ergebnis genau
aussieht. Dabei entstand aber mehr Verwirrung als Klarheit. Vielleicht
mußte ich doch die negativen Zahlen auf dem Papier bilden und hinterher
auf dem Papier wieder in Beträge umwandeln. Für die abschließende
Addition ist es ebenfalls wichtig, die Vorzeichen zu beachten.

Gruß

von bukongahelas (Gast)


Lesenswert?

Hi,wollte auch immer mit Digifiltern experimentieren,hab
jedoch nie studiert und bei höherer Mathe versteh ich wenig.
Dabei kanns doch nicht so schwer sein:
Antialiasing Filter,A/D-Wandler,AVR,D/A-Wandler,Filter,das ist
m.E. alles an Hardware (für 8bit Lo-Fi und niedrige Abtastraten).
Die Bytes werden mit Koeffizienten mehrfach multipliziert und
zwischengespeichert (FIR Filter (FFT)).
Den AVR8515 hab ich auch durch Versuch und Irrtum gelernt.
Habe normale Elektroniker-Ausbildung.
Glaube nach wie vor durch den richtigen Erklärungsansatz den
Einstieg zu finden.
Also vielleicht hier ?
Uli

von thkais (Gast)


Lesenswert?

Allerdings ist die Methode "rückwärts" einfacher, denn der Atmel
besitzt keinen ADDI , aber einen SUBI-Befehl. Prinzipiell funktioniert
beides, denn "128" ist, als signed dargestellt, -128. Und a + (-128)
== a - 128.
Noch ne Frage: Der A/D-Wandler hat 10 Bit, an die Normalisierung an 8
Bit hast Du auch gedacht? Vielleicht kommen von daher auch seltsame
Verhaltensweisen. Da die Zweierkomplementdarstellung eigentlich die
übliche im Integerbereich ist, muß man davon ausgehen, daß mpy8s die
Zahlen genau so erwartet. Das Zweierkomplement bildest Du bereits durch
die Subtraktion des A/D-Werts mit 127 (nicht 128, denn dann würdest Du
a - (-128) rechnen, also a + 128). Das Zweierkomplement bedeutet nicht,
daß Du automatisch eine negative Zahl hast, sondern beschreibt
eigentlich einen Umrechnungsvorgang.
Avr Assembler stellt übrigens die sehr nützliche NEG - Funktion zur
Verfügung, falls Du mal eine Zahl "umdrehen" mußt. Er besteht aus COM
x +1.

von Chris (Gast)


Lesenswert?

Hallo,

besonders die letzte Antwort traf den Nagel auf den Kopf und hat mir
entscheidend weiter geholfen, denn so war klar, daß "mpy8s" generell
im Zweierkomplement arbeitet. Daraufhin ließen sich in meiner
Kontrollrechnung auf dem Papier einige Fehler entlarven. Die Methode
"rückwärts" mit dem SUBI-Befehl ist jetzt die von mir favorisierte.

Gruß



Minimierung der Anzahl an Unbekannten ist der Schlüssel zu Erfolg.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.