Forum: Mikrocontroller und Digitale Elektronik LookUp Tabelle mit Variablen


von Gamo (Gast)


Lesenswert?

Hallo Leute,

folgende Aufgabenstellung:

4 Eingangssignale  --> 1 Output

A B C sind % Werte von 0..100, gereiht von High nach Low
das Activ Flag hat einen wertebereich von 0..1

A B C Activ(0) --> A
B A C Activ(0) --> B
....


Kann man das vernünftig in einer LookUp darstellen, obwohl sich 
natürlich
A B C ständig ändern?

das ganze natürlich in ANSI C.

LG

von Florian O. (simuru)


Lesenswert?

Was soll denn unter welchen umstaenden zurueck gegeben werden?

In deinem Beispiel ist es immer der groeszte Wert - liegt das am 
activ-flag?

von Rene H. (Gast)


Lesenswert?

PC oder µC? Für einen µC dürfte die Tabelle zu groß werden.

Grüße,
René

von Gamo (Gast)


Lesenswert?

Danke für die schnellen Antworten,

die Tabelle hat 12 Reihen, mit 4 Inputs und 1nem Output.
Am µC würde die LookUp implementiert werden.

Leider ist es nicht immer der größte Wert.
Das Activ Flag greift in Spezial Fällen

Lg

von Dr. Sommer (Gast)


Lesenswert?

Spielt denn nur die Größenreihenfolge von A, B, C eine Rolle oder die 
genauen %-Werte? Im ersten Fall kann man eine LUT über die Reihenfolge 
machen, dann sinds nämlich nur noch 3*2*1=6 Möglichkeiten und nicht 
100*100*100=1000000

von Gamo (Gast)


Lesenswert?

Es spielt nur die Größenreihenfolge eine Rolle, nicht genaue % Werte.
Wie könnte so etwas aussehen?

von lehmi (Gast)


Lesenswert?

Gamo schrieb:
> 4 Eingangssignale  --> 1 Output
>
> A B C sind % Werte von 0..100, gereiht von High nach Low
> das Activ Flag hat einen wertebereich von 0..1
>
> A B C Activ(0) --> A
> B A C Activ(0) --> B

wenn es nur darum geht, den größten der 3 oder das Active Flag zu 
nutzen, wozu dann die Tabelle? Oder muss der größte Werte dann 
umgerechnet werden?

Schreib doch mal Pseudo Code, vielleicht wird es dann klarer (wenigstens 
für mich...)

Grüße

von Dr. Sommer (Gast)


Lesenswert?

Du vergleichst die Werte um die Reihenfolge zu ermitteln. Du nimmst ein 
Byte, speicherst in Bits 2-3 welches von A,B,C das größte ist (als Zahl 
von 0-2), in Bit 1 welches der beiden übrig gebliebenen das zweitgrößte 
ist, und in Bit 0 das "Active Flag". Das Byte nimmst du dann als Index 
für eine LUT mit 12 Einträgen (0-11), in der du pro Eintrag den Index 
des Eingabewerts speicherst, der durchgeleitet werden soll.

von Gamo (Gast)


Lesenswert?

Das Problem ist das Activ Flag, somit ist es nicht immer der Fall, dass 
der größte Wert auch der Output ist.

Für mich ist die Frage, ob es möglich ist, dass in einer LUT 
darzustellen.

Gibt es vielleich eine andere Möglichkeit, eventuell mit einem input 
vector und einem Output vector zu arbeiten....

von Karl H. (kbuchegg)


Lesenswert?

Kannst du den Zusammenhang etwas besser bzw. genauer beschreiben?
Deine 'Beschreibung' im Eröffnungsposting ist reichlich schwammig.

Falls die Zusammenhänge nicht völlig willkürlich sind, dann ist es auch 
möglich sie vernünftig auszudrücken. Und dann kann man auch Code dafür 
schreiben, ohne eine LUT bemühen zu müssen.


> die Tabelle hat 12 Reihen, mit 4 Inputs und 1nem Output.

