Arduino Forum

International => Deutsch => Topic started by: sarah_gru on Aug 06, 2018, 10:11 am

Title: I2C - Arduino als Slave
Post by: sarah_gru on Aug 06, 2018, 10:11 am
Hallo,

ich versuche gerade ein Programm zu schreiben, indem der Arduino Uno die Aufgabe des Slaves annimmt.
Normalerweise ist es so, dass ein Sensor meinem Stellantrieb (Master) Daten sendet.
Jetzt habe ich jedoch die Aufgabe diesen Sensor zu simulieren. Ich habe jetzt in LabVIEW ein SubVI erstellt, dass mittels Cases verschiedene Aktionen ausführt. Ich habe die Cases in Abhängigkeit von selbst erstellten Adressen aufgebaut. Folglich wird wenn Adresse eins angegeben wird eben die Aktion vom 1 "Casefall" ausgeführt und wenn Adresse 2 dann die Aktion vom 2 "Casefall" usw.
Ích habe einmal ein Programm mit den einfachen I2C Bausteinen von Arduino (sh. Anhang) und einmal ein Programm mit Bausteinen von Arduino Compatible Compiner for Labview Home / Student geschrieben.
Wie realisiere ich jedoch jetzt, dass mein Arduino ein Slave sein soll? Mein Stellantrieb zeigt die ganze Zeit die Fehlermeldung an, dass ein Kommunikationsfehler zwischen Slave und Master existiert. Ich denk das liegt daran, dass eben noch nicht festgelegt ist, dass der Arduino ein Slave ist - ist das möglich?

Vielen Dank im Voraus!
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 06, 2018, 10:17 am
Das ist das zweite Programm :)
Title: Re: I2C - Arduino als Slave
Post by: HotSystems on Aug 06, 2018, 10:22 am
Und warum machst du jetzt einen neuen Thread auf ?

Das hattest du doch im ersten Thread schon alles beschrieben.
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 06, 2018, 10:34 am
Und warum machst du jetzt einen neuen Thread auf ?

Das hattest du doch im ersten Thread schon alles beschrieben.

Habs im alten Thread vermerkt. Hoffe dass durch die neue Themenangabe mehr Leute die eben auf das Thema Arduino als Slave Antworten wissen aufmerksam werden :)
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 06, 2018, 10:36 am
Noch mehr Aufmerksamkeit? Es wäre hilfreicher, wenn Du etwas aufmerksamer und lernwilliger mit den bisherigen Antworten umgehen würdest :-]
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 06, 2018, 10:45 am
Noch mehr Aufmerksamkeit? Es wäre hilfreicher, wenn Du etwas aufmerksamer und lernwilliger mit den bisherigen Antworten umgehen würdest :-]
Zu meinen Programmen wurde noch nichts geschrieben - zu den Antworten bezüglich der Hardware habe ich ja alles verstanden und selbst probiert - jetzt geht es ja um die Software selbst und die Möglichkeit meinen Arduino als Slave zu verwenden und auf die Frage kam noch keine Antwort, weshalb ich mir gedacht habe, dass ein neues Topic mit einer besseren Themabeschreibung hilfreich wäre.
Sobald ich eine Hilfestellung habe werde ich das im jeweils anderen Post natürlich posten um eben nicht einfach so einen Crosspost zu machen :)
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 06, 2018, 12:26 pm
Erkläre bitte, wie LabView mit dem Arduino zusammenarbeitet. Läuft auf dem Arduino eine LabView Bibliothek, oder wie kommen die Daten zum Arduino?

Die Register müssem übrigens auf dem Arduino realisiert werden, damit ihre Werte jederzeit sofort an den Master übertragen werden können,
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 06, 2018, 12:44 pm
Erkläre bitte, wie LabView mit dem Arduino zusammenarbeitet. Läuft auf dem Arduino eine LabView Bibliothek, oder wie kommen die Daten zum Arduino?
Also in LabView gibt es Zusatzpakete die man kostenlos downloaden kann. Es sind spezielle SubVIs für Arduino. Die, die ich verwendet habe sind zusätzlich noch speziell für die I2C Verbindung von einem Arduino.

Bevor man LabView mit dem Arduino in Betrieb nimmt, muss dass Arduino Interface installiert werden. Danach verbindet man den Arduino wie gewohnt mit dem Computer und öffnet die Arduino Programmierumgebung (IDE). Dann erstellt man zuerst mittels Arduino Sketch LIFA_Base ein ganz normales Arduinoprogramm. Danach wird das Interface hochgeladen und die IDE geschlossen. Dann kann man den Arduino mittels Labview verwenden. Mit dem Baustein Init werden dann die wichtigen Parameter für die Kommunikation (USB-SChnittstelle, Arduinotyp, Baudrate...) eingestellt. Dann kann mit den Bausteinen eine Software geschrieben werden.

