Forum: Mikrocontroller und Digitale Elektronik Stromausfall bei I2C Slaves abfangen?


von Gunther (Gast)


Lesenswert?

Hallo zusammen,

Frage 1: ich habe ein System mit Mega328 was einige I2C Slaves (2 
Displays, EEPROM, Sensor) abfragt/mit Daten versorgt und auch 1A 
funktioniert. Jetzt sind nicht immer alle da oder auch "plötzlich" weg - 
das fangen die normalen libs nicht ab oder? Wie macht man das am 
sinnvollsten?

Frage2: das System sollte Stromausfälle überleben, dann jedoch stellt 
sich wieder das Problem aus 1, denn ich will die I2Cs nicht weiter 
versorgen, nach dem Stromausfall aber wieder "hochfahren"?

Danke, euer Gunther.

von Wolfgang (Gast)


Lesenswert?

Gunther schrieb:
> Jetzt sind nicht immer alle da oder auch "plötzlich" weg -
> das fangen die normalen libs nicht ab oder? Wie macht man das am
> sinnvollsten?

Nimm eine Lib, die zurück meldet, wenn niemand antwortet.

Bei Stromausfall eines Slaves musst du sicher stellen, dass des der Bus 
nicht durch einen dominanten Pegel blockiert.

von Tom (Gast)


Lesenswert?

Wo ist das Problem wenn alle Stromlos sind werden sie bei Neustart 
wieder initialisiert

von c-hater (Gast)


Lesenswert?

Gunther schrieb:

> Wie macht man das am
> sinnvollsten?

Man setzt I2C nicht in Umgebungen ein, in denen Master und Slaves 
verschiedene Versorgungen haben. Dafür war das Protokoll nie gedacht 
(und ist de facto aus physikalischen Gründen auch nicht dafür geeignet).

> Frage2: das System sollte Stromausfälle überleben

Tut es. Sofern alle Devices halt gleichzeitig ableben und gleichzeitig 
wieder neu erweckt werden.

von Gunther (Gast)


Lesenswert?

...sry, war ggf nicht präzise genug: Der M328 soll weiter laufen, die 
I2C Slaves aber nicht. Mal abgesehen davon, ob es nicht dafür gedacht 
ist (was ich weiß) - geht es?

Man bräcuhte also libs die nicht mit "while" arbeiten und muss dort 
einen "Notfall timer" haben. Ggf muss man die retrys pro Slave zählen 
und diesen komplett im Ablauf deaktivieren, wenn er sich nicht meldet. 
Und falls man einen Stromausfall erkennt (2s kann ich die Slaves auch so 
puffern) - dann schnell alle COM beenden und das "COM_enable" flag auf 
FALSE setzen, bis wieder Strom da und dann die "inits" neu aufrufen, 
danach "COM_enable" auf TRUE und weiter gehts...oder?

Richtig spannend wäre "pseudo hotplug" des E² :) (Ggf mit Menüoption "E² 
wechseln, was dann COM stoppt)

Gunther.

von minitype (Gast)


Lesenswert?

nimm den watchdog-timer und frage dann ab, ob die slaves power haben, 
oder nimm noch besser einen anderen bus, der i2c ist fuer sowas 
ungeeignet

von Gunther (Gast)


Lesenswert?

...hmpf, OK. Danke! Ich puffer erstmal mit LiPo, das System braucht nur 
50mA da hält ne 18650 ne Weile. Ist halt schon fertig (natürlich "non 
commercial") , da strickt man ungern um - und soooo wichtig ist mir die 
Robsutheit auch nicht gewesen :)

Gunther.

von c-hater (Gast)


Lesenswert?

Gunther schrieb:

> ...sry, war ggf nicht präzise genug: Der M328 soll weiter laufen, die
> I2C Slaves aber nicht. Mal abgesehen davon, ob es nicht dafür gedacht
> ist (was ich weiß) - geht es?

Ganz sicher nicht zuverlässig. Ein Slave ohne Versorgung wird nämlich 
typisch über seine Schutzdioden aus den I2C-Pullups gespeist. Das ist 
nicht gut für den Slave und auch nicht gut für die Funktionsfähigkeit 
des Busses, denn es besteht natürlich die sehr reale Möglichkeit, dass 
der/die toten Slaves den Bus völlig funktionsunfähig machen...

Das hat noch nichtmal was mit irgendwelchen Libs zu tun...

von Gunther (Gast)


Lesenswert?

Wie gesagt - ich kann ja 2s puffern (über Elko), dann merke ich dass 
extern keine Spg mehr da ist und fahr den GESAMTEN I2C geordnet runter 
(siehe flags) und initialisiere dann wieder, wenn alles wieder iO ist. 
Aber die Faulbärlösung ist gerade die 18650er, die ich dauerhaft mit 
~3,5V Systemsg beaufschlage. Mal sehen, wann sie mir das übel 
nimmt...dann kann ich erstmal in Ruhe prüfen, wie robust das ganze wird.

Gunther.

von c-hater (Gast)


Lesenswert?

Gunther schrieb:

> Wie gesagt - ich kann ja 2s puffern (über Elko), dann merke ich dass
> extern keine Spg mehr da ist und fahr den GESAMTEN I2C geordnet runter

Was soll das bringen? Deine Situation ist doch, dass der Master versorgt 
ist, aber einige oder alle Slaves nicht, wodurch zumindest einige 
Slaves, recht wahrscheinlich aber auch der gesamte Bus funktionsunfähig 
werden.

