Protokoll zwischen TXT4 und einem selbstgebauten „I2C-Target“

Alles rund um TX(T) und RoboPro, mit ft-Hard- und Software
Computing using original ft hard- and software
Forumsregeln
Bitte beachte die Forumsregeln!
Antworten
Arnoud-Whizzbizz
Beiträge: 200
Registriert: 20 Mär 2021, 17:06
Kontaktdaten:

Protokoll zwischen TXT4 und einem selbstgebauten „I2C-Target“

Beitrag von Arnoud-Whizzbizz » 02 Apr 2026, 13:22

Ich arbeite gerade an der Entwicklung einer neuen Hardware mit einem ATMega328-Prozessor. Seit einigen Wochen besitze ich einen TXT4-Controller, und nun habe ich mir vorgenommen, mein (zukünftiges) Gerät auch über I2C vom TXT4 aus steuerbar zu machen. Ich musste sofort an juhs I2CWrapper-Klasse denken, die ich mir schon vor einigen Jahren einmal angesehen hatte, als ich meinen Sketch „CNCv4_Board_3_Steppers.ino“ für AccelStepperI2C erstellte (und den joh sogar in die Beispiele seiner I2CWrapper-Bibliothek aufnahm). Mein Beispiel hatte damals jedoch noch wenig mit I2C-Kommunikation zu tun. :lol:

Jetzt versuche ich (am liebsten auf möglichst einfache Weise), zunächst einmal die I2C-Kommunikation zwischen dem TXT4 und einem Arduino UNO herzustellen. Für den Test habe ich die I2C-level-shifters, einen Druckknopf und einen Potentiometer auf einer kleinen Experimentierplatine aufgebaut. Die Idee ist nun, in ROBO Pro Coding eine I2C Anfrage zu stellen und z. B. den Potentiometer auszulesen und damit einen Servo anzusteuern.

IMG_2136.jpeg
IMG_2136.jpeg (1.49 MiB) 43 mal betrachtet

Ich brauche die CRC8-Prüfung und das Unit-Byte in der Anfrage der ursprünglichen I2Cwrapper-Firmware.ino zunächst nicht und versuche, das Hinzufügen von „eigener Hardware“ zur bestehenden I2Cwrapper-Bibliothek (was offenbar über die Precompiler-Direktive „MF_STAGE“ geregelt wird) noch etwas aufzuschieben. Außerdem hatte ich gehofft, dass ich die gesamte State-Machine-Architektur von I2Cwrapper nicht benötigen würde. Deshalb habe ich die (alte) AccelStepperI2C-„Slave“-Firmware auf das Wesentliche reduziert und auf den UNO geladen. Für meine Puffer habe ich eine abgespeckte Version von SimpleBuffer (ohne CRC-Prüfung und Unit-Byte) verwendet.

Bisher bekomme ich meine Versuche jedoch nicht zuverlässig zum Laufen. Ich versuche nun herauszufinden, ob dies daran liegt, dass mein technischer Ansatz vielleicht zu naiv ist. Ich stoße nämlich auf ein vermutlich recht grundlegendes Timing-Problem.

Das Problem ist nun, dass in dem Moment, in dem die Werte (der Potentiometerwert) der Anfrage zurückgefordert werden, diese noch nicht verfügbar sind. Dadurch hinkt der bufferOut also immer eine Anfrage des TXT4 hinterher. Die angeforderten Werte erscheinen zu spät im bufferOut und bleiben dort bis zur nächsten Anfrage stehen. Dies liegt daran, dass das requestEvent des TXT4 bereits eintrifft, bevor in der Hauptschleife der Befehl interpretiert, der Potentiometer ausgelesen und der zurückzugebende Wert (als zwei Bytes) in den bufferOut geschrieben wurde.

Im Idealfall sollte der TXT4 diesen Rückgabewert ignorieren und den Wert erneut abfragen? Ich sehe, dass der I2C-Wrapper über eine Funktion „autoAdjustI2Cdelay“ verfügt und einen „tainted“-Status für den „bufferOut“ usw. hat. Meine konkrete Frage lautet nun: Ist das alles notwendig, oder wurde bereits getestet, ein eigenes „Target“ (vorzugsweise ein Arduino UNO) über I2C vom TXT4 aus abzufragen? Oder wie lässt sich der bestehende I2C-Wrapper hierfür möglichst übersichtlich nutzen?

Vermutlich muss ich dann eine eigene XXX_firmware.h-Datei mit der Befehlsinterpretation dafür erstellen? Ich verstehe jedoch die Funktionsweise und Interpretation der „MF_STAGE“-Precompiler-Direktive hierfür noch nicht gut genug. Außerdem erscheint mir die gesamte Klasse für meine Anwendung überdimensioniert? Ich versuche schließlich, einen Endpunkt/Slave/Target zu erstellen, der ausschließlich vom TXT4 abgefragt werden kann. An diesem „Target“ sind keine anderen Sensoren usw. angeschlossen, die über I2C abgefragt oder angesteuert werden müssen.

Hat jemand (Jan selbst?) eine Idee, wie ich den „Handshake“ vom TXT4 auf I2C-Ebene hinbekomme, wenn die zurückzusendenden Daten nicht sofort (oder offensichtlich zu spät) verfügbar sind? :shock:

Benutzeravatar
fishfriend
Beiträge: 2455
Registriert: 26 Nov 2010, 11:45

Re: Protokoll zwischen TXT4 und einem selbstgebauten „I2C-Target“

Beitrag von fishfriend » 02 Apr 2026, 14:42

Hallo...
Auf die Schnelle würde ich einfache einen Wert z.B. 0 oder 1 zurücksenden und den dann im TXT 4.0 verwerfen, also vom TXT 4.0 eine neue Anfrage stellen, bis halt ein abweichender Wert kommt, der dann richtig ist.

Ich gebe zu, ich würde es ganz anders machen.
Warum nimmst du nicht das "einfache" Slavebeispiel der Arduino IDE?

Man könnte auch wie beim Onlinebetrieb vom TXT/TX/RoboIF... ein Datenfeld übertragen. Vorzugsweise wenn möglich den gleichen Aufbau.
Ich hab mich darum noch gekümmert, aber vermutlich wird der TXT 4.0 auch sowas haben.

Ist schon lustig, ich hab gerade einen ESP32 dem ich I2C am TXT beibringe :-)
Mit freundlichen Grüßen
Holger
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

Antworten