Hallo Leute,
ich bräuchte für Umrechnung der Entfernung in cm eine Divisionsroutine,
die mir eine 16-bit Zahl durch eine konstante 8-Bit Zahl dividieren
würde (genauer gesagt ist diese Konstante 58).
Ich programmiere in Assembler, auf dem Atmega8.
Habe sehr viele Beiträge bereits gelesen, konnte jedoch keine passende
Lösung finden.
mfg Anton
Peter Dannegger schrieb:> Da der ATmega einen Mul-Befehl hat, ist es einfacher mit dem Reziproken> zu multiplizieren und das Ergebnis entsprechend nach rechts zu schieben.>>> Peter
könntest du das bitte näher erläutern, habe es nicht so ganz verstanden,
wie es mit mul Befehl gehen soll ..
mfg Anton
Du dividierst zuerst durch 64 und addierst einen Korrekturfaktor.
z.B.
10000/58=172,413
10000/64=156 156,25/8=19 /8=2 /4=0 /2=0
156+19-2-0-0=173
anderes Beispiel:
65536/58=1129,931
65536/64=1024 /8=128 /8=16 /4=4 /2=2
1024+128-16-4-2=1130
Oder wie Peter beschrieben hat, nur statt shr16 vom 32-bit-Ergebnis nur
das upper-word verwenden.
Abhängig vom Eingangsbereich kannst Du vorher noch erweitern, um besser
runden zu können.
Es ginge auch ganz klassisch:
Vom Dividend solange den Divisor abziehen und mitzählen bis das
Subtraktionsergebnis negativ wird. Dann wieder einen Schritt rückgängig
machen und du hast dein Ergebnis + Rest.
Anton schrieb:> Peter Dannegger schrieb:>> Da der ATmega einen Mul-Befehl hat, ist es einfacher mit dem Reziproken>> zu multiplizieren und das Ergebnis entsprechend nach rechts zu schieben.>>>> Peter>> könntest du das bitte näher erläutern, habe es nicht so ganz verstanden,> wie es mit mul Befehl gehen soll ..> mfg Anton
Einfach nem guten C-Compiler bei der Arbeit zuschauen ;-)
Hallo,
sorry das ich das alte Thema ausgrabe.
Der Code von Jürgen Funktioniert aber nur mit Werten unter 100 oder?
Mit 158 kommt bei mir ein Falsches Ergebis raus nämlich statt 414 kommt
388.
Thomas Gruber schrieb:> Der Code von Jürgen Funktioniert aber nur mit Werten unter 100 oder?
Nur bis 127.
Willst Du bis 255, mußt Du noch den Übertrag bei "rol temp1"
berücksichtigen.