Forum: Mikrocontroller und Digitale Elektronik I2C Leitung aktiv oder inaktiv Arduino


von angie123 (Gast)


Lesenswert?

Hallo,

ich habe einmal eine Frage. Gibt für den Arduino irgendein Befehl mit 
dem man erkennen kann, ob die I2C Leitung aktiv bzw. inaktiv ist?

Beste Grüße

von Walter T. (nicolas)


Lesenswert?

Ja. Da eine inaktive I2C-Leitung immer +5V hat, lautet der Befehlt 
einfach "digitalRead()".

von Einer K. (Gast)


Lesenswert?

angie123 schrieb:
> ich habe einmal eine Frage. Gibt für den Arduino irgendein Befehl mit
> dem man erkennen kann, ob die I2C Leitung aktiv bzw. inaktiv ist?

Welches Problem plagt dich, dass du auf eine solche (abwegige?) Frage 
kommst...?
Denn in der Arduino Welt ist (in der Regel) Wire für I2C zuständig.
Also auch dafür, ob der Bus belegt ist oder nicht.

von Stefan F. (Gast)


Lesenswert?

Einfach nur den Pegel abzufragen, genügt nicht, da die Leitungen bei 
Aktivität pulsieren.

Man müsste schon beobachten, ob beide Leitungen eine gewisse Zeit lang 
auf High Pegel bleiben. Aber wenn du dann sagt "ok, sie ist frei, jetzt 
darf ich mal ran", besteht die Möglichkeit, dass die Schnittstelle genau 
in diesem Moment doch nicht mehr frei ist.

Man müsste schon sicherstellen, dass kein anderer Prozess läuft, der sie 
potentiell belegen könnte - also auch alle Interrupts sperren. Nur: Wenn 
es nur einen Prozess gibt, dann weiß der bereits, was er tut und muss es 
nicht abfragen oder antesten.

Also: Worum geht es wirklich? Lege die Karten offen auf den Tisch!

von angie123 (Gast)


Lesenswert?

Ich arbeite auch mit der Wire Bibliothek, aber ich finde kein Befehl 
bzw. ich weiß nicht wie man die Frage im Programm umsetzt, ob die I2C 
Leitung frei ist.

Ich habe ein Reader entwickelt der Smart Batterien ausliest. Ich möchten 
diesen Reader nun zwischen Batterie und Verbraucher schalten. Die beiden 
Anschlüsse sind einfach nur parallel geschaltet. Das Problem ist das 
Verbraucher auch mit der Batterie kommuniziert. Deswegen will ich die 
Batterie nur auslesen, wenn die Leitung frei ist.

von Olaf (Gast)


Lesenswert?

> Ich möchten diesen Reader nun zwischen Batterie und Verbraucher schalten.

Das geht nur wenn der andere Master im System Multimasterfaehig ist und 
das will ich mal bezweifeln. Dein Problem ist also nicht loesbar.

Olaf

von Einer K. (Gast)


Lesenswert?

angie123 schrieb:
> aber ich finde kein Befehl
> bzw. ich weiß nicht wie man die Frage im Programm umsetzt, ob die I2C
> Leitung frei ist.

Dass ist richtig, denn einen solchen "Befehl" gibt es nicht.
Ist auch nicht nötig.

angie123 schrieb:
> Deswegen will ich die
> Batterie nur auslesen, wenn die Leitung frei ist.
Arduino Wire kann den Multimaster Betrieb auf dem I2C Bus 
bedienen/abhandeln.

Also: Ich sehe dein Problem nicht.

von angie123 (Gast)


Lesenswert?

Wie genau funktioniert es denn mit den Multi Master betrieb? Was muss 
ich dafür in den Code integrieren?

von Stefan F. (Gast)


Lesenswert?

angie123 schrieb:
> Wie genau funktioniert es denn mit den Multi Master betrieb? Was muss
> ich dafür in den Code integrieren?

Du musst erstmal herausfinden, ob das Gerät, dass du da anzapfen willst, 
den Multi-Master Modus überhaupt unterstützt. Ich schätze zu 99%, dass 
dies nicht der Fall ist und dein Vorhaben damit schon gestorben ist. Und 
wenn du das gar nicht herausfinden kannst, dann ist es schon zu 100% 
gestorben.

von Einer K. (Gast)


Lesenswert?

angie123 schrieb:
> Wie genau funktioniert es denn mit den Multi Master betrieb? Was muss
> ich dafür in den Code integrieren?

Um Race Conditions in Multimaster Umgebungen zu vermeiden haben einige 
Wire Methoden den stop Parameter.
- Wire.endTransmission(stop)
- Wire.requestFrom(address, quantity, stop)
Setzt man diesen auf false, dann kann sich kein anderer Master zwischen 
zwei Zugriffe, auf ein und denselben Baustein, drängeln. Der Bus bleibt 
belegt.

Dein letztes Kommando sollte dann den Bus "los lassen".

von K. S. (the_yrr)


Lesenswert?

logic analyzer und mal sehen was da so abgeht auf dem Bus

eventuell reicht es passiv mitzulesen und die info einfach zu dekodieren

