Forum: Mikrocontroller und Digitale Elektronik 4 Bit Wert in 3 1/2 Bit umrechnen?


von Alisa 1387 (Gast)


Lesenswert?

Möchte Werte im Bereich von 0-15 auf einen Bereich von 0-11 umrechnen.
Für die größeren Zahlen klappt es einigermaßen, von links gesehen die
erste Null zu behalten und die restlichen Stellen nach rechts zu
schieben.

Kennt jemand die "saubere" Lösung, mit der sich auch kleinere Werte
ordentlich runden lassen?

von Alisa 1387 (Gast)


Lesenswert?

Ich meinte natürlich: Die erste Eins zu behalten.

von Tom (Gast)


Lesenswert?

Zum Verständnis:
Möchtest du quasi mit dem Bruch 11/15 multiplizieren?



Gruß
Thomas

von Peter Dannegger (Gast)


Lesenswert?

Z.B. 15 * 188 / 256 = 11

in 8051 assembler:

mov a, #15 ;A = input (15)
mov b, #188
mul ab
mov a, b ;A = output (11)


Peter

von Martin S. (Gast)


Lesenswert?

na ja, sind es denn 12/16, (da die 0 ja auch mit darstellbar ist)?

also dann auch 3/4

/4 ist mit shift realisierbar, und *3 durch 3fache Addition

Du must also zuerst 3 mal addieren (also passende Registergröße
vorhalten, müssten ja dann 10 bit sein) und das ergebniss dann schieben

von Martin S. (Gast)


Lesenswert?

AUtsch, wo ich den Zahlenwert in 8 Bit breitkloppen möchte weiß ich auch
grad nicht.

"zur Not" tuns auch 4 Bit (respp. 6 Bit)

also

15d * 3d = 45d (binär = 101101
das dann durch 4 = 2 * shift rechts = 1011 = 11d

von A.K. (Gast)


Lesenswert?

Wie wär's mit einem einfachen Tabelle? Ist garantiert kürzer als jede
Rechnerei.

von Martin S. (Gast)


Lesenswert?

0  0,00  0
1  0,75  1
2  1,50  2
3  2,25  2
4  3,00  3
5  3,75  4
6  4,50  5
7  5,25  5
8  6,00  6
9  6,75  7
10  7,50  8
11  8,25  8
12  9,00  9
13  9,75  10
14  10,50  11
15  11,25  11

Ein bishcen ungenau wird es also immer

von Michael Wilhelm (Gast)


Lesenswert?

Na ja und die Tabelle kann man ja mit int-Werten belegen. Wenn gerechnet
werden soll: Tabellenwert * 10; + 5 und wieder durch 10 teilen. Dann
sind die C-Rundungsfehler eliminiert.

MW

von Alisa 1387 (Gast)


Lesenswert?

Eben bin ich mit der Bahn nach Hause gefahren und dachte nur: Autsch,
was für ne bekloppte Frage. Wert kopieren, zweimal schieben, Ergebnis
vom Ursprungswert subtrahieren und fertig.

Danke für die vielen schnellen Antworten. Peter, Du hättest bestimmt
noch irgendwo nen Zyklus gespart doch für mich ist die Performance
vorerst ausreichend und ich kenne mich mit dem 8051ger nicht aus...
(die neue Schule, erst mit´m AVR angefangen ;)

THX

(und nächstes mal versuche ich erstmal nachzudenken bevor ich dumme
Fragen stelle ;)

Basti aka "Alisa 1387"

von Mark Hämmerling (Gast)


Lesenswert?

Salve,

@Martin:
es bleibt trotzdem bei 11/15 - daß die 0 mit im Wertebereich liegt,
spielt doch keine Rolle. 0 bleibt 0, und 15 wird 11. Also 11/15.

Mark

von Alisa 1387 (Gast)


Lesenswert?

Das ist ja alles viel zu umständlich. So ganz habe ich nicht verstanden,
wozu ich 10 Bit brauche, um einen 4bit Wert nach 3 1/2 umzurechnen.

Die "garantiert kürzere" Tabelle ist mir zu lang.

Und das Runden ist egal, da gar keine Nachkommastellen benötigt werden
(waren die 10 Bit für Nachkommastellen gedacht?)

von Alisa 1387 (Gast)


Lesenswert?

Also in 3 1/2 Bit können ja so viele Nachkommastellen nicht enthalten
sein?

von Freak5 (Gast)


Lesenswert?

Ich habe nicht alles gelesen, aber wie kann es halbe Bits geben?

von Peter D. (peda)


Lesenswert?

"Peter, Du hättest bestimmt
noch irgendwo nen Zyklus gespart doch für mich ist die Performance
vorerst ausreichend und ich kenne mich mit dem 8051ger nicht aus..."


Die ATMegas können doch auch multiplizieren:

ldi r16, 15 ;r16 = 15
ldi r17, 188
mul r16, r17
mov r16, r1 ;r16 = 11


Peter

von Alisa 1387 (Gast)


Lesenswert?

@Freak5:
Indem es Wertebereiche gibt, welche keine Potenz von 2 sind?!?

@Peter:
Danke, das war verständlich...

von Freak5 (Gast)


Lesenswert?

Achso. Das ist aber doch kein 2.5Bit-Wert, da man keine halben Bits
nutzen kann g
Aber jetzt weiß ich, wass ihr meint.

von Martin S. (Gast)


Lesenswert?

> da man keine halben Bits nutzen kann *g*

Doch, es gibt nutzbare halbe bits (auch außerhalb von Gaststätten um
Bitburg)

Beid er seriellen Übertragung kann man dei Anzahl der Stop-bits auf 1,5
oder ,5 stellen. Dies hat durchaus sinnvolle Gründe.

von Martin S. (Gast)


Lesenswert?

aber trotzdem versteh ich nicht, wieso eine integer-Multiplikation
effizienter sein soll als 2 Additionen plus ein Doppel-Shift (siehe
meine obige Formel)

von Peter D. (peda)


Lesenswert?

@Martin,

"wieso eine integer-Multiplikation effizienter sein soll"

LDI + MUL = 2 Words / 3 Zyklen
2 * ADD + 2 * LSR = 4 Words / 4 Zyklen

Die Effizienz ist aber nicht ausschlaggebend, sondern daß die
Multiplikation auch für beliebig andere Umrechnungen geeignet ist.
Z.B. um ADC-Werte in reale Spannungen umzurechnen und umgekehrt.

Wichtig ist dabei nur, daß man den Koeffizienten so wählt, daß eine
Division durch 256 oder 65536 oder andere Zweierpotenzen herauskommt.



Peter

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
Noch kein Account? Hier anmelden.