P82B715PN I2C Extender

#817699
Lesenswert?

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
#817970
Lesenswert?

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.
#818006
Lesenswert?

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...
#818314
Lesenswert?

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.
#818506
Lesenswert?

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?
#818521
Lesenswert?

> 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...
#818663
Lesenswert?

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.
#820028
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren