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: 201
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) 76 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: 2456
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

Arnoud-Whizzbizz
Beiträge: 201
Registriert: 20 Mär 2021, 17:06
Kontaktdaten:

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

Beitrag von Arnoud-Whizzbizz » 02 Apr 2026, 15:18

Danke für deine Antwort, Holger!
fishfriend hat geschrieben:
02 Apr 2026, 14:42
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.
Auf der sendenden Seite (UNO) stimmen die Daten. Sie sind lediglich zu spät verfügbar. Auf der empfangenden Seite (TXT4) lässt sich dies nicht erkennen. Es handelt sich schließlich um gültige Werte, nur aus der vorherigen Anfrage. :?
fishfriend hat geschrieben:
02 Apr 2026, 14:42
Warum nimmst du nicht das "einfache" Slavebeispiel der Arduino IDE?
Könntest du mir bitte innerhalb der Standardbeispiele der Arduino IDE den Weg zu einem allgemeinen, aber voll funktionsfähigen Beispiel dafür weisen? Ich habe zwar schon einige davon studiert, und die Technik ist ähnlich. Es werden zwei Interrupt-Handler (onReceive und onRequest) eingerichtet, die das eigentliche Empfangen und Senden der Bytes übernehmen sollen.

Meine Frage ist vielleicht eher eine Frage des Verständnisses: Woher nimmt der UNO die Zeit, um die angeforderte Antwort zu finden? Erst danach kann sie als Antwort gesendet werden. Aber worauf ich jetzt stoße, ist, dass die Anfrage bereits fertig ist und der TXT4 seine Antwort bereits angefordert hat.

Soweit ich das überblicken kann, sieht das I2C-Protokoll keinen echten „Handshake“ vor, durch den dem Master mitgeteilt werden könnte, dass die Antwort bald kommt. Es gibt zwar so etwas wie „Clockcycle-Stretching“, aber das scheint mir nicht die richtige Methode zu sein.

Und selbst wenn es möglich wäre, den TXT4 zu zwingen, die Anfrage erneut zu stellen, würde dies meiner Meinung nach nichts lösen. Schließlich müsste dann wieder dieselbe Verzögerungszeit eintreten...
fishfriend hat geschrieben:
02 Apr 2026, 14:42
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.
In meinem Fall handelt es sich um einfache Antworten mit 1 oder 2 Bytes. Selbstverständlich sende ich dazu selbst einen Befehlscode mit. Das I2C-Protokoll (Wire-Bibliothek) fügt hier im Header die Länge dieser Nachricht hinzu.

Die Kommunikation vom TXT4 zu meinem „Target“ ist jedoch nicht das Problem. Es geht um das Timing der Antworten, die ich zurücksende.
fishfriend hat geschrieben:
02 Apr 2026, 14:42
Ist schon lustig, ich hab gerade einen ESP32 dem ich I2C am TXT beibringe :-)
Das ist interessant! Kann man über I2C Werte vom ESP32 abrufen?

Ich hoffe immer noch, dass ich etwas Einfaches übersehen habe. Ich werde noch einmal nach grundlegenden Beispielen suchen, insbesondere nach einer Anfrage, die auf Basis eines Befehlscodes auf dem UNO bestimmte Werte an den Controller zurückgeben kann.

Bisher sind jedoch alle Beispiele, die ich gefunden habe, Beispiele für die Kommunikation von und zu Hardware (wie Sensoren und Displays usw.), nicht für von Software emulierte Hardware.

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

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

Beitrag von fishfriend » 02 Apr 2026, 16:47

Hallo...
Na ja, es ist schon etwas länger her mit meinen Experimenten zu I2C und dem UNO.
Auf der sendenden Seite (UNO) stimmen die Daten. Sie sind lediglich zu spät verfügbar. Auf der empfangenden Seite (TXT4) lässt sich dies nicht erkennen. Es handelt sich schließlich um gültige Werte, nur aus der vorherigen Anfrage. :?
Ich bin mir nicht sicher. Kann man den Buffer nach dem Senden löschen?
Man könnte dem Wert auch eine fortlaufende Nummer anhängen. Ob nun eine 0 und/oder der laufende Wert, der TXT 4.0 kann daran erkennen, das der Wert gültig ist oder nicht. Man kann ja auch nur bis 255 zählen und dann wieder von 0 anfangen.

Ich meine, der UNO macht das in der Hardware. Deswegen kann man ja auch nur bestimmte Pins nehmen. Wenn man Pech hat, sind nicht alle Möglichkeiten die I2C hat in der Lib zum UNO drinn.
Es gab/gibt I2C Beispiele, wo man zwei UNOs verbindet. Wenn das läuft, kann man nun den TXT 4.0 drannhängen. So dachte ich mir das. Zumindest hatte ich das damals so gemacht.

Das es da eine Art Timeout im TXT 4.0 gibt, glaub ich jetzt nicht. Im Grunde hat der Slave doch alle Zeit der Welt. Ich vermute mal das es da noch ein Flag gibt, wo man das Senden freigibt. Ich meine nicht, dass es emuliert ist. Zumindest beim UNO.

---
Mein Ansatz bei meinem momentanen Projekt ist noch ganz anders.
Erst wollte ich I2C am ESP direkt machen. Hab ich momentan verworfen.
Ich hab aber eine fertige Platine mit Display, die auch noch eine zusätzliche serielle Schnittstelle hat.
Es gibt I2C zu Seriell (z.B. von NXP). Der hat zwei serielle Schnittstellen. Ich wollte über den TXT 4.0 dann diesen Wandler ansprechen, der dann die Platine mit dem ESP32 anspricht, Der große Vorteil davon ist, dass man nichts bauen oder umbauen muss. Man kann es direkt anklemmen und dann das Programm aufspiele. Soll halt "nachbausicher" sein. So der Plan.

Mit freundlichen Grüßen
Holger
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

Antworten