Go Down

Topic: Arduinos finden sich nicht über I2C (Read 4037 times) previous topic - next topic

schUk0

Sketch niemals als Foto posten, das liest keiner durch.

Hatte ich auch nicht vor... aber schon der eine Sketch überschreitet die 9000 Character Grenze.

Und, dass man dann auch jedesmal 5 Minuten warten muss ist die Kische on Top :P

Tommy56

Was der erste Code (Sensor) soll, ist mir noch nicht klar. Der sieht ebenfalls nach Master aus. Soll das Multimaster werden?
Ansonsten befeuert der 2. Master den Slave ungebremst. Das sollte wohl nicht so sein.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

HotSystems

#17
Feb 18, 2017, 04:21 pm Last Edit: Feb 18, 2017, 04:22 pm by HotSystems
Hatte ich auch nicht vor..
Sorry, das hatte ich so verstanden.

Jetzt wird es aber kompliziert. ;)

Du solltest deine Sketche so aufbauen, dass du nur einen Master hast und dieser fordert die Daten der einzelnen Slaves an.
Anders wird es gehen, aber kompliziert.
Wenn ein Slave vorrangig seine Daten senden soll, dann musst du es mit einem Interrupt lösen.
,
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

schUk0

Hatte oben im Code extra rein geschrieben welcher der I2C Master und welcher der Slave sein soll.

Das "Problem" ist nur, dass das, was für mich der Master ist, für I2C jetzt erstmal der Slave ist.

Schwer zu durchschauen...ich weiß.

Mein Master (I2C Slave) empfänt die die Daten von meinem Slave (I2C Master).

Du solltest deine Sketche so aufbauen, dass du nur einen Master hast und dieser fordert die Daten der einzelnen Slaves an.

So ist es auch.

Gruß

schUk0

HotSystems

So ist es auch.

Das sehe ich nicht.
Du solltest deinen Master auch als I2C-Master machen und die Slave-Daten abfragen.
Also jeden einzelnen Slave ansprechen und Daten holen.
Das ist erst mal einfacher.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

schUk0

Das sehe ich nicht.
Du solltest deinen Master auch als I2C-Master machen und die Slave-Daten abfragen.
Also jeden einzelnen Slave ansprechen und Daten holen.
Das ist erst mal einfacher.

Ich will echt nicht unhöflich sein, aber wenn immer der gesamte Code verlangt wird. Dann sollte man ihn sich auch komplett ansehen.

Ich habe bereits 2 mal klar gemacht welches aus der I2C Perspektive der Master und welches der Slave ist.

Und wenn ich an irgend einer Stelle einen Fehler gemacht habe, dann sei bitte so nett und zeige mir diese.

Es sind >WAHRSCHEINLICH< nur nur 2 Sketches entscheidend.

Der vom Mega (I2C Slave)

Und der vom Sensor Nano (I2C Master)





Der Pulsgeber erzeugt nur die Pulse, die im Sensor Nano gemessen werden.

Die restlichen beiden Sketche sind die funktionierenden Testsketche als Vergleich.
Denn alles was in diesen steht, steht auch genauso in den entscheidenden Sketchen.


Trotzdem Danke für die Aufmerksamkeit.
Ich will keinen verschrecken, aber wir kümmern uns hier um Probleme, die keine sind.
Und schriftlich lässt sich der "Ton" immer ein bisschen schwierig darstellen  :)

HotSystems

#21
Feb 18, 2017, 05:00 pm Last Edit: Feb 18, 2017, 10:14 pm by uwefed
Ich will echt nicht unhöflich sein, aber wenn immer der gesamte Code verlangt wird. Dann sollte man ihn sich auch komplett ansehen.

Ich habe bereits 2 mal klar gemacht welches aus der I2C Perspektive der Master und welches der Slave ist.

Und wenn ich an irgend einer Stelle einen Fehler gemacht habe, dann sei bitte so nett und zeige mir diese.

Es sind >WAHRSCHEINLICH< nur nur 2 Sketches entscheidend.

Der vom Mega (I2C Slave)

Und der vom Sensor Nano (I2C Master)
Da du deine Sketche besser kennstals wir, ist es für dich auch einfacher zu durchblicken.

Wenn du mich aber nicht verstehst, brauchst du auch nicht unhöflich werden, also weiß ich nicht was das soll.

Quote
Der Pulsgeber erzeugt nur die Pulse, die im Sensor Nano gemessen werden.

Die restlichen beiden Sketche sind die funktionierenden Testsketche als Vergleich.
Denn alles was in diesen steht, steht auch genauso in den entscheidenden Sketchen.


Trotzdem Danke für die Aufmerksamkeit.
Ich will keinen verschrecken, aber wir kümmern uns hier um Probleme, die keine sind.
Und schriftlich lässt sich der "Ton" immer ein bisschen schwierig darstellen  :)

Wenn du hier keine Probleme hast, frage ich mich, warum du hier bist.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

schUk0

Da du deine Sketche besser kennstals wir, ist es für dich auch einfacher zu durchblicken.

Kann ich mir vorstellen ^^ .



Wenn du mich aber nicht verstehst, brauchst du auch nicht unhöflich werden, also weiß ich nicht was das soll.
Wenn du hier keine Probleme hast, frage ich mich, warum du hier bist.


Ich verstehe schon was du meinst.
Ich habe nur (vielleicht etwas unglücklich) versucht klar zu machen, dass ich genau das, was du gesagt hast bereits getan habe.

Der Mega fragt die Daten vom Nano ab.

Also muss meiner Meinung nach in diesen Sketchen der Wurm drin sein. Und ich versuche ihn ja parallel auch zu finden.

Wenn ich jetzt die entscheidenden Teile einzeln rausfilter, dann stehen wir wieder mit dem Testsketch da, der ja funktioniert.

Und die Probleme die keine sind, bezogen sich auf die Frage ob es mehere Master gibt oder ob ich versuche mit dem Slave zum Master zu sprechen.
Diese Probleme gibt es nicht, weil ich so überhaupt nicht vorgegangen bin.
Und wenn dann nicht bewusst.
Aber dann bräuchte ich auch die Stelle an der dieser Fehler auftritt, denn ich finde sie nicht.

Ich wollte es mir hier nicht gleich mit allen verscherzen, aber ich hatte die Befürchtung, dass die Fehlersuche in eine, meiner Meinung nach, falsche Richtung läuft.

Also sorry dafür, dass sich jemand auf den Schlips getreten fühlt :smiley-sweat:

Gruß

schUk0


HotSystems

#23
Feb 18, 2017, 05:35 pm Last Edit: Feb 18, 2017, 05:36 pm by HotSystems
Kein Problem, da ich aktuell keinen Schlips trage, fühle ich mich auch nicht draufgetreten.

Aber nochmal zur besseren Erklärung:

In deinem I2C-Master vermisse ich ein "Wire.beginTransmission(x);" und ein "Wire.requestFrom(x, n);".

Erstere sendet einen Anforderung an den Slave, zweites liest die ankommenden Daten.
Und das musst du für alle Slaves machen.

Mit einem "Wire.onReceive(receiveEvent);" wirst du da nichts.

Siehe auch in der verlinkten Beschreibung den letzten Master.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Tommy56

Ich glaube da ist auch noch ein Verständnisproblem Master/Slave.

Der Mega wird als Master bezeichnet, fungiert aber als I2C-Slave. Er bekommt die Daten vom Nano (I2C-Slave) hin geknallt, egal ob er Zeit hat sie zu verarbeiten oder nicht. Besonders während der Delay(2000) kann er nichts verarbeiten. Nach weiteren Delays habe ich nicht gesucht.

Das Master-/Slavekonstrukt hat auch den Sinn, dass der funktionelle Master (der Mega) als I2C-Master, der er nicht ist, die Daten anfordert, wenn es in seinem Ablauf sinnvoll ist. Der Sensor-Nano hat die aktuellen Werte vorrätig und sendet sie auf Anforderung.
Deinen Puls-Nano, der auch als I2C-Master aufgebaut ist, kann auch als Störquelle die Übertragung beeinflussen.

Ich würde an Deiner Stelle nochmal die I2C-Master/Slaveverteilung überdenken und natürlich alle Delays raus, die länger als 5 sind bzw. alle, je nach Stelle.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

schUk0

Kein Problem, da ich aktuell keinen Schlips trage, fühle ich mich auch nicht draufgetreten.

Is ja auch Wochenende :smiley-cool:

In deinem I2C-Master vermisse ich ein "Wire.beginTransmission(x);

Funktion:
Code: [Select]

void sendRPM(int x){
  Wire.beginTransmission(slaveAddress);  // begin transmission to slave device
  Wire.write(x & 0xff);       // send first byte
  Wire.write(x >> 8);         // send second byte shiftet by 8 bits
  Wire.endTransmission();     // stop transmitting
}



Aufruf:
Code: [Select]

//calculate the RPM
  if (ignitionCount > 20){
       
    detachInterrupt(digitalPinToInterrupt(interPin1));//Disable interrupt when calculating
   
    fCrank = (1/(((millis()-t)/ignitionCount)/1000.0));
    rpm = fCrank * 60;
    ignitionCount = 0;
   
//    Serial.print("Crank frequency  ");
//    Serial.println(fCrank);
//    Serial.print("RPM  ");
//    Serial.println(rpm);
//    Serial.println("-------------");
   
    sendRPM(rpm);     ////////////////////////////// <-DA
 

    //drive the LED-Bar
    val = map(rpm, 0, 12000, 0, 8);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, data[val]);
    digitalWrite(latchPin, HIGH);

       
    attachInterrupt(digitalPinToInterrupt(interPin1),isIgnition,RISING);
    t=millis();
  }