Die Register müssem übrigens auf dem Arduino realisiert werden, damit ihre Werte jederzeit sofort an den Master übertragen werden können,
Okey das ist schonmal gut zu wissen - also ist es möglich Register auf dem Arduino konstant zu speichern oder müssen diese Register immer bei Start des Programmes neu auf den Arduino geschrieben werden?
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 06, 2018, 01:04 pm
Okey das ist schonmal gut zu wissen - also ist es möglich Register auf dem Arduino konstant zu speichern oder müssen diese Register immer bei Start des Programmes neu auf den Arduino geschrieben werden?
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  (https://www.adafruit.com/?q=fram)an.
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 06, 2018, 01:10 pm
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  (https://www.adafruit.com/?q=fram)an.

Kann das definitiv nur im Programm von Arduino selbst realisiert werden?
Also werde ich praktisch mein Programm ausschließlich so gestalten, dass ich mit I2C Daten schreibe? Mit der Funktion schreiben sendet mein Arduino dann doch per I2C dem Master (also dem Stellantrieb) meine Werte oder ist das immer vom Master auszusehen? Also das mein Programm mit der Lesefunktion die Werte von meinem Arduino liest?
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 06, 2018, 02:08 pm
Vorbemerkung: Ich kenne weder LabView, noch verstehe ich, was Du damit machst.

Kann das definitiv nur im Programm von Arduino selbst realisiert werden?
Verstehe ich nicht.

Also werde ich praktisch mein Programm ausschließlich so gestalten, dass ich mit I2C Daten schreibe? Mit der Funktion schreiben sendet mein Arduino dann doch per I2C dem Master (also dem Stellantrieb) meine Werte oder ist das immer vom Master auszusehen? Also das mein Programm mit der Lesefunktion die Werte von meinem Arduino liest?
Verkürzt auf dieses Projekt: Bei I2C gibt es einen Master und einen Slave, einen Sender und einen Empfänger. Der Master ist der aktive Teil, der Slave wird nur nach Aufforderung aktiv.

Der Master sendet eine Datenanforderung über vier Bytes, der adressierte Slave empfängt diese Anforderung. Der Slave sendet vier Bytes, der Master empfängt diese.

Manche Slaves nehmen auch Daten entgegen, dann sendet der Master ein Byte für den Index (fünftes Register) und anschließend den Wert. Dies kann beispielsweise einen Meßprozeß "messe Temperatur" anstoßen.

Welche Register des Slaves gelesen oder beschrieben werden können, muß man dem Datenblatt entnehmen.

Soweit klar?
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 06, 2018, 02:55 pm
Verkürzt auf dieses Projekt: Bei I2C gibt es einen Master und einen Slave, einen Sender und einen Empfänger. Der Master ist der aktive Teil, der Slave wird nur nach Aufforderung aktiv.

Der Master sendet eine Datenanforderung über vier Bytes, der adressierte Slave empfängt diese Anforderung. Der Slave sendet vier Bytes, der Master empfängt diese.

Manche Slaves nehmen auch Daten entgegen, dann sendet der Master ein Byte für den Index (fünftes Register) und anschließend den Wert. Dies kann beispielsweise einen Meßprozeß "messe Temperatur" anstoßen.

Welche Register des Slaves gelesen oder beschrieben werden können, muß man dem Datenblatt entnehmen.

Soweit klar?

Ja das ist klar - ich habe ja keinen Sensor, also keinen Slave somit werden die Register, die vom Master gelesen werden sollen eben durch ein SubVI einfach gestellt - also da sind einfach verschiedene Aktionen vorhanden, denen jeweils eine Adresse zugeteilt ist und diese Adressen sollen dann vom Master gelesen werden.

Allgemein habe ich immer noch das Problem, dass mein Stellantrieb die Fehlermeldung: Kommunikationsfehler zwischen Master und Slave bringt.
Ich habe jetzt den Arduino mit dem Stellantrieb über die SCL, SDA, Ground und 5V-Kabel miteinander verbunden. Laut Schaltplan des Arduinos wird bei einer Versorgung durch den Stellantrieb (also dem Anschluss des 5 V Kabels) die Versorgung durch den USB geblockt. Folglich ist der zeitgleiche Anschluss des USB und der 5V am Arduino kein Problem.
Zudem habe ich jetzt zur Vervollständigung des Aufbaues die Pull-Ups von jeweils einen 4,7kOhm zwischen SCL und 5V und der SDA und 5V angeschlossen.
Trotzdem kommt eben die Fehlermeldung, sobald ich den Arduino mit dem Stellantrieb verbinde - muss ich erst mal Softwaretechnisch irgendwas initialisieren damit die Kommunikation möglich ist?
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 06, 2018, 03:10 pm
... SubVI ...
Was soll das sein?
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 06, 2018, 03:32 pm
Was soll das sein?

Oh sry - das ist einfach ein Unterprogramm - also einfach ein Softwarecode den man dann in anderen Programmen eben einbinden kann :)


Ich habe gerade festgestellt, dass ich zwischen meinem 5V Anschluss vom Stellantrieb zum Arduino und dem Ground einen Widerstand von ca 290Ohm habe - das Kabel ist jedoch einwandfrei -.-
Title: Re: I2C - Arduino als Slave
Post by: uwefed on Aug 06, 2018, 04:32 pm
Quote
Ich habe jetzt den Arduino mit dem Stellantrieb über die SCL, SDA, Ground und 5V-Kabel miteinander verbunden. Laut Schaltplan des Arduinos wird bei einer Versorgung durch den Stellantrieb (also dem Anschluss des 5 V Kabels) die Versorgung durch den USB geblockt. Folglich ist der zeitgleiche Anschluss des USB und der 5V am Arduino kein Problem.
Wer sagt Dir das? Ich gehe genau vom Gegenteil aus.

Quote
Folglich wird wenn Adresse eins angegeben wird eben die Aktion vom 1 "Casefall" ausgeführt und wenn Adresse 2 dann die Aktion vom 2 "Casefall" usw.
Was meinst Du mit Adressen? Ein I2C Slave hat EINE, nur EINE eindeutige Adresse und basta.

Je mehr Du schreibst desto mehr verschidene Versionen presentiert Du und desto verworrener wird das alles.

Grüße Uwe
Title: Re: I2C - Arduino als Slave
Post by: postmaster-ino on Aug 06, 2018, 05:47 pm
Hi

In welchem Thread wollen wir denn jetzt weiter machen?
Ich hatte ja 'drüben' bereits geschrieben, daß mir ABSOLUT NICHT KLAR IST, was Du hier treibst/treiben willst.
Wir fangen Mal gaaanz unten an ...

Der Arduino hat die LabView-Firmware drauf und kann nun (irgendwie) von/mit/zu LabView schwätzen/angeschwätzt werden.
Durch diese Firmware kann der Arduino auch Antworten geben - z.B., wenn Er '1' gesagt bekomme, kann er 'CASE 1' antworten.

Ich gehe weiter davon aus, daß LabView der Master hier ist.

Wie soll der ganze Quatsch ablaufen?
LabView sendet 'will Sensordaten auslesen'
Arduino antwortet 'Sensor 1 so und so'
LabViel sendet 'Will Stellantrieb auf zwölf'
Arduino hält den Rand, ein ACK für das Verstehen des Befehl reicht, außerdem ist jetzt ein Motor zu verfahren

Wenn der Ablauf irgendwie anders ist - schreibe - BITTE - wie!
Dann können wir vll. auch auf die Punkte eingehen, wo Deine Cases nicht 1 sind und was Du sonst noch feines gesagt hast.
Vll. sogar dieses Mal auf den Arduino bezogen - denn hier ist kein LabView-Forum, wo man mit lustigen Bildchen Bits hin und her schiebt, sondern ein Arduino-Forum - und hier geht's eigentlich um Arduinos.
Daß diese Dinger auch mit LabView schwätzen können, ist wohl ein nettes AddOn, Welches uns diesen Thread beschert hat.

MfG
Title: Re: I2C - Arduino als Slave
Post by: uwefed on Aug 06, 2018, 05:59 pm
Ich glaube das ist eine 3-er-Beziehung:

LabView mit seinem Skript/Programm auf dem PC sendet Befehle an den Arduino. Arduino emuliert einen Sensor für den Stellantieb. Der Stellantrieb fragt über I2C den Arduino-Sensor ab und je anch Befehl des LabView soll er andere Werte an den Stellbetrieb senden. Praktisch einen über LabView ferngesteuerten Sensor für den Stellbetrieb.

Grüße Uwe


Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 06, 2018, 06:08 pm
Die "Befehle" kommen vom Stellantrieb (master), als Registernummern. Der Arduino (slave) muß zu jedem Register einen passenden Wert bereithalten, der auf Anfrage zu übertragen ist.

Das Gefasel mit den 4 Bytes verwirrt nur. Der Master sendet (vermutlich) 1 Byte Registernummer, und möchte dann so viele Bytes lesen, wie dieses Register per Definition enthält. Und da scheint es schon bei der Slave-Adresse zu klemmen, die nicht oder nicht richtig gesetzt ist. Dazu ist bislang noch völlig unbekannt, welche Register der Stellantrieb anfordert, und was jeweils als Inhalt des Registers zurückgeschickt werden soll.

Zum Testen der Verbindung würde ich den slave_sender Sketch an den Stellantrieb anpassen, bis die richtige Adresse ermittelt ist. Die steht vermutlich im Datenblatt des Sensors, zusammen mit den Definitionen der Register.
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 07, 2018, 07:15 am
Wer sagt Dir das? Ich gehe genau vom Gegenteil aus.
Mein Vorgesetzter hat gemeint, dass dies durch den Transistor zwischen der USB Buchse und dem 5V Anschluss möglich ist.

Was meinst Du mit Adressen? Ein I2C Slave hat EINE, nur EINE eindeutige Adresse und basta.
Mit der Adresse sind eben die Verschiedenen Registeradressen die der simulierte Sensor, also das was LabVIEW enthält - die verschiedenen Aktionen die der "Stellantrieb" ausführen könnte (also welche Werte er sendet)



Ich glaube das ist eine 3-er-Beziehung:

LabView mit seinem Skript/Programm auf dem PC sendet Befehle an den Arduino. Arduino emuliert einen Sensor für den Stellantieb. Der Stellantrieb fragt über I2C den Arduino-Sensor ab und je anch Befehl des LabView soll er andere Werte an den Stellbetrieb senden. Praktisch einen über LabView ferngesteuerten Sensor für den Stellbetrieb.

Grüße Uwe
So wie DrDiettrich das im nachfolgenden Post erklärt soll es realisiert werden :)



 
Die "Befehle" kommen vom Stellantrieb (master), als Registernummern. Der Arduino (slave) muß zu jedem Register einen passenden Wert bereithalten, der auf Anfrage zu übertragen ist.

