Forum: Projekte & Code Porterweiterung 15O/9I mit 74HC595 und 74HC165


von Christof Rieger (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ihr Lieben,
hier mal 2 Uralte Sachen kombiniert. Nach dem ich gesehen habe das es 
den guten alten 74HC595 schon für etwas über 2ct gibt und ein ESP8266 
nicht viele I/O hat. Habe ich mal das entworfen.
Vieleicht kann es ja auch jemand gebrauchen.

Es werden vom Controller nur 2 I/O benötgt.
Einen für Din out und einen für CLK.
Mit /OE könnte man optional die Ausgänge ausschalten.
Wenn man das nicht braucht einfach fest mit GND verbinden.

Ich habe den 74HC165 noch nicht geliefert bekommen und die Schaltung 
erst mal ohne ihn aufgebaut.

Das erst Bit was man sendet ist das StartBit, es muss immer 1 sein.
Dann folgen die 15 Datenbits.

Hier ein Arduinocode der nur die Outputs schreibt.
Bei einem Arduino NANO mit 16MHz aktualisiert er die 15 IO in 20µS.
1
byte c;
2
3
void setup() {
4
  PORTD &= 0b10011111; //Hier am NANO 5 Data 6 CLK
5
  DDRD |= 0b01100000; //Hier am NANO 5 Data 6 CLK als Output
6
  SendWord(0); //Reset Expander
7
  Serial.begin(115200);
8
}
9
10
void loop() {
11
  if (Serial.available()) {
12
    byte inByte = Serial.read();
13
    Serial.println();
14
    Serial.print("Data: ");
15
    Serial.print(inByte);
16
    Serial.print(" Bin: ");
17
    uint16_t Data = (uint16_t((inByte<<8))+c++) | 0x8000;
18
    Serial.println(Data,BIN);
19
    uint32_t smicro = micros();
20
    SendWord(Data);
21
    uint32_t emicro = micros();
22
    Serial.println(emicro-smicro);
23
  }
24
}
25
void SendWord(uint16_t Data){
26
  byte PDdLcL = PORTD & 0b10011111; //Hier am NANO 5 Data 6 CLK
27
  byte PDdHcL = PDdLcL | 0b00100000;
28
  byte PDdLcH = PDdLcL | 0b01000000;
29
  byte PDdHcH = PDdLcL | 0b01100000;
30
  PORTD = PDdHcL; //Startbit
31
  PORTD = PDdHcH;   
32
  //Von Data Outputs Bit 0 bis Bit 14. Bit 15 wird ignoriert
33
  for ( uint16_t i = 1; i != 0x8000; i=i<<1){
34
    if ((Data & i) == 0){
35
      PORTD = PDdLcL;
36
      PORTD = PDdLcH;
37
    }else{
38
      PORTD = PDdHcL;
39
      PORTD = PDdHcH;
40
    }   
41
  }
42
  PORTD = PDdLcL;  
43
}

LG Christof

von Christof Rieger (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ihr Lieben,
Der 74HC165 ist nun auch angekommen. Die Schreib/Lese-Dauer beträgt nun 
36µS.
Ich hab mal ein Foto von meiner handverdateten Schaltung angehängt 
:-))).
1
byte c;
2
3
void setup() {
4
  PORTD &= 0b10011111; //Hier am NANO 5 Data 6 CLK
5
  DDRD |= 0b01000000; //Hier am NANO 5 Data als Input 6 CLK als Output
6
  SendWord(0);
7
  SendWord(0); //Reset Expander
8
  Serial.begin(115200);
9
}
10
11
void loop() {
12
  if (Serial.available()) {
13
    byte inByte = Serial.read();
14
    Serial.println();
15
    Serial.print("Char: ");
16
    Serial.print(inByte);
17
    Serial.print(" Bin: ");
18
    uint16_t Data = (uint16_t((inByte<<8))+c++) | 0x8000;
19
    Serial.println(Data,BIN);
20
    uint32_t smicro = micros();
21
    Data = SendWord(Data);
22
    uint32_t emicro = micros();
23
    //Angezeigt wird 100000|H(t-1)|G(t-1)|F(t-1)|E(t-1)|D(t-1)|C(t-1)|B(t-1)|A(t-1)|D(t)|H(t)
24
    Serial.print("  InData Bin: ");
25
    Serial.println(Data | 0x8000,BIN);
26
    Serial.print(" Dauer in µS: ");
27
    Serial.println(emicro-smicro);
28
  }
29
}
30
uint16_t SendWord(uint16_t Data){
31
  uint16_t Inputs = 0;
32
  byte PDdLcL = PORTD & 0b10011111; //Hier am NANO 5 Data 6 CLK
33
  byte PDdHcL = PDdLcL | 0b00100000;
34
  byte PDdLcH = PDdLcL | 0b01000000;
35
  byte PDdHcH = PDdLcL | 0b01100000;
36
  if ((PIND & 0b00100000) != 0)Inputs++;
37
  Inputs += Inputs;
38
  DDRD |= 0b00100000; //IO5 als Output
39
  PORTD = PDdHcL; //Startbit
40
  PORTD = PDdHcH;
41
  DDRD &= 0b11011111; //IO5 als Input
42
  PORTD = PDdLcH;   
43
  //Von Data Outputs Bit 0 bis Bit 14. Bit 15 wird ignoriert
44
  for ( uint16_t i = 1; i != 0x8000; i=i<<1){
45
    if (i < 0x0100){
46
      if ((PIND & 0b00100000) != 0)Inputs++;
47
      Inputs += Inputs;
48
      DDRD |= 0b00100000; //IO5 als Output      
49
    }
50
    if ((Data & i) == 0){
51
      PORTD = PDdLcL;
52
      PORTD = PDdLcH;
53
    }else{
54
      PORTD = PDdHcL;
55
      PORTD = PDdHcH;
56
    }
57
    if (i < 0x0080){
58
      DDRD &= 0b11011111; //IO5 als Input
59
      PORTD = PDdLcH;
60
    }         
61
  }
62
  DDRD &= 0b11011111; //IO5 als Input
63
  PORTD = PDdLcL;
64
  delayMicroseconds(4);
65
  if ((PIND & 0b00100000) != 0)Inputs++;
66
  return Inputs;
67
}

