4 x MCP23S17 über SPI ansteuern, wie erstelle ich einen Sketch hierfür

Hallo zusammen,

dies ist mein erstes Projekt. Ich habe einen Controller gebaut der über SPI mit single CS an 4 MCP23S17 mit nachgeschalteten 8 TXS0108 Level-Shifter hängen. Der Controller soll dann 8 AC-Servo driver (AASDF-15) ansteuern. Hier suche ich immer noch Info's wie man Impulse mit Anzahl Umdrehungen auf einen linearen Hub in mm. als Funktion abbildet. Angefügt der Auschnitt der Schaltung. Die Adressen der einzelnen MCP's sind entsprechend auch beschaltet.

Was brauche ich um einen base Sketch hierfür zu erstellen?

  • MCP23S17.cpp
  • MCP23S17.h
  • helpers.cpp
  • helpers.h
  • DigitalFilters-h
  • Preferences.h
  • Bounce2.h
  • Wire.h
  • SPI.h
  • EEPROM.h

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Wenn Du SPI machst, werden die Adressen (A0-A2) nicht benutzt gebraucht, die sind normalerweise für I2C. Datenblatt Seite 2
[edit]
Der Chip hat einen Mischmasch bei Nutzung des SPI. Die AdressPins können da auch mit genutzt werden... (Datenblatt Seite 15) Muss ich nicht verstehen...
Damit relativiert sich meine Aussage von oben ....

Hallo,

Im Datenblatt im Abschnitt 3.3.2 steht "The MCP23S17 is a slave SPI device. The slave address contains four fixed bits and three user-defined
hardware address bits (if enabled via IOCON.HAEN)
(pins A2, A1 and A0) with the read/write bit filling out
the control byte. Figure 3-5 shows the control byte
format. The address pins should be externally biased
even if disabled (IOCON.HAEN = 0)."

Ich interpretiere das so das die Adressen gesetzt sein müssen. Oder sehe ich das falsch. Ausserdem habe ich gesehen in diversen Post das man dabei nur ein gemeinsame CS nutzen kann.

Ne. ich hatte das oben schon korrigiert - ist sicher schick, wenn nur ein CS für alle, verwirrt aber... :slight_smile:

ich möchte ja nur eine CS (SS) nutzen und den rest über die Adresse A0,A1,A2 definieren.

wie definiere ich hierfür einen Sketch ?

Schau mal beim arduinoplayground, da hat jemand eine lib gebaut, die auch die Adressierung berücksichtigt.
Imgur

https://playground.arduino.cc/Main/MCP23S17/

also libs gibts da einige, auch von Adafruit:

nur wenn man sich schon so was spezielles baut, dann würde ich mich durch die Register kämpfen und eine eigene Lib schreiben. Allein schon deswegen weil man dann für seinen Anwendungsfall genau das richtige implementieren kann, 8 bit oder 16 bit schreiben, continous oder nicht? Und nicht durch das Ildefonso bohren muss (also auch nicht durch die Schichten der Lib durch muss).

Im Thema Fragen zu Port Expander (Dartscheibe) findest Du ein Programm zur Bibliothek MCP23S17:

const uint8_t chipSelect = 5;
MCP23S17 mcp1(&SPI, chipSelect, 0);  // letzte Stelle die Adresse von A0, A1 und A2
MCP23S17 mcp2(&SPI, chipSelect, 1);

Neuerdings unterstützt auch Adafruit MCP23S17. Wo man die durch die Adresseingänge eingestellte Adresse konfigurieren kann, habe ich aber noch nicht gefunden.

ich schaue mal ob ich daraus schlau werde. hier mal die komplette Schaltung

an den db25 Anschlüssen werden AASD-15A Servo driver angeschlossen

Las E-STOP1 nicht das sein, was ich vermute.
Warum hast Du den nicht gleich auf E-stop gelegt und machst da solche Umstände?
Die 470 halte ich für zu klein - ansonsten 4 Instanzen für die Ansteuerung bauen und gut ist.

E-Stop unterbricht das Impulse an den Controller gesendet werden eine Art Pause-Funktion. Der K-Switch unterbricht die Stromversorgung des Servo enables Input und ist der Not-Aus im richtigen Sinne. Wie meinst du das E-stop direkt auf E-Stop gelegt, das erschließt sich mir im Moment nicht, habe das es so gemacht weil ich bisher keine andere Lösung kenne

Habe im Arduino IDE, einen Sketch angelegt und würde nun gerne diesen anfangen zu befüllen, was brauche ich für alle inlcudes? Als board habe ich das ESP32 Dev Module ausgewählt. Wie gesagt ist mein erstes Projekt. Was muss alles in den Ordner wo der Sketch abelegt noch hin kopiert werden?

motion-controller.ino (1,2 KB)

das klingt so als hättest du überhaupt keine Erfahrung mit der Programmierung unter Arduino.

Wenn das so ist: alles beiseite legen und Stück für Stück einzeln probieren.

bring mal das "Blink Without Delay" zum Blinken deiner LED am ESP32.
Solange das nicht funktioniert macht es überhaupt keinen Sinn einen Schritt weiter zu gehen.

Gib bescheid wenn das funktioniert.

ich habe bisher nur den vorhandene Sketches, bearbeitet und angepasst, z.B. für meinen 3D Drucker, aber da waren ja libaries, die ganzen h-files drin und es waren Mega2560 oder Mega due.
Der ESP32 ist hier komplett neu, ich habe schon mit µ-phyhton am ESP32 programmiert um darauf einen Webserver zu installieren und diverse Zustände auzlesen und auch SD-Karte anegbunden.

