Demultiplexer

IngoP

Mitglied
04. Jan. 2012
72
2
8
49
Sprachen
  1. BascomAVR
  2. Pascal
Moin Zusammen,

ich habe bei meinem Projekt folgende Problemstellung:help:

Ein µC soll über vier Leitungen einen Demultiplexer ansteuern 4 BIT IN - 16 OUT.:moil:
Diese 16 Kanäle sollen jeweils 2x8 Kanal Relaiskarten steuern. Ich denke, dass ich zusätzlich noch eine FlipFlop Schaltung benötige, da ich je nach Impuls über den Demultiplexer den letzten Zustand (Kanal n Ein/Aus) überschreibe.

Hat jemand jemand eine Idee welchen FlipFlop ich nutzen könnte ? Wie gesagt, ich habe 16 Kanäle zu versorgen ...:confused:
 
Das den Controller selbst machen zu lassen ist keine Option?
Oder eben irgendein gelatchtes Schieberegister... Alabel?
 
Hi,

wenn du lediglich 16 Kanäle (Relais) ansteuern mußt, dann würde ich nen I2C-Portexpander nehmen und für die Relais nen paar Transistoren als Treiber für die Relais dransetzen.

Gruß
Dino
 
Hallo,

such mal nach 74ls154 (BCD zu 16 Decoder).
Mir ist nur nicht so ganz klar, wozu die Flip Flops gut sein sollen - der Decoder liefert genau so lange ein entsprechendes Ausganssignal wie er ein entspr. Eingangssignal bekommt.

- gp177 -
 
Da hab ich ja was angerichtet :D
:p

Ingo, sag mal konkret, was Dein Problem ist...

Soll von den 16 Relais immer nur eins aktiv/inaktiv sein, oder willst Du mit wenigen Prozessorpins (deswegen meine erste Frage) viele Relais flexibel treiben können (also mehrere gleichzeitig)?

Der IC von gp177 schaltet immer einen von den 16 Ausgängen durch (oder keinen, wenn man die beiden Strobes ansteuert).klar, 42=16.
Wenn Du Deine 16 Relais allerdings vollständig unabhängig voneinander ansteuern willst, müssen auch 16 bit Information übertragen werden. Entweder direkt über 16 Controller pins, oder in Form von 4 Halbbytes (Deine FlipFlops mit 'nem 4bit-Bus ??), oder eben irgendwie seriell auf'n Portexpander (ob nun I2C oder SPI/Schieberegister erstmal egal).
 
sorry für die späte Antwort ... ich bau gerade mein Haus um ;-)

Also, der Controller soll 16 Relais ansteuern können. Alle von einander unabhängig und alle mit ggf. unterschiedlichen Schaltzuständen die gehalten werden müssen

vllt. hilft das Bild weiter::playingball:


demux.jpg
 
Hallo,

such mal nach 74ls154 (BCD zu 16 Decoder).
Mir ist nur nicht so ganz klar, wozu die Flip Flops gut sein sollen - der Decoder liefert genau so lange ein entsprechendes Ausganssignal wie er ein entspr. Eingangssignal bekommt.

- gp177 -

Ich habe einen 74HC754 :)

Genau bei dem Halten dieser Information denke ich hab ich das Problem.

über die 4 Bit Leitung kommt das Signal dass Kanal 3 geschaltet werden soll (0011) > Relais zieht an, Jetzt kommt das Signal für Kanal 4 (0100) Relais 3 bekommt das Signal nicht mehr und fällt ab und nun zieht Relais 4 an. ....
 
Wie gesagt: ich würde ein serielles Schieberegister mit Input-Latch (?) empfehlen. Die Bits werden via SPI eingetaktet (entweder echte Hardware, oder Bascom-Software-SPI), und dann alle auf den Ausgang gelatcht. Entweder 2x8bit kaskadiert, oder ein 16bit. Schau Dir mal den 74xx595 an. Ggf brauchst Du dahinter noch'ne Treiberstufe.
Hmm... der sieht nicht schlecht aus.

