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