Das Gefasel mit den 4 Bytes verwirrt nur. Der Master sendet (vermutlich) 1 Byte Registernummer, und möchte dann so viele Bytes lesen, wie dieses Register per Definition enthält. Und da scheint es schon bei der Slave-Adresse zu klemmen, die nicht oder nicht richtig gesetzt ist. Dazu ist bislang noch völlig unbekannt, welche Register der Stellantrieb anfordert, und was jeweils als Inhalt des Registers zurückgeschickt werden soll.

Zum Testen der Verbindung würde ich den slave_sender Sketch an den Stellantrieb anpassen, bis die richtige Adresse ermittelt ist. Die steht vermutlich im Datenblatt des Sensors, zusammen mit den Definitionen der Register.
Die Datenübertragung ist im Datenblatt beschrieben - ich habe den Auszug mal an den Post drangehängt :)
Mein Stellantrieb soll entweder ein Bit gesetzt (1) oder ein Bit nicht gesetzt (0) oder einen Zahlenwert übergeben bekommen.
Title: Re: I2C - Arduino als Slave
Post by: uwefed on Aug 07, 2018, 07:19 am
Mein Vorgesetzter hat gemeint, dass dies durch den Transistor zwischen der USB Buchse und dem 5V Anschluss möglich ist.
Da sollte Dein Vorgesetzter und Du mal den Schaltplan genau anschauen um zu verstehen wann der Mosfet schaltet.
Grüße Uwe
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 07, 2018, 10:07 am
Nach dem Datenblatt erhält der Master jeweils 2 Bytes pro Register vom Slave übergeben.
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 07, 2018, 10:58 am
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.

