www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Division durch Zehnerpotenz in Assembler


Autor: Jens87 (Gast)
Datum:

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

Bewertung
0 lesenswert
nicht lesenswert
Ansatz siehe Beitrag "Re: 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:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Jens87 (Gast)
Datum:

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

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

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

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

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

Bewertung
0 lesenswert
nicht lesenswert
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) Benutzerseite
Datum:

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

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

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.