Hi.
Was ist in der Regel schneller, wenn ein 8 Bit Wert auf einen Wert mit 6
Stufen umgerechnet werden soll.
-Teilen und runden?
-Teilen, Addieren und Abschneiden
-Lookup Table
Der Wert wird irgendwo permanent ausgelesen und liegt als Bytewert vor.
Er soll dann auf 6 einzelne Portpins umgesetzt werden, die wie bei einem
VU Meter dann den Wert des Eingangssignals anzeigen. (Wert 1 = LED 1 an,
Wert 2 = LED 1 und 2 an usw)
Der Andere schrieb:> Einfach die unteren 2 Bits ausblenden.
Bzw binäres nach rechts schieben, je nachdem welche portpins benutzt
werden sollen.
Sind die Pins aus welchem Grund auch immer durcheinander, macht eine
Tabelle ggf. Sinn.
Peter II schrieb:> kommt auf die Hardware an. Aber Lookup Table wird wohl oft das> schnellste sein.
Ist jetzt aber nicht dein Ernst für:
Sven schrieb:> wenn ein 8 Bit Wert auf einen Wert mit 6> Stufen umgerechnet werden soll.
Wenn ich es richtig verstehe, willst Du 256 Werte auf 7 Werte (alle
aus.. alle 6 an) falten?
Kommt sehr drauf an, wie linear die Umsetzung das ist Einer LUT ist das
egal, kostet aber auch viel Platz (256 Byte).
Also wenn ich nur 2 Bits abschneide, habe ich einen 6 Bit Wert.
Ich brauch aber einen Wert der nur von 1-6 geht.
Ist der Zielwert 1= Portpin 1 ein
Ist der Zielwert 2= Portpin 1 und 2 ein
Ist der Zielwert 3= Portpin 1,2,3 ein
usw.
Es soll wie ein VU Meter arbeiten und eine Eingangsspannung als
Balkenanzeige ausgeben.
Ich könnte dafür einfach rechnen, den Eingangswert durch 42,7 teilen und
runden oder teilen, 0,5 addieren und Nachkommazahl abschneiden.
Oder ich mach halt einfach eine Lookup Table. Also einfach die oberen 4
bit nehmen und eine Lookup Table mit 16 Werten und der gewünschen
Zuordnung im System 1 bis 6.
Es geht zwar nicht ganz auf, aber da kann ich mit der Aufteilung spielen
und z.B. bis ca 25% nur eine LED anzeigen und im oberen Bereich feiner
unterteilen.
Jörg schrieb:> Wenn ich es richtig verstehe, willst Du 256 Werte auf 7 Werte (alle> aus.. alle 6 an) falten?>> Kommt sehr drauf an, wie linear die Umsetzung das ist Einer LUT ist das> egal, kostet aber auch viel Platz (256 Byte).
genau.
Wobei 0 heißt alle LED aus.
Sobald irgendwas ankommt (Also auch schon bei dem Bytewert 1) soll schon
eine leuchten damit man sieht, dass die Anlage an ist.
Sven schrieb:> -Teilen und runden?> -Teilen, Addieren und Abschneiden
Wenn's auf einem AVR läuft, ist Teilen ganz schlecht, aber
multiplizieren geht: 8x8 Multiplikation mit einem geeigneten Faktor,
dann das höherwertige Byte verwenden.
Sven schrieb:> Ich brauch aber einen Wert der nur von 1-6 geht.
Okay, zu flüchtig gelesen.
> Oder ich mach halt einfach eine Lookup Table. Also einfach die oberen 4> bit nehmen und eine Lookup Table mit 16 Werten und der gewünschen> Zuordnung im System 1 bis 6.
Warum dann nicht die oberen 3bits ?
5 mal shiften und den Rest per Lookup oder switch case.
Genau. Dafür sind LUTs ideal. Und wenn Du vom 8-Bit Wert eh' nur die
oberen 4-Bit brauchst, sind das meist nur zwei Operationen: Nibble
tauschen und AND mit 0x0F. Dann 16 Byte LUT und gut ist...
Solange du keine Divisionen machst die keine Zweierpotenz als Divisor
haben ist das alles relativ Wumpe.
LUT ist zügig, bei 6 Stufen kannst du einfach von unten nach oben per
Schleife durchgehen und für jeden Tabellenwert der kleiner als der
Eingangswert ist, den LED Portpin auf 1 setzen.
Wenn es noch zügiger sein soll, macht man das gleiche wie bei SAR ADCs,
man fängt in der Mitte an und halbiert seine Schritte immer weiter. Aber
die maximale Zeitersparnis ist bei 6 Stufen minimal.
Alternativ kann man da auch die etwas unflexiblere Bitshift/Mathematik
trickery anwenden:
Peter II schrieb:> Der Andere schrieb:>> Einfach die unteren 2 Bits ausblenden.>> dann hat man 6 bits aber nicht 6 Stufen.
Uups,
sorry, Asche auf mein Haupt. Ihr habt natürlich recht und ich hab Mist
interpretiert.
Der Andere schrieb:> Peter II schrieb:>> Der Andere schrieb:>>> Einfach die unteren 2 Bits ausblenden.>>>> dann hat man 6 bits aber nicht 6 Stufen.>> Uups,> sorry, Asche auf mein Haupt. Ihr habt natürlich recht und ich hab Mist> interpretiert.
Zu deiner Verteidigung: Die Frage ist etwas blöd formuliert, daher war
ein Bitshift um 5 Bits meine erste Antwort. Dann hab ich den Teil mit
dem VU Meter nochmal gelesen und den eigentlichen Zweck der Übung
verstanden.
Im einfachsten Fall nimmt man switch mit Bereichen (der AVR-GCC kann
das), dann macht der Compiler die binäre Suche für Dich.
Z.B. für logarithmische Bereiche:
Peter II schrieb:> wobei man sich Fragen muss, warum ein paar LEDs so schnell angesteuert> werden müssen. Jeder weg sollte schnell genug dafür sein.
Das sehe ich auch so. LUT ist der schnellste Weg, aber wozu den Aufwand,
wenn die Funktion alle x ms einmal aufgerufen wird?
Ich bin ja normalerweise kein Freund von langen if..else Ketten, aber in
diesem Fall bist Du so am flexibelsten, weil Du die Schwellwerte direkt
einstellen kannst.
Peter D. schrieb:> case 128 ... 255: display6(); break;
Interessant, dass das geht. Peters Code sieht hübscher aus. Ist aber
(noch) kein Standard, oder?
Gruß, Stefan
Stefan K. schrieb:> Peter D. schrieb:>> case 128 ... 255: display6(); break;>> Interessant, dass das geht. Peters Code sieht hübscher aus. Ist aber> (noch) kein Standard, oder?
Nein, das ist eine C-Erweiterung in GCC.