LG Christof

von Konrad Zuse (Gast)


Lesenswert?

Christof Rieger schrieb:
> Ich hab mal ein Foto von meiner handverdateten Schaltung angehängt

Die Schaltung sieht ja sehr stark gequetscht aus, aber wenn sie nun mal 
klein sein muss und dann auch noch funktionieren soll. Hut ab.

von Christof Rieger (Gast)


Lesenswert?

Danke :-)
Naja ich wollte nicht, dass sie auf dem Bredboard alles Kontakte 
abdeckt.

von Christof Rieger (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ihr Lieben,
Hier noch ein Recycling-Vorschlag.
mittlerweile weiß man nicht mehr was man mit den alten ATA Kabel 
anfangen soll. Macht man die Stecker vorsichtig vom Kabel ab, so sind 
die Kontakte der beiden Reihen um 1,27 mm zu einander versetzt. Genau 
wie der Abstand bei der SMD-Version vom 74HC595. Super ist, 7 Out und 
GND sind auf einer Seite des 74HC595. Biegt man jeden 2. Pin des 74HC595 
vorsichtig nach oben, passt der wunderbar zwischen die Reihen der 
Stecker Leiste. Ich hab 4 74HC595 nach dem obigen Schema kaskadiert, und 
mit jeweils einen Pin Abstand in die Stecker Leiste eingelötet, damit 
ich noch Platz für den D0 habe.
So er hält man eine extrem kompakte und gut handelbare 3 zu 31 
Porterweiterung.

Ich habe sie an meinem OrangePI One angeschossen. Ich hänge noch eine 
Bash an mit der man die Ports komfortabel schalten kann.

Das geht zwar mit einer erkennbaren Verzögerung, aber für einfaches Ein 
und Ausschalten ist es ausreichend.

mit "./setport.sh" werden die Werte (1 oder 0) in den Dateien /tmp/out01 
... out31 auf die Ausgänge geschrieben. Beim ersten Aufruf initialisiert 
das Skript die Pins am OPI und legt die tmp-Datein mit dem Inhalt 0 an. 
Danach werden die Ausgänge aktiv geschaltet.

mit "./setport.sh out01 1" kann man z.B. den Ausgang 1 direkt 
einschalten.

LG Christof

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.