Zu meinen Programmen wurde noch nichts geschrieben ...
In diesem Forum wird üblicherweise mittels C++ (siehe I2C Slave Schnittstelle (https://forum.arduino.cc/index.php?topic=561345.msg3827797#msg3827797)) programmiert. Die Grafiken sagen mir leider nichts.
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 07, 2018, 12:00 pm
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!
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 07, 2018, 01:11 pm
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.
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 07, 2018, 01:24 pm
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?
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 07, 2018, 01:29 pm
Bei I2C gibt es keine Baudrate, der Takt wird vom Master geliefert.
Title: Re: I2C - Arduino als Slave
Post by: uwefed on Aug 07, 2018, 01:43 pm
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
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 07, 2018, 01:47 pm
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?

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?
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 07, 2018, 01:52 pm
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:

(https://forum.arduino.cc/index.php?action=dlattach;topic=561969.0;attach=269397)

Die 100kHz ist der Takt bei SCL, den der Master generiert. Das muß bei Dir der Stellantrieb liefern.

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.
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 07, 2018, 02:15 pm
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.
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 07, 2018, 02:27 pm
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:

(https://forum.arduino.cc/index.php?action=dlattach;topic=561969.0;attach=269397)

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 :smiley-slim:
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?



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 :)
http://sine.ni.com/nips/cds/view/p/lang/de/nid/213629
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? :)
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 07, 2018, 03:37 pm
Nein, dazu muß irgendwie noch Arduino Sourcecode gehören.
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 07, 2018, 04:17 pm
Vorbemerkung: Ich kenne LabView nicht.

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.
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 08, 2018, 07:57 am
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.

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:
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  (https://www.adafruit.com/?q=fram)an.

Wie kann ich jedoch auf dem EEPROM zugreifen? Ist dieser auch so konstruiert wie Pins, sodass ich ihm einfach Daten schicken kann?


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 :)
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 08, 2018, 08:22 am
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.

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 :)
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 08, 2018, 08:33 am
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 ;-)
Title: Re: I2C - Arduino als Slave
Post by: ArduFE on Aug 08, 2018, 08:54 am
Also wenn ich die Beschreibung auf der in #30 verlinkten NI Seite lese
Quote
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.
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 08, 2018, 10:48 am
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.

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. -.-
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 08, 2018, 10:52 am
Ich habe leider selbst kein Datenblatt vom Sensor, ...
Meine Meinung: Murks!

