Multiplexer / Demultiplexer (Bsp. 74HC4067)
Der 74HC4067 Multiplexer verbindet einen Mikrocontroller Eingang (SIG) mit 16 Anschlüssen (C0-C15). Dabei wird gleichzeitig nur jeweils einer der Anschlüsse mit dem Eingangspin verbunden. Welcher der 16 Anschlüsse dabei verbunden wird kann über 4 Adressleitungen (S0-S3) ausgewählt werden. Über die Adressleitungen wir der gewünschte Anschluss quasi binär ausgewählt. Liegt an den Adressleitungen jeweils LOW an (0, 0, 0, 0) wird der Eingang mit dem Ausgang C0 verbunden. Liegen die Pegel 0,0,1,1 an S0,S1,S2,S3 an wird der Anschluss 3 mit dem Eingang verbunden.
Neben dem Eingang (SIG), den Ausgängen (C0-C15) und den 4 Adressleitungen(S0-S3) gibt es noch einen Enable Pin (EN). Erst wenn dieser auf LOW liegt können Daten übertragen werden. Daten können übrigens in beide Richtungen ausgetauscht werden. Werden an C0-C15 Eingangssignale wie Sensoren angeschlossen spricht man von einem Multiplexer, werden dagegen Aktoren angeschlossen spricht man von einem Demultiplexer.
| Pinbelegung | |
|---|---|
| VCC | +5V Spannungsversorgung |
| GND | - Spannungsversorgung |
| EN | Enable Pin (aktiv LOW) |
| SO-S3 | Adressleitungen zur Auswahl einer der 16 Eingänge |
| C0-C15 | Eingänge bzw. Ausgänge |
| SIG | Signalausgang |
Werden C0-C15 als Eingänge verwendet, können diese auch analog sein. Zum Auswerten muss man nur die SIG Leitung am Arduino Uno an einen analogen Eingang (A0-A5) anschließen.
Ließt man mit dem Multiplexer digitale Signale ein, muss man bedenken, dass die Eingänge standardmäßig alle auf HIGH stehen.
Programmcode Demultiplexer
#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define SIG 6
#define EN 7
void setup(){
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(EN, OUTPUT);
// EN wird dauerhaft auf LOW (aktiv) geschaltet
digitalWrite(EN, LOW);
// beim Demultiplexer ist SIG ein Ausgang
pinMode(SIG, OUTPUT);
}
void loop(){
verbindungMit(3);
digitalWrite(SIG, HIGH);
}
void verbindungMit(int Cx){
static int adresse[16][4]
{{0,0,0,0}, // C0
{1,0,0,0}, // C1
{0,1,0,0}, // C2
{1,1,0,0}, // C3
{0,0,1,0}, // C4
{1,0,1,0}, // C5
{0,1,1,0}, // C6
{1,1,1,0}, // C7
{0,0,0,1}, // C8
{1,0,0,1}, // C9
{0,1,0,1}, // C10
{1,1,0,1}, // C11
{0,0,1,1}, // C12
{1,0,1,1}, // C13
{0,1,1,1}, // C14
{1,1,1,1}}; // C15
digitalWrite(SO, adresse[Cx][0]);
digitalWrite(S1, adresse[Cx][1]);
digitalWrite(S2, adresse[Cx][2]);
digitalWrite(S3, adresse[Cx][3]);
}
Programmcode Multiplexer
Das Programm ist ähnlich wie das des Demultiplexers. Lediglich der SIG Pin muss im setup() als
Eingang definiert werden. Damit das Programm nicht zweimal das gleiche ist wird es hier mit Hilfe des Zugriffs auf
die Portregister etwas kürzer geschrieben.
#define SIG 6
#define EN 7
// Pinbelegung S0=2, S1=3, S2=4, S3=5
byte adresse[] = {B00000000, B00000100, B00001000, B00001100,
B00010000, B00010100, B00011000, B00011100,
B00100000, B00100100, B00101000, B00101100,
B00110000, B00110100, B00111000, B00111100 };
void setup(){
// Anschlüsse definieren Pin2,3,4,5,7=Ausgänge Pin6=Eingang
DDRD = B10111100;
digitalWrite(EN, LOW);
Serial.begin(9600);
}
void loop(){
// Aufgrund des bitweisen ODER werden nur die Pots mit (1) geändert.
PORTD |= adresse[15];
Serial.println(digitalRead(SIG));
delay(500);
}
...noch eine Variante mit bitRead()
#define SIG 6
#define EN 7
int S0=2, S1=3, S2=4, S3=5;
int adressPins[4] ={S0,S1,S2,S3};
void setup(){
pinMode(SIG, INPUT);
for(int i=0; i<4; i++) pinMode(adressPins[i], OUTPUT);
pinMode(EN, OUTPUT);
digitalWrite(EN, LOW);
Serial.begin(9600);
}
void loop(){
const int Cx = 5;
// Adressleitungen bestromen
for(int i=0; i<4; i++) digitalWrite(adressPins[i], bitRead(Cx,i));
Serial.println(digitalRead(SIG));
delay(1000);
}