Das ist jetzt noch nicht allzuviel. Problematisch wird es genau dann, 
wenn eine Wertekombination als Input kommt, die nicht in der LUT 
enthalten ist.

von Gamo (Gast)


Lesenswert?

Hier die Tabelle:
1
High Medium Low Activation     Output
2
3
A    B      C       0            A
4
A    C      B       0            A
5
B    A      C       0            B
6
B    C      A       0            B
7
C    A      B       0            A
8
C    B      A       0            B
9
10
A    B      C       1            A
11
A    C      B       1            A
12
B    A      C       1            A
13
B    C      A       1            C
14
C    A      B       1            C
15
C    B      A       1            C

von Karl H. (kbuchegg)


Lesenswert?

Gamo schrieb:

>
1
> High Medium Low Activation     Output
2
> 
3
> A    B      C       0            A
4
> A    C      B       0            A
5
> B    A      C       0            B
6
> B    C      A       0            B
7
> C    A      B       0            A
8
> C    B      A       0            B
d.h. wenn Activation gleich 0 ist, dann spielt C keine Rolle mehr und 
das Ergebnis ist der größere Wert von A und B
1
  if( Activation == 0 )
2
    Result = ( A > B ) ? A : B;


>
1
> A    B      C       1            A
2
> A    C      B       1            A
3
> B    A      C       1            A
4
> B    C      A       1            C
5
> C    A      B       1            C
6
> C    B      A       1            C
7
>

und hier ist es umgekehrt. Wenn Activation gleich 1 ist, dann spielt B 
keine Rolle mehr
1
    else
2
      Result = ( A > C ) ? A : C;





Das wars. Deine LUT Implementierung reduziert sich auf den 4-Zeiler
1
  if( Activation == 0 )
2
    Result = ( A > B ) ? A : B;
3
  else
4
    Result = ( A > C ) ? A : C;
und du brauchst die Werte noch nicht mal vorher der Größe nach ordnen.

von Gamo (Gast)


Lesenswert?

Danke,dass habe ich bereits in Verwendung.

Ich wollte jedoch zur Übung das ganze etwas schwieriger gestalten und in 
einer LUT mit Referenzen verpacken.

von Karl H. (kbuchegg)


Lesenswert?

Gamo schrieb:
> Danke,dass habe ich bereits in Verwendung.
>
> Ich wollte jedoch zur Übung das ganze etwas schwieriger gestalten und in
> einer LUT mit Referenzen verpacken.

Für eine LUT brauchst du Zahlenwerte. Du hast keine Zahlenwerte. Du hast 
irgendwas schwammiges mit A, B und C.
Eine Lookup Table macht dir den Zusammenhang:
Wenn der Messwert 867 ist, dann ist das Ergebnis 23. Wenn der Messwert 
868 ist, dann ist das Ergebnis 25. Wenn der Messwert x ist, dann ist das 
Ergebnis davon y.
Und man benutzt sie wenn es keine einfache Formel oder Formalismus gibt, 
so dass man y aus x errechnen kann.
Das geht natürlich auch 2-dimensional, bzw. n-dimensional. Aber der 
Speicherverbrauch steigt extrem mit jeder weiteren Dimension.

Bei dir
1
  A     B     C       active      Result
2
  0     0     0          0           0
3
  1     0     0          0           1
4
  2     0     0          0           2
5
  3  ....
6
 99     0     0          0          99
7
8
  0     1     0          0           1
9
  1     1     0          0           1
10
  2     1     0          0           2
11
  3  ....
12
 99     1     0          0          99
13
14
  0     2     0          0           2
15
  1     2     0          0           2
16
  2     2     0          0           2
17
  3     2     0          0           3
18
   ...
19
 99     2     0          0          99
20
21
  0     3     0          0           3
22
  1     3     0          0           3
23
....
24
 99    99     0          0          99
25
...
26
  0     0     1          0           0
27
...

alle Kombinationen, jeder mit jedem. mit allen möglichen Zahlenwerten.

von Gamo (Gast)


Lesenswert?

Ok, danke für die Antworten.

Thread kann geschlossen werden.

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.