www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik Division durch Zehnerpotenz in Assembler

Autor: Jens87 (Gast)
Datum: 04.07.2009 07:09

Hi.

Ich habe hier einen PIC12 dem ich ein wenig rechnen beibringen will. Die
16x16 Bit Multiplikation klappt schon ganz gut. Jetzt soll er jedoch
auch Dividieren lernen und zwar durch 100 und 1000. Gibts da ne einfache
Möglichkeit, ohne ne richtige Divisionsroutine, durch solche 10er
Potenzen zu teilen ?

Gruß Jens
Autor: A. K. (prx)
Datum: 04.07.2009 07:33

Ansatz siehe Beitrag "AVRGCC: Konstanten optimieren".
Lohnt aber m.E. nur wenn er gut multiplizieren kann. Kann der PIC12
vermutlich nicht.
Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum: 04.07.2009 08:56

Autor: Jens87 (Gast)
Datum: 04.07.2009 10:13

Danke euch für die Antworten!

@A. K.
nee der PIC12 kann garnet multiplizieren...:P (zumindest mit hausmitteln
net)

@Christoph Kessler
Hilft mir leider auch nicht weiter. Ich brauchs nicht für ne Ausgabe ich
muss ne neue Zahl ausrechnen (und die dann in nem counter einstellen)
und da ich keine Gleitkommarechnung benutzen kann, muss ich mit 5612
statt 5,612 multiplizieren und anschließend halt durch 1000 dividieren
(mit Rundung).

Der PIC hat leider kaum Spiecher und den könnt ich besser gebrauchen als
für ne Divisionsroutine, hab gedacht villeicht gibts ja n Trick wie man
ne Division durch 1000 einfach machen kann.

Gruß
Autor: Peter Dannegger (peda)
Datum: 04.07.2009 10:47

Jens87 schrieb:
> Ich habe hier einen PIC12 dem ich ein wenig rechnen beibringen will. Die
> 16x16 Bit Multiplikation klappt schon ganz gut. Jetzt soll er jedoch
> auch Dividieren lernen und zwar durch 100 und 1000. Gibts da ne einfache
> Möglichkeit, ohne ne richtige Divisionsroutine, durch solche 10er
> Potenzen zu teilen ?

Was stört Dich an einer Divisionsroutine?
Die verbraucht doch nur ein einziges mal Flash, egal, wie oft sie
aufgerufen wird.

Mit dem PIC kenne ich mich nicht aus, aber beim AVR braucht eine 16Bit
Division 20 Worte Flash, ist also nicht der Rede wert.

Wenn es aber um die Dezimalausgabe geht, kann man das auch direkt nach
der Subtraktionsmethode machen, geht deutlich schneller.
16 Bit nach 5 Digits wandeln kostet beim AVR auch nur 20 Worte Flash.


Es bleibt natürlich Dir überlassen, aber ich persöhnlich finde das
Programmieren eines 6-, 8-, 14-, 20-, 28-Pin AVR deutlich entspannter,
gegenüber einem PIC12.
Wobei ich sogar die 8-Pinner fast nur noch in C programmiere und dann
auch float kein Problem ist.


Peter
Autor: Konrad L. (konrad)
Datum: 04.07.2009 11:14

Hallo,

Ich weiß nicht, wie genau Du es brauchst, aber 5612 / 1000 entspricht
(fast) 5480 / 1024. Genaugenommen 5480,47.

5480 / 1024 = 1370 / 256

Also 16bit-Multiplikation mit 1370 und dann nur das höherwertige Byte
nehmen.
Evtl kann man dann noch jedes Zweite mal noch eins draufaddieren oder
so.

Hoffe, geholfen zu haben,
Konrad
Autor: Robert Teufel (robertteufel)
Datum: 04.07.2009 17:37

Wenns einfach in ASM sein soll, dann muss in 2-er Potenzen gedacht
werden. Also shift, add, sub. Das ist ledignlich eine Verallgemeinerung
des Beitrages von Konrad.
Also mit 10 multiplizieren is dasselbe wie originalwert 3x rechts
shiften (*8) und noch zwei mal drauf addieren. Bringt bei den meisten
Architekturen nur Verzoegerung wenn ordentlich MULs da sind doch bei
Minimalbefehlssaetzen ist das der Weg. Eine tolle Zahlen fuers
Multiplizieren und Addieren ist 256, wie bereits erwaehnt, dann wird das
low-byte zum high-byte oder andersrum.

Vielleicht hilfts ja.
Autor: Peter Dannegger (peda)
Datum: 04.07.2009 18:10

Konrad L. schrieb:
> Also 16bit-Multiplikation mit 1370 und dann nur das höherwertige Byte
> nehmen.

Was soll das bringen?
Diese 16 Bit Multiplikation funktioniert doch nur bis Zahlen kleiner
65536/1370=47, dürfte also praktisch unsinnig sein.


Nehmen wir mal an, die Division kostet 150% gegenüber dem AVR, also 30
Worte.
Ist der PIC12 denn wirklich so klein, daß popelige 30 Worte ne Rolle
spielen?


Peter
Autor: Mario (Gast)
Datum: 04.07.2009 22:05

Moin, moin,

Fixed-Point arithmetik heißt das Zauberwort, wurde aber eh schon zuvor
von Konrad und Robert geschrieben. Anstatt mit 1000 nimmst 1024, das
enspricht 10Bit, oder 10x rechts schieben. Dazu gibts hervorragende App.
notes bei Microchip die allesamt eine Bibliothek - in Assemblercode -
mitbringen.
Da braucht man nix mehr selber machen, es sei denn wegen Geschwindigkeit
die Routinen anzupassen, was schätzungsweise <10% bringt.

@Peter: Diese kleinen PIC's sind recht schnell am Anschlag, ein
Vergleich mit AVR ist da eher nicht sinnvoll.

Gruß
Mario
Autor: Kevin K. (nemon)
Datum: 04.07.2009 22:33

wie wäre:
wert x durch 1000 teilen:

y = x shr(5) //durch 32 teilen
y = y + x
z = y shr(10) //durch 1024 teilen

also auf gut deutsch z = (x + x/32) / 1024

macht 0,7% abweichung, bei den variablen kann natürlich noch gespart
werden.
Autor: Klaus Wachtler (mfgkw)
Datum: 07.07.2009 17:29

eben zufällig gesehen, vielleicht hilft es ja:
http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email ü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




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.
Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net