mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zwei 16Bit Zahlen multiplizieren, ATMega8, mul Befehl


Autor: Bernhard Bauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

ich habe folgendes Problem: Ich möchte eine Konstante (Zahl) mit dem
Ergebnis einer 10bit ADC-Wandlung (temp2, temp1) multiplizieren. Dazu
hat der ATMega8 den wunderschönen Hardware-Multiplizierer (mul Befehl).
Das Ergebnis steht dann in den Registern r1:r0. Ich habe hierzu unten
aufgelisteten Assembler-Code geschrieben. Im Simulator des AVR-Studios
funktioniert alles einwandfrei. Nur in der Praxis scheint diese Routine
nicht zu funktionieren. Sie basiert auf den Algorithmus der alten
"Schul-Multiplikation". Andere Fehlermöglichkeiten habe ich
ausgeschlossen. Der Fehler muß also in diesem Code-Schnipsel stecken.
Wenn jemand Tipps für mich hätte, wäre ich sehr dankbar.






.include "m8def.inc"

.equ Zahl = 1251

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
.def temp4 = r19

================================================================
; Multiplikator Zahl = 1251 steht in den Registern temp4, temp3
; Multiplikand (ADC-Wert) steht in den Registern temp2, temp1

; Ergebnis soll dann in den Registern r23, r22, r21, r20 stehen
================================================================


.
.
.
.
        ldi temp3, LOW(Zahl)
        ldi temp4, HIGH(Zahl)



        mul temp1, temp3
        mov r20, r0
        mov r21, r1

        mul temp1, temp4
        add r21, r0
        adc r22, r1

        mul temp2, temp3
        add r21, r0
        adc r22, r1

        mul temp2, temp4
        add r22, r0
        adc r23, r1
.
.
.
.




Gruß
Bernhard Bauer

Autor: Bernhard Bauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das Problem hat sich erledigt. Der Code funktioniert einwandfrei.
Nur habe ich vergessen, vor der Multiplikation die Register r23:r20
wieder zu löschen.

Gruß
Bernhard

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mul temp1, temp3
        mov r20, r0
        mov r21, r1

Damit überschreibst Du den Inhalt von r20 und r21.
Du brauchst also nur r23:r22 löschen.

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.