Binär Demuxer 3:7

Hi,

Ich versuche einen demultiplexer mit 3 Eingängen und 7 Ausgägen zu programmieren, leider klappt das irgentwie nicht. Die wahrheitstabelle soll so sein:

15  13  11 | 0   1   2   3   4   5   6 
0   0   0  | 0   0   0   0   0   0   0
0   0   1  | 1   0   0   0   0   0   0
0   1   0  | 0   1   0   0   0   0   0
0   1   1  | 0   0   1   0   0   0   0
1   0   0  | 0   0   0   1   0   0   0
1   0   1  | 0   0   0   0   1   0   0
1   1   0  | 0   0   0   0   0   1   0
1   1   1  | 0   0   0   0   0   0   1

Ich habe dafür diesen code:

int wert = 0, wertv = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(11, INPUT);
  pinMode(13, INPUT);
  pinMode(15, INPUT);
}

void loop() {
  wert = 0;
  if (digitalRead(11) == HIGH)
    wert = wert + 1;
  if (digitalRead(13)  == HIGH)
    wert = wert + 2;
  if (digitalRead(15)  == HIGH)
    wert = wert + 4;
  if (wert != wertv && wert >= 1) {
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(wert - 1, HIGH);
    wertv = wert;
  }
  if (wert != wertv && wert == 0) {
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    wertv = wert;
  }
}

Aber irgendwie funktioniert es noch nicht so, wie es soll...

Ich verwende einen Attiny 4313, Eingänge mit Pull Down widerständen.

In der letzten Zeile, wo wert >=1 ist, wird ja wieder der passende ausgang HIGH gesetzt...

ich habe jetzt das versucht:

void setup() {
  // put your setup code here, to run once:
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(11, INPUT);
  pinMode(13, INPUT);
  pinMode(15, INPUT);
}

void loop() {
  if (digitalRead(11) == LOW &&digitalRead(13) == LOW &&digitalRead(15) == LOW ){
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
  }
  if (digitalRead(11) == HIGH &&digitalRead(13) == LOW &&digitalRead(15) == LOW ){
    digitalWrite(0, HIGH);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
  }
  if (digitalRead(11) == LOW &&digitalRead(13) == HIGH &&digitalRead(15) == LOW ){
    digitalWrite(0, LOW);
    digitalWrite(1, HIGH);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
  }
  if (digitalRead(11) == HIGH &&digitalRead(13) == HIGH &&digitalRead(15) == LOW ){
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
  }
  if (digitalRead(11) == LOW &&digitalRead(13) == LOW &&digitalRead(15) == HIGH ){
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
  }
  if (digitalRead(11) == HIGH &&digitalRead(13) == LOW &&digitalRead(15) == HIGH ){
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
  }
  if (digitalRead(11) == LOW &&digitalRead(13) == HIGH &&digitalRead(15) == HIGH ){
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
  }
  if (digitalRead(11) == HIGH &&digitalRead(13) == HIGH &&digitalRead(15) == HIGH ){
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
  }
}

Auch das geht nicht. ich schalte relais., ich habe keine Schutzdiode parallel geschaltet... kann das auch das Problem sein, dass der uC abstürzt?

OK, habe jetzt die Dioden eingelötet und es geht...

/*
 * Die Eingänge an PD0 bis PD2
 * Die Ausgänge an PB0 bis PB6
 */
 
void setup() 
{
  DDRB = 0b1111111;
}  

void loop() 
{
  PORTB = _BV((PIND&7)^7)&127;
}

:sunglasses:

Alleine für die Sonnenbrille ... Karma+
Der Rest gefällt (und wird wohl korrekt sein) - wird 'die Tage' Mal quer gelesen ... freue mich schon drauf :slight_smile:
Edit ... kK ... (könnte Kotzen) ... auf welchem Arduino ist 11,13,15 auf dem gleichen Port?
11,13 ... Uno/Nano ok - 15 ist A1 - gaaanz wo Anders.
(weitere Recherchen werden auf 'die Tage' verschoben ...)

Ja, beim UNO gibts nur eine vollständige "Bank" PD.
Unter Verzicht von Serial, durchaus nutzbar für die Ausgänge
Als Eingänge wären dann noch Wahlweise PC und PB nutzbar, jeweils die unteren 3 Bit

... aber die Idee, aus den 3 Eingängen eine Zahl zu 'generieren', Die dann die Anzahl an Shift's ergibt ... wenn ich Dir das Karma geben darf (und ich Das nicht vergesse ... oha)!
Das sind Dinge, Die ich unwahrscheinlich 'geil' finde - wobei ich auch einem Wischer-Getriebe (damals Actros) mehrere Minuten lang zusehen kann ... also 'keine Angst' :wink:

MfG

Edit
Die Stunde ist um - das Karma wurde (verdient) erteilt
(hatte ir zuvor schon ein Karma zuge'dingst' - und durfte halt nicht 'noch Mal' ... wohl gegen SPAM-Bots :wink: )
... oha ... muß ich JETZT das Karma wieder zurück nehmen???
1-ELF-1!!! ... SO geht Das doch nicht ... ok, wird Zeit, muß ins Bett ... klären Wir dann irgendwann ... vll ... oder auch nicht :wink:

Darfst du!

Die Wahrheitstabelle im Eingangsposting enthält eine Symmetrie.
Nach erkennen dieser, war das nicht mehr ganz so schwer...

Danke für die Blumen!

Leicht zu testen:

void setup() 
{

 Serial.begin(9600);
 for(unsigned i=0; i<=7; i++) Serial.println( _BV((i&7)^7)&127 , BIN);
}  

void loop() 
{
}

Nachtrag:

Ich sehe gerade, das Ergebnis meiner Funktion stimmt nicht mit der Tabelle überein!

Vorgabe: 15 13 11 | 0 1 2 3 4 5 6
Meins: E2 E1 E0 | A6 A5 A4 A3 A2 A1 A0
(E= Eingang A= Ausgang)

Die Wertigkeiten sind vertauscht!
MSB <--> LSB
(ich meine das hätte Anfangs noch anders ausgesehen)

Oha...

Hier die Korrektur:
Vorgabe: 15 13 11 | 0 1 2 3 4 5 6
Meins: E2 E1 E0 | A0 A1 A2 A3 A4 A5 A6
(E= Eingang A= Ausgang)

for(unsigned i=0; i<=7; i++) Serial.println( _BV((i-1)&7)&127 , BIN);

Jetzt stimmen die Wertigkeiten mit der Tabelle überein

/*
 * Die Eingänge an PD0 bis PD2
 * Die Ausgänge an PB0 bis PB6
 */
 
void setup()
{
  DDRB = 0b1111111;
} 

void loop()
{
  PORTB =  _BV((PIND-1)&7)&127;
}