www.mikrocontroller.net

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


Autor: Alisa 1387 (Gast)
Datum:

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

Autor: Alisa 1387 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meinte natürlich: Die erste Eins zu behalten.

Autor: Tom (Gast)
Datum:

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



Gruß
Thomas

Autor: Peter Dannegger (Gast)
Datum:

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

Autor: Martin S. (Gast)
Datum:

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

Autor: Martin S. (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: Martin S. (Gast)
Datum:

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

Autor: Michael Wilhelm (Gast)
Datum:

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

Autor: Alisa 1387 (Gast)
Datum:

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

Autor: Mark Hämmerling (Gast)
Datum:

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

Autor: Alisa 1387 (Gast)
Datum:

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

Autor: Alisa 1387 (Gast)
Datum:

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

Autor: Freak5 (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Alisa 1387 (Gast)
Datum:

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

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

Autor: Freak5 (Gast)
Datum:

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

Autor: Martin S. (Gast)
Datum:

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

Autor: Martin S. (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.