Forum: Mikrocontroller und Digitale Elektronik I²C-Expander MCP23008 verliert ständig seine ID


von Marlon S. (raspberrypi-mp)


Lesenswert?

Moin moin!

Ich möchte mehrere Displays über je einen MCP23008 per I²C von meinem 
Raspberry Pi aus ansteuern. Ich habe eine Platine gebaut, auf der die 
Expander sitzen und gleich Buchsenleisten angebracht, in die ich die 
Displays (HD44780 20x4) einstecken kann. Die Displays haben 
RGB-Hintergrundbeleuchtung, die über einen auch auf dem Board 
befindlichen PCA9685 (ebenfalls via I²C) gesteuert wird.
Leider hindert mich folgendes Problem am Weiterkommen:

Wenn ich über den Befehl "i2cdetect -y 1" im Terminal die I²C-Geräte 
anzeigen lasse, sind mal beide (zwei Chips sind auf dem Board), mal nur 
einer und meistens aber keiner der MCPs zu sehen. Wenn sie auftauchen, 
haben sie auch die per Jumper eingestellte Adresse, aber das passiert ja 
leider meistens nicht.

Was ich bereits überprüft habe:

Ist der I²C-Bus in Ordnung?
 - Ja, andere Geräte funktionieren problemlos

Ist das Kabel zur Platine in Ordnung?
 - Höchstwahrscheinlich, da der PCA9685 immer erkannt wird.

Ist der RESET-Kontakt (denkt euch nen Strich drüber) des MCP23008 auf 
HIGH?
 - Grundsätzlich sollte er das sein, kann es leider nicht nachmessen, da 
mein Multimeter leer ist. Auf dem Breadboard ganz sicher.

Sind irgendwelche Leiterbahnen defekt?
 - Nicht auszuschließen, aber auf dem Breadboard tritt das gleiche 
Problem auf.

Kalte Lötstellen vorhanden?
 - siehe vorheriger Punkt

Was ist mit dem INT-Kontakt?
 - Eigentlich nicht verbunden, habe aber das Gefühl, dass es etwas 
besser geht, wenn er auf GND liegt.

Mir ist aufgefallen, dass scheinbar alle Geräte unter Spannung (120 V) 
zu stehen scheinen. Wenn ich das Gehäuse meines Displays, das 
HDMI-Kabel, den Raspberry Pi oder einen beliebigen +5V oder GND Kontakt 
meiner Platine(n) mit etwas empfindlicherer Haut (Nein, nicht das, was 
ihr jetzt denkt) berühre, kann ich einen leichten bis mittleren 
Stromfluss spüren. Soll ja angeblich nicht schlimm sein und häufig 
vorkommen, aber kann es sein, dass es dem PCA9685 egal ist, während die 
MCPs aber davon gestört werden? Habe allerdings noch vier mal den 
MCP23016 dranhängen und die funktionieren wunderbar.

So, ich hoffe das war ausführlich und klar genug... ;)
Bin für sämtliche Ratschläge dankbar!

Viele Grüße

Marlon

von Fachmann (Gast)


Lesenswert?

120V können es nicht sein, das hält diese Electronik nicht aus.

von Max D. (max_d)


Lesenswert?

Wenn ich mich richtig erinnere, dann hat der Raspi nur sehr schwache 
Pullups an den I²C-Leitungen. Damit könnte evtl. der Anstieg für die 
MCPs zu langsam sein, der PCF schaltet etwas früher und geht damit 
noch...
Mach halt testweise mal an SCL und SDA jeweils 5k nach Vcc und kuk ob es 
hilft, dauert keine 2 minuten und ist ne idee wert....

von Marlon S. (raspberrypi-mp)


Lesenswert?

Danke das wäre ne Idee... Aber die Chips werden ja mit 5V betrieben, 
während der Raspberry Pi nur 3,3V an seinem Bus verträgt. Habe mal 
gelesen, dass man keine zusätzlichen Pullups verwenden darf, wenn man 
mit 5V-Geräten arbeitet.
Hab mir schon LogicLevel-Converter bestellt, brauchen aber noch ca. 2 
Wochen.

