"virtual" 74HC595 mit Ardunio

Hallo,

ich habe gerade in Brett vorm Kopf und komme nicht weiter. Evtl. könnt Ihr mir auf die Sprünge helfen :slight_smile:

Folgendes Problem:

Gerade bin ich dabei eine INTEX Poolsteuerung zu automatisieren. Die Hauptplatine sendet ihre Signale an zwei 74HC595 Schieberegister im Bedienfeld, welches die Daten dann anzeigt.

Nun möchte ich mich mit dem Arduino dazwischen hängen und die die Bits/Bytes mitlesen um diese dann in entsprechende MQTT Befehle zu verwandeln.

Leider komme ich auf keine zuverlässige Lösung wie ich diese Signale am besten mitlesen könnte.

Eine Möglichkeit wäre da, die Daten mit einem MCP23017 abfragen und per I2C an den Arduino liefern.

Evtl. geht es noch anders, aber da habe ich aktuell keine Idee.

Im Prinzip geht das am einfachsten mit SPI im slave mode. Takt an SCK, Daten an MISO.

(deleted)

HotSystems:
Eine Möglichkeit wäre da, die Daten mit einem MCP23017 abfragen und per I2C an den Arduino liefern.

Evtl. geht es noch anders, aber da habe ich aktuell keine Idee.

Natürlich kann man die Ausgänge des 595 abfragen. Sinnvoller sehe ich die Datenübertragung der seriellen Seite. Grüße Uwe

Wenn der Arduino so tut, als sei er ein Schieberegister, dann kann er sich das serielle Eingangssignal des 595 abgreifen und als Bitmuster auswerten.

uwefed:
Natürlich kann man die Ausgänge des 595 abfragen. Sinnvoller sehe ich die Datenübertragung der seriellen Seite. Grüße Uwe

Deswegen habe ich ja auch beigeschrieben, “eine Möglichkeit”.
Andersrum muss der TO entscheiden, was für ihn sinnvoll bzw. einfacher ist.
Viele tun sich ja bei serieller Übertragung sehr schwer.

Soo, danke schonmal für die Vorschläge.

