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


von Bernhard Bauer (Gast)


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

von Bernhard Bauer (Gast)


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

von Profi (Gast)


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.

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.