Der Mega wird als Master bezeichnet, fungiert aber als I2C-Slave. Er bekommt die Daten vom Nano (I2C-Slave) hin geknallt, egal ob er Zeit hat sie zu verarbeiten oder nicht. Besonders während der Delay(2000) kann er nichts verarbeiten. Nach weiteren Delays habe ich nicht gesucht.

Guter Einwand.
Das Delay ist übrigens weit und breit das einzige und ist nur dafür da, den Intro-Screen lange genug zu erhalten um ihn zu sehen :D
Diese if Schleife (?) wird, bedingt durch state = false; danach auch nie wieder durchlaufen.

Und in dem Pulsgeber ist nichtmal die Wire.h eingebunden.
Geschweige denn entsprechnder Code vorhanden.
Noch dazu ist er nicht an den I2C Bus angeschlossen, sondern direkt an die Interrupt-Pins vom Sensor.


Ich habe inzwischen auch neue Erkenntnisse.
Die U8g.lib scheint die Wurzel allen Übels zu sein.
Aber ich kann dazu noch nichts definitives sagen...bin noch am testen.

Da ich aber zum jetzigen Zeitpunkt bereits Daten auf dem Mega erhalte und auch auf dem Display dargestellt kriege kann man sagen, dass die Kommunikation also möglich ist.
Allerdings noch sehr hakelig.

Werde mich gleich nochmal melden.

Gruß

schUk0

schUk0

Das hat jetzt zumindest schon mal dazu geführt, dass mir der Wert übertragen und auf dem Display angezeigt wird.

Code: [Select]

if (state == false) {
  u8g.firstPage();
    do {
     draw();           
    }   
  while ( u8g.nextPage() );
    Wire.begin(2);       
  }


Hatte irgendwo gelesen, dass die U8g.lib den I2C Bus irgendwie für sich beansprucht und danach nicht mehr freigibt...
Also muss man das selber einleiten.


Ok..

Gehen wir die Sache mal anders an.

Der Sensor macht so Sensor Sachen und sollte / möchte dabei auch möglichst nicht gestört werden.
Er soll nur ab und an 2 Werte an den Mega senden... Sagen wir mal alle 100 ms.

Der Mega soll das ganze nun grafisch darstellen und vielleicht auch noch andere Berechnungen mit den erhalten Werten machen, die nicht so zeitkritisch sind.

Beides alleine funktioniert eigentlich ganz gut.

Wie übertrage ich nun am besten diese 2 Werte ?


Ich hänge da jetzt schon 2 Tage dran und hätte eigentlich noch ganz andere Sachen am Projekt zu erledigen.
Aber bevor ich das nicht habe brauche ich gar nicht über andere Sachen nachdenken.

Vielleicht ist ja I2C auch nicht die beste Lösung...ich weiß es nicht.


Gruß

schUk0

agmue

#27
Feb 18, 2017, 07:19 pm Last Edit: Feb 18, 2017, 07:30 pm by agmue
Wie übertrage ich nun am besten diese 2 Werte ?
Welchen Typ haben die Werte?

Lesetipp, wobei union data_u der springende Punkt ist.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Tommy56

Wie ich schon mehrfach gesagt habe, der Mega muss die Daten anfordern, wenn er Zeit hat und wenn er nicht gerade das Display aktialisiert. Sonst sendet er zum Display und gleichzeitig der Sensornano zum Mega auf den gleichen Leitungen.
Das ignorierst Du aber immer. Dann wirst Du die Probleme auch nicht los werden.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

schUk0

Welchen Typ haben die Werte?
int

Einmal 3-stellig (bis 255 würde reichen)

und einmal 5-Stellig (da wäre ich mit 20000 zufrieden)

Wie ich schon mehrfach gesagt habe, der Mega muss die Daten anfordern, wenn er Zeit hat und wenn er nicht gerade das Display aktialisiert. Sonst sendet er zum Display und gleichzeitig der Sensornano zum Mega auf den gleichen Leitungen.
Das ignorierst Du aber immer. Dann wirst Du die Probleme auch nicht los werden.
Ich versuche natürlich nichts zu ignorieren.
Scheinbar stehe ich aber grad etwas auf dem Schlauch weil es mich nervt, dass ich an so nem scheinbar banalen Sch***ß festhänge.

Aber ich glaube jetzt hab ich kapiert was du meinst.
Den Mega zum Master machen und damit die Werte vom Sensor anfordern.
Der muss diese dann auf Anfrage senden.

In der Einführung in den I2C Bus war das aber so erklärt, dass die Messung auch erst auf Anfrage durchgeführt wird.
Das fänd ich eher blöd .
Ich werd mich trotzdem mal ran machen.

Das oberste Ziel ist es, die Darstellung trotzdem möglichst (für das menschliche Auge) flüssig zu halten.
Sollte das damit noch klappen?



Und vielen Dank für eure Geduld :D


Gruß

schUk0

Go Up