mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Warning bei .DEF von 32bit Divisionsroutine


Autor: Ben ___ (burning_silicon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi!

ich habe hier im forum/tutorial die divisionsroutine für zwei 32bit 
zahlen in assembler gefunden. eigentlich brauche ich nur 32bit/16bit, 
würde aber die 32/32 dafür nehmen. rechenzeit sollte genug da sein und 
ich brauch nur eine solche division pro sekunde.

diese routine .DEFiniert sich 12 registernamen, wovon die letzten beiden 
(t2 und t3) probleme bereiten.

.def t2=r26 -> warning: register r26 already defined by the .def 
directive
.def t3=r27 -> warning: register r27 already defined by the .def 
directive

was mich wundert, die anderen 10 .DEFs gehen problemlos durch. und wieso 
regt er sich über die registernamen R26 und R27 auf und nicht über T2 
und T3? kann ich die beiden warnings ignorieren? würde ich ungerne 
machen, irgendwas muß ja komisch daran sein. den fehler beheben der die 
beiden warnings erzeugt wäre mir aber lieber.

plan B wäre eine 32/16bit divisionsroutine falls jemand sowas parat hat. 
danke!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, diese Warnungen sind nervig.
Eine Mehrfachnutzung von Registern ist ja normal.

Du kannst sie aber umgehen, durch
#define t2 r26


Peter

Autor: Ben ___ (burning_silicon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay danke dir, dann werde ich das ändern.

noch eine frage weil du sonst immer alles an code hast:
liegt bei dir eine 32/16bit divisionsroutine in AVR assembler in der 
schublade? :)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ben _ schrieb:
> okay danke dir, dann werde ich das ändern.
>
> noch eine frage weil du sonst immer alles an code hast:
> liegt bei dir eine 32/16bit divisionsroutine in AVR assembler in der
> schublade? :)

Nur 56 / 24, das Prinzip sollte aber leicht zu erkennen sein:
;                               Division 56 / 24 bit
;-------------------------------------------------------------------------
;input:  a6..0: Dividend
;        b2..0; Divisor
;
;output: a6..0: Quotient
;        t2..0: Remainder
;        T = 1: Quotient > 0
;
div56:  clt
        clr     t0
        clr     t1
        clr     t2
        ldi     i0, 56
_div1:  lsl     a0
        rol     a1
        rol     a2
        rol     a3
        rol     a4
        rol     a5
        rol     a6
        rol     t0
        rol     t1
        rol     t2
        brcs    _div2
        cp      t0, b0
        cpc     t1, b1
        cpc     t2, b2
        brcs    _div3
_div2:  sub     t0, b0
        sbc     t1, b1
        sbc     t2, b2
        inc     a0
        set                     ;Quotient not zero
_div3:  dec     i0
        brne    _div1
        ret
;------------------------------------------------------------------------


Peter

Autor: Ben ___ (burning_silicon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
56bit... weiaaa wozu braucht ihr solche zahlen! :D

im moment blick ich durch solche routinen noch nicht so gut durch, daß 
ich eigene schreiben könnte, daher muß ich hier auch so oft wegen dem 
kram fragen. ziel ist im moment eine eigene sammlung solcher routinen 
anzulegen wo man weiß sie funktionieren alle und man kann sie sich von 
dort holen wenn man sie braucht.

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
r26 und r27 sind halt über die AVR-Includes schon als XL und XH 
(X-Pointer) definiert.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Z.B. für nen Frequenzmesser:

F_in = F_Quarz * count_in / count_timebase

;                               Division 32 / 16 bit
;-------------------------------------------------------------------------
;input:  a3..0: Dividend
;        b1..0; Divisor
;
;output: a3..0: Quotient
;        t1..0: Remainder
;        T = 1: Quotient > 0
;
div32_16:
        clt
        clr     t0
        clr     t1
        ldi     i0, 32
_div1:  lsl     a0
        rol     a1
        rol     a2
        rol     a3
        rol     t0
        rol     t1
        brcs    _div2
        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: Ben ___ (burning_silicon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klasse, danke dir für deine mühe!

habe allerdings doch noch ein byte mehr gebraucht als ich gedacht hatte 
(24 bit divisor anstatt 16 bit), geht jetzt super mit der 32/32bit 
routine.

frequenzmesser ist schon einigermaßen dicht dran. allerdings wirds doch 
nur ein elektronischer stromzähler. :)

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.