Fachmann schrieb:
> 120V können es nicht sein, das hält diese Electronik nicht aus.

Doch, das ist wie gesagt sehr häufig so. Hat was damit zu tun, dass das 
Gerät nicht geerdet ist, viel mehr weiß ich auch nicht. Da es quasi 
statisch ist, macht es den Geräten nix aus. Kannst ja mal dein 
Handgelenk an das Gehäuse einer Mikrowelle (wenns aus Metall ist) 
halten, dann weißt du was ich meine. Ist halt nur ein schwaches 
Kribbeln, da der Strom meist im µA-Bereich bleibt.

von Max D. (max_d)


Lesenswert?

Das mit den 5V an den Chips macht die Sache nicht besser.
Mach die Pullups von SDA und SCL nach 3,3 V (gibts ja auch am Raspi 
header)

von Philipp M. (pm_siggi)


Lesenswert?

Ggf. die i²c Frequenz mal runtersetzen.

Grüße

von Pete K. (pete77)


Lesenswert?

Wie wäre es, wenn Du mal Deinen Schaltplan hier postest?

Sonst kann man nur raten, was die Ursache sein kann:
- Abblockkondensatoren vergessen
- Stromversorgung zu gering?
- 5V an 3V?
- Mehrere Bauteile auf gleicher I2C Adresse

Marlon S. schrieb:
> Habe mal
> gelesen, dass man keine zusätzlichen Pullups verwenden darf, wenn man
> mit 5V-Geräten arbeitet.

Dann schau Dir das Datenblatt an und glaube nicht irgendwelchem 
Geschreibsel im Internet :-)

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

Du kannst einen PCA9517A zwischen PI und Deiner Schaltung setzen. Das 
ist ein Level-Translating I2C Bus Repeater", d.h. der vermittelt 
zwischen 3.3V des PI und den 5V vom Rest, und er enthält Buffer und 
entlastet die schwachen Ausgänge des PI.

fchk

von Max D. (max_d)


Lesenswert?

Als Levelshifter reichen im Normalfall zwei MOSFETs und vier Pullups