Der Unterschied zu den Portexpandern (->Dino) ist, daß die nur Ausgänge sind - ein Portexpander kann natürlich beides. Auf der anderen Seite ist ein Portexpander entsprechend aufwändiger zu verwalten (eben über lesen und schreiben von Registern). Bei I2C-Expandern kommt außerdem noch der I2C-Overhead hinzu (Adresierung). Dafür kommt I2C aber auch mit 2 Pins aus - und kann die auch noch mit vielen anderen I2C-Slaves teilen.
 
Hallo,

also wenn du 4 Bit zum Latch (74574) schickst, dann wird genau das an die Ausgänge weitergegeben. Also jede Null und jede Eins. Es werden nicht nur die Einsen weitergegeben :p Also die Ausgaben im Programm in Variablen auch noch zwischenspeichern (also einen Ausgabepuffer bauen).

Beim I2C mußt du auch die Ausgaben zwischenpuffern. Du kannst bei den I2C-Portexpandern keine einzelnen Bits setzen/löschen. Genau so wie bei deinem Demultiplexer. Deine 4 Bits sind ja eigentlich 4mal verwendet. Ein Bit kann aber nur eine Information enthalten und keine 4.

Ich würde das so machen das du einfach 4 Variablen definierst für die 4 mal 4 Bits die du an die Latches schicken willst. Dann setzt/löschst du das entsprechende Bit für das Relais in der Variable und schickst die gesamte Variable (also alle 4 Bit) der geänderten Variable an dein entsprechendes Latch.

Gruß
Dino
 
Hallo,

ja, das Bild hilft schon weiter. Jetzt wird die Aufgabenstellung erst klar.
Am einfachsten wäre natürlich 2 komplette Ports (2 x 8 Bit) zu verwenden.

Da es hier nicht auf Geschwindigkeit ankommt, könnte man auch einen unkonventionellen Weg gehen.
Der Decoder macht aus den 4 Bit 16 Signale (Adresse), jetzt braucht man natürlich noch ein Steuersignal welches die eigentliche Information enthält.
Das Steuersignal wird mit der jeweiligen Adressleitung und-verknüpft und zur Ansteuerung des Relais verwendet.
Wenn man jetzt in der Ansteuerung für das jeweilige Relais noch einen entsprechenden Kondensator unterbringt, reicht es aus, alle Ausgänge der Reihe nach anzusprechen (so ähnlich wie DRAM-Refresh).

- gp177 -
 
Hallo,

also wenn du 4 Bit zum Latch (74574) schickst, dann wird genau das an die Ausgänge weitergegeben. Also jede Null und jede Eins. Es werden nicht nur die Einsen weitergegeben :p Also die Ausgaben im Programm in Variablen auch noch zwischenspeichern (also einen Ausgabepuffer bauen).

Beim I2C mußt du auch die Ausgaben zwischenpuffern. Du kannst bei den I2C-Portexpandern keine einzelnen Bits setzen/löschen. Genau so wie bei deinem Demultiplexer. Deine 4 Bits sind ja eigentlich 4mal verwendet. Ein Bit kann aber nur eine Information enthalten und keine 4.

Ich würde das so machen das du einfach 4 Variablen definierst für die 4 mal 4 Bits die du an die Latches schicken willst. Dann setzt/löschst du das entsprechende Bit für das Relais in der Variable und schickst die gesamte Variable (also alle 4 Bit) der geänderten Variable an dein entsprechendes Latch.

Gruß
Dino

Warum die 4 Bits 4 mal verwendet werden verstehe ich jetzt nicht. Ich gebe doch nur eine Adresse mit innerhalb der 4 Bit mit um welchen Putput es sich handelt ??? In der Kombinatorik der Zustände erhalte ich doch 16 unterschiedliche Adressen, die der Demultiplexer nur an die einzelnen PINS dan weitergeben soll.

Ich vergaß natürlich die AND Verknüfung zu einer Signalleitung die dann den Schaltzustand (AN / AUS) definiert. Somit müsste dann der FlipFlop (Latch) doch angesteuert werden können ?