Ich habe nur die 3 Blätter, ...
Ich sehe nur ein Blatt :smiley-confuse:

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.
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 08, 2018, 10:57 am
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.
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 08, 2018, 12:49 pm
Da war mal 1 Blatt angehängt, mehr konnte ich nicht finden.
Ah Entschuldigung ich wollte das Gesamte noch mit an den letzten Post anhängen :smiley-sweat:
Jetzt aber :)

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.
Okey danke dann werde ich da mal weitersuchen  :)
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 08, 2018, 04:02 pm
Jetzt aber :)
Geht doch :)

Basierend auf den Programmen, die Dir Serenifly im Thema I2C Datenübertragung (http://forum.arduino.cc/index.php?topic=556227.msg3794257#msg3794257) gezeigt hat, eine Erweiterung mit den Registern aus dem Datenblatt:

Slave:
Code: [Select]
#include <Wire.h>

const byte SLAVE_ADR = 8;
byte index;

union RegisterData
{
  uint16_t r;
  byte b[sizeof(uint16_t)];
};

RegisterData reg[16];


void setup()
{
  Wire.begin(SLAVE_ADR);
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);

  reg[0].r = 0 ; //  01
  reg[1].r = 0 ; //  02
  reg[2].r = 0 ; //  03
  reg[3].r = 0 ; //  04
  reg[4].r = 12000 ; //  05 get temperature
  reg[5].r = 0 ; //  06
  reg[6].r = 0 ; //  07
  reg[7].r = 0 ; //  08
  reg[8].r = 0 ; //  09
  reg[9].r = 0 ; //  10
  reg[10].r = 0 ; //  11
  reg[11].r = 0 ; //  12
  reg[12].r = 0 ; //  13
  reg[13].r = 100 ; //  14 Correction
  reg[14].r = 0 ; //  15
  reg[15].r = 0 ; //  16
}

void loop()
{
}

void receiveEvent(int numBytes)
{
  index = Wire.read();
}

void requestEvent()
{
  Wire.write(reg[index].b, sizeof(RegisterData));
}


Master:
Code: [Select]
#include <Wire.h>

const byte SLAVE_ADR = 8;

union RegisterData
{
  uint16_t r;
  byte b[sizeof(uint16_t)];
};

RegisterData reg[16];


void setup()
{
  Serial.begin(9600);
  Wire.begin();
}

void loop()
{
  for (byte i = 0; i < sizeof(reg) / sizeof(reg[0]); i++)
  {
    getTemp(i);
    Serial.println(reg[i].r);
  }  
  Serial.println();

  delay(2000);
}

void getTemp(byte index)
{
  Wire.beginTransmission(SLAVE_ADR);
  Wire.write(index);
  Wire.endTransmission();

  Wire.requestFrom(SLAVE_ADR, sizeof(RegisterData));
  while (Wire.available())
  {
    for (byte i = 0; i < sizeof(RegisterData); i++)
      reg[index].b[i] = Wire.read();
  }
}


Ob union notwendig ist, bliebe zu hinterfragen, aber ich wollte nah am Vorbild bleiben.

Der Slave muß jetzt "nur" noch um das Holen und Beschreiben von sinnvollen Daten von LabView und sowas wie "trigger for a new measurement" ergänzt werden.

