Gast
#2173720
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?