Wenn irgendwas sinnvoll ist (wirklich sinnvoll wäre natürlich nur ein 
geeignetes Bussystem) dann wäre es einzig die Überwachung der 
Versorgung(en) der Slaves. Da braucht dann aber nix gepuffert zu werden, 
das ist eine triviale Messung, z.B. mittels ADC.

Blöd ist halt nur: man braucht dann eine Strippe zu jeder 
Slave-Versorgung...

von holger (Gast)


Lesenswert?

>Blöd ist halt nur: man braucht dann eine Strippe zu jeder
>Slave-Versorgung...

Damit könnte man dann die Slaves auch gleich versorgen.
Problem gelöst. Alles andere ist Quatsch. I2C unterstüzt kein
Hotplug. Jeder Slave ohne Stromversorgung wird wie schon gesagt
im besten Fall den Bus massiv stören oder komplett totlegen. Da hilft 
nix.

von Gunther (Gast)


Lesenswert?

...alles gut, ich habe genug Meinungen gehört - ich melde mich, wenns 
läuft, Danke :)

Gunther.

von Klaus (Gast)


Lesenswert?

holger schrieb:
> I2C unterstüzt kein
> Hotplug.

Doch, natürlich geht das.

Ich muss ja jedesmal wenn ich einen I2C-Slave anspreche erstmal seine 
Adresse senden. Und da bekomme ich ein Ackn. Bekomme ich kein Ackn, ist 
der Slave nicht da.

Im µC mache ich mir ein Flag. Ist das Flag false, spreche ich alle paar 
Sekunden die Adresse an. Antwortet der Slave, initialisiere ich ihn und 
setze das Flag true. Dann frage ich ihn ganz normal ab. Bekomme ich bei 
einer der Abfragen kein Ackn, ist der Slave weg. Dann setze ich das Flag 
false und beende die Übertragung bis zur nächsten Abfrage.

Natürlich kann ein Slave beim Anstecken eine gerade laufende Übertragung 
eines anderen Slaves kurzzeitig stören. Da muss man entscheiden ob das 
kritisch ist.

Zur Akkuschonung Slaves abschalten würde ich so machen: Vcc aller Slaves 
und die Pull-Ups über einen Portpin + Transistor abschalten. I2C-Pins 
auf Eingang und tristate.

Ja, natürlich betrifft das IMMER ALLE Slaves an einem Bus. Aber das ist 
auch Sinn der Sache. Will man Slaves nicht abschalten, zum Beispiel eine 
RTC, bekommt die einen zweiten Bus.

von Jim M. (turboj)


Lesenswert?

Klaus schrieb:
> Und da bekomme ich ein Ackn. Bekomme ich kein Ackn, ist
> der Slave nicht da.

LOL, so weit kommst Du nicht wenn der Slave keinen Strom hat.

Denn praktisch alle Slaves (wenn sie nicht von NXP sind) ziehen ohne 
Stromversorgung die Busleitungen auf Masse. Dann kannste nicht mal das 
Start Signal senden, geschweige denn Adresse o.ä.

Die meisten I²C Master implementierungen hängen sich dann einfach auf. 
Falls das ein Erwachsener implementiert hat, gibt es u.U. ein Timeout 
oder ein "Arbitration lost" Signal.

von Wolfgang (Gast)


Lesenswert?

Gunther schrieb:
> Man bräcuhte also libs die nicht mit "while" arbeiten ...

Libs sind Software und I2C ist nun wahrlich nicht so kompliziert, dass 
man soetwas nicht selber entsprechend den eigenen Anforderungen 
schreiben kann.

> ... und muss dort einen "Notfall timer" haben.

Wie lange willst du denn auf das Ack warten?

von Uuu B. (hansdampf2)


Lesenswert?

Jim M. schrieb:
> Denn praktisch alle Slaves (wenn sie nicht von NXP sind) ziehen ohne
> Stromversorgung die Busleitungen auf Masse. Dann kannste nicht mal das
> Start Signal senden, geschweige denn Adresse o.ä.

Genau, deshalb gibt es die Möglichkeit z.B. per zusätzlichem 
Pegelshifter den Slave vom Bus zu entkoppeln. Das funktioniert auch bei 
Stromausfall des Slaves - ohne das SDL/SCL gleich auf Masse gezogen 
werden.
https://www.mikrocontroller.net/articles/I2C_als_Hausbus

von Andi B. (andi_b2)


Lesenswert?

c-hater schrieb:
> Gunther schrieb:
>
>> ...sry, war ggf nicht präzise genug: Der M328 soll weiter laufen, die
>> I2C Slaves aber nicht. Mal abgesehen davon, ob es nicht dafür gedacht
>> ist (was ich weiß) - geht es?
>
> Ganz sicher nicht zuverlässig. Ein Slave ohne Versorgung wird nämlich
> typisch über seine Schutzdioden aus den I2C-Pullups gespeist. Das ist
> nicht gut für den Slave und auch nicht gut für die Funktionsfähigkeit
> des Busses, denn es besteht natürlich die sehr reale Möglichkeit, dass
> der/die toten Slaves den Bus völlig funktionsunfähig machen...
>
> Das hat noch nichtmal was mit irgendwelchen Libs zu tun...

So allgemein formuliert, stimmt die Aussage nicht. Slaves welche sich an 
die Spezifikation halten, dürfen auch ohne Versorgung den Bus nicht 
beleidigen. Aber ja, es gibt viele, die sich nicht an die I²C Spec 
halten. Also wenn man g'scheite, spec-konforme Slaves hat, geht das sehr 
wohl. Muss man im Einzelfall testen.

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.