mikrocontroller.net

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


Autor: Christof Rieger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
byte c;

void setup() {
  PORTD &= 0b10011111; //Hier am NANO 5 Data 6 CLK
  DDRD |= 0b01100000; //Hier am NANO 5 Data 6 CLK als Output
  SendWord(0); //Reset Expander
  Serial.begin(115200);
}

void loop() {
  if (Serial.available()) {
    byte inByte = Serial.read();
    Serial.println();
    Serial.print("Data: ");
    Serial.print(inByte);
    Serial.print(" Bin: ");
    uint16_t Data = (uint16_t((inByte<<8))+c++) | 0x8000;
    Serial.println(Data,BIN);
    uint32_t smicro = micros();
    SendWord(Data);
    uint32_t emicro = micros();
    Serial.println(emicro-smicro);
  }
}
void SendWord(uint16_t Data){
  byte PDdLcL = PORTD & 0b10011111; //Hier am NANO 5 Data 6 CLK
  byte PDdHcL = PDdLcL | 0b00100000;
  byte PDdLcH = PDdLcL | 0b01000000;
  byte PDdHcH = PDdLcL | 0b01100000;
  PORTD = PDdHcL; //Startbit
  PORTD = PDdHcH;   
  //Von Data Outputs Bit 0 bis Bit 14. Bit 15 wird ignoriert
  for ( uint16_t i = 1; i != 0x8000; i=i<<1){
    if ((Data & i) == 0){
      PORTD = PDdLcL;
      PORTD = PDdLcH;
    }else{
      PORTD = PDdHcL;
      PORTD = PDdHcH;
    }   
  }
  PORTD = PDdLcL;  
}

LG Christof

Autor: Christof Rieger (Gast)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht 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 
:-))).
byte c;

void setup() {
  PORTD &= 0b10011111; //Hier am NANO 5 Data 6 CLK
  DDRD |= 0b01000000; //Hier am NANO 5 Data als Input 6 CLK als Output
  SendWord(0);
  SendWord(0); //Reset Expander
  Serial.begin(115200);
}

void loop() {
  if (Serial.available()) {
    byte inByte = Serial.read();
    Serial.println();
    Serial.print("Char: ");
    Serial.print(inByte);
    Serial.print(" Bin: ");
    uint16_t Data = (uint16_t((inByte<<8))+c++) | 0x8000;
    Serial.println(Data,BIN);
    uint32_t smicro = micros();
    Data = SendWord(Data);
    uint32_t emicro = micros();
    //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)
    Serial.print("  InData Bin: ");
    Serial.println(Data | 0x8000,BIN);
    Serial.print(" Dauer in µS: ");
    Serial.println(emicro-smicro);
  }
}
uint16_t SendWord(uint16_t Data){
  uint16_t Inputs = 0;
  byte PDdLcL = PORTD & 0b10011111; //Hier am NANO 5 Data 6 CLK
  byte PDdHcL = PDdLcL | 0b00100000;
  byte PDdLcH = PDdLcL | 0b01000000;
  byte PDdHcH = PDdLcL | 0b01100000;
  if ((PIND & 0b00100000) != 0)Inputs++;
  Inputs += Inputs;
  DDRD |= 0b00100000; //IO5 als Output
  PORTD = PDdHcL; //Startbit
  PORTD = PDdHcH;
  DDRD &= 0b11011111; //IO5 als Input
  PORTD = PDdLcH;   
  //Von Data Outputs Bit 0 bis Bit 14. Bit 15 wird ignoriert
  for ( uint16_t i = 1; i != 0x8000; i=i<<1){
    if (i < 0x0100){
      if ((PIND & 0b00100000) != 0)Inputs++;
      Inputs += Inputs;
      DDRD |= 0b00100000; //IO5 als Output      
    }
    if ((Data & i) == 0){
      PORTD = PDdLcL;
      PORTD = PDdLcH;
    }else{
      PORTD = PDdHcL;
      PORTD = PDdHcH;
    }
    if (i < 0x0080){
      DDRD &= 0b11011111; //IO5 als Input
      PORTD = PDdLcH;
    }         
  }
  DDRD &= 0b11011111; //IO5 als Input
  PORTD = PDdLcL;
  delayMicroseconds(4);
  if ((PIND & 0b00100000) != 0)Inputs++;
  return Inputs;
}

LG Christof

Autor: Konrad Zuse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christof Rieger (Gast)
Datum:

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

Autor: Christof Rieger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.