4 zu 16 Decoder in anderer Form

Hallo Leute,

Ich suche seit Tagen ein IC, welches folgende Wahrheitstabelle erfüllt:

INPUT				OUTPUT															
D	C	B	A	Q15	Q14	Q13	Q12	Q11	Q10	Q9	Q8	Q7	Q6	Q5	Q4	Q3	Q2	Q1	Q0
0	0	0	0	L	L	L	L	L	L	L	L	L	L	L	L	L	L	L	H
0	0	0	1	L	L	L	L	L	L	L	L	L	L	L	L	L	L	H	H
0	0	1	0	L	L	L	L	L	L	L	L	L	L	L	L	L	H	H	H
0	0	1	1	L	L	L	L	L	L	L	L	L	L	L	L	H	H	H	H
0	1	0	0	L	L	L	L	L	L	L	L	L	L	L	H	H	H	H	H
0	1	0	1	L	L	L	L	L	L	L	L	L	L	H	H	H	H	H	H
0	1	1	0	L	L	L	L	L	L	L	L	L	H	H	H	H	H	H	H
0	1	1	1	L	L	L	L	L	L	L	L	H	H	H	H	H	H	H	H
1	0	0	0	L	L	L	L	L	L	L	H	H	H	H	H	H	H	H	H
1	0	0	1	L	L	L	L	L	L	H	H	H	H	H	H	H	H	H	H
1	0	1	0	L	L	L	L	L	H	H	H	H	H	H	H	H	H	H	H
1	0	1	1	L	L	L	L	H	H	H	H	H	H	H	H	H	H	H	H
1	1	0	0	L	L	L	H	H	H	H	H	H	H	H	H	H	H	H	H
1	1	0	1	L	L	H	H	H	H	H	H	H	H	H	H	H	H	H	H
1	1	1	0	L	H	H	H	H	H	H	H	H	H	H	H	H	H	H	H
1	1	1	1	H	H	H	H	H	H	H	H	H	H	H	H	H	H	H	H

Die normalen Decoder schalten ja immer nur einen Pin durch. Gibt es das in dieser abgewandelter Form bzw. wie kriege ich die Funktion am besten hin?

3 zu 8 wäre auch ok, sowie vertauschte Pegel 8)

Danke bereits!

Kann man wohl mit Standard-Logik Bausteinen irgendwie hinkriegen, aber ...
... Wo sind wir denn hier ?

Wie wäre es mit einem atmega8 oder einem Arduino oder so?
20 Digital Signale kommt doch genau hin.

Sowas ist eigentlich das Gebiet von GALs, PALs und CPLDs. Aber da braucht man wieder ein Programmiergerät...

Ich möchte möglichst wenige Pins am arduino "verschwenden" um möglichst viele Bit-Ausgänge zu haben.

Dachte jemand hätte so etwas in der Art vllt schon mal gelöst z.B. über einen seriellen I/O Baustein, wovon ich wiederum (noch) keine Ahnung habe.

Dann nimm Schieberegister wie den 74HC595 oder Port Expander wie den MCP23009 / MCP23017 oder PCF8574 / PCF8575. Da kannst Du jeden einzelnen Ausgang setzen oder löschen. Die Port Expander können nach belieben Pin für Pin als Eingang oder Ausgang benutzt werden.
Beispiele zur Ansteuerung findest Du im Playground: zB Arduino Playground - I2CPortExpander8574 Overview | Arduino Lesson 4. Eight LEDs and a Shift Register | Adafruit Learning System
Grüße Uwe

Wenn du eine separate Lösung wolltest (und ein entsprechendes Programmiergerät hast) ist für sowas der Vorschlag mit dem Atmega8 gut.

Ich habe sowas auch schon mal gemacht. Ironischerweise gerade um einen GAL zu ersetzen :slight_smile:
Hatte mal ne Maschine zum reparieren bei der die Umsetzung der Schrittmotor-Ansteuersignale in die Schrittfolgen in einem GAL gemacht war. Programmiergerät war sogar da, aber der Baustein war soweit zerschossen dass ich ihn nicht mehr auslesen konnte. Da ich auch keine Erfahrung hatte sowas zu programmieren habe ich einen Atmel AT89C2051 genommen, etwa 30 Zeilen Assembler programmiert und schon liefs wieder :slight_smile:

Schieberegister sind auch hier sehr schön erklärt:

Da brauchst du dann zwei davon und schiebst dir dann je nach dem Zustand von ABCD andere Werte raus. Ist sicher das einfachste hier.

Schieberegister hab ich ja völlig vernachlässigt :drooling_face:

Arbeite mich jedoch erst mal bei dem Port-Expander ein. Die Lösung gefällt mir mehr als das Schieben.

Vielen Dank für die schnellen Antworten 8)

Beim Port expander wird auch geschoben (zwar über I2C bzw SPI)
Der Vorteil der Port Expander liegt darin, daß die Pins einzeln als Eingänge oder Ausgänge programmiert werden können. Der Nachteil ist daß bei I2C nur 3 Adresspin vorhanden sind und darum nur 8 gleiche ICs am Bus hängen können. Bei SPI braucht jedes IC ein Enable-Pin vom Arduino. Darumist auch hier die Anzahl der Adressierbaren ICs begrenzt.

Vorteil der Schieberegister ist daß viele hintereinandergeschaltet werden können. Bei mehr als ca 5 braucht es Treiber um genügend Strom zu haben soviele CLK uns Enable Pins paralell anzusteuern.

