Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage I2C - Python


von Chris M. (chris_appment)


Lesenswert?

Moin,

folgende Frage bzw. Szenario.
Ich programmiere an meinem Raspberry mit Python und der SMBus-Library 
den I2C-Bus.
Ich habe zum Beispiel einen Temperatursensor und einen 
Feuchtigkeitssensor.
Die Temperaturwerte möchte ich alle 5 Sekunden, die Feuchtigkeit alle 10 
Sekunden abfragen.
Das ganze mache ich über 2 parallel laufende Dauerschleifen.
(Nur als Beispiel - mir ist klar, dass man das Szenario auch anders 
lösen könnte)
Jetzt die eigentliche Frage:
Würde ich bei jeder 2. Abfrage meinen I2C-Bus "überlasten", da ich im 
exakt gleichen Moment 2 Anfragen auf den Bus haue?
Gibt es in Python eine Art boolsche Methode, um zu schauen, ob der Bus 
derzeit arbeitet, wie z.B.
1
if bus.isBusy() == true:
2
     time.sleep(0.01)

oder wartet der Raspi sogar von alleine, solange bis eine Abfrage 
getätigt wurde und der Bus wieder frei ist?

Finde leider keine Dokumentation, die mir diese Frage beantwortet, bzw. 
fehlen mir vielleicht die richtigen Suchbegriffe.

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

Chris M. schrieb:
> Finde leider keine Dokumentation, die mir diese Frage beantwortet, bzw.
> fehlen mir vielleicht die richtigen Suchbegriffe.

Mach dir doch zu allererst klar, wie der I2C überhaupt funktioniert. 
Dort kann es mehrere Master geben, also muß ein Master, der "dran" 
sein will, warten, bis kein anderer Master den Bus mehr besitzt. Dann 
kann der eine Start-Kondition veranstalten und dann sollte er auch den 
Slave, mit dem er kommunizieren will, adressieren und zusehen, ob der 
ihm ein ACK gibt. Anschließend kann er mit dem Slave nach Herzenslust 
kommunizieren und zum Schluß mit einer Stop-Kondition den I2C wieder 
freigeben.

So. Und nun informiere dich, wie der Raspberry sich am I2C denn so 
benimmt. EInes sollte dir klar sein: Mit einer interruptgesteuerten oder 
in verschiedene Threads aufgeteilten Software wirst du immer Probleme 
haben, den I2C zu benutzen - solange du nicht software-intern dafür 
sorgst, daß sich diese Threads o.ä. am I2C nicht in die Quere kommen.

Für deine Software würde ich dir raten, selbige eben nicht in 
unterschiedliche Trampel-Dauerschleifen aufzuteilen, sondern mit Events 
zu arbeiten. Dann entfallen nämlich diese Dauerschleifen ersatzlos und 
das Verhalten deines Programmes wird deterministisch.

W.S.

von Chris M. (chris_appment)


Lesenswert?

Super vielen Dank für die ausführliche Erklärung.
Mit Events arbeiten wird wohl die Lösung sein, auf die ich zurückgreifen 
werde :)

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.