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
Ansatz siehe Beitrag "Re: AVRGCC: Konstanten optimieren". Lohnt aber m.E. nur wenn er gut multiplizieren kann. Kann der PIC12 vermutlich nicht.
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ß
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
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
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.
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
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
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.
eben zufällig gesehen, vielleicht hilft es ja: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=37150&start=40
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.