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
Ja. Da eine inaktive I2C-Leitung immer +5V hat, lautet der Befehlt einfach "digitalRead()".
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.
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!
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.
> 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
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.
Wie genau funktioniert es denn mit den Multi Master betrieb? Was muss ich dafür in den Code integrieren?
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.
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".
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.
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
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/
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.