eventuell ließt der Verbraucher regelmäßig aus, z.b. ein mal die 
Sekunde, und du kannst immer kurz nachdem der fertig ist selber lesen, 
sollte den anderen  Master nicht stören.

von K. S. (the_yrr)


Lesenswert?

Arduino Fanboy D. schrieb:
> Setzt man diesen auf false, dann kann sich kein anderer Master zwischen
> zwei Zugriffe, auf ein und denselben Baustein, drängeln. Der Bus bleibt
> belegt.

Problem ist, wenn der andere Master das genau so macht, kommt nur Müll 
am Ende raus, da sich Beide gegenseitig Überschreiben. Wenn der 
Verbraucher garnicht guckt ob da bereits was läuft, wird auch SCL 
doppelt getrieben und das Signal ist kein gültiges IIC mehr, dann kann 
alles passieren, inkl zufällige befehle ausführen oder Slave stürzt ab. 
Einer (am besten beide) Master müssen arbitration erkennen und auf jeden 
Fall sowohl Clock stretching als auch einen belegten Bus.

Der Name ist hier wohl Programm, guck dir mal an wie so ein IIC Bus 
aufgebaut ist, da kannst du tausende Master anklemmen, solange die sich 
gegenseitig ignorieren kommt halt nur Müll raus. Und genau das ist mehr 
oder weniger was der Befehl tut, denn den Bus für andere Master sperren 
geht halt einfach nicht.

alternativ muss halt das Timing des Verbraucher Masters genau bekannt 
sein, dann kann man in den Pausen den Bus nutzen.

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

K. S. schrieb:
> Problem ist, wenn der andere Master das genau so macht, kommt nur Müll
> am Ende raus,
Das Gegenteil ist der Fall!


Arduino Fanboy D. schrieb:
> - Wire.endTransmission(stop)
> - Wire.requestFrom(address, quantity, stop)
Beide senden eine "repeated start condition" wenn stop == false

Tipp:
Mein Name hat nichts damit zu tun, ob du das verstehst, oder auch nicht.


Lesestoff:
https://www.i2c-bus.org/repeated-start-condition/

von K. S. (the_yrr)


Lesenswert?

Mir ging es um folgenden Fall
- bestehender Master ist nicht multi-Master fähig, hat keine arbitration 
erkennung
- selbst programmierter Master beginnt zuerst zu Senden

dann sendet der bestehende Master einfach in die laufende Übertragung 
rein, und das wird kaum möglich zu erkennen, und selbst wenn es erkannt 
wird, wird mitten in der Übertragung kein neuer Start möglich sein.

Du hast insoweit Recht, dass dein Vorschlag hilft wenn der Verbraucher 
MultiMaster fähig ist. Wenn der Bus sowas wie ein SMBus ist, dann sollte 
das gehen. Kann nur leider keiner hier sagen, inklusive dem TE. aber mal 
ne Info dazu was das für Geräte sind könnte helfen.

von Einer K. (Gast)


Lesenswert?

K. S. schrieb:
> - bestehender Master ist nicht multi-Master fähig,

Dann ist das Vorhaben sowieso zum scheitern verurteilt.
Da hilft dann auch kein "Bus beobachten".
Die taube Nuss kann jederzeit dazwischen quatschen.

Dann wird man sich nach anderen Wegen umsehen müssen.

von Walter T. (nicolas)


Lesenswert?

Arduino Fanboy D. schrieb:
> Dann ist das Vorhaben sowieso zum scheitern verurteilt.

Nicht zwangsläufig. In einem Autoradio habe ich mal einen kleinen Lügner 
(ATTiny88 glaube ich) in die I2C-Leitung zwischen Bedienteil und 
Audioquellen-Umschalt-Misch-und-Equalizer-IC gemacht, um den AUX-Eingang 
nutzen zu können, was bei meiner Radio-Variante nicht vorgesehen war. Im 
Normalfall leitet man den I2C einfach durch, im Lügen-Fall manipuliert 
man die Datentelegramme. Zum Glück hat der Bedienteil-Prozessor extremes 
Clock-Stretching akzeptiert.

von Einer K. (Gast)


Lesenswert?

Walter T. schrieb:
> Nicht zwangsläufig. In einem Autoradio habe ich mal einen kleinen Lügner
> (ATTiny88 glaube ich) in die I2C-Leitung zwischen Bedienteil und
> Audioquellen-Umschalt-Misch-und-Equalizer-IC gemacht,

Eben...

Ist aber hier erstmal von den Voraussetzungen ausgeschlossen worden.
Siehe:
angie123 schrieb:
> Die beiden Anschlüsse sind einfach nur parallel geschaltet.
Wobei man das evtl ändern könnte....
Was ich dann auch mit "andere Wege" meinte.

von Peter D. (peda)


Lesenswert?

angie123 schrieb:
> Ich möchten
> diesen Reader nun zwischen Batterie und Verbraucher schalten.

Eine Möglichkeit wäre, den AVR als I2C-Slave die Batterie simulieren zu 
lassen. Er selber fragt als SW-I2C die Batterie ab und speichert die 
Werte zwischen.

angie123 schrieb:
> Die beiden
> Anschlüsse sind einfach nur parallel geschaltet.

Das geht dann nicht, der AVR muß dazwischen hängen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.