Grüße Uwe

Strom? Fan-Out? Wir sind hier doch nicht bei TTL :slight_smile: Die HC Serie hat einen Eingangsstrom von ca. 1µA

Statischen Eingangstrom vieleicht; aber es braucht einen Strom um den Zustand eines Eingangs zu ändern ( Gate-Source Kapazität)

Grüße Uwe

Schieberegister kommt nicht in Frage.
Die geforderte Funktion kann nicht erfüllt werden.

Das ganze soll am Ende eine "Balken"-Anzeige mit LEDs werden.
Um eine möglichst hohe Auflösung des darzustellenden Analogwertes hinzubekommen, brauche ich eben so viele Pins. Das Analogsignal ändert sich sehr schnell und die Anzeige soll mit min 2Hz aktualisiert werden.

Ansteigender Wert ist ja kein Problem mit dem Schieben. Das Absinken jedoch :roll_eyes:

hi,

Ansteigender Wert ist ja kein Problem mit dem Schieben. Das Absinken jedoch

??????

gruß stefan

Das ist nicht wie das Schieberegister funktioniert. Geschoben wird um die seriell/parallel-Wandlung zu erreichen. Du schiebst da immer alle 16 Werte auf einmal rein. Wenn du eine neue Zeile willst werden 16 neue Werte eingeschoben.

Es gibt auch Schieberegister bei denen man die Schieberichtung einstellen kann. Aber das ist hier nicht nötig!

2Hz ist alle 500ms. Das ist eine Ewigkeit.

Eisebaer:
hi,

??????

gruß stefan

Dann klär mich bitte auf, wie ich das darüber "einfach" lösen kann.

Sinkt das Signal ab, kommt natürlich ein LOW Aufs Register, die dann eben durchwandert. Jedoch soll in dem Fall das letzte (Höchstwertigste) HIGH-Signal zum LOW werden.

beispiel:
0000000011111111 steigt an
0000000111111111
0000001111111111 jetzt soll es sinken
0000000111111111
0000000011111111

mit dem Schieben kann nur die erste bzw. letzte Stelle beinflusst werden.

Serenifly:
Das ist nicht wie das Schieberegister funktioniert. Geschoben wird um die seriell/parallel-Wandlung zu erreichen. Du schiebst da immer alle 16 Werte auf einmal rein. Wenn du eine neue Zeile willst werden 16 neue Werte eingeschoben.

Es gibt auch Schieberegister bei denen man die Schieberichtung einstellen kann. Aber das ist hier nicht nötig!

2Hz ist alle 500ms. Das ist eine Ewigkeit.

So sieht das ganze dann anders aus. Also kann ich die werte Seriell reinladen und die Ausgabe erst aktivieren, wenn alle da sind? Oder versteh ich das jetzt falsch?
Mit "2Hz ist alle 500ms. Das ist eine Ewigkeit." gehe ich davon aus, dass das auch schneller geht?

Du verstehst das falsch. Denke nicht in dem Sinne als ob du da irgendwas durch schiebst. Das Schieben dient nur dazu um aus einem seriellen Ausgang 16 parallel Ausgänge zu machen. Davon bekommst du gar nichts mit.

Du hast eine Funktion wie shiftOut(byte) in der IDE. Die schiebt dir dann das Byte raus und es erscheint an den SR Ausgängen. Wenn man das zweimal macht hat man 16 Ausgänge. Wenn du eine neue Zeile der Wertetabelle willst werden zwei neue Bytes rausgeschoben.

genau. Du schreibst IMMER 16 werte rein. und natürlich geht das viel schneller. noch viel schneller als Du es zb von anzeigen auf alten stereoanlagen kennst.

gruß stefan

R1der:
Also kann ich die werte Seriell reinladen und die Ausgabe erst aktivieren, wenn alle da sind? Oder versteh ich das jetzt falsch?

Schau dir mal das Datenblatt an. Die Schieberegister sind intern gelatcht. Das heißt sie haben einen Zwischenspeicher und der wird erst raus geschrieben wenn ein Latch Enable Signal kommt.

Siehe hier:
http://arduino.cc/en/Reference/ShiftOut

    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, data1);  
    shiftOut(dataPin, clockPin, LSBFIRST, data2);
    digitalWrite(latchPin, HIGH);

Serenifly:
Mit "2Hz ist alle 500ms. Das ist eine Ewigkeit." gehe ich davon aus, dass das auch schneller geht?

Ja, wesentlich schneller. Genau kann ich es dir nicht sagen, aber wahrscheinlich ein paar hundert kHz. Die Limitierung kommt daher dass jeder Wert einzeln durch die ganzen Flip-Flops geschoben werden muss (ähnlich einem Ripple-Counter) und natürlich den µC Takt. Aber so schnell brauchst du das dann doch nicht :slight_smile:

Entschuldigt mein Unwissen.

Habe mir nun das Datenblatt genau angeschaut vom 74HC595...

Der wird es wohl werden... Also min 2 davon.

Damit probier ich es dann.

Bin noch Frischling auf dem ganzen Gebiet. Den Schiebetakt erzeuge ich am Besten im Board um das mit den Daten sauber hinzubekommen. Richtig?

Das ist in der IDE schon implementiert. Du musst da um nichts kümmern. Du definierst nur den Daten-Pin, den Clock-Pin und Latch-Pin.

Alles hier mit Beispiel beschrieben:
http://arduino.cc/en/Reference/ShiftOut