Als Relais habe ich fertige Relaiskarten, die mit einem Schalttransistor bestückt werden und direkt an die µC Outputs angeklemmt werden können.

Im Programm selber würde ich mir die Schaltzustände merken, ja. (soll das der hier angesprochene Ausgabepuffer sein)?

Vielleicht gibt es ja irgednwo auch das Ganze einmal etwas grafisch aufbereitet... ich stehe gerade ein wenig auf dem Schlauch ;-)
 
Warum willst Du unbedingt diesen 4bit-Bus, bzw woher kommt diese binär auszugebende Zahl? Ich vermute(!), Du willst in deinem Programm einfach "irgendwie" Relais X toggeln (oder setzen/löschen? wie soll das gehen?)

Dinos und mein Vorschlag beinhaltet, daß Du im Speicher den Zustand der Relais mitspeicherst (also in 2 Bytes, jedes Bit stellt ein Relais dar), und dort die Änderungen vornimmst (setzen/löschen). Anschließend werden dann alle 16 Bits an den/die Portexpander/Schieberegister übertragen, und (wenn alle durch sind) auf die Ausgänge des Expanders/Schieberegisters geschaltet.

Mal was zum Schieberegister, vielleicht kann Dino für den I2C-Weg 'ne ähnlich gut verständliche Erklärung aus dem Ärmel schütteln.
Unter Bascom kannst Du neben dem Hardware-SPI (->SPIOUT) auch den eigentlich aufwändigeren Software-SPI nutzen (eigentlich, da Bascom Dir das alles abnimmt )->SHIFTOUT.

Wenn ich das mit dem TPIC6B595 richtig lese, kann jeder Ausgang 150mA auf Gnd zwingen. Ist die Darstellung auf S3 rechts oben im Datenblatt so zu verstehen, daß da bereits 'ne Freilaufdiode drin ist?
 
Warum willst Du unbedingt diesen 4bit-Bus, bzw woher kommt diese binär auszugebende Zahl? Ich vermute(!), Du willst in deinem Programm einfach "irgendwie" Relais X toggeln (oder setzen/löschen? wie soll das gehen?)

...?

Nun ich hatte mir das so überlegt, dass ich nacheinander die Temperaturen abfrage und je nach eingestellter Hyterese die BIT bestücke und somit dann über den Demultiplexer ein Flip Flop ansteuere um so dann das Relais auf oder zu zumachen.

Vielleicht sehe ich gerade auch noch nicht direkt die resultierende Programmlogik, dass kann sein.

Ich hätte jetzt gedacht, dass ich mit 5 Bit letztlich hinkomme, da ich zum einen die 16 binären Adressen habe und zum anderen dann den ON / OFF.
ich werde mir das mit den schieberegistern mal reinziehen, vielleicht verflüchtigen sich dann die Fragezeichen ...
 
> erleuchtung ist da :)

Nun, ok, ich baue also eine BIT Matrix auf die 16 Stellen hat und jede Stelle für ein Relais steht.

Jetzt habe ich diese 8 bit Schieberegister. Wenn ich es richtig verstanden habe muss ich dann die beiden 8bit Register kaskadieren ?
Jetzt schiebe ich also die 2 BYTE über SPI an die Schieberegister raus. Wie zerlegt das System dann letztendlich die 16 Bit?
Also woher weiss Register 1 dass es das erste Byte verarbeiten soll und Register 2 das zweite Byte?

Leistungstechnisch sieht der TI Baustein gut aus. Zum ansteuern meiner Relaiskarten allemal hervorragend :D
 