Hier ( http://www.adafruit.com/datasheets/an97055.pdf ) auf Seite 10 
wird gezeigt wie ....

von Marlon S. (raspberrypi-mp)


Angehängte Dateien:

Lesenswert?

Pete K. schrieb:
> Wie wäre es, wenn Du mal Deinen Schaltplan hier postest?
>
> Sonst kann man nur raten, was die Ursache sein kann:
> - Abblockkondensatoren vergessen
> - Stromversorgung zu gering?
> - 5V an 3V?
> - Mehrere Bauteile auf gleicher I2C Adresse

Nen konkreten Schaltplan hab ich leider nicht, weil ich das Layout 
direkt mit SprintLayout gemacht habe...
Abblockkondensatoren habe ich in der Tat nicht  verbaut, das wollte ich 
"nachträglich" noch machen. Allerdings ist mir nicht so ganz klar, wo 
man die dann setzen muss und vor allem was für Werte die haben müssen.
Stromversorgung ist mehr als ausreichend, wird alles über nen 4-Pin 
MOLEX-Stecker und ein 60W-Netzteil versorgt. Der Raspberry Pi hat aber 
sein eigenes Netzteil.
Habe keine Pullups an 5V gelegt, daher sollten auf dem Bus nur 3,3V 
liegen. Kann es wie gesagt gerade nicht nachprüfen...Ist ein größerer 
oder kleinerer Widerstand besser für das Signal? Jeder zusätzliche 
Pullup verringert ja den Gesamtwiderstand.
Gleiche I²C-Adresse ist nicht das Problem, da hab ich drauf geachtet.

Philipp M. schrieb:
> Ggf. die i²c Frequenz mal runtersetzen.

Das werd ich gleich mal ausprobieren!

Frank K. schrieb:
> Du kannst einen PCA9517A zwischen PI und Deiner Schaltung setzen. Das
> ist ein Level-Translating I2C Bus Repeater", d.h. der vermittelt
> zwischen 3.3V des PI und den 5V vom Rest, und er enthält Buffer und
> entlastet die schwachen Ausgänge des PI.

Das hört sich ja ziemlich gut an! Ich glaub, den bastel ich mir dann 
direkt an die Hauptplatine vor die I²C-Anschlüsse, da ich vom Raspi 
abgesehen sowieso eigentlich nur mit 5V arbeite

Ich hab in den Anhang mal nen Screenshot von SprintLayout hochgeladen, 
vielleicht kann man damit wenigstens ETWAS anfangen... Die blauen 
Hauptleitungen sind von links nach rechts [+5V,SDA,SCL,GND]. Die rechten 
grünen Leitungen kommen vom PCA und steuern die Beleuchtung. Die blaue 
Seite ist die, auf die man von oben draufguckt. Der MCP ist gespiegelt, 
weil er auf der anderen Seite sitzt!

von Pete K. (pete77)


Lesenswert?

Abblockkondensatoren gehören so dicht wie möglich an alle VDD-Pins des 
bauteils. Wenn nicht anders erwähnt reichen 100nF Kerkos.

Hast Du beide GND-Stränge von Raspi-Netzteil und separater Versorgung 
verbunden? Wenn nicht könnte das die unterschiedliche Potenzialdifferenz 
erklären.

Auf Deinem Layout-Bild sieht man leider nix. Schaltplan muss her.

60W Netzteil? Na hoffentlich wird das nicht zu gering belastet...

von Humpfdidumpf (Gast)


Lesenswert?

Hi,

Die PCA9685 sind mit 5V versorgt, korrekt?
In dem Fall hast du folgendes Problem:

Logisch HIGH erkennt der PCA9685 spätestens ab 0,7VCC (High Level Input 
voltage, S37):
VIH = 0,7*VDD = 0,7*5V = 3,5V

Du gibst im 3,3V, brauchen tut er aber > 3,5V, damit er sicher ein HIGH 
erkennen kann. Das ist zu wenig. Manchmal reichts dann gerade noch 
(Reserven der Hersteller) manchmal nicht.

--> die oben erwähnten Pegelshifter sind nötig, außer der Raspberry PI 
hat 5V-tolerante Eingänge (muss im Datenblatt stehen). Dann täten es 
Pullups auf 5V auch.

von Max D. (max_d)


Lesenswert?

Ich würde (wenn du wirklich keine mosis hast) testweise den MCP auch aus 
3,3 V versorgen (auch wenn das Disp dann vlt. nicht gut lesbar ist). Er 
sollte dann immer auftauchen beim suchen.....

von Certified Cargo Cult Priest (Gast)


Lesenswert?

Marlon S. schrieb:

>Das hört sich ja ziemlich gut an! Ich glaub, den bastel ich mir dann
>direkt an die Hauptplatine vor die I²C-Anschlüsse, da ich vom Raspi
>abgesehen sowieso eigentlich nur mit 5V arbeite

Bevor du dich in weitere Basteleien stürtzt, solltest vielleicht die 
Erratas des MCP23008 lesen.
http://ww1.microchip.com/downloads/en/DeviceDoc/80251A.pdf

von Irgendwer (Gast)


Lesenswert?

Ich hoffe mal das die Adresspins A0 bis A2 nicht offen in der Luft 
rumhängen.

von Marlon S. (raspberrypi-mp)


Lesenswert?

Hi,

sorry, dass ich mich erst so spät wieder melde! Hatte heute viel um die 
Ohren...

Pete K. schrieb:
> Abblockkondensatoren gehören so dicht wie möglich an alle VDD-Pins des
> bauteils. Wenn nicht anders erwähnt reichen 100nF Kerkos.

100 nF hab ich leider nicht... Hab nur einige im pF-Bereich, ne 1000er 
Großpackung mit verschiedensten Werten ist aber unterwegs.

Pete K. schrieb:
> Hast Du beide GND-Stränge von Raspi-Netzteil und separater Versorgung
> verbunden? Wenn nicht könnte das die unterschiedliche Potenzialdifferenz
> erklären.

Ja, das könnte sein. Als Lösung könnte ich ja einfach auf der 
Hauptplatine die 5V und GND-Leitungen verbinden, oder? Theroretisch 
könnte ich eigentlich auch den Raspi über die Hauptplatine versorgen und 
mir das Handy-Netzteil sparen...

Pete K. schrieb:
> 60W Netzteil? Na hoffentlich wird das nicht zu gering belastet...

Das regelt sich selbst, soweit ich weiß... Hat auch nur 2A für 12V und 
2A für 5V, hab das mit nem anderen verwechselt.

Humpfdidumpf schrieb:
> Die PCA9685 sind mit 5V versorgt, korrekt?
> In dem Fall hast du folgendes Problem:
>
> Logisch HIGH erkennt der PCA9685 spätestens ab 0,7VCC (High Level Input
> voltage, S37):
> VIH = 0,7*VDD = 0,7*5V = 3,5V
>
> Du gibst im 3,3V, brauchen tut er aber > 3,5V, damit er sicher ein HIGH
> erkennen kann. Das ist zu wenig. Manchmal reichts dann gerade noch
> (Reserven der Hersteller) manchmal nicht.

Der PCA funktioniert ja ohne Probleme, deswegen wunderte ich mich, dass 
es die MCPs nicht tun. Aber ich tippe auch auf den Pegel.

Max D. schrieb:
> Ich würde (wenn du wirklich keine mosis hast) testweise den MCP auch aus
> 3,3 V versorgen (auch wenn das Disp dann vlt. nicht gut lesbar ist). Er
> sollte dann immer auftauchen beim suchen.....

Hab ein paar rumliegen, die sich auch mit geringen Pegeln schalten 
lassen, aber als Fertigchip finde ich's irgendwie handlicher, da warte 
ich dann halt noch ein bisschen. Testweise mal auf 3,3V runterschalten 
würde allerdings vielleicht etwas mehr Klarheit verschaffen, werd ich 
morgen mal machen.

Irgendwer schrieb:
> Ich hoffe mal das die Adresspins A0 bis A2 nicht offen in der Luft
> rumhängen.

Die hängen entweder an Vdd oder GND, da hab ich drauf geachtet ;)

