www.mikrocontroller.net

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


Autor: flo (Gast)
Datum:

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

Autor: flo (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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


Peter

Autor: flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und an welcher stelle wenn ich fragen darf?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

Autor: flo (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
flo schrieb:
> und an welcher stelle wenn ich fragen darf?
;                               Division 24 / 16 bit
;-------------------------------------------------------------------------
;input:  a2..0: Dividend
;        b1..0; Divisor
;
;output: a2..0: Quotient
;        t1..0: Remainder
;        T = 1: Quotient > 0
;
div24:  clt
        clr     t0
        clr     t1
        ldi     i0, 24
_div1:  lsl     a0
        rol     a1
        rol     a2
        rol     t0
        rol     t1
        brcs    _div2           ;17bit: subtract always !
        cp      t0, b0
        cpc     t1, b1
        brcs    _div3
_div2:  sub     t0, b0
        sbc     t1, b1
        inc     a0
        set                     ;Quotient not zero
_div3:  dec     i0
        brne    _div1
        ret
;------------------------------------------------------------------------


Peter

Autor: flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab mal meine variablen geändert aber irgendwie funzt es nicht

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.