Gast
#600755
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
|
Anzeige
|
Division einer 8 Bit Konstante / eine 8 Bit Variable
Gast
#600755
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
Gast
#600761
ja nach rechts schieben = /2
Gast
#600763
aber nur wenn die Teilerkonstante ein Vielfaches von 2 ist.
Gast
#600767
nicht wenn man das carry bit testet. 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 ?
kehrwert der konstante?
Gast
#600896
..Wie berechnet man den Kehwert ohne Division ?.. Taylorreihenentwicklung von 1/x ;-))
Gast
#600949
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.
Gast
#600953
die vollstände gleichung sieht ungefär so aus: A = Delta * (255/x) alles in 8 Bit (.asm)
Gast
#600955
@ 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
Gast
#600966
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
Gast
#600978
@ 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
Gast
#600987
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.
Gast
#601612
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 Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|