Forum: Mikrocontroller und Digitale Elektronik I2C treibt in den Wahnsinn!


von kennie (Gast)


Lesenswert?

Ich habe ein Voltmeter aufgebaut mit einem 18-Bit ADC von Microchip 
(MCP3424) mit I2C-Interface. Der ADC ist an einen PIC16F628 
angeschlossen der die Ergebnisse auf einem LCD ausgibt.

Da der PIC kein Hardware-I2C hat, habe ich diese 
Software-Implementierung verwendet:

http://www.sprut.de/electronic/pic/grund/i2c_soft.htm

Hat auf dem Breadboard auch wunderbar funktioniert, lief dort wochenlang 
tadellos. Nun ist das ganze auf eine Platine umgezogen und seitdem 
spinnt es, und zwar so:

Meistens bleibt das ganze beim Einschalten komplett hängen; der PIC will 
eine Startkondition auf dem Bus ausgeben und wartet dazu bis der Bus 
frei ist (SCL=SDA=1). SCL wird aber vom ADC dauerhaft low gezogen und 
der PIC wartet und wartet...

Manchmal dagegen (ich sag mal 1 aus 20 Versuchen) läuft das ganze für 
einige Sekunden, d.h. der ADC liefert mehrere Ergebnisse und die ganzer 
Abfolge aus I2C-Start, Adressierung, Schreiben des Konfig-Bytes, warten 
auf Ergebnis, Lesen des Ergebnis, Stop-Kondition usw. funktioniert. Nach 
max. 2 Sekunden hängt das ganze dann wieder.

Mir ist das völlig unverständlich. Komischerweise funktioniert das ganze 
nach Neuprogrammierung des PIC immer beim ersten Mal und dann nicht 
mehr.

Habe schon den PIC ausgetauscht aber daran liegts nicht. Als Pullups auf 
dem Bus werden 6.8k Widerlinge verwendet. Massig Abblockkondensatoren 
sind auch vorhanden.

Wenn SDA vom ADC auf Low gezogen würde, dann täte ich es ja verstehen 
und dann könnte man solange Takte auf SCL ausgeben (normalerweise 9x 
reicht) bis der Slave SDA wieder loslässt.

Aber warum zum Teufel zieht er SCL direkt bei Einschalten der 
Versorgungsspannung auf Masse? Laut Datenblatt ist SCL beim MCP3424 
"input only" als für mich hört sich das an als würde der ADC nichtmal 
clock-stretching machen.

Und was kann man in so einem Fall tun? Wenn der Slave SCL auf Masse 
zieht ist doch Feierabend, dann kann der Master nix tun oder?

von Lehrmann M. (ubimbo)


Lesenswert?

- Schaltung durchpiepsen

Immer das selbe hier - das ist zu posten:!
- Schaltplan
- Bild von der Platine / aufgebauten Schaltung
- Sourccode
- Config-Bits

Ansonsten kann man nur raten ...

von kolabier (Gast)


Lesenswert?

Versuche es mal mit 2.2k Pullups (bei VCC=3.3V ist das der Standard)

von bingo (Gast)


Angehängte Dateien:

Lesenswert?

> Versuche es mal mit 2.2k Pullups (bei VCC=3.3V ist das der Standard)

Eher noch weniger: der I2C-Standard verlangt, dass mindestens 3 mA durch 
die Pullups fliessen, wenn die Leitung low ist. Daraus folgt, dass die 
Pullups in Deinem Beispiel bei 3.3 Volt unter 1 kOhm haben sollen. Oft 
geht geht es auch mit grössren Widerständen, dass ist aber nicht 
spezifikationsgerecht und manchmal funktioniert es eben nicht mit den 
grösseren Werten. In der Anlage ein Auszug aus der 
Original-I2C-Defintion von Philips.

von kennie (Gast)


Lesenswert?

Hallo,

vielen Dank für die Vorschläge, ich hab das Problem entdeckt: Es war 
diese besch... Hartpapier-Platine! Die war vor zig Jahren bei so einem 
Anfängerset fürs Platinenätzen dabei und ich wollte sie halt 
loswerden... naja langer Rede kurzer Sinn: die Platine hatte eine 
niederohmige Verbindung zwischen SCL und einem anderen uC-Pin der 
anfangs auf Low ist. Sehen konnte man zwar nix (auch mit der Lupe) aber 
nach sorffältigem Kratzen zwischen den Leiterbahnen mit einem Skalpell 
läuft die Schaltung nun zuverlässig. Das Hartpapier hat auch 
unerklärliche dunkle Flecken, ich frage mich ob die irgendwie Wasser 
gesogen hat beim Ätzen und da nun leitfähige Areale drin sind... auch 
ansonsten der letzte Scheissdreck, an 2 Stellen löste sich beim Löten 
das Kupfer an einer Seite ab.

werd wohl künftig nur noch Glasfaser nehmen und diesen Mist wegwerfen!

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.