Forum: Mikrocontroller und Digitale Elektronik Division durch Zehnerpotenz in Assembler


von Jens87 (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

Ansatz siehe Beitrag "Re: AVRGCC: Konstanten optimieren".
Lohnt aber m.E. nur wenn er gut multiplizieren kann. Kann der PIC12 
vermutlich nicht.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?


von Jens87 (Gast)


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ß

von Peter D. (peda)


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

von Konrad L. (konrad)


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

von Robert T. (robertteufel)


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.

von Peter D. (peda)


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

von Mario (Gast)


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

von Kevin K. (nemon) Benutzerseite


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.

von Klaus W. (mfgkw)


Lesenswert?


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.