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ß
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ß
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ß
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?)
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ß
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.