Nach dem Datenblatt erhält der Master jeweils 2 Bytes pro Register vom Slave übergeben.
DrDiettrich:
Das Gefasel mit den 4 Bytes verwirrt nur.
Das war als Beispiel gedacht, können auch zwei oder 25 sein. Würde man das ganze Datenblatt bereitgestellt bekommen, könnte man neben der Anzahl der Register auch sehen, ob es einen inkremetellen Modus gibt.
sarah_gru:
Zu meinen Programmen wurde noch nichts geschrieben ...
In diesem Forum wird üblicherweise mittels C++ (siehe I2C Slave Schnittstelle) programmiert. Die Grafiken sagen mir leider nichts.
Ich habe das jetzt mal auch mit dem Oszilloskop gemessen um zu sehen ob die Hardware an sich tut. Ich bekomme definierte Zustände - nur wird nach der Übergabe von der Slave-Adresse (8) meine Übertragung abgebrochen.
Das Bild scope_Sensor_0 und scope_Sensor_1 zeigt die Messung von SCL und SDA Leitung wenn ich den Stellantrieb an meinen Sensor anschließe.
Das Bild scope_Simulation_1 und scope_Simulation_2 zeigt die Messung von SCL und SDA wenn ich meinen Arduino anschließe. Ich habe jedoch auch noch keine Software und nichts gestartet.
Es gibt also keine Bestätigung vom Arduino, also vom Slave.
Allgemein ist doch trotzdem eine Kommunikation zwischen Master und Slave möglich, da ja schon mal die Anfrage des Masters (also die Slave-Adresse übermittelt wird) oder nicht?
Danke!
So wie ich das sehe wird die Übertragung abgebrochen, weil der Slave nicht reagiert. Das kann er ja auch garnicht, wenn er keine Daten zu senden hat.
DrDiettrich:
So wie ich das sehe wird die Übertragung abgebrochen, weil der Slave nicht reagiert. Das kann er ja auch gar nicht, wenn er keine Daten zu senden hat.
So habe ich mir das auch überlegt, da ich ja noch keine Daten an den Arduino gegeben habe.
Ich probiere jetzt mittels der Oszilloskop Bilder zu ermitteln, was für Daten übertragen werden.
Ich muss jedoch zum Initialisierten bei dem Arduino auch die Baudrate einstellen - in meinem Datenblatt steht dazu:
Transmission Parameter I²C: Standard Mode 100 kHz - ich denke, dass das in Verbindung mit der Baudrate steht. Es gibt sonst kein Vermerk auf eine Baudrate vom Sensor. Weil die Baudrate ist ja abhängig davon, welche Baudrate mein Stellantrieb bei der I2C Verbindung hat oder nicht? Sonst würden die Bauteile ja in verschiedenen Geschwindigkeiten die Daten senden / empfangen.
Wie übersetzte ich jetzt nur die 100kHz in eine Baudrate?
Bei I2C gibt es keine Baudrate, der Takt wird vom Master geliefert.
Meines Erachtens brauchst Du auf dem Arduino einen Sketch der einerseits die Parameter vom PC/labview entgegennimmt und andererseits auf Anfragen vom I2C Master antwortet.
Das bekommst Du mit einem Standart Arduino LabView-Firmware nicht zusammen.
Grüße Uwe
quote author=DrDiettrich link=msg=3833101 date=1533641378]
Bei I2C gibt es keine Baudrate, der Takt wird vom Master geliefert.
[/quote]
Muss ich diese Frequenz dann auch bei dem Arduino einstellen?
uwefed:
Meines Erachtens brauchst Du auf dem Arduino einen Sketch der einerseits die Parameter vom PC/labview entgegennimmt und andererseits auf Anfragen vom I2C Master antwortet.Das bekommst Du mit einem Standart Arduino LabView-Firmware nicht zusammen.
Grüße Uwe
Also ich hab mir dass jetzt auch nochmal genauer überlegt mit den Werten an den Arduino und diese dann über I2C an den Stellantrieb.
Ich würde das so realisieren, dass ich die Werte aus dem Register über USB an den Arduino gebe.
Dann hat der Arduino eben diese Werte in seinem Speicher und kann sie jeder Zeit über den I2C Bus an den Stellantrieb weitergeben.
Weil dann könnte ich mir den Sketch ja sparen oder nicht? Oder geht es nicht den Arduino gleichzeitig über USB und I2C zu nutzen?
Ich habe einen Mega2560 (egal, ein Arduino eben) als Master an einen Uhrenbaustein DS3231 als Slave angeschlossen und lese die Uhrzeit und Datum als sieben Bytes. Sieht dann so aus:
Die 100kHz ist der Takt bei SCL, den der Master generiert. Das muß bei Dir der Stellantrieb liefern.
sarah_gru:
Weil dann könnte ich mir den Sketch ja sparen oder nicht? Oder geht es nicht den Arduino gleichzeitig über USB und I2C zu nutzen?
USB und I2C geht gleichzeitig (die Uhrzeit zeige ich mit dem seriellen Monitor über USB an), aber irgendein Programm muß auf dem Arduino schon laufen. Wüßte nicht, wie es sonst funktionieren sollte.
Es wird langsam Zeit, daß Du Links auf die benötigte(n) LabView-für-Arduino Bibliothek(en) lieferst. Die müssen dann mit der I2C Bibliothek in einen Sketch gepackt werden, damit LabView über USB und der Stellantrieb über I2C mit dem Arduino kommunizieren können.
agmue:
Ich habe einen Mega2560 (egal, ein Arduino eben) als Master an einen Uhrenbaustein DS3231 als Slave angeschlossen und lese die Uhrzeit und Datum als sieben Bytes. Sieht dann so aus:Die 100kHz ist der Takt bei SCL, den der Master generiert. Das muß bei Dir der Stellantrieb liefern.
USB und I2C geht gleichzeitig (die Uhrzeit zeige ich mit dem seriellen Monitor über USB an), aber irgendein Programm muß auf dem Arduino schon laufen. Wüßte nicht, wie es sonst funktionieren sollte.
Okey perfekt danke
Ich sitze jetzt über dem Programm, dass eben etwas auf den Arduino geschrieben wird.
Ich muss dann ja angeben, worauf ich den Wert schreiben will (also auf welchem Pin). Schreib ich das dann auf meine Digitalen I/O oder direkt auf die SDA Leitung? Weil die hat ja eigentlich nur was mit I2C zu tun und nicht damit, die Daten auf den Arduino zu bringen
Ich könnte die Daten auch über den Baustein Serial Write Bytes schreiben, jedoch müsste ich hier ein Interface angeben - was ist damit gemeint oder funktioniert das grundsätzlich nicht?
DrDiettrich:
Es wird langsam Zeit, daß Du Links auf die benötigte(n) LabView-für-Arduino Bibliothek(en) lieferst. Die müssen dann mit der I2C Bibliothek in einen Sketch gepackt werden, damit LabView über USB und der Stellantrieb über I2C mit dem Arduino kommunizieren können.
Das hier ist das Zusatzpaket für Arduino bei LabVIEW
Ich habe diesen Download dann entpackt und in meinem LabVIEW-Ordner abgespeichert. Ich kann die Bausteine jetzt eben in LabVIEW selbst gleich aufrufen. Meinst du das mit in einen Sketch packen?
Nein, dazu muß irgendwie noch Arduino Sourcecode gehören.
Vorbemerkung: Ich kenne LabView nicht.
sarah_gru:
Ich muss dann ja angeben, worauf ich den Wert schreiben will (also auf welchem Pin).
Ich kenne Animationsprogramme, wo der PC eine Animation für LEDs berechnet. Die Helligkeitswerte der LEDs werden dann per USB in Variablen auf dem Arduino übertragen. Der Arduino nimmt dann diese Werte und schiebt sie zu den LEDs raus.
Meine analoge Vorstellung: LabView überträgt Werte, die eigentlich der Sensor erfaßt, mittels USB zum Arduino. Der speichert sie, bis der I2C-Master danach fragt und übermittelt sie dann zum Master. Ziel wären dann Arduino-Variablen, die Register.
Alternativ könnte der Arduino auch erst dann die Meßwerte bei LabView anfragen, wenn der Master sie anfordert. Dürfte aber hinsichtlich zeitlichem Ablauf kritisch sein.
agmue:
Vorbemerkung: Ich kenne LabView nicht.
Ich kenne Animationsprogramme, wo der PC eine Animation für LEDs berechnet. Die Helligkeitswerte der LEDs werden dann per USB in Variablen auf dem Arduino übertragen. Der Arduino nimmt dann diese Werte und schiebt sie zu den LEDs raus.
Genau - hier werden dann dementsprechend die einzelnen Pins auf 1 oder 0 gesetzt, an denen die LEDs angeschlossen sind. Ich bräuchte aber irgendwie ein Register oder so etwas auf dem Arduino, wo ich Werte speichern kann und dann an die Datenleitung vom I2C Bus weiterleiten kann, sobald eine Anfrage kommt.
Man muss, wenn man eben etwas in den Arduino schreiben will auswählen, ob ich einen digitalen oder analogen Ausgang beschreiben will und dann welcher Pin genau. Ich habe ja aber weder etwas am digitalen, noch am analogen Ausgang angeschlossen.
agmue:
Meine analoge Vorstellung: LabView überträgt Werte, die eigentlich der Sensor erfaßt, mittels USB zum Arduino. Der speichert sie, bis der I2C-Master danach fragt und übermittelt sie dann zum Master. Ziel wären dann Arduino-Variablen, die Register.
So wäre der Plan - jetzt ist eben nur die Frage, wo ich die Werte abspeichern kann, dass sie nach Anfrage vom Master direkt auf der Datenleitung gesendet werden.
Im Post 8 wurde das hier vorgeschlagen:
agmue:
Werte, die ein Reset überdauern sollen, kannst Du unter Beachtung der maximal möglichen Schreibzyklen im EEPROM des UNO gespeichert werden. Sonst bietet sich auch FRAM an.
Wie kann ich jedoch auf dem EEPROM zugreifen? Ist dieser auch so konstruiert wie Pins, sodass ich ihm einfach Daten schicken kann?
DrDiettrich:
Nein, dazu muß irgendwie noch Arduino Sourcecode gehören.
Ich frag nochmal meinen Kollegen, der schon einmal einen Arduino in LabVIEW eingebunden hat. Danke für den Hinweis
sarah_gru:
Genau - hier werden dann dementsprechend die einzelnen Pins auf 1 oder 0 gesetzt, an denen die LEDs angeschlossen sind.
Sorry, ich meinte nicht normale LEDs, sondern APA102 oder WS2812, die wie Schieberegister angesteuert werden. Die Farbwerte werden in einem Feld gesammelt und dann zusammen zu den ICs geschoben, die die LEDs mittels PWM ansteuern. Ist nicht wichtig, aber es werden auch Daten in Registern gesammelt.
sarah_gru:
So wäre der Plan - jetzt ist eben nur die Frage, wo ich die Werte abspeichern kann, dass sie nach Anfrage vom Master direkt auf der Datenleitung gesendet werden.
Normalerweise in einem Datenfeld.
Ist das Datenblatt des Sensors geheim? Ohne ist es Stochern im Nebel, also frustrierend. Dies ist ein öffentliches Forum, das auf öffentlich zugänglichen Informationen basierend Hilfe anbietet, die auch für andere Personen hilfreich sein könnte. Idealerweise sollte es ein Geben und Nehmen sein. Ich versuche zu helfen, um etwas zu lernen. Nur mal so als zarter Hinweis
Die genauen Angaben zum Sensor können doch geheim bleiben, sie ändern am Lösungsverfahren überhaupt nichts.
Benötigt wird ein Array, entsprechend den Registern im Sensor. Die Größe des Arrays entspricht der Anzahl der Register. Der Typ des Arrays hängt vom Typ der Register ab, möglicherweise 8 oder 16 Bit u/int.
Das alles ist erst mal nicht unser Problem, solange keine ganz spezifischen Fragen kommen - und das dürfte noch eine ganze Weile dauern. Aktuell ist doch die wichtigste Frage, was LabView sendet, und wie die dazu gehörende Bibliothek aussieht, die auf dem Arduino die Werte in Empfang nimmt. Die muß dann irgendwie I2C-fähig gemacht werden, wenn da nicht schon was vorgesehen ist. Doku Lesen soll da ganz hilfreich sein
Also wenn ich die Beschreibung auf der in #30 verlinkten NI Seite lese
The PWS Toolkit is a LabVIEW add-on to be used in conjunction with the Arduino Compatible Compiler for LabVIEW, allowing the programming and downloading of LabVIEW code to the Programmable Wireless Stamp (PWS) device. The PWS is a low cost micro-controller based wireless board tailored to general test and measurement, wireless data acquisition and IoT applications.
bleiben bei mir einige Fragen offen.
Ist dieser Compiler nur für dieses PWS Board ?
Falls er auch für andere Arduinos ist, wurde da richtig eingestellt, dass er für einen Uno übersetzen muss ?
[Edit] Ah, ok, in #7 steht noch was dazu. Der Link diente wohl nur zur Verwirrung.
agmue:
Ist das Datenblatt des Sensors geheim? Ohne ist es Stochern im Nebel, also frustrierend. Dies ist ein öffentliches Forum, das auf öffentlich zugänglichen Informationen basierend Hilfe anbietet, die auch für andere Personen hilfreich sein könnte. Idealerweise sollte es ein Geben und Nehmen sein. Ich versuche zu helfen, um etwas zu lernen. Nur mal so als zarter Hinweis
Ich habe leider selbst kein Datenblatt vom Sensor, da es eine Kundenhardware ist und ich somit keinen Zugriff darauf habe. Ich habe nur die 3 Blätter, die ich im Anhang mal mit eingefügt habe - mehr nicht sry.
DrDiettrich:
Benötigt wird ein Array, entsprechend den Registern im Sensor. Die Größe des Arrays entspricht der Anzahl der Register. Der Typ des Arrays hängt vom Typ der Register ab, möglicherweise 8 oder 16 Bit u/int.Das alles ist erst mal nicht unser Problem, solange keine ganz spezifischen Fragen kommen - und das dürfte noch eine ganze Weile dauern. Aktuell ist doch die wichtigste Frage, was LabView sendet, und wie die dazu gehörende Bibliothek aussieht, die auf dem Arduino die Werte in Empfang nimmt. Die muß dann irgendwie I2C-fähig gemacht werden, wenn da nicht schon was vorgesehen ist. Doku Lesen soll da ganz hilfreich sein
Das Array habe ich schon erstellt. Ich finde jedoch kein einzigsten Vermerk, wie ich mittels LabVIEW in den EEPROM Daten schreiben kann. Auf der Arduino Seite gibt es ja nur den Code EEPROMWrite für das eigene Programm. Dort ist es ja so, dass die Daten von dem Analogen 0 in den EEPROM schreibt.
Ich kann mit LabVIEW zwar Daten an den Analogen Eingang senden, aber dann nicht in den EEPROM überführen. -.-
sarah_gru:
Ich habe leider selbst kein Datenblatt vom Sensor, ...
Meine Meinung: Murks!
sarah_gru:
Ich habe nur die 3 Blätter, ...
Ich sehe nur ein Blatt
sarah_gru:
Ich finde jedoch kein einzigsten Vermerk, wie ich mittels LabVIEW in den EEPROM Daten schreiben kann.
EEPROM ist zum Erhalt von Daten über Reset hinaus, das brauchst Du nicht. Versuche es mal mit RAM oder Arbeitsspeicher, da wo Variablen abgelegt und verändert werden.
sarah_gru:
Ich habe leider selbst kein Datenblatt vom Sensor, da es eine Kundenhardware ist und ich somit keinen Zugriff darauf habe. Ich habe nur die 3 Blätter, die ich im Anhang mal mit eingefügt habe - mehr nicht sry.
Da war mal 1 Blatt angehängt, mehr konnte ich nicht finden.