SPI im SlaveMode, das wäre wohl genau die richtige Lösung. Möchte das gerne ohne zusätzliche Bausteine umsetzen.
Leider scheint der ESP32 mit Arduino IDE kein richtiges SPI im SlaveMode zu können :frowning:
Habe daher mal versucht, die GPIOs manuell abzufragen, leider ist das für 100kHz wohl nicht schnell genug, da manche Sequenzen verloren gehen.

     while(digitalRead(storePin) == 1) {};
      for (int seqcount=0; seqcount < 16; seqcount++){
      while(digitalRead(shiftPin) == 0) { bitstore[seqcount] = digitalRead(dataPin); }

Evlt hat da noch wer einen Vorschlag?

Habe es dann mal mit SPI im SlaveMode an einem Mega 2560 getestet, leider scheint auch da die Kommunikation nicht richtig abzulaufen. Vermutlich ist der mit den 16bit pro Übertragung überfordert. Letztlich bekomme ich hier keine plausiblen Ergebnisse.

Ohne Code läßt sich nicht feststellen, wo ein Fehler liegen könnte. Bei SPI muß man auch noch den richtigen Modus einstellen, entsprechend dem '595 Interface. Und SS mit richtiger Polarität, für die Synchronisation.

ich würde auch noch mit SPI probieren.
Hier gabs mal ein Muster von GolamMustafa: https://forum.arduino.cc/index.php?topic=66998.0 für einen 16bit slave.

Den Code habe ich mit dem Mega 2560 getestet:

#include<SPI.h>
volatile int i = 0;
byte myArray[2];

void setup()
{
  Serial.begin(9600);
  pinMode(53, INPUT_PULLUP);
  pinMode(51, OUTPUT);
  pinMode(52, INPUT);
  SPCR |= _BV(SPE);
  SPI.attachInterrupt();  //allows SPI interrupt
}

void loop(void)
{
  if (i == 2)
  {
    int x = (int)myArray[0]<<8|(int)myArray[1];
    Serial.print("Received 16-bit data item from Master: ");
    Serial.println(x, BIN);
    i=0;
    Serial.println("=============================================");
  }
}

ISR (SPI_STC_vect)   //Inerrrput routine function
{
  myArray[i] = SPDR;
  i++;
}

Ergebniss ist leider unplausibel:

=============================================
Received 16-bit data item from Master: 11111111111111111111111001011010
=============================================
Received 16-bit data item from Master: 11111111111111111010111011111110
=============================================
Received 16-bit data item from Master: 11111111111111111010111011111110
=============================================
Received 16-bit data item from Master: 11111111111111111111111001111110
=============================================
Received 16-bit data item from Master: 11111111111111111111111010101110
=============================================
Received 16-bit data item from Master: 11111111111111111111111010101110
=============================================
Received 16-bit data item from Master: 100111111111110
=============================================
Received 16-bit data item from Master: 11111111111111111111111011001000
=============================================
Received 16-bit data item from Master: 11111111111111111010111011111110
=============================================
Received 16-bit data item from Master: 11111111111111111010111011111110

EDIT:
Könnte dann aber wie DrDiettrich schon sagte am falschen Mode liegen.
Versuche gerade den passenden zu finden und ggf zu ändern :slight_smile:

es fehlen die code tags.
Es gibt eine Zeile mit 16 bit!?!
Da die ersten ja immer High sind... sind die unteren 16bit realistisch?
Auf welchem Target bist unterwegs?
Wie siehts am Mega aus?
Welche Zeile ist richtig, was ist an den anderen Zeilen falsch?

Bisserl genauere Analysen kannst du sicher machen. Denk daran, wir sehen nicht was auf deinem Schreibtisch liegt!

Ausschauen müsste der Output wie folgt:

-------

0.000332000000000 0xFE7F 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1  
0.000500250000000 0xFF7E 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0  
0.000668750000000 0xFF77 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1  
0.000837000000000 0xFF3F 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1  
0.001005250000000 0x7F7F 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1  
0.001179500000000 0xEF7F 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1  
0.001347750000000 0xFF5F 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 
0.001516250000000 0xBF7F 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1  
0.001684500000000 0xFF7B 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 
0.001872750000000 0xFF7D 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1
0.002300500000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.002649000000000 0xEC13 1 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1
0.003074500000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.003250000000000 0xF253 1 1 1 1 0 0 1 0 0 1 0 1 0 0 1 1
0.003681750000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.003857250000000 0xFF27 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1
0.004290000000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.004468750000000 0xCE5A 1 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 
0.004894750000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.005220000000000 0xFF7D 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1
0.005647500000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.005992250000000 0xEC13 1 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1
0.006417750000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.006593000000000 0xF253 1 1 1 1 0 0 1 0 0 1 0 1 0 0 1 1
0.007029000000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.007204250000000 0xFF27 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1
0.007637250000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.007816000000000 0xCE5A 1 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0
0.008247750000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.008568500000000 0xFF7D 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1
0.008996000000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.009340750000000 0xEC13 1 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1
0.009766250000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.009947500000000 0xF253 1 1 1 1 0 0 1 0 0 1 0 1 0 0 1 1
0.010373500000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.010548750000000 0xFF27 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1
0.010985750000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.011164500000000 0xCE5A 1 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0
0.011596250000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.011914250000000 0xFF7D 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1
0.012348000000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.012686500000000 0xEC13 1 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1
0.013118250000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.013293500000000 0xF253 1 1 1 1 0 0 1 0 0 1 0 1 0 0 1 1
0.013719500000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.013900750000000 0xFF27 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1
0.014327750000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.014506250000000 0xCE5A 1 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 
0.014942250000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.015262500000000 0xFF7D 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1
0.015696000000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.016034750000000 0xEC13 1 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1
0.016466250000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.016641500000000 0xF253 1 1 1 1 0 0 1 0 0 1 0 1 0 0 1 1
0.017073500000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.017248750000000 0xFF27 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1
0.017675750000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.017860500000000 0xCE5A 1 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0
0.018286500000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.018607000000000 0xFF7D 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1
0.019056500000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.019395250000000 0xEC13 1 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1
0.019826750000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.020002250000000 0xF253 1 1 1 1 0 0 1 0 0 1 0 1 0 0 1 1
0.020434000000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.020609250000000 0xFF27 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1
0.021042250000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
0.021221000000000 0xCE5A 1 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0
0.021647000000000 0xFF7F 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1

LogicAnalycer:


Das ist die Kommunikation vom Controller zu den zwei hintereinander geschalteteten 74HC595.
Dazwischen hänge ich gerade mit meinem Arduino 2560.
Shift an Pin 52
Latch an Pin 53
Data an Pin 51

Ich muss dazu sagen, ist mein erstes Projekt dieser Art :blush: