Forum: Mikrocontroller und Digitale Elektronik P82B715PN I2C Extender


von Jo H. (haveaniceday)


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

von Klaus R. (klara)


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.

von Jo H. (haveaniceday)


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...

von Andreas K. (a-k)


Lesenswert?

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.

von Andreas K. (a-k)


Lesenswert?

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.

von Jo H. (haveaniceday)


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.

von Andreas K. (a-k)


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?

von Jo H. (haveaniceday)


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...

von Andreas K. (a-k)


Lesenswert?

Ich meinte die C Version.

von Jo H. (haveaniceday)


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.

von Andreas K. (a-k)


Lesenswert?

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.

von Jo H. (haveaniceday)


Lesenswert?

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.

von Klaus R. (klara)


Lesenswert?

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.

von Jo H. (haveaniceday)


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

von Jo H. (haveaniceday)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.