Mahlzeit!
Ich experimentiere derzeit mit dem I²C-Bus und habe mir eine Platine
gebastelt, auf der 5 verscheidene I²C-Bausteine zeigen sollen was sie
können.
Ich kann jeden Baustein nach Bedarf auf SDA/SCL jumpern.
Im Sortiment befinden sich u.A. der 12bit A/D-Wandler ADC121C027
http://www.national.com/ds/AD/ADC121C021.pdf
und der Temperatur-Sensor LM75.
http://www.national.com/ds/LM/LM75A.pdf
Im Prinzip funktioniert die Kommunikation mit allen Steinen sehr gut,
nur sobald ich den A/D-Wandler auf den Bus schalte sendet der LM75 nur
noch 0.
Alle anderen Steine funktionieren wie gehabt. Auch der ADC121C027.
Woran kann das liegen?
Ich habe gelesen, dass der LM75 angeblich sein eigenes Ding drehen soll,
wenn es um den I²C-Bus geht, kann das aus dem Datenblatt aber nicht
nachvollziehen... ?
Die Adressen sollten sich auch nicht in die Quere kommen (ADC hat die
162 und der LM75 die 144) und Kurzschlüsse oder Falschverdrahtungen habe
ich schon x mal kontrolliert, das passt alles.
Ich hatte die Befürchtung, dass die Bus-Kapazität vielleicht mit allen 5
Slaves zu groß wird und habe die Pullup-Widerstände von 10k auf 1k
verkleinert.
Fazit ist, dass ich mit 1k natürlich eine steilere Flanke auf dem Ossi
sehe, sich an meinem Problem aber nichts ändert.
Alles geht, aber sobald der ADC121C027 auf dem Bus liegt sendet der LM75
eine NULL... also nichts, scheint die Übertragung aber noch zu
quittieren.
Ein Screenshot der Messung im Anhang.
Wäre schön,. wenn jemand eine Idee für mich hätte.
I²C ist leider (noch?) nicht so mein Gebiet.
Viele Grüße, Holger.
n Abend Holger.
Hast du schon mal geschaut, welches IC den Bus auf Masse zieht, sodass
NULL herauskommt? Der LM75 oder der ADC?
Was sagt der ADC, wenn du die Adresse 144 auf den Bus schickst (LM75
hängt nicht am Bus)? (Laut Datenblatt dürfte der ADC ja garnichts
antworten...)
Evtl auch mal andere Adresse für den LM75 testen, lässt sich über A0-A2
ja programmieren.
So wie ich das verstanden habe, funktioniert der LM75 mit allen anderen
Busteilnehmern außer dem ADC.
Sind alle ICs gut abgeblockt oder weist die Versorgungsspannung
Einbrüche während der Kommunikation auf?
Gruß, Markus
Hallo Markus!
Danke für die rasche Antwort, nur wie das Leben so spielt komme ich die
Tage leider nicht mehr zum Basteln :-/
Die 5V-Versorgungs-Referenz-Signalspannung kommt aus einem 90W
Computer-Netzteil. ganz sauber ist sie nicht, aber wirkliche Einbrüche
konnte ich bislang nicht erkennen.
Die ICs habe ich laut zuerst gar nicht, dann laut Datenblatt mit einem
100nF Folien und einem 4,7µF Tantal-Kondensator geblockt und zu guter
Letzt zur Sicherheit noch einen 4,7µF Elko parallel geschaltet.
Also hängen derzeit ~9,5µF parallel zur Versorgung in umittelbarer Nähe
der ICs. All die Kondensatoren haben am Signalverlauf allerdings nichts
für mich erkennbares geändert. Die Versorgungsspannung macht allerdings
einen etwas ruhigeren Eindruck.
Ich komme über's Wochenende wahrscheinlich nicht mehr zum Messen,
allerdings glaube ich mich zu erinnern, dass der ADC die 144 ignoriert,
genau wie alle anderen ICs das tun.
Genaueres dazu kann ich aber erst nächste Woche sagen.
P.S.: Ja, das verstehst du richtig: Der LM75 funktioniert, wenn alle ICs
außer dem ADC auf dem BUS liegen, wenn der ADC mit auf dem BUS liegt
funktionieren alle, aber der LM75 sendet eine NULL anstatt der aktuellen
Temperatur.
Schönes Wochenende,
Holger
Schalte mal einen Widerstand (100 Ohm) in Reihe zum SDA des ADC.
Wenn dann der LM high senden will, aber der ADC low, siehst Du eine
kleine Stufe (0,1V) auf dem Oszi.
Das heißt dann, der ADC fühlt sich adressiert und sendet auch was.
Peter
Ach wie blöd.
Ich habe mich halb ins Delirium gemessen, nur um beim letzten
Verzweifelten Blick ins Datenblatt zu merken, dass der DAC121C081 die
144 als "Broadcast Adresse" verwendet.
Da muss ich mir für den LM75 wohl einen neuen Code ausdenken... schade
eigentlich, weil es bis dato so schön gepasst hat alle Address-Pins
einfach auf Masse zu ziehen :(
Euch jedenfalls vielen Dank für die Tipps!
Ich werde sie bestimmt an anderer Stelle noch mal gebrauchen können!
Viele Grüße,
Holger
Hallo noch mal!
Ich habe den A/D-Wandler mit Broadcast-Adresse zu den Akten gelegt und
an sich bin ich mit der I²C-Geschichte ganz zufrieden, wenn da nicht
Horter&Kalb wäre.
Ich habe mir diese Schaltung:
http://www.horter.de/i2c/i2c-pc-seriell/pcseriell_1.html
nach gebaut, um mit dem PC über RS232 mit Delphi Daten über den BUS zu
schicken.
Beim genauen nachmessen erkennt man nun aber, dass die Slew-Rate des
Signals eher zu Wünschen übrig lässt.
Ein Bit braucht etwas über 3µs um auf 5V zu steigen, wenn mich nicht
alles täuscht würde daraus eine eine BUS-Grenzfrequenz von 1/6µs=166kHz
resultieren.
Selbst bei Standard I²C mit 100kHz wird mir da ein bisschen mulmig.
Ganz zu schweigen davon, dass ich dachte ich könnte den BUS auch
irgendwann mal auf 3,4MHz hoch jagen... ob das Sinn macht sei vorerst
dahingestellt.
Die Frage ist:
Kann ich über RS232 überhaupt solche Geschwindigkeiten erreichen?
All die Schaltungen die ich gefunden habe nutzen ein Derivat des MAX232
Pegelwandlers und alle anderen schwören auf eine I²C-Realisierung mit
einem dem ATTiny.
ATTiny wäre komplettes Neuland, RS232 ist mehr oder weniger Grauzone.
Was wäre nun der effektivste Weg einen 3,4MHz I²C-Bus zu basteln?
Kennt ihr gute Alternativen zwischen MAX232 und ATTiny?
Die Betonung liegt auf "gute" ;o)
P.S.: Ich glaube ich habe kHz und kbit ein wenig durcheinandergewürfelt,
lasse das zu meiner eigenen Schande jetzt aber mal so da stehen.
Viele Grüße,
Holger