Levelshifter für I2C?

Cassio

Aktives Mitglied
29. Okt. 2008
4.027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Hallo zusammen!

Ich "spiele" ja seit einiger Zeit mit dem I2C-Bus.

Nun habe ich aber ein Stück Hardware hier, dass leider nur mit 3,3V arbeitet. :rolleyes:
Die Versorgungsspannung kann man ja relativ einfach realisieren.....
was ist aber mit den 5V-Signalen des I2C vom Controller?

Da muss doch ein Levelshifter zwischen.
Kann ich den einfach mit nem FET (BS170) bauen? :hmmmm:
Mache mir halt nur Gedanken wegen dem 100k Bustakt.
Nicht das die Signale nachher nicht mehr stimmen. :rolleyes:

Gibt es da ggf. nicht sogar ein fertiges IC für? Kennt sich damit jemand vielleicht aus?

Grüße,
Cassio
 
Guten Morgen Cassio,

bei I2C hast du ja SCL und SDA, wobei SDA bidirektional ist, hier wird es also schwieriger. Wenn du da was mit einem BS170 und Pullup-Widerstand realisierst, kommt es auch sehr stark auf die Länge der I2C Verbindung an, ob das ganze letztendlich funktioniert.

Es gibt auch fertige integrierte Schaltkreise, die das Problem lösen. Zum Beispiel von Maxim, auch bidirektional. Diese Lösung siehst du öfter mal bei Interfaces für Display oder SDCard Anbindung an 5V Systeme, die Lösung ist relativ günstig und schaltungstechnisch einfach. Allerdings muss hier die Leitungslänge sehr kurz sein und ich vermute mal, das wird bei dir nicht der Fall sein. (Für die Richtungserkennung benötigt man am "Eingang" kurzzeitig einen höheren Strom, ist die Leitungslänge zu groß, kann es am Eingang zur mehrfachem Signalwechsel kommen, was bei Clock-Signalen kritisch ist, da dann das Protokoll fehlerhaft ist. Der Effekt hat nichts mit der Datenrate zu tun. Nach meiner Erfahrung betrifft das auch unidirektionale Leveltranslator, ich hatte das Problem bei Maxim und TI bei Leitungslänge ab 15cm, ist sicherlich systembedingt, bei direkter Anbindung funktioniert es einwandfrei. Nur mal als Hinweis, falls du es mit so einem Leveltranslator versuchen möchtest).

Ansonsten kenne ich für I2C leider keine andere fertige Lösung.

Grüße,
Dirk
 
Hallo Dirk!

Ja genau.... bidirektional wäre das Hauptproblem.
Hatte gedacht mit zwei BS170 im "Gegentakt" zu verwenden... aber ich traue dem ganzen nicht. Aus dem Grunde habe ich auch gar nicht erst einen Test gemacht. ;)

Das MAX3000(E) hatte ich schon mal gesehen.... mir aber nicht genau angesehen. Dachte immer, es wäre nur für 1,8V zu 3,3V. :rolleyes:
Nun habe ich aber auch gesehen, dass es bis 5,5V ausgewiesen ist.
Wenn ich Glück habe, liegt hier irgendwo noch ein Teil in der Ecke. ;)

Die Leitungslänge ist diesmal aber unkritisch!
Dürften letztlich nur max. 5cm Leiterbahn bei rauskommen. :)


Fein, dann werde ich mich mal auf die Suche nach dem guten Stück machen. :cool:

Danke dir!
Cassio
 
Hallo Stefan!

Wow! Das P82B96 ist ja ein Traum! :)

Wenn man zwei von den guten Stücken benutzt, kann mit 12V und einem JY(ST)Y-2x2 gut 100m bis 250m erreichen! :eek:
Das ist für I2C ja der Wahnsinn!

Reichelt hat momentan nur die SMD-Variante auf Lager.... aber egal.
Die guten Stücke sollten jedenfalls in meiner Bastelkiste nicht fehlen! ;)

Schon wieder Danke, für den Hinweis! :)

Gruß,
Cassio
 
Hallo Cassio,

mit normalen Cat-5-Kabeln habe ich versuchsweise schon 75 Meter geschafft. Da sollte noch mehr drin sein, ich hatte nur nicht mehr Kabel. Ich habe Einzelkomponenten meiner Aquarienanlage über zwei Stockwerke mit Netzwerkkabeln verbunden. In jedem Teil ist ein P82B96 verbaut der mit 12 Volt läuft. Bislang gab es noch keine Probleme damit.
 
Hallo Stefan!

Wo wir doch gerade dabei sind... ;)

Wenn du einen Teil deiner Aquariumsteuerung via I2C von einer Etage in die Andere transportierst, dann hast du doch bestimmt einen Mega als Slave laufen.

Hast du das unter BASCOM schon mal hinbekommen?
Es gibt dafür wohl eine fertige LIB die man zusätzlich kaufen kann, aber es soll ja auch mit dem Hardware-I2C Pins des Megas so gehen.

Ich gestehe, das wäre ein Punkt, der mich nun noch brennend interessieren würde. ;)
Hast du da mal ein paar Infos für mich, wie du das realisiert hast?

Danke,
Cassio
 
Hi Dino!

Na super.....
und warum hast du mir das gestern Abend nicht gleich geschrieben? ;)

Nun sind sie aber schon in meiner Bestellnotiz. :D

Gruß,
Cassio
 
Na super.....
und warum hast du mir das gestern Abend nicht gleich geschrieben? ;)

Nun sind sie aber schon in meiner Bestellnotiz. :D
na siehste ... hat jeder welche ...
Meiner einer seine ... und ... deiner einer seine ;)
Hab ich aber auch nicht mehr dran gedacht. Hab ich schon ne Zeit lang liegen.

Gruß
Dino
 
Hi zusammen,
Hab ich aber auch nicht mehr dran gedacht. Hab ich schon ne Zeit lang liegen.
was ihr da alles für nette Sachen "rumliegen" habt :D

Den P82B96 muss ich mir mal merken, vielleicht habe ich ja auch irgendwann I2C mit zwei unterschiedlichen Logikpegeln.

Noch einen schönen Abend,
Dirk
 
Hallo Cassio,

ATMega als Slave? Habe ich jede Menge! :)
Wenn du die Hardware-TWI-Pins verwendest ist das recht einfach. Da braucht es keine LIB dazu. Der ATMega macht ja fast alles von selbst, du musst nur ein paar Register abfragen oder setzen. Neben den gängigen Routinen, die im Netz zu finden sind, habe ich es sogar geschafft, den TWI-Interrupt zu nutzen. In der Bascom-Hilfe ist dazu nichts zu finden, aber es funktioniert trotzdem :)

Ein einfaches Programm (ohne Interruptsteuerung) beinhaltet folgendes:
Code:
$lib "i2c_twi.lbx"        'Bei Verwendung von Hardware-TWI (Codeoptimierung)

Const Slaveid = &H84          'Adresse für I2C
Const Vers = 114                'Software-Version

Const Maxanzahlbyte = 2       ' Wenn mehr Zeichen kommen werden diese verworfen !
Dim Messagebuf(maxanzahlbyte) As Byte
Dim Anzahlbuf As Byte         ' Anzahl Zeichen die gesendet wurden
Dim Neuemsg As Byte           ' zeigt an wenn eine neue Message gültig ist

Dim Twi_control As Byte       ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte

Twsr = 0                  ' status und Prescaler auf 0
Twdr = &HFF               ' default
Twar = Slaveid            ' Slaveadresse setzen
Twcr = &B01000100         ' TWI aktivieren, ACK einschalten
Damit hast du den Chip als Slave fertig gemacht. SlaveID ist in dem Fall die Adresse, die du dem Slave verpassen willst. Mehr braucht es gar nicht. Jetzt musst du nur noch festlegen, was der Slave tun soll, wenn er irgendwelche Daten erhält. Mit Maxanzahlbytes legst du fest, wieviele Bytes zur Steuerung des Slaves gesendet werden müssen.
Code:
Do
    'schauen ob TWINT gesetzt ist:
    Twi_control = Twcr And &H80       'Bit7 von Controlregister auslesen
    If Twi_control = &H80 Then       'TWI-Status auslesen:
        Twi_status = Twsr And &HF8       ' Status ->Bit3 bis Bit7
        Select Case Twi_status       'Verzweigung:
            Case &H60         ' Slave Adress empfangen, wir sind gemeint !
                Twcr = &B11000100       ' TWINT löschen, erzeugt ACK
                Anzahlbuf = 0               'Rücksetzen
                Neuemsg = 0                'Rücksetzen
            Case &H80         ' Byte mit ACK erhalten
                If Anzahlbuf < Maxanzahlbyte Then
                    Incr Anzahlbuf
                    Messagebuf(anzahlbuf) = Twdr
                End If
                Twcr = &B11000100       ' TWINT löschen, erzeugt ACK
            Case &HA0         ' Stop oder restart empfangen
                Twcr = &B11000100
                If Anzahlbuf = Maxanzahlbyte Then
                    Neuemsg = 1
                Else
                    Neuemsg = 0
                End If
            Case &HA8:    'Master will ein Byte haben
                 Twdr = Vers   'Sende Softwareversion
                 Twcr = &B11000100
                 Int_i = 0
            'Master will weiteres Byte haben
            Case &HB8:
                 Select Case Int_i
                      Case 0:
                      Twdr = ByteX
                      Case 1:
                      Twdr = ByteY
                      Case 2:
                      Twdr = ByteZ
                 End Select
                 Twcr = &B11000100
                 Incr Int_i
            Case Else
                Twcr = &B11000100       ' TWINT löschen, erzeugt ACK
        End Select
    End If
    ' ein gültiges Paket angekommen
    If Neuemsg = 1 Then
       Neuemsg = 0            ' Flag wieder löschen
       Select Case Messagebuf(1)
          Case 1: 'Mache Dies    
               'Verwende dabei Messagebuf(2)
          Case 2: 'Mache Das
               'Verwende dabei Messagebuf(2)
          Case Else
       End Select
    End If
Loop
Verwirrt genug? Das legt sich bald! :)
 
Verwirrt genug? Das legt sich bald! :)

Hallo Stefan!

Nun ja.... verwirrt bin ich nicht, aber den Code muss ich mir noch mal in Ruhe auf der Zunge zergehen lassen.
Heute Abend wird das nichts mehr. ;)

Kurze Frage noch....
Für welchen Controller gelten deine Codezeilen denn, oder sind die Register bei allen Controllern gleich? :hmmmm:
Finde es jedenfalls besser, wenn ich parallel das Datenblatt liegen habe!

Ich danke dir auf alle Fälle schon mal, für die Zeilen.
Werde mich morgen damit mal etwas beschäftigen. :)

Gruß,
Cassio
 
Hallo Stefan!

Ich hatte den Mega8 zwar im Verdacht, aber nun weiß ich es genau! ;)

Inzwischen muss ich sagen, dass mich der I2C-Bus immer mehr fasziniert.
Ich weiß gar nicht mehr, warum ich den "früher" immer ignoriert habe. ;)
Es scheint so, als hätte der Bus einen neuen Fan gefunden. :)

Gruß,
Cassio
 
Hallo Cassio,

ich bin schon länger TWI-Fan.
Die Registerbezeichnungen sollten übrigens bei allen ATMegas passen. In den Datenblättern, die ich durchgeschaut habe, war es auf jeden Fall so. Ein paar haben zusätzlich noch ein TWAMR (Adress Mask Register).
 
Hi Cassio und Stefan,

Deine/ Eure Begeisterung hat mich neugierig gemacht. I2C ist vermutlich die Lösung meines Problems.....Tiny84/85 und 2313 haben doch den Two- Wire - Modus...2 Pins (SDA und SCL) sind immer abzuzwacken...und kürzeste Leitungswege habe ich auch...dann kann mein Testbox- Layout (Tiny84 und 2313) ja fast so bleiben, das spart eine Menge an Zeit und umgefriemel...:D:D deswegen liegt's z. Zt. beiseite...

Das muss ich mir alles mal ganz in Ruhe ansehen!


Grüsse,

Michael
 
Hallo Stefan!

Für einen ersten Test, einen Mega8 als Slave zu benutzen, fehlt mir momentan die Zeit. Allerdings werde ich da bestimmt nicht locker lassen!
Was ich heute zufällig im Dtaenblatt des P82B96 gesehen habe.....
Mit den IC`s kann man ja sogar einen Multipoint-I2C aufbauen! :eek:
Das wäre sonst meine nächste Frage gewesen. ;)

Mit dem ganzen Thema muss ich mich doch mal näher befassen!



Hallo Michael!

Was möchtest du denn auf I2C an deiner Testbox ändern? :hmmmm:
Mit dem Slavemodus habe ich noch keine Erfahrung.... allerdings gibt es für BASCOM fertige Möglichkeiten eine 4x4-Matrixtastatur und ein Standard-LCD via I2C zu verwenden! ;)
Ich bin der Meinung, dass die LIB von Kent Andersson für die Matrix-Tastatur schon von BASCOM mitgeliefert wird. Schau mal nach Key-i2c.lib in deinem LIB-Verzeichnis.
Die LIB für das LCD am I2C-Bus musst du dir aber aus dem Internet besorgen..... die wurde übrigens auch mal von Kent Andersson geschrieben. Sollte also zu finden sein.
Auf alle Fälle brauchst du für beide Varainten nur die einfachen PCF8574. :)

Diese beiden Test möchte ich jedenfalls auch noch gerne durchführen und auch gleich ein paar Anschlussplatinen dafür ätzen.
Wie aber immer, fehlt einem mal wieder die Zeit. :rolleyes:

Gruß,
Cassio
 
Hi Cassio,

ich dachte da lediglich an die Tastaturmatrix und die Kommunikation zwwischen den AVR.
Das muss ich mir ebenfalls alles gaaaanz in Ruhe ansehen und überdenken. Vor Weihnachten wird das aber wohl nix mehr werden.

Ansonste werde ich bis dahin nur noch ein oder zwei Fahrzeuge beleuchten und die Fahrtregelung einbauen. Funktioniert inzwischen per HW- PWM (TL494/ IRLU 2905), nur noch etwas feintuning. Und ausgiebig das Linux "Ultimate Edition" testen; dafür muss ich vorher noch die HW etwas umorganisieren. So ist (leider) von mir vorerst wieder nicht viel zu erwarten. Die 1820er und ein DCF- Modul fristen ein trostloses Dasein in der Schublade...:eek:

So ungefähr wird der Rest des Jahres bei mir ablaufen. Und wer weiss, vielleicht läuft ab Ende November hobbymässig ja gar nichts mehr....:cray:;) :D:D:D


Grüsse,

Michael
 
Und wer weiss, vielleicht läuft ab Ende November hobbymässig ja gar nichts mehr....:cray:;) :D:D:D
l

Hi Michael!

Oder gerade dann hast du eine Menge Zeit für dein Hobby. ;)
Wenn alles andere zu stressig wird, verkriechst du dich in den Hobbykeller. :D


Für I2C-Matrixtastatur benötigst du wirklich nur einen PCF8574!
Schau mal in das LIB-Verzeichnis nach der Key-i2c.lib und öffne diese mit einem ganz normalen Editor. Dort ist auch die Anschlussbelegung angegeben. :)
Oder du wartest noch etwas, dann schreibe ich hier bestimmt ein paar Zeilen dazu. ;)

Gruß,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)