Hallo µC Gemeinde, hab in nem controller ne dividier routine laufen sie soll eine 24 bit konstante (3 000 000) durch eine variable teilen, das problem ist das sie ab einer variablen um 47 000 mist berechnet... die routine ist eine atmel apnote, nur auf 24 bit verändert durch das hinzufügen von rol dd16uM. kennt jemand solch ein verhalten? lg flo div16u: clr drem16uL ;clear remainder Low byte sub drem16uH,drem16uH ;clear remainder High byte and carry ldi dcnt16u,25 ;init loop counter d16u_1: rol dd16uL ;shift left dividend rol dd16uM rol dd16uH dec dcnt16u ;decrement counter brne d16u_2 ;if done ret ;return d16u_2: rol drem16uL ;shift dividend into remainder rol drem16uH sub drem16uL,countl ;remainder = remainder - divisor sbc drem16uH,counth ; brcc d16u_3 ;if result negative add drem16uL,countl ;restore remainder adc drem16uH,counth clc ;clear carry to be shifted into result rjmp d16u_1 ;else d16u_3: sec ;set carry to be shifted into result rjmp d16u_1
Noch zusätzlich: als lösung bei /47 000 kommt 16,... raus
Du mußt ne 17Bit Subtraktion machen, d.h. das Carry-Bit berücksichtigen. Jetzt schiebst Du es einfach raus ins Nirwana. Peter
und an welcher stelle wenn ich fragen darf?
Mal ins Blaue geschossen nach Überfliegen der paar Zweilen (und ohne zu blicken, was da genau abgeht): ich würd drauf tippen, daß der Algorthmus von gleichen Bitbreiten für Dividend und Divisor ausgeht.
aber wieso dann erst der fehler ab einer größeren zahl, der dividend ist doch egal oder ?
flo schrieb: > und an welcher stelle wenn ich fragen darf?
1 | ; Division 24 / 16 bit |
2 | ;------------------------------------------------------------------------- |
3 | ;input: a2..0: Dividend |
4 | ; b1..0; Divisor |
5 | ; |
6 | ;output: a2..0: Quotient |
7 | ; t1..0: Remainder |
8 | ; T = 1: Quotient > 0 |
9 | ; |
10 | div24: clt |
11 | clr t0 |
12 | clr t1 |
13 | ldi i0, 24 |
14 | _div1: lsl a0 |
15 | rol a1 |
16 | rol a2 |
17 | rol t0 |
18 | rol t1 |
19 | brcs _div2 ;17bit: subtract always ! |
20 | cp t0, b0 |
21 | cpc t1, b1 |
22 | brcs _div3 |
23 | _div2: sub t0, b0 |
24 | sbc t1, b1 |
25 | inc a0 |
26 | set ;Quotient not zero |
27 | _div3: dec i0 |
28 | brne _div1 |
29 | ret |
30 | ;------------------------------------------------------------------------ |
Peter
hab mal meine variablen geändert aber irgendwie funzt es nicht
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.