Das sind 8bit-Schieberegister, die bestehen also aus 8 "Bitparkplätzen" (FlipFlops?) Diese sind hintereinandergeschaltet (schau mal ins Datenblatt des Ti..595) - Deine Datenleitung liegt nur am ersten Parkplatz an, die Clock an allen. Der Ausgang des ersten Parkplatzes landet einerseits auf dem ersten Bit des Ausgangsregisters (wo es erst mit einem Latchimpuls übernommen wird), und auf dem 2ten Bit(eingang) des Schieberegisters. Bei jeder steigenden Flanke der SCK (SRCK, SPI-Clock) wird also beim Schieberegister in jedem Parkplatz der Zustand des davor geschalteten übernommen, das erste übernimmt den Zustand der anliegenden SERIN-Datenleitung (MOSI). Der Ausgang des letzten Parkplatzes ist (da ja kein weiterer kommt) als Ausgang des ICs vorhanden (SEROUT, Q7', QH'), und kann einfach als Dateneingang des nächsten 8bit-Bausteines verwendet werden. (Die Clocks müssen dann auf beide ICs parallel). Für Dich verhalten sich beide 8bit-Register dann wie ein 16bit-Register. Nach 8mal-Schieben befindet sich das erste Bit im letzten Parkplatz des ersten ICs (und liegt am entsprechenden Bit des Ausgangsregisters an und über SEROUT->SERIN am ersten Bit des 2ten ICs), nach weiteren 8 Schiebezyklen ist es im 8ten Parkplatz des 2ten ICs. Also alle 16 Bits in den beiden Schieberegistern eingetaktet. Ein Impuls auf die RCK, RCLK, Speicherclock (steigende Flanke) bewirkt, daß die wartenden Bits aus den eigentlichen Schieberegistern in die Ausgangsregister übernommen werden, und (wenn die Ausgangstreiber aktiviert sind (->/G)) somit die Ausgänge entsprechend (um-)schalten.

Der Ablauf wäre dann also:
Speichertakt -> fallende Flanke
16bit Rausschieben (entweder mit SPIOUT oder mit SHIFTOUT)
Speichertakt -> steigende Flanke

