mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8 bit Divisionsroutine


Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: René König (king)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!?

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh mann jetzt ist klar!

Danke mal!

Autor: Profi (Gast)
Datum:

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

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.