Mahlzeit,
ich benötige für eine Zeitkritische Geschichte eine Routine (ASM) womit
ich auf einem ATmega1281 eine 16 Bit Variable durch eine Konstante (in
diesem Fall 180) teilen kann.
Hat jemand vielleicht etwas Code-Geschnippsel da? Ich glaub mein
Mathe-Verständnis reicht dafür nicht aus um durch 180 zu teilen (und nur
Addition, Sub. sowie Div und Mul mit Potenzen von 2 (shift)) zu
verwenden.
Ich hoffe jemand kann mir auf die Sprünge helfen :)
Viele Grüsse
du kannst die 16 Bit Zahl einfach mit 364 multiplizieren und dann die
obersten 16 Bits des Ergebnisses verwenden.
x / 180 = (x * (65536 / 180)) / 65536 = (x * 364,088888...) >> 16
Je nach geforderter Präzision geht das am Schnellsten.
Oder du rechnest:
Ergebnis=Zahl/256+Zahl/512-Zahl/4096 usw.
Geht komplett ohne Multiplikation oder Division, nur durch Schieben.
Wird aber vermutlich langsamer sein als die Lösung von Kai.
Hmmm,
rein von der Idee her schon gut... Nur dann brauch ich wieder 32 Bit
Variablen, da wird dadd ganze natürlich wieder sehr Komplex :(...
Zumal wenn man nur die High-bytes nimmt, dass das ergebnis wieder nur 8
Bit ist... und 65535 / 180 = 364 ;)
Viele Grüsse
Ihr seit top... Jörgs Variante braucht grad mal 20 Takte.... Sowas nenn
ich doch mal Klasse ;D
Bascom hätte dafür mal locker über das 10-Fache gebraucht....
Vielen Dank an euch!!!!
Auch nur auf die Schnelle:
lsl r20
kann raus, da der Wert nicht mehr gebraucht wird.
Die Rundung am Ende kann durch eine Addition mit 91 am Anfang ersetzt
werden - das spart u.U. noch mal ein Bisschen. Je nach Anforderung kann
die auch komplett entfallen.
Ansonsten lässt sich da vermutlich nicht mehr viel dran machen.