Vielen Dank für die vielen anregenden Antworten! Hatte (und habe) heute 
leider absolut keine Zeit, deshalb werd ich mich erst morgen dransetzen 
können...

von Pete K. (pete77)


Lesenswert?

Marlon S. schrieb:
> Als Lösung könnte ich ja einfach auf der
> Hauptplatine die 5V und GND-Leitungen verbinden, oder?

NEEEIIIINNN!!! Das gibt einen Kurzschluss!

Du musst die beiden GND-Pole (also 3V3 GND mit 5V GND) miteinander 
verbinden!

Kondensatoren (100nF) nicht vergessen.

Wo bleibt der Schaltplan?

: Bearbeitet durch User
von David W. (glasairman)


Lesenswert?

Ich habe 2 x MCP23017 auf einem Shield (kostet 12 GBP als Bausatz von 
ModMyPi-Shop in UK), das auf dem Raspi sitzt und mit 3 V betrieben wird 
(120V???) . Es gab keinerlei (elektrische) Probleme, die MCP's 
erscheinen als 0x20 und 0x21.

von Humpfdidumpf (Gast)


Lesenswert?

Hi,

die MCP23008 haben das gleiche Problem, nur noch viel schlimmer:

VIH=0,8VDD = 4V

Datenblatt S24

Du wirst das bei den PCA9685 aber auch lösen müssen. Selbst wenn es 
momentan durch reines Glück geht hat das folgende Nachteile:

1.
Beim I2C werden die parasitären Kapazitäten der Schaltung mit den 
Pullups geladen d.h. es geht asymptotisch gegen 3V3. Die Kurve ist gegen 
die 3V3 oben dann schon sehr flach. Umso höher die Schaltschwelle (die 
wird bei de PCA schon fast bei 3.3V sein), desto größer die Verzögerung. 
--> mögliche Timingprobleme, Jitter etc.

2.
Störabstand:
Der Abstand der Schaltschwelle zum HIGH-Pegel ist nur noch im mV 
bereich. Ein winziger "Hupfer" auf SCL/SDA (ein Handy klingelt...), eine 
Flanke wird erkannt. Es wird sehr störempfindlich werden.

