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