Der Speichertakt ist dann sowas wie die /CS-Leitung, Du kannst also den SPI-BUS weiterhin für andere Sachen nutzen (mit anderen /CS-Pins, klar). Die "falschen" Bits werden dann zwar trotzdem Durch Deine Schieberegister gepumpt, aber dort nicht auf die Ausgänge übernommen (da keine steigende Flanke am Speichertakt). Du mußt natürlich streng den Ablauf einhalten.
Da Dino zum I2C noch nichts geschrieben hat, auch hier mal ein Link
Der PCF... besitzt 8 (Open Collector)Ausgänge, die jeder 25mA auf Gnd ziehen können. Er ist über I2C (TWI) angebunden, er muß also mit einem Byte adressiert werden (wobei 7bit die Adresse darstellen und das letzte Bit festlegt, ob das folgende Byte aus dem PCF gelesen wird, oder dorthin geschrieben wird (der PCF ist bidirektional). Du kannst die zwar nicht kaskadieren, aber mehrere an den selben TWI-Bus klemmen (mit unterschiedlichen Adressen, klar). Sehr wahrscheinlich lassen sich aber auch Expander mit mehr als 8bit finden.
Für TWI bieten die AVR natürlich auch Hardware-Funktionen, Bascom unterstützt Dich natürlich auch hier.
Genereller Ablauf in Bascom wäre dann (für 8 Datenbits):
I2CSTART
I2CWBYTE Schreibadresse des jeweiligen PCF
I2CWBYTE Datenbyte
I2CSTOP
Auch beim TWI können am Bus andere ICs hängen, solange die Adressen sich nicht in die Quere kommen. Es stehen theoretisch 7 Bit als Adresse zur Verfügung (das LSB bestimmt die Kommunikationsrichtung, 'ne 0 steht für Schreiben (Master->Slave)). Adresse 0x00 ist der Generall Call an alle Slaves, natürlich Schreiben, es darf keiner drauf antworten. 0x01 existiert somit logischerweise nicht. Bei vielen I2C-ICs ist ein Teil der Adresse fest, einen Teil kannst Du selbst variieren - um eben mehrere ICs desselben Typs mit unterschiedlichen Adressen an ein und denselbem Bus zu betreiben zu können.
 
Danke. das mit dem Schieberegister und dem 16bit "ZUG" hab ich verstanden.
Wenn also die Variable mit den 16 BIT zu den beiden Registern heschoben wurden erhalte ich innerhalb von 16 Takten dann die einzelnen Zustände in jedem einzelnen Register. Im 17. Zyklus würde dann der Registerzustand in die Ausgabe geschoben, wenn an G dann HIGH anliegt.

Muss G nach dem Schieben in die Ausgaberegister G wieder auf LOW gesetzt werden, damit dann beim nächsten "UPDATE" des 16 bit Satzes die Bits wieder durch das Register durchgeschoben werden ... und dann wieder für die Übernahme den Ausgang G auf HIGH ?

Der Ablauf wäre dann also:
Speichertakt -> fallende Flanke
16bit Rausschieben (entweder mit SPIOUT oder mit SHIFTOUT)
Speichertakt -> steigende Flanke

Der Speichertakt ist dann sowas wie die /CS-Leitung, Du kannst also den SPI-BUS weiterhin für andere Sachen nutzen (mit anderen /CS-Pins, klar). Die "falschen" Bits werden dann zwar trotzdem Durch Deine Schieberegister gepumpt, aber dort nicht auf die Ausgänge übernommen (da keine steigende Flanke am Speichertakt). Du mußt natürlich streng den Ablauf einhalten.

Ich denke ich werde meine Anforderung mit dem Schieberegister lösen ...:yes2:
 
Es sind 16 Schiebezyklen, effektiv also mehr als 16 Takte (AFAIR kann Hardware SPI nur mit halbem Systemtakt, außerdem zwischen den beiden Bytes nochmal 'ne kurze Verzögerung. Software-SPI ist noch langsamer, da ja hier per Software für jedes zu übertragende Bit zweimal die SPI-Clock getoggelt werden muß, und dazwischen abhängig vom aktuellen Datenbit die Datenleitung zu setzen/löschen.
mal grob überschlagen
Clockleitung toggeln
Datenleitung löschen
Datenbyte schieben
bei MSB=0 nächsten Befehl überspringen
Datenleitung setzen
Sprung nach oben

wären allein 7 Takte, und da muß auch noch'ne Abbruchbedingung für das Ende des Bytes rein.
Aber darum gehts Dir sicher nicht...

Für SPI hast Du also erstmal die Datenleitung (MOSI bei Hard-SPI oder irgendeinen beliebigen Pin bei Soft-SPI)->Serin des 595, die Clockleitung (SCK)->SRCK des 595. Beide Leitungen bedient die Hardware bzw Bascom für Dich. damit werden die Bits in/durch die eigentlichen Schieberegister des 595 geschoben.
Mit einer weiteren Leitung latchst Du den Inhalt der Schieberegister in die Ausgangsregister (->RCK). Du kannst also zwischendurch Bits in andere ICs am gemensamen SPI-Bus pumpen, die wandern dann auch parallel dazu durch die Schieberegister Deiner kaskadierten 595 - aber mit der Subroutine
RCK->low
16bits schieben
RCK->high
landen eben die beabsichtigten 16 Bits in den 595ern, und werden auf die Ausgangsregister übertragen. Du darfst natürlich zwischendurch (also innerhalb der sub) nichts anderes auf dem SPI-Bus machen (->Interrupts).

Die Ausgänge der 595 sind entsprechend der Bits im Ausgangsregister entweder durchgeschaltet (1->Transistor schaltet Ausgang intern auf Gnd durch) oder Open Collector (0), aber nur, wenn /G auf Gnd liegt. Ist /G high sind die Ausgänge immer offen. Das ist hilfreich, da der IC beim Start zufällige Werte in den Registern hat (und folglich die Ausgänge beim Start zufällig schalten würden).
Im laufenden Betrieb kannst Du /G also dauerhaft auf Gnd lassen, wenn die zufälligen Zustände beim Start akzeptabel sind, kannst Du es generell auf Gnd verdrahten.
Du brauchst also die Datenleitung, die Schiebeclock und die Latch-Leitung für das Ausgaberegister. Zusätzlich dann noch /G, falls mit allen Relais=aus gestartet werden muß. Also 3 oder 4 Leitungen.
 
Hi,

tja ... wie erklärt man das mit dem Schieberegister ...
Das mit dem Zug ist schon recht gut. Stell dir mal vor du hast nen Zug mit 2 hintereinandergehängten Wagen. In jedem Wagen hast du 8 Abteile.

-|_|_|_|_|_|_|_|_|--|_|_|_|_|_|_|_|_|- . . . . Also 2 Wagen mit 8 Abteilen ... oder 2 Byte mit 8 Bit = 16 Bit gesamt ;)

Dann hast du auch noch nen Bahnhof mit 16 Rampen

#|-|-|-|-|-|-|-|-|##|-|-|-|-|-|-|-|-|#####

Wenn der Zug nun in den Bahnhof einfährt bis die Abteile vor den Rampen stehen (in 16 Takten) ...

#|-|-|-|-|-|-|-|-|##|-|-|-|-|-|-|-|-|#####
-|_|_|_|_|_|_|_|_|--|_|_|_|_|_|_|_|_|-


Dann mußt du nur noch die Abteiltüren öffnen damit der jeweilige Fahrgast aus seinem Abteil auf die Rampe purzeln kann. Beim Schieberegister machst du das mit dem Übernahmepuls.

Wenn du statt 16 Takte aber 17 auf das Schieberegister gibst, dann ist dein Zug bereits wieder hinten aus dem Bahnhof rausgefahren. Damit bleibt die vordere Rampe unbenutzt und hinten purzelt ein Fahrgast in die Botanik :cool:

Fahrgäste = Bits
Wagen = Bytes
Rampen = D-Latches in den Schieberegister-ICs die die Bits aus dem eigentlichen Schieberegister aufnehmen und an den Ausgängen zur Verfügung stellen.

Wenn jetzt der nächste Zug mit 2 Wagen einfährt und seine Türen öffnet, dann schubsen die Fahrgäste des zweiten Zuges einfach die vorherigen von der Rampe.

Erstes Byte zu den Schieberegistern rausschieben (Daten und Datentakt)
zweites Byte zu den Schieberegistern rausschieben (Daten und Datentakt)
Übernahmepuls geben (Übernahmetakt) ... Türen auf, Fahrgäste raus.

Datentakt ist nicht der Übernahmetakt! Das sind zwei verschiedene Leitungen!

Soweit zum Schieberegister.
= = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Nun zum I2C und den Portexpandern ...

Du hast nun zwei Bahnhöfe mit einer Weiche davor. Du schickst nun auch nur einen Waagen. Je nachdem wie du die Weiche einstellst, kommt der Wagen im einen oder anderen Bahnhof an.

Du stellst zuerst die Weiche, dann schickst du den Waagen los und der kippt wieder im Bahnhof seine 8 Abteile auf 8 Rampen auf dem Bahnsteig.

Da du aber 2 Bahnhöfe hast, sind es in der Summe wieder 16 Rampen.

Weiche = I2C-Adresse des Bausteins

Eigentlich aus ganz einfach.

Gegenüber den Schieberegistern wird aber im Atmel eine andere Hardware benutzt. Damit benötigst du andere Befehle. Die Bausteine arbeiten auch etwas anders. Im Grunde aber alles vergleichbar.

I2Cstart = Alle Bausteine ACHTUNG!
I2Csend Schreibadresse = Weiche einstellen
I2Csend Datenbyte = Waagen in den Bahnhof schieben, Türen auf und Fahrgäste auf die Rampe schubsen
I2Cstop = Alle Bausteine wieder vom I2C-Bus "abkoppeln" ( so ungefähr) ... Übertragung beendet ... Sendung ist aus ... oder so


Gruß
Dino
 
Etwas einfacher? ;)

[video=youtube_share;ZE5gILjXQw4]http://youtu.be/ZE5gILjXQw4[/video]

Aber Respekt für die detaillierten Erklärungen!
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)