Was Dein Stellantrieb als Master dann davon hält, ist noch mal eine ganz andere Frage.

Möglicherweise wäre ein zweiter Arduino als Master für Dich hilfreich, weil Du da sehen kannst, was ankommt. Wenn zwei Arduinos als Master-Slave-Gespann zusammen funktionieren, kannst Du mit dem Stellantrieb vergleichen. Nur so eine Idee.

EDIT 20180810: Andere Variante der Programme siehe #60.
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 08, 2018, 04:42 pm
An diesen Code muß noch Hand angelegt werden, bis er funktioniert und auch zum Sensor paßt.
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 08, 2018, 05:23 pm
... bis er funktioniert ...
Mit Mega und UNO getestet.
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 08, 2018, 05:39 pm
Deshalb sage ich ja, daß er noch überarbeitet werden muß. Einfach nur zufällig funktionieren ist kein Argument, solchen kaputten Code weiterzuverbreiten :-(
Title: Re: I2C - Arduino als Slave
Post by: postmaster-ino on Aug 08, 2018, 06:42 pm
Hi

Große Worte - besser wäre, gleich damit  rauszurücken, was Dich stört - nur so als dezenter Hinweis - nicht Jeder hier kann in Dein Hirn rein schauen.

MfG
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 08, 2018, 07:03 pm
Code: [Select]
 Wire.requestFrom(SLAVE_ADR, sizeof(RegisterData));
 while (Wire.available())
 {
   for (byte i = 0; i < sizeof(RegisterData); i++)
     reg[index].b[i] = Wire.read();
 }

Was soll hier die while Schleife?
Title: Re: I2C - Arduino als Slave
Post by: Serenifly on Aug 08, 2018, 07:23 pm
Das war von mir. Richtig durchdacht ist das in der Tat nicht :) Sie verhindert vielleicht dass man was einliest wenn requestFrom() fehlschlägt. Und dafür sollte man eher ein if verwenden. Aber ansonsten macht sie nichts. Schadet aber auch nichts. Nach dem ersten Durchlauf ist available() 0 und sie bricht ab
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 08, 2018, 07:26 pm
Wenn mehr oder weniger Bytes ankommen, als in der for Schleife erwartet, dann gibt das furchtbaren Murks :-(
Title: Re: I2C - Arduino als Slave
Post by: Serenifly on Aug 08, 2018, 07:50 pm
Dass sollte aber eigentlich durch das requestFrom() nicht vorkommen. Jedenfalls wenn der Slave richtig programmiert ist. I2C ist da anders als Serial

Aber wie gesagt, kann man durch ein if ersetzen, dann ist etwas besser


Ich glaube ich war da mit dem while der for-Schleife durcheinander gekommen und habe beides gemacht, obwohl man nur eine der beiden Varianten verwenden sollte. Das war nur auf die Schnelle getippt
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 09, 2018, 12:42 pm
Hallo, also ich muss mein Projekt jetzt doch nochmal ein bisschen umschmeißen.
Ich werden die Daten, wie schon besprochen per (virtuellem) COM-Port zum Arduino schicken. Dort dann per I2C zum Stellantrieb.
Jedoch werde ich das mit der Arduino-IDE programmieren.
Ich habe jedoch noch nie mit der Arduino IDE gearbeitet.
Könnt ihr mir daher vorprogrammierte Beispiele von Arduino selbst nennen, die es eben ermöglichen die Daten an den Arduino zu schicken?

Danke!
Title: Re: I2C - Arduino als Slave
Post by: Serenifly on Aug 09, 2018, 12:55 pm
Nein. Das ist viel zu speziell als dass es da was fertiges gibt. Außerdem ist gerade bei der seriellen Schnittstelle der meiste Code den man auf die Schnelle im Internet findet nicht brauchbar wenn man etwas anderes als einen Anfänger-Test braucht

Mit der IDE an sich hat das auch nichts zu tun. Das ist ganz normales C++ mit der Arduino API darüber. Beispiele für die Bibliotheken gibt es. An denen kann man dann verstehen man eine Klasse verwenden muss und passt das an seine eigenen Bedürfnisse an
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 09, 2018, 01:15 pm
Daten können binär oder als Text geschickt werden. Binär werden einfach die gespeicherten Bytes gesendet, empfangen und abgespeichert. Kritisch wird es, wenn die Übertragung aus dem Takt kommt, so daß die Zahlen verwürfelt werden.

Als Text werden die Werte zuerst codiert (printf...), dann übertragen, vom Arduino wieder decodiert und abgespeichert, z.B. mit Serial.parseInt().
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 09, 2018, 01:59 pm
Möglicherweise hilfreicher Lesestoff: How to process incoming serial data without blocking (https://www.gammon.com.au/serial) und RS485 communications (https://www.gammon.com.au/forum/?id=11428) bezogen auf die Art der Kommunikation.
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 09, 2018, 02:31 pm
Möglicherweise hilfreicher Lesestoff: How to process incoming serial data without blocking (https://www.gammon.com.au/serial) und RS485 communications (https://www.gammon.com.au/forum/?id=11428) bezogen auf die Art der Kommunikation.

Ich habe mir die Links mal angeschaut und auch hier im Forum und allgemein im Internet gesucht, aber ich finde nirgends einen Code, der per USB Daten auf den Arduino schickt. Immer nur lesen oder per RS232 Verbindung  :smiley-confuse:

Irgendwo muss es doch aber ein Beispiel dafür geben, weil das doch nicht so selten sein kann, dass man Daten über USB senden will :smiley-eek:

Es ist sinnvoll wenn ich die Daten binäre sende, weil ich ja Messwerte senden will und keinen Text aber ich weiß eben nicht wie ich das realisieren soll :(
Ich würde das jetzt so realisieren, dass ich die Daten über USB in den EEPROM schreibe und diese dann eben bei Anforderung vom Stellantrieb (Master) gelesen werden, weil ich eben nichts finde, dass ich die Daten in den RAM schreiben kann und mein Kollege mir das so empfohlen hat.
Title: Re: I2C - Arduino als Slave
Post by: DrDiettrich on Aug 09, 2018, 03:08 pm
Du suchst falsch :-(

Die USB Übertragung erfolgt über einen virtuellen COM Port, der beim Arduino an Serial hängt (UART). Für USB, RS-232, RS-485 etc. kann also der gleiche Code verwendet werden.
Title: Re: I2C - Arduino als Slave
Post by: Serenifly on Aug 09, 2018, 04:44 pm
weil ich ja Messwerte senden will und keinen Text
Auch hier besteht ein Verständnis-Problem. Binär wird hier einfacher sein, aber Text schließt es nicht aus beliebige Daten zu senden
Title: Re: I2C - Arduino als Slave
Post by: postmaster-ino on Aug 09, 2018, 05:55 pm
Hi

Daten vom PC->Arduino, seriell, trotzdem über das USB-Kabel (wobei das S in USB auch in die Richtung geht).
Eingabe via Terminal-Programm oder Terminal aus der IDE heraus.
Im Arduino wartest Du auf I²C-Ereignisse oder eben Daten auf der Seriellen.
Wenn Daten von der seriellen Schnittstelle eintrudeln, liest Du Diese und speicherst Diese - irgendwo - ab.
Wenn Du schon weißt, daß Du zwei 16bit Zahlen an Werte senden und weitersenden willst, wäre hier eine gute Idee, ein Datenfeld in dieser Größe vorzuhalten.
Wenn jetzt die Anfrage via I²C kommt, werden genau diese Daten aus diesem Datenfeld raus gegeben.

Wenn Du mehrere Datenfelder dieser Größe hast, diesen Speicherplatz öfter einrichten.
Hier muß dann natürlich sowohl Terminal->Arduino wie auch Master->Arduino diese 'Nummer' mit übermitteln.

Bis jetzt Alles kein Hexenwerk.

Was Du aber mit dem EEprom willst, wo eh alle Daten, mit Denen aktuell 'gespielt' wird im RAM vorhanden sind, ist mir nicht klar.

MfG
Title: Re: I2C - Arduino als Slave
Post by: sarah_gru on Aug 10, 2018, 09:38 am
Eingabe via Terminal-Programm oder Terminal aus der IDE heraus.
Im Arduino wartest Du auf I²C-Ereignisse oder eben Daten auf der Seriellen.
Wenn Daten von der seriellen Schnittstelle eintrudeln, liest Du Diese und speicherst Diese - irgendwo - ab.
heißt das, dass ich eigentlich nur den Programmcode von Serial Read brauche oder wie? Also z.B. einfach nur das Programmbeispiel von: https://www.arduino.cc/en/Serial/Read

Wenn Du schon weißt, daß Du zwei 16bit Zahlen an Werte senden und weitersenden willst, wäre hier eine gute Idee, ein Datenfeld in dieser Größe vorzuhalten.
Wie kann ich Datenfelder vorhalten? Ich habe noch nie mit Arduino gearbeitet, deswegen versteh ich da leider definitiv noch viel zu wenig :(

Dankeschön!
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 10, 2018, 10:51 am
heißt das, dass ich eigentlich nur den Programmcode von Serial Read brauche oder wie? Also z.B. einfach nur das Programmbeispiel von: https://www.arduino.cc/en/Serial/Read
Im Prinzip ja. Allerdings willst Du nicht nur ein Byte lesen, sondern mehrere, weil beispielsweise ein Wort ja aus zwei Bytes besteht.

Wie kann ich Datenfelder vorhalten? Ich habe noch nie mit Arduino gearbeitet, deswegen versteh ich da leider definitiv noch viel zu wenig :(
Darum habe ich in #41 ein Beispiel gemacht. Im Slave-Programm ist das Datenfeld reg[16]. In reg[4].r ist die Temperatur von 20°C enthalten.
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 10, 2018, 04:50 pm
Große Worte - besser wäre, gleich damit  rauszurücken, was Dich stört - nur so als dezenter Hinweis - nicht Jeder hier kann in Dein Hirn rein schauen.
Danke :)

Und dafür sollte man eher ein if verwenden.
Mit while, if und ganz ohne funktioniert es.

Nun habe ich mal bei Nick Gammon (http://www.gammon.com.au/i2c) geschaut. Wenn ich das für mich übernehme, kommt dies dabei heraus:

Slave mit Veränderung der Temperatur:
Code: [Select]
#include <Wire.h>

const byte SLAVE_ADR = 8;
byte index;

union RegisterData
{
  uint16_t r;
  byte b[sizeof(uint16_t)];
};

RegisterData reg[16];


void setup()
{
  Serial.begin(9600);
  Serial.setTimeout(10);
  Serial.println(F("Temperatur eingeben"));
  Wire.begin(SLAVE_ADR);
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);

  reg[0].r = 0 ; //  01
  reg[1].r = 0 ; //  02
  reg[2].r = 0 ; //  03
  reg[3].r = 0 ; //  04
  reg[4].r = 12000 ; //  05 get temperature
  reg[5].r = 0 ; //  06
  reg[6].r = 0 ; //  07
  reg[7].r = 0 ; //  08
  reg[8].r = 0 ; //  09
  reg[9].r = 0 ; //  10
  reg[10].r = 0 ; //  11
  reg[11].r = 0 ; //  12
  reg[12].r = 0 ; //  13
  reg[13].r = 100 ; //  14 Correction
  reg[14].r = 0 ; //  15
  reg[15].r = 0 ; //  16
}

void loop()
{
  if (Serial.available())
  {
    reg[4].r = Serial.parseInt() * 100 + 10000;
  }
}

void receiveEvent(int numBytes)
{
  for (byte j = 0; j < numBytes; j++)
  {
    index = Wire.read();
  }
}

void requestEvent()
{
  Wire.write(reg[index].b, sizeof(RegisterData));
}

Master:
Code: [Select]
#include <Wire.h>

const byte SLAVE_ADR = 8;

union RegisterData
{
  uint16_t r;
  byte b[sizeof(uint16_t)];
};

RegisterData reg[16];


void setup()
{
  Serial.begin(9600);
  Wire.begin();
}

void loop()
{
  for (byte i = 0; i < sizeof(reg) / sizeof(reg[0]); i++)
  {
    getTemp(i);
    Serial.println(reg[i].r);
  }
  Serial.println();

  delay(2000);
}

void getTemp(byte index)
{
  Wire.beginTransmission(SLAVE_ADR);
  Wire.write(index);
  Wire.endTransmission();

  if (Wire.requestFrom(SLAVE_ADR, sizeof(RegisterData)))
  {
    for (byte i = 0; i < sizeof(RegisterData); i++)
      reg[index].b[i] = Wire.read();
  }
  while (Wire.available () > 0)
    Wire.read ();  // Fehler: zu viele Daten, daher Daten wegwerfen
}
Title: Re: I2C - Arduino als Slave
Post by: Serenifly on Aug 10, 2018, 04:59 pm
Wenn man parseInt() verwendet, dann sollte man auch setTimeOut() auf was vernünftiges anpassen. Sonst wartet man bei jeder Eingabe eine ganze Sekunde
Title: Re: I2C - Arduino als Slave
Post by: agmue on Aug 10, 2018, 09:20 pm
Danke für den Hinweis, habe ich ergänzt. Wobei ich mich frage, welcher Wert da sinnvoll ist. Bei 115200 Baud funktioniert bei einer zweistelligen Zahl der Wert 1 (=1 ms), bei 9600 Baud ist 10 besser.

Für dieses Thema dürfte parseInt() allerdings nur für den schnellen Test mit dem seriellen Monitor und nicht für die Kommunikation mit dem PC von Interesse sein.