mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Division einer 8 Bit Konstante / eine 8 Bit Variable


Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja nach rechts schieben = /2

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber nur wenn die Teilerkonstante ein Vielfaches von 2 ist.

Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nicht wenn man das carry bit testet.

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei den AVR-Freaks gibt es einen Tread zum Thema Division-Tricks:
http://8515.avrfreaks.net/index.php?name=PNphpBB2&...

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit dem Kehrwert Multiplizieren ????
AVR / 8051  8086  Z80 oder wofür ???
Kommt mitunter auch auf die MCU an was günstiger ist !!!

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stephan Henning wrote:
> mit dem Kehrwert Multiplizieren ????

Wie berechnet man den Kehwert ohne Division ?

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kehrwert der konstante?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..Wie berechnet man den Kehwert ohne Division ?..

Taylorreihenentwicklung von 1/x
;-))

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die vollstände gleichung sieht ungefär so aus:


A = Delta * (255/x) alles in 8 Bit      (.asm)

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: Christoph Wagner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Quehl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.