Forum: Mikrocontroller und Digitale Elektronik 24 bit konstante/16bit variable fehler ab best. variabler


von flo (Gast)


Lesenswert?

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

von flo (Gast)


Lesenswert?

Noch zusätzlich: als lösung bei /47 000 kommt 16,... raus

von Peter D. (peda)


Lesenswert?

Du mußt ne 17Bit Subtraktion machen, d.h. das Carry-Bit berücksichtigen.
Jetzt schiebst Du es einfach raus ins Nirwana.


Peter

von flo (Gast)


Lesenswert?

und an welcher stelle wenn ich fragen darf?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von flo (Gast)


Lesenswert?

aber wieso dann erst der fehler ab einer größeren zahl, der dividend ist 
doch egal oder ?

von Peter D. (peda)


Lesenswert?

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

von flo (Gast)


Lesenswert?

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