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?
- 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 ...
Versuche es mal mit 2.2k Pullups (bei VCC=3.3V ist das der Standard)
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.