Hallo, gibt es eine einfache lösung eine feste 8bit Zahl durch eine Variable zu dividieren? 255/x=.. x ist auch eine 8 bit Zahl
aber nur wenn die Teilerkonstante ein Vielfaches von 2 ist.
Bei den AVR-Freaks gibt es einen Tread zum Thema Division-Tricks: http://8515.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=37150&start=all&sid=9d723b13f25265cd6bad9b5b0b383c29
mit dem Kehrwert Multiplizieren ???? AVR / 8051 8086 Z80 oder wofür ??? Kommt mitunter auch auf die MCU an was günstiger ist !!!
Stephan Henning wrote:
> mit dem Kehrwert Multiplizieren ????
Wie berechnet man den Kehwert ohne Division ?
..Wie berechnet man den Kehwert ohne Division ?.. Taylorreihenentwicklung von 1/x ;-))
Hallo, der Kehrwert von 255 ist 0.0039... das dürfe auch nicht gehen. Kommas sind so glaube ich auch ein Problem das nicht ohne mehr aufwand gelöst werden kann.
die vollstände gleichung sieht ungefär so aus: A = Delta * (255/x) alles in 8 Bit (.asm)
@ René (Gast) >der Kehrwert von 255 ist 0.0039... das dürfe auch nicht gehen. Kommas >sind so glaube ich auch ein Problem das nicht ohne mehr aufwand gelöst >werden kann. Festkommaarithmetik Aber das löst das Problem nciht, denn die VARIABLE steht im Nenner. Da kommt man um einen Division nicht herum. Warum wird da so ein Theather draus gemacht? Wie schnell muss denn gerechnet werden? Und wozu das Ganze? MfG Falk
Danke Falk für den Hinweis ich wollte nur Register sparen da schon fast alle belegt sind. Und die Teilweise in Interups benutzt werden kann es zu "überschneidungen" kommen. Aber da werde ich nicht drum herumkommen. Die Zeit ist nicht so das Problem. Es geht um RGB nach HSV und zurück umrechnung in .asm Für C gibt es ja schon Beispiele aber in asm ist nichts zu finden. Da mein ganzes Projekt aber in ASM gehalten ist habe ich ein Problem
@ René (Gast) >ich wollte nur Register sparen da schon fast alle belegt sind. Und die Hast du keinen SRAM? Welchen Controller verwendest du? >Teilweise in Interups benutzt werden kann es zu "überschneidungen" Auch das Problem kann SRAM lösen. Push & Pop. MfG Falk
damit ist eine approximation gemeint. Die Quintessenz von dem Link, der oben gepostet worden ist ist folgende: man findet kurze und einfache Routinen, um Division für bestimmte Zahlen wie z.B. 10 zu umgehen - die funktionieren allerdings nur bis zu einem bestimmten Eingangswert. Ein nahezu bestechend einfacher ist: Eingangswert * 26 und das low-byte vergessen. Diese Lösung stimmt bis zu einem Eingangswert von 67. Also für 6 Bit genau. Das kann man nehmen, wenn man eine Anzahl Sekunden, Minuten, Stunden, etc. z.B. auf einem Display darstellen will [mögliche Eingangswerte: 0-59]. Die "Division" benötigt gerade einmal 4 Zyklen. mov TEMP1,10 mul INPUT,TEMP1 mov OUTPUT,r1 Genauer wirds mit: (Eingangswert * 205)/8. Diese Lösung stimmt sogar bis 1027 - also 10 Bit. Man kann soz.B. einen Messwert von 0-999 fix in die Einzelstellen zerlegen. mov TEMP1,205 mul INPUT,TEMP1 shr r1 shr r1 shr r1 mov OUTPUT,r1 Für andere Divisoren als 10 müsstest du natürlich selbst solche Tricks aufstellen aber der Link sollte als Anregung für Methoden dazu reichen.
die Approximation würde ich noch für am Besten halten. In 2er Potenzen multiplizieren und sehen, ob das Ergebnis größer oder kleiner dem Vorgabewert ist. So ähnlich. Wie man das dann programmiert, müßte überlegt werden. mfg
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.