www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rechnen mit negativen Dualzahlen


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und warum willst du da mit signed arbeiten?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?)

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: bukongahelas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.