Forum: Mikrocontroller und Digitale Elektronik 8 bit Divisionsroutine


von Thorsten (Gast)


Lesenswert?

Hat jemand schon mal mit der 8/8 bit Routine div8u von Atmel
gearbeitet?
Hab sie in ein Programm für meinen ATMega8515 eingefügt aber danach
kamen utopische Werte heraus.

Nun habe ich die Funktion allein getestet und das Ergebnis und rest im
EEPROM gespeichert um diese Werte auszulesen.

Ich habe immer das gleiche Ergebnis mit 8 als dres8u und 0 als drem8u.
Auch wenn ich die Werte für Divident und Divisor ändere komt immer das
gleiche Ergebnis dabei raus.

Jemand eine Idee woran das liegen könnte oder hatte jemand schonmal ein
ähnliches Problem mit den Routinen?

Danke schonmal für jede Hilfe.

von Thorsten (Gast)


Lesenswert?

Niemand eine Idee an was das liegen könnte?

Also der Wert für den Rest in drem8u stimmt mittlerweile aber die 8 als
Ergebniss hab ich immernoch.

Aber keine Ahnung an was das liegen soll.

von A.K. (Gast)


Lesenswert?

Alternativen: (a) Atmel hat Blödsinn zusammengewürfelt. (b) Du benutzt
dieses Routinen falsch. Alle Wahrscheinlichkeit spricht für (b), aber
ohne deinen Code ist das schwer zu bewerten.

von René K. (king)


Lesenswert?

> Niemand eine Idee an was das liegen könnte?

Ein Forum ist kein Chat.


> (a) Atmel hat Blödsinn zusammengewürfelt.

Daran liegt es tatsächlich, zumindest teilweise. Denn das Register
"dres8u", in dem laut Dokumentation das Ergebnis gespeichert wird,
wird vom Code gar nicht benutzt. Ich könnte jetzt schauen, wo das
Ergebnis anstelle dessen landet. Aber die Antwort muß ja ganz schnell
raus, und mir läuft die Zeit davon...

von Thorsten (Gast)


Lesenswert?

.nolist
.include "m8515def.inc"
.list

.def  drem8u  =r18    ;remainder
.def  dres8u  =r19    ;result
.def  dd8u  =r20    ;dividend
.def  dv8u  =r21    ;divisor
.def  dcnt8u  =r22    ;loop counter
.org 0x0000


reset:  ldi  r31, LOW(RAMEND)
  out   SPL, r31                  ldi   r31, HIGH(RAMEND) 
out   SPH,
r31

main:  ldi  dd8u,11
  ldi  dv8u,3
  rcall  div8u

end:  rjmp  end

Dann hab ich genau die Routine div8u von Atmel kopiert und nun sollte
ja 11/3 gerechnet werden, also 3 rest 2.
Den Rest 2 bekomm ich aber als Ergebnis dres8u immer die 8.

von Jens (Gast)


Lesenswert?

schau dir doch ganz einfach den block von "div8u" an, dann weisst du
es

von A.K. (Gast)


Lesenswert?

Doch, das Register "dres8u" wird sehr wohl verändert.

Allerdings nicht unter diesem Namen, sondern unter "dd8u". Und genau
das ist der Trick daran. Der Atmel-Code funktioniert genau dann, wenn
"dd8u" und "dres8u" das gleiche Register sind.

Wenn man, wie Thorsten, dafür getrennte Register verwendet, hat man
verloren.

von Thorsten (Gast)


Lesenswert?

hmm hab ich gemacht , und nicht nur einmal :-)
Entweder steh ich voll auf dem Schlauch oder weiss auch nicht.
Aber anstatt hier Rätsel zu geben wäre mir die Lösung einiges lieber
wenn du sie weisst ;-)

von Thorsten (Gast)


Lesenswert?

Ich habe das aber alles komplet von Atmel übernommen,also auch die
Registerzuweisungen.
Das muss dann doch eigentlich auch so stimmen wenn die das schon so
lange da drin haben!?

von Thorsten (Gast)


Lesenswert?

Oh mann jetzt ist klar!

Danke mal!

von Profi (Gast)


Lesenswert?

Könntest Du uns bitte auch aufklären, wenn es Dir klar ist?
Wie hast Du es gelöst?

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.