Hallo zusammen,
wer hat Erfahrung mit dem P82B715PN I2C Extender?
Habe mir mal zwei bestellt um einen DS1621 bzw 1631 an einem längeren
Kabel betreiben zu können.
Mir ist allerdings noch nicht ganz klar wie er angeschlossen wird.
Beschalte ich die Sensoren genau wie vorher (pullup von 4,7KOhm an SDA &
SCL) nur das der Extender dazuwischen geschaltet wird?
Also:
"SDA-µC" an "Sx SDA-Extender", Lx SDA-Extender" zu "SDA-Sensor"?
1 | PIN SYMBOL FUNCTION
| 2 | 1 N.C. No connection
| 3 | 2 LX Buffered Bus, LDA or LCL
| 4 | 3 SX I2C Bus, SDA or SCL
| 5 | 4 GND Negative Supply
| 6 | 5 N.C. No connection
| 7 | 6 SY I2C Bus,SCL or SDA
| 8 | 7 LY Buffered Bus,LCL or LDA
| 9 | 8 VCC Positive Supply
|
Habe hier mal das Datenblatt beigefügt:
http://www.nxp.com/acrobat_download/datasheets/P82B715_6.pdf
Hallo Jo,
auf Seite 6 wird dies wohl am deutlichsten. Links fängt es mit dem
lokalen Bus an. Man hat hier 20K für den Pullup gewählt. Die
I2C-Bausteine machen dabei 3K und auch bis zu 2,2K mit. Damit die
Signale noch vernüftig schalten muss der Rechteck noch eine gewisse
Flankensteilheit haben. Hier kommt die kapazitive Belastung ins Spiel.
Jeder cm Leitung und jeder I2C-Baustein hat Kapazitäten. In diesem
Beispiel hat man 50pF. Will man beim Rechteck tau=R*C = 1us einhalten,
so kommt man auf 20K.
Und jetzt kommen wir zum 2. Teil, der langen Leitung. Die hat hier im
Beispiel 3000pF. Um hier auf 1us zu kommen muss der Pullup 330 Ohm
betragen. Dies schafft der Extender. Auf der anderen Seite der langen
Leitung wird zum Abschluss ein zweiter Extender benötigt. Und danach hat
der Bus zum Baustein ein Pullup (R3) wieder mit Werten, die jeder
I2C-Baustein schalten kann.
Hierbei sieht man auch sehr schön, dass längere Leitungen kapazitätsarm
sein sollten. Litze ist hier auch von Vorteil. Ich habe bei mir mit
einem 8 adrigen Telefonflachkabel (Litze) im Ring 4 Adern hintereinander
geschaltet, so dass ich auf über 40m kam, bei einem Takt von 9600 KBit/s
und ca. 5K Pullup, ohne Extender.
Gruss Klaus.
Das hilft mir lerider auch nicht wirklich weiter :-s
Meine bisherige Schaltung sieht so aus, das 2 Sensoren Sternförmig an
dem µC mit pullups von 4,7KOhm hängen, die allerdings nur eine
Leitungslänge von ca. 50cm haben. Um eine größere Entfernung zu
überbrücken, wollte ich halt den Extender vorschalten, um 4 Sensoren,
Sternförmig, mit Kabeln 2-3m zu benutzen.
Oder geht das so garnicht? Muss ich immer 2 Extender benutzen? Einen am
µC und einen vor dem Sensor?
Die ganzen rechenbeispiele weiß ich leider auch nicht wie ich die
umsetzen soll, da ich die Kapazitäten der Telefonkabel garnicht kenne...
Jo Hannes wrote:
> Oder geht das so garnicht? Muss ich immer 2 Extender benutzen?
Genau so ist das gedacht. Die Strecke zwischen den Extendern entspricht
nicht so ganz dem normalen I2C.
Bei 2-3m kannst du es auch ohne Extender mal ausprobieren, indem du mit
der I2C-Bitrate deutlich runter gehst und als Pullup-Widerstand den
kleinsten zulässigen Wert wählst.
Also bringt mir der Extender garnix? Weil mein Sternpunkt berreits der
µC ist? Also ist der Extender kein Verstärker im eigentlichen sin,
sondern kann nur mit einem weiten Extender eine strecke überbrücken?
Das ist jetzt natürlich total sch***.
Woher weiß ich denn den kleinst möglichen Widerstand?
Ich benutze die lib von Peter Fleury, hatte es schon probiert die KHz
gerringer einzustellen, hab aber keine Ahnung wie ich es ändern kann.
Hab mit 4,7KOhm berreits bei 1m kein Signal mehr gehabt.
Jo Hannes wrote:
> Woher weiß ich denn den kleinst möglichen Widerstand?
Ohm'sches Gesetz und Datasheet. Üblicherweise sind die I2C-Pins mit
3mA/0,4V spezifiziert. Daraus ergibt sich bei 5V Versorgung über
(5V-0,4V)/3mA dass ein Pullup von 1,5K grad noch geht.
Der I2C-Takt steht in der Fleury-Lib im Klartext drin.
> kein Signal mehr gehabt.
Was heisst das? Horizontaler Strich auf dem Oszi? Keine Verbindung?
> Der I2C-Takt steht in der Fleury-Lib im Klartext drin. 1 | ;*************************************************************************
| 2 | ; delay half period
| 3 | ; For I2C in normal mode (100kHz), use T/2 > 5us
| 4 | ; For I2C in fast mode (400kHz), use T/2 > 1.3us
| 5 | ;*************************************************************************
| 6 | .stabs "",100,0,0,i2c_delay_T2
| 7 | .stabs "i2cmaster.S",100,0,0,i2c_delay_T2
| 8 | .func i2c_delay_T2 ; delay 5.0 microsec with 4 Mhz crystal
| 9 | i2c_delay_T2: ; 4 cycles
| 10 | rjmp 1f ; 2 "
| 11 | 1: rjmp 2f ; 2 "
| 12 | 2: rjmp 3f ; 2 "
| 13 | 3: rjmp 4f ; 2 "
| 14 | 4: rjmp 5f ; 2 "
| 15 | 5: rjmp 6f ; 2 "
| 16 | 6: nop ; 1 "
| 17 | ret ; 3 "
| 18 | .endfunc ; total 20 cyles = 5.0 microsec with 4 Mhz crystal
|
Damit meinst du wohl das? Hab leider keine Ahnung wie ich da etwas
ändere...
>> kein Signal mehr gehabt.
>
> Was heisst das? Horizontaler Strich auf dem Oszi? Keine Verbindung?
Weil ich kein Messignal mehr ausgegaben bekomme. Er gibt immer nurnoch
255 aus...
Ich meinte die C Version.
Ah ok, hatte bisher den twinmaster.c nicht genutzt für meine Programme,
nur die i2cmaster.S und .h
Auf was soll ich den die SCL_CLOCK einstellen? 10000 statt 100000 oder
noch weniger? Mir würde es sogar reichen wenn das in der Minute der bus
nur 10-20mal durchläuft... Aber ich weiß nicht, ob es ihrgendwelche
anderen Auswirkungen hat, wenn ich die Tanktfrequenz zu niedrig setze,
also ob es es dann überhaupt noch tut, wenn ich ihn auf nurnoch 10 Hz
setzen würde (wäre ja dann 0,1s) und selbst das dürfte für meine
Anwedung noch reichen.
Jo Hannes wrote:
> Auf was soll ich den die SCL_CLOCK einstellen?
Probier es aus. 10KHz sollte locker funktionieren. Wenn nicht, steckt
der Wurm woanders.
Also mit 10KHz und 2,4KOHM pullup hab ich jetzt 2,5m hinbekommen,
allerdings läuft das ganze sehr sehr instalbil. D.h. nach min 10min
hängt sich meine Steuerung auf.
Hallo Jo,
Damit musst Du locker 50m und mehr überbrücken können.
Ich vermute mal, Du hast das I2C-Protokoll nicht sauber umgesetzt.
Ausserdem gibt es Bausteine wie der PCF8574 die problemlos sind und
andere wie der DS1631 die auch schon mal den Takt verlängern
(stretching).
Gruss Klaus.
War gester noch bis spät in die Nacht getestet. Aber immer das selbe
problem, nach max. 10min, manchmal auch schon nach 2min hängt sich die
ganze Regelung auf.
Verwende 2 DS1621 und 2 DS1631 also gesamt 4 Tempertursensoren.
Mit deiner Vermutung, etwas mit meinem Code nicht stimmt kann sein. Denn
jenachdem wie ich initalisiere läuft das Program oder halt nicht. Aber
ich muss die initalisierung in die for Anweisung schreiben, sonst misst
er jeden Sensor nur einmal, was ja eigentlich nicht so gedacht ist...
Hier mal ein kleiner Code ausschnitt:
1 | #define GETTEMP 0xAA
| 2 | #define i2ctemp1 0x90
| 3 | #define i2ctemp2 0x92
| 4 | #define i2ctemp3 0x96
| 5 | #define i2ctemp4 0x9E
| 6 | #define STARTCONVERT 0xEE
|
1 | i2c_init();
| 2 | i2c_start(i2ctemp1 + I2C_WRITE);
| 3 | i2c_write(STARTCONVERT);
| 4 | i2c_stop();
| 5 | i2c_start_wait(i2ctemp1 + I2C_WRITE);
| 6 | i2c_write(GETTEMP);
| 7 | i2c_rep_start(i2ctemp1 + I2C_READ);
| 8 | tempVK1 = i2c_readAck();
| 9 | tempNK1 = i2c_readNak();
| 10 | i2c_stop();
| 11 |
| 12 |
| 13 | i2c_init();
| 14 | i2c_start(i2ctemp2 + I2C_WRITE);
| 15 | i2c_write(STARTCONVERT);
| 16 | i2c_stop();
| 17 | i2c_start_wait(i2ctemp2 + I2C_WRITE);
| 18 | i2c_write(GETTEMP);
| 19 | i2c_rep_start(i2ctemp2 + I2C_READ);
| 20 | tempVK2 = i2c_readAck();
| 21 | tempNK2 = i2c_readNak();
| 22 | i2c_stop();
| 23 |
| 24 |
| 25 | i2c_init();
| 26 | i2c_start(i2ctemp3 + I2C_WRITE);
| 27 | i2c_write(STARTCONVERT);
| 28 | i2c_stop();
| 29 | i2c_start_wait(i2ctemp3 + I2C_WRITE);
| 30 | i2c_write(GETTEMP);
| 31 | i2c_rep_start(i2ctemp3 + I2C_READ);
| 32 | tempVK3 = i2c_readAck();
| 33 | tempNK3 = i2c_readNak();
| 34 | i2c_stop();
| 35 |
| 36 |
| 37 | i2c_init();
| 38 | i2c_start(i2ctemp4 + I2C_WRITE);
| 39 | i2c_write(STARTCONVERT);
| 40 | i2c_stop();
| 41 | i2c_start_wait(i2ctemp4 + I2C_WRITE);
| 42 | i2c_write(GETTEMP);
| 43 | i2c_rep_start(i2ctemp4 + I2C_READ);
| 44 | tempVK4 = i2c_readAck();
| 45 | tempNK4 = i2c_readNak();
| 46 | i2c_stop();
|
Mit diesem Codebeispiel läuft die Regelung jetzt soweit ich das
beurteilen kann (seit 13min mit allen 4 Sensoren), aber hab alle Kabel
jetzt wieder auf max. 90cm gekürzt und den µC genau an die stelle
geschraubt, wo er ursprünglich nicht hinsollte... :(
Würde mich freuen wenn du noch eine idea bezüglich meines problems hast.
LG Jo
Vielleicht noch als kleine Anmerkung, die Regelung bzw. der Code hat mit
"nur" 2 Sensoren (Kabellängen wie jetzt) fehlerfrei gelaufen. Momentan
läuft sie auch wieder mit nur 2 Sensoren... Hab denn Code für die
anderen 2 Sensoren im prinzip nur kopiert und eingefügt und die Adressen
geändert...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|