3.
Exemplarstreuung. Nimmt man einen IC aus einer andern Charge, wird es 
vielleicht nicht mehr passen -> Problem beim reparieren / nachbauen.

Es ist "out of spec", das macht man nur, wenn man sich sehr sicher ist 
:-).

von Marlon S. (raspberrypi-mp)


Lesenswert?

Pete K. schrieb:
> Marlon S. schrieb:
>> Als Lösung könnte ich ja einfach auf der
>> Hauptplatine die 5V und GND-Leitungen verbinden, oder?
>
> NEEEIIIINNN!!! Das gibt einen Kurzschluss!

Sorry, ich hab das wohl missverständlich formuliert :D
Ich meinte natürlich 5V und GND vom Handynetzteil jeweils mit 5V bzw. 
GND vom anderen Netzteil verbinden! Sooo blöd bin ich dann doch nicht :D
Den Schaltplan mach ich vielleicht noch heute Abend, hab im Moment 
leider nicht so viel Zeit...

Humpfdidumpf schrieb:
> die MCP23008 haben das gleiche Problem, nur noch viel schlimmer:
>
> VIH=0,8VDD = 4V
>
> Datenblatt S24
>
> Du wirst das bei den PCA9685 aber auch lösen müssen. Selbst wenn es
> momentan durch reines Glück geht hat das folgende Nachteile:
>
> 1.
> Beim I2C werden die parasitären Kapazitäten der Schaltung mit den
> Pullups geladen d.h. es geht asymptotisch gegen 3V3. Die Kurve ist gegen
> die 3V3 oben dann schon sehr flach. Umso höher die Schaltschwelle (die
> wird bei de PCA schon fast bei 3.3V sein), desto größer die Verzögerung.
> --> mögliche Timingprobleme, Jitter etc.
>
> 2.
> Störabstand:
> Der Abstand der Schaltschwelle zum HIGH-Pegel ist nur noch im mV
> bereich. Ein winziger "Hupfer" auf SCL/SDA (ein Handy klingelt...), eine
> Flanke wird erkannt. Es wird sehr störempfindlich werden.
>
> 3.
> Exemplarstreuung. Nimmt man einen IC aus einer andern Charge, wird es
> vielleicht nicht mehr passen -> Problem beim reparieren / nachbauen.
>
> Es ist "out of spec", das macht man nur, wenn man sich sehr sicher ist
> :-).

Danke für die gute Erklärung! :)
Werde es erstmal mit 3,3V ausprobieren und bestell mir dann bei Reichelt 
den Repeater. Muss aber erst noch ein paar mehr Sachen finden, sonst 
lohnt sich das Porto nicht...

von Marlon S. (raspberrypi-mp)


Lesenswert?

Ich habe jetzt übrigens die 5V-Leitung der Hauptplatine mit dem 
GPIO-Header verkabelt und auch gleich noch den Touchscreen an den 
12V-Port der Hauptplatine angeschlossen. Jetzt läuft alles über ein 
Netzteil und die 120V "Störspannung" sind annähernd weg. Selbst am 
Handgelenk kein Kribbeln mehr, vorher tat es schon fast ein bisschen 
weh. Denke, das hat einfach daran gelegen, dass ich drei Netzeile 
miteinander verbunden (Kommunikationsleitungen, HDMI) hatte, die 
GND-Leitungen aber keinen direkten Kontakt hatten und eins von den 
beiden weggelassenen sehr minderwertige Qualität hatte.

Und siehe da! Die MCPs werden jetzt auch ohne Probleme erkannt! Werde 
mir aber trotzdem über kurz oder lang nen Repeater zulegen, um auch mit 
meinem Arduino kommunizieren zu können.

Nochmals vielen Dank für die lehrreichen Antworten!

An alle, die ein ähnliches Problem haben: Die Beiträge oben bieten sehr 
gute Lösungsansätze und ihr solltet sie auf jeden Fall berücksichtigen. 
Allerdings könnte es auch schlicht und ergreifend an einer massiv 
gestörten Spannungsversorgung liegen ;)

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.