Den Controller habe ich selber entworfen und auch aufgebaut. Beruflich bin ich Diplom Elektrotechniker mit der Fachrichtung Elektronik, habe auch einen Abschluss als Radio und Fensehtechniker, zwar bin ich schon ein älteres Semester, aber einen sofort herunter zu Stufen und man(n) soll mit LED blinken anfangen wie ein Grundschüler im Technikunterricht, ist auch nicht die feine Art. Ich habe Mitte der 80er Assembler programmiert. Ich schreibe täglich Code in XML für Geräte die Internetverschlüsselung Routing und ähnliches machen.

Ich habe schon einen 4 Kanal Controller mit Mega 2560 gebaut an dem die AASD-15a laufen, jedoch sind diese direkt an den GPIO angeschlossen und es sind keine MCP und TXS-0108 im Spiel.

Es besteht durchaus Erfahrung und Wissen auf dem man aufbauen kann. Mir ist auch klar das man dies auch in µ-Phyton oder FreeRtOs oder C++ umsetzen kann. Ich möchte jedoch diese mit Arduino umsetzen um auch zwischen Mega2560 und ESP32 wechseln zu können bei Schaltungs Anpassungen ohne jedes mal alles neu schreiben zu müssen.

Deswegen hoffe ich, hier den richtigen Input und evtl. auch Lösungen zu bekommen und auch zu diskutieren, konstruktive Vorschläge oder wo ich was verbessern kann.

Hier der Sketch des 4 Kanal Controller mit Mega 2560.

4-channel-motion-controller.ino (30,1 KB)

Das Thema/ Aufgabe vor der ich stehe ist, dieses nun auf den esp32 zu portieren und um die weiteren 4 Kanäle zu erweitern.

ich bleib dabei: Blinkt die LED am ESP schon?

Damit wäre sichergestellt, dass sich der ESP32 mit der Arduino IDE beladen lässt.
Solange du das nicht mit einem JA beantworten kannst, bin ich raus.

OT: Selbst ein A310 Pilot braucht ein neues Typerating für eine 737.
Und wenn ich diese Kombination lese

  • Preferences.h
  • EEPROM.h

dann steht es mir zu, nach Grundlagen zu fragen.

Moin!

Willkommen im Club der alten Männer!

Z80, 6502 ...

Und Du siehst Dich täglich im Spiegel, wir aber nicht. Bitte bedenke, wir können Dich nur nach dem beurteilen, was Du hier schreibst!

Das mißverstehst Du!

Als ich mit dem ATtiny85, dem UNO und dem ESP32 angefangen habe, war der Blink-Sketch jeweils mein erster Versuch, dem µC ein Programm zu verpassen. Als das funktionierte, hatte ich ein paar Hürden überwunden. Die Frage ist also, hast Du diese Hürden für den ESP32 auch schon überwunden?

Wenn nein, müssen wir mit der Hilfe genau da ansetzen.

Es geht also darum, den Stand Deines Wissens hinsichtlich ESP32 abzufragen, denn davon lese ich leider bis jetzt noch nichts.

Dann hast Du vermutlich noch nicht bemerkt, die Arduino-IDE hat einen C++-Kompiler unter der Haube, OOP wartet auf Dich :joy:

Da sehe ich viele Dinge, die sich leicht übertragen lassen, allerdings werden da auch die Timer-Register direkt angesprochen. Der ESP32 ist aber eine ganz andere Prozessorfamilie, das muß also komplett neu.

Das Wissen über die Timer des ESP32 dürfte dünn gesäht sein. @MicroBahner hat die Programmbibliothek MobaTools auch für den ESP32 angepaßt, der sollte sich damit auskennen. Eventuell wäre auch die Nutzung dieser Bibliothek eine Möglichkeit, die Austauschbarkeit zwischen Mega2560 und ESP32 hinzubekommen.

Ich hoffe, Du hast dieses Projekt ohne Zeitdruck begonnen, es wartet eine Menge Arbeit auf Dich :slightly_smiling_face:


In Deinem Programm finde ich

CN2 control signal connector
p3 - pwm signal
p4 - direction

Das deutet mehr auf einen Schrittmotor mit STEP und DIR hin. Welche Signale soll der ESP32 erzeugen?

Dieser Aufbau ist falsch der SPI ist kein Daisy Chain (schreibt man das so? Gänseblümchenkette)
SCLK, MOSI und MISO sind an allen Teilnehmern paralellgeschaltetund nicht im Ring wie Du das gezeichnet hast.
Jeder SLAVE ist inaktiv (Ausgänge Hochomig und Keine Datenübernahme) nur der durch SS aktivierte (in diesem Fall SS und ADRESSE) wird geschrieben und kann Dalten senden.

Grüße Uwe

Hallo Uwe,

der MCP23S17 hat drei Adresspins, die auch bei SPI ausgewertet werden, weshalb acht MCP23S17 an einem SS-Pin hängen können. In dem verlinkten Thema habe ich es ausprobiert. SCK, MOSI, MISO und SS werden an Device #1 und #2 parallel angeschlossen.

Siehe Datenblatt MCP23017/MCP23S17 von 2007 "1.4.2 ADDRESSING SPI DEVICES
(MCP23S17)"