I²C-Bus Allgemeine Fragen

Hi Leute,

hab jetzt einige Zeit das Internet durchforstet hab aber zu ein paar Fragen nix gefunden
und hoffe nun das ihr mir helfen könnt =)

  1. Brauch ich die Pull-ups beim Arduino oder sind die schon intern?
    Da mein Bus mit 3 Slave und 1 Master und ohne Pull-ups wunderbar funktioniert.

  2. Inwiefern beeinflussen die Pull-up Widerstände meine Übertragung?
    (Störungen oder Geschwindigkeit?) Für was brauch ich von der Funktion her diese Eigentlich? =D

  3. Für was werden die 16 Reservierten Adressen im 7-bit Bereich benötigt?

Freue mich schon auf eure Antworten und vielen Dank schon mal für eure Hilfe=)

Gruß Da_Sepp

Hallo,

wenn Du nach "I2C erklärt" suchst, solltest Du fündig werden. :wink:
Bsp. Universität Paderborn  -  Fehler 403

1. Brauch ich die Pull-ups beim Arduino oder sind die schon intern?
    Da mein Bus mit 3 Slave und 1 Master und ohne Pull-ups wunderbar funktioniert.

Die hat der Arduino schon, nur haben die große Toleranzen. Nimm besser externe. Meine DS3231RTC funktioniert auch ohne PullUps, dennoch habe ich sie dran. Damit werden die Signalleitungen sauber auf Pegel gehalten. Man kann auch freihändig Fahrrad fahren, funktioniert, aber nie dauerhaft und in jeder Situation. :wink:

2. Inwiefern beeinflussen die Pull-up Widerstände meine Übertragung?
   (Störungen oder Geschwindigkeit?) Für was brauch ich von der Funktion her diese Eigentlich? =D

Die Größe soll die Übertragungsgeschwindigkeit beeinflussen. Hatte ich auch gelesen. Ich hab 10k verwendet.

3. Für was werden die 16 Reservierten Adressen im 7-bit Bereich benötigt?

Da mußt Du den Erfinder Philips fragen. Müssen irgendwelche festgelegte Adressen des Herstellers vom IC sein.

Normal sind 4,7k

Man sollte dabei auch beachten, dass die meisten Breakout Boards schon Pullups auf den Platinen haben. Wenn man also ein nacktes IC hat sollte man welche extra verbauen. Aber nicht wenn sie schon auf der Platine drauf sind.

Hier sieht man schön den Effekt des Widerstands-Werts auf das Signal:

Bei den internen Pullups kommt kein vernünftiges Signal raus, auch wenn es unter Umständen funktionieren mag

Das hängt aber auch mit der Kabel-Länge (die bei I2C sowieso minimal sein sollte) und der Geschwindigkeit (die hier fest ist) zusammen

Hallo,

Man sollte dabei auch beachten, dass die meisten Breakout Boards schon Pullups auf den Platinen haben. Wenn man also ein nacktes IC hat sollte man welche extra verbauen. Aber nicht wenn sie schon auf der Platine drauf sind.

Bist Du Dir da sicher? Denn das würde bedeuten das man nicht mehrere Module verwenden kann.

Hier sieht man schön den Effekt des Widerstands-Werts auf das Signal:
Gammon Forum : Electronics : Microprocessors : I2C - Two-Wire Peripheral Interface - for Arduino
Bei den internen Pullups kommt kein vernünftiges Signal raus, auch wenn es unter Umständen funktionieren mag

schön anschaulich erklärt.

Man sollte dabei auch beachten, dass die meisten Breakout Boards schon Pullups auf den Platinen haben.

Das ist leider bei einigen so, zum Glück nicht bei den meisten, denn wie DocArduino schon angedeutet hat, würde das schnell grosse Probleme machen, wenn man mehr als ein Device an den Bus anschliessen möchte. Grundsätzlich kann man sagen: wenn ein Breakout Board die Pullups fest verdrahtet auf der Platine hat, ist es schlecht designt und ich würde eher nach einer Alternative Aussschau halten.

Wow vielen Dank für die Informativen Rückmeldungen =)

Wenn ich das mit den Widerständen richtig verstanden hab dann kann ich mit größeren Widerständen auch eine höhere Geschwindigkeit erzielen oder?

Gruß Da_Sepp

Hallo,

nein, genau umgekehrt. Je kleiner die Pull-Ups, desto höher die Geschwindigkeit. Ich sagmal so, zwischen 4,7k und 10k sollte alles funktionieren. Wenn diese, wie eben festgestellt wurde, die einzigsten Pull-Ups an den beiden Leitungen sind.

Alles klar vielen Dank =)

Die Grösse der Pullups hängen natürlich auch von der verwendeten Spannung ab. Für 5V ist 2k7 so in etwa der kleinste Wert, der noch knapp in der Spezifikation ist, bei 3V3 würde ich hingegen eher zu 2k2 raten. 4k7 ist für einen kurzen Bus mit wenigen Slaves (<4) im Normalfall ein guter Wert.

Da_Sepp:
Wow vielen Dank für die Informativen Rückmeldungen =)

Wenn ich das mit den Widerständen richtig verstanden hab dann kann ich mit größeren Widerständen auch eine höhere Geschwindigkeit erzielen oder?

Gruß Da_Sepp

Nein.
Es gibt 3 verschiedene Geschwindigkeiten die man beim I2C Bus verwendet: 100k, 400kHz und 1.2MHz 3,4MHz. Je nach Geschwindigkeit braucht es kleinere Widerstände um in der gegebenen Zeit für ein Bit den Spannungspegel wieder auf HIGH zu bringen. Wenn der Widerstand zu groß ist, dann heißt es nicht daß die Geschwindigkeit abfällt, sondern daß der Bus nicht funktioniert.
Der größtmögliche Pullupwiderstand ergibt sich aus den kapazitäten der Leitungen und dem Stromverbrauch der Eingänge. Der kleistmögliche Widerstand wird von der maximalen Strombelastung der Eingänge bestimmt.
Außer Widerstände gibt es auch noch I2C Extender wie zB PCA9507 die zwischen sich einen größeren Strom aufbringen können oder I2C Accelerator der den High-Pegel aktiv wieder auf High bringt zB LTC4311.

Für den I2C Bus gibt es einen erweiterten Adressraum bei dem ein zweites Byte als Adresse vorgesehen ist. Dieser Adressraum fängt mit den reservierten Adressen an. Mir ist aber keine Applikation dafür bekannt.

Grüße Uwe

Hallo,

ich habe mein DS3231RTC Modul mal "vermessen". Tatsache, zwischen + und je SCL/SDA messe ich 4,7k. Da es sich leider nicht um die 2 einzelnen SMD Widerstände handelt, sondern um 2 Stück 8pol. SMD Bauteile, wahrscheinlich Widerstandsnetzwerke, kann ich die nicht einfach runterlöten. Da noch ein Eprom auf dem Modul sitzt. Zur Zeit ist es mein einzigstes I2C Device am µC. Ich lasse das erstmal so. Bestätigt mich in meiner Vorliebe zum SPI Bus. :wink:

Der Pullupwiderstand kann sich ruhig aus mehreren paralell geschaltenen Widerständen zusammensetzen. Die Summe darf nicht zu klein werden um die Ausgänge nicht zu überlasten.
Grüße Uwe

hi,

Für was werden die 16 Reservierten Adressen im 7-bit Bereich benötigt?

hat mir auch keine ruhe gelassen:
http://www.diolan.com/dln_doc/i2c-address.html

gruß stefan

Eisebaer:
hi,

Für was werden die 16 Reservierten Adressen im 7-bit Bereich benötigt?

hat mir auch keine ruhe gelassen:
http://www.diolan.com/dln_doc/i2c-address.html
Addressing - I2C Bus

gruß stefan

Dann hatte ich teilweise recht. :wink: :wink: :wink:
Grüße Uwe

hi,

Dann hatte ich teilweis recht.

naja, ich hab' ja nicht gesucht, um Dich zu widerlegen. ich hätt's nur nicht verstanden, warum man ohne sinn den adressraum beschneidet.
außerdem hattest Du vollkommen recht, es war nur nicht die ganze antwort.

gruß stefan

Hi Loits,

Ich krebse aktuell ein wenig mit meinem Equipment rum...

Aaaalllsssooooo:

Arduino Uno, R3 original/ alternativ ein Sainsmart Uno
ein DEEK Robot Data Logging shield, V1.0, also mit SD/ RTC
ein I2C LCD 2004. LCD made in China, I2C von Sainsmart

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>



#define BACKLIGHT_PIN     13

/*
Add read: 7E <= LCD

Add read: D0 <= RTC

Add write: 7E <= LCD

Add write: D0 <= RTC

Scanning...

I2C device found at address 0x3F  !

I2C device found at address 0x68  !

done

Done
*/

LiquidCrystal_I2C lcd(0x3F,20,4);  // Set the LCD I2C address

// LiquidCrystal_I2C lcd(0x7E, BACKLIGHT_PIN, 20);  // Set the LCD I2C address


// Creat a set of new characters
const uint8_t charBitmap[][8] = {
   { 0xc, 0x12, 0x12, 0xc, 0, 0, 0, 0 },
   { 0x6, 0x9, 0x9, 0x6, 0, 0, 0, 0 },
   { 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0, 0x0 },
   { 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0, 0x0 },
   { 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0x0 },
   { 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0x0 },
   { 0x0, 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0x0 },
   { 0x0, 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0x0 }
   
};



void setup()
{
  Serial.begin(9600);
   int charBitmapSize = (sizeof(charBitmap ) / sizeof (charBitmap[0]));

  // Switch on the backlight
  pinMode ( BACKLIGHT_PIN, OUTPUT );
  digitalWrite ( BACKLIGHT_PIN, HIGH );
  Serial.println("Setup done");
  
  
  lcd.begin(20,4);               // initialize the lcd 

   for ( int i = 0; i < charBitmapSize; i++ )
   {
      lcd.createChar ( i, (uint8_t *)charBitmap[i] );
   }

  lcd.home ();                   // go home
  lcd.print("Hello, ARDUINO ");  
  lcd.setCursor ( 0, 1 );        // go to the next line
  lcd.print (" FORUM - fm   ");
  delay ( 1000 );
  Serial.println("Forum.fm");
}

void loop()
{
/*   lcd.home ();
   // Do a little animation by writing to the same location
   for ( int i = 0; i < 2; i++ )
   {
      for ( int j = 0; j < 16; j++ )
      {
         lcd.print (char(random(7)));
      }
      lcd.setCursor ( 0, 1 );
   }
*/

  lcd.home ();                   // go home
  lcd.setCursor (0, 0);
  lcd.print("This is Tom ");
Serial.println("This is Tom");  
  lcd.setCursor ( 0, 1 );        // go to the next line
  lcd.print ("Testing LCD");
  lcd.setCursor ( 0, 2 );        // go to the next line
  lcd.print ("Writing LCD");
  lcd.setCursor ( 0, 3 );        // go to the next line
  lcd.print ("Shining LCD"); 
  digitalWrite ( BACKLIGHT_PIN, LOW );
  delay (2500);
  digitalWrite ( BACKLIGHT_PIN, HIGH );
  delay (2500);
}

Problem:
Das LCD zeigt mit auf Zeile 1 und 3, also die 2. und vierte Zeile einen Streifen aus den 5x7 Matrix Punkten
Mit den Original Settings der Examples aus der (den....) Libaries erhalte ich keine Reaktion, mit den Settings von oben, also den Echos des I2C Scanners und den 20 Zeichen x 4 Zeilen bleiben die Zeilen mit den Pixeln, mit 7E als Adresse blinkt das LCD mit den 5000ms, wird also angesprochen, ohne Zeichen dazustellen.

Hat einer von Euch Freaks eine Idee, an welchen 'Schrauben' ich noch drehen kann, um das Ding zum Rennen zu bringen?

Hier im Forum, und bei den weiterführenden Links habe ich zwar ne Menge Infos gefunden, jedoch nichts, was geholfen hat...

Best regards,
Grazie tutti,

Ciao, Markus

Hallo,
diese "LCD´s! scheinen ja alle ein Eigenleben zu führen.
Was hat das Ding denn für einen Controller?
Einige Bilder und Link´s zur Hardware wären nicht schlecht.
Diese "Zeilen" deuten auf falschen Anschluß hin, oder falsche Adressierung des LCD.
Gruß und Spaß
Andreas

Bitte poste auch Bilder von der Verkabelung des LCDs an den Arduino. Verwendest Du Pull-up-Widerstände? Wie lang ist der I2C-Bus?

Hey, prima, THX !!!!

Also, Verkabelung wie in den Bildern, Pullups mit 4,7k, gegen +5V, 4 poliger Stecker, andere Seite angelötet, ~20cm

habdas Shield gefunden: Play-Zone.CH DK Data Logging Shield V1.0

Greetz, Linpo

Hallo,
das Display wird über einen I2C-Adapter betrieben. Da habe ich keine Ahnung von. sorry
Gruß und Spaß
Andreas