Moin aus Bremen,
ich arbeite gerade an einem Bastelprojekt, bei dem ich aktuell nicht
wirklich weiterkomme. Ich komme aus der IT-Branche und habe grundlegende
Kenntnisse zum Thema Arduino und Programmieren desselben, dann hört es
jedoch schon auf.
Ich habe mal einen mit meinem Oszilloskop erfassten "Datenaustausch"
zwischen zwei Komponenten angehängt. Es geht in diesem Fall um einen an
den Slave versendeten Befehl. Statt des original-Slaves möchte ich in
meinem Fall einen Arduino anschließen, welcher dem Master das
erforderliche "ack" sendet und dann die gesendeten Datenbytes auswertet
(um sie dann über eine SPI-Schnittstelle weiterzusenden - aber das soll
hier nicht das Thema sein).
Ich habe mich nun schon viele Stunden mit dem Fall und dem Arduino mit
der wire-library beschäftigt (sniffer ausprobiert, arduino als slave mit
der Adresse 40/80,...) bekomme jedoch keine Reaktion vom Arduino. Habt
ihr vielleicht irgendeinen Rat für mich? Ist der Bustakt von nur ca
866Hz evtl das Problem?
Vielen Dank schonmal...
Also du möchtest, dass deinen Arduino als I2C-Slave einsetzen?
Das beste wäre, wenn du den zugehörigen Code den du geschrieben hast
postest. Das Oszillogramm ist schön, da kann man erstmal nichts falsches
entdecken, ohne den zugehörigen Code allerdings auch nichts aussagen.
Außerdem wäre es wichtig zu wissen welche Hardware (welche Teilnehmer,
welche Arduino usw.) im Einsatz ist.
I2C Takt wird vom Master vorgegeben, also nicht von deinem Slave ...
Hi,
Wie es beim Arduino ist weiß ich zwar nicht, aber prinzipiell sollte ein
I2C-Slave mit beliebig langsamem Takt zurechtkommen. Ich denke daher
dass es sehr wahrscheinlich nicht am Takt liegt, sondern irgendwo
anders...
Hast Du die Signale auch mal mit dem Oszi aufgenommen, und ist da das
erste Byte genauso wie oben, nur dass das ACK fehlt?
Ansonsten wäre noch ein Versuch, den Arduino-Slave mal mit einem anderen
I2C-Master anzusprechen, um zu sehen ob der ein prinzipielles Problem
hat oder es nur mit diesem Master nicht funktioniert.
Ist es jetz I2C oder nicht? Weil du in der Überschrift von I2C-ähnlichem
Signal schreibst...
Falls es echtes I2C ist: Hast du ein Datenblatt zu dem "originalen"
Slave?
Dort könnte eine mögliche "Mindesttaktrate" stehn, genauso die korrekte
Adresse.
So, habe mich nun auch mal angemeldet hier. Danke schonmal für die
Antworten!
Markus S. schrieb:> Ist es jetz I2C oder nicht? Weil du in der Überschrift von I2C-ähnlichem> Signal schreibst...>> Falls es echtes I2C ist: Hast du ein Datenblatt zu dem "originalen"> Slave?> Dort könnte eine mögliche "Mindesttaktrate" stehn, genauso die korrekte> Adresse.
Ich bin mir nicht sicher ob das wirklich i2c ist, lt meinem Oszi sieht
der Start ja etwas anders aus (data und clock gehen gleichzeitig auf 0,
nicht data zuerst wie in den i2c spezifikationen beschrieben) - aber
ansonsten sieht es schon sehr danach aus.
Der originale Slave ist ein D78P014-Microcontroller von NEC. Ich habe
mir das Datenblatt zwar angeschaut, aber bin ehrlich gesagt mit den
ganzen Informationen absolut überfordert...
mrdelphi: Genau, ich habe den Arduino als Slave programmiert und da
sieht alles so aus wie in meinem Foto, nur dass halt kein Ack kommt -
und daher der Master dann abbricht und das ganze mehrfach wiederholt.
Wenn ich einen i2c-Sniffer baue (diverse Versionen aus dem Netz
ausprobiert) kommt ebenfalls keine Reaktion - als wäre der Bus tot, aber
im Oszi sieht man, dass dies nicht so ist.
Test: Der Oszi-Mitschnitt ist nicht mit Arduino aufgenommen, sondern mit
original Master und Slave. Mit dem Arduino habe ich einen Beispielsketch
der Wire-library (slave_receiver) genommen und lediglich die Adresse
geändert, in der Annahme, dass dann zumindest automatisch die Ack-bits
gesetzt werden. Leider ohne Erfolg...
Dennis M. schrieb:> Ich bin mir nicht sicher ob das wirklich i2c ist, lt meinem Oszi sieht> der Start ja etwas anders aus (data und clock gehen gleichzeitig auf 0,> nicht data zuerst wie in den i2c spezifikationen beschrieben) - aber> ansonsten sieht es schon sehr danach aus.
Hmm, da könnte in der Tat der Hund begraben liegen... bei I2C gibt es ja
die Start Condition (und Stop Condition, aber die ist hier erstmal nicht
relevant), weiß jetzt nicht auswendig wie die aussieht, aber evtl ist
die nicht erfüllt durch dieses leicht andere Verhalten?
In dem Fall reagieren normale I2C-Slaves dann nicht, auch wenn die
Adresse passen würde. Die Start Condition gibt sozusagen den Startschuss
dass der Slave überhaupt weiter "zuhört"...
Evtl. kann man den Start nochmal mit höherer zeitlicher Auflösung
aufnehmen... Die zeitliche Verzögerung muss nicht um eine halbe Taktrate
verschoben sein, da reichen auch 10us...
Gruss Chregu
Dennis M. schrieb:> data und clock gehen gleichzeitig auf 0
Ob das wirklich gleichzeitig ist, kann man bei der horizontalen
Auflösung nicht erkennen.
Wenn alle Stricke reißen magst du es vielleicht ohne Arduino Framework
umsetzen. Hier sind zwei umfangreich kommentierte Varianten mit der USI
Schnittstelle vom ATtiny:
http://stefanfrings.de/servocontroller/index.html
Da hast du selber die Kontrolle darüber, wie du die Start Condition
erkennst.