- 3D-Druck Einstieg und Tipps    Werbung      
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 40

Thema: bidirektionale Level-Converter I2C

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.02.2010
    Beiträge
    101
    Hmmm... woran liegt es nur, dass das nicht will wie ich? Bild  

    Hab es gerade noch mal getestet aber es funktioniert noch nicht.
    Hier mal der aktuelle Code:

    Code:
    ' BASCOM-Programm
    ' I2C-Scanner mit ATMega8
    '
    ' In:  beliebige I2C-Slaves  an C.4=SDA und C.5=SCL
    ' Out: SerialOut über UART
    ' Funktion dieses Demo-Programmes:
    ' Scannen der Slave-Adressen
    
    '$sim
    
    $regfile = "m8def.dat"                                      ' benutzter Mikrocontroller
    $crystal = 8000000                                          ' Taktfrequenz
    
    $hwstack = 40                                               ' Hardware Stack
    $swstack = 32                                               ' SW Stack
    $framesize = 60                                             ' Frame
    
    $baud = 9600
    
    Waitms 250
    
    Config Sda = Portc.4
    Config Scl = Portc.5
    
    Config I2cdelay = 10
    
    I2cinit
    
    Dim Slaveadresse As Byte
    Dim Lux As Byte
    Lux = 0
    
    Dim Lux01 As Byte
    Dim Lux02 As Byte
    
    Do
       Print "I2C Slaves"
       Print "suchen..."
       Wait 2
    
       For Slaveadresse = 0 To 254 Step 1                       ' für alle geraden Adressen
          I2cstart                                              'Startbedingung senden
          I2cwbyte Slaveadresse                                 ' Addresse senden
    
          If Err = 0 Then                                       'I2C-Slave gefunden?
             Print "Slave dec: " ; Slaveadresse
             Print "h" ; Hex(slaveadresse) ; "  b" ; Bin(slaveadresse)
             Wait 2
          End If
    
          I2cstop                                               'Bus freigeben
       Next
    
       Print "Ende Scan"
       Wait 2
    
    
    
       I2cstart
       I2cwbyte &H72 , Lux
       If Err = 0 Then
          Print "Lux72: " ; Lux
          Waitms 250
       Else
          Print "Lux72: no ACK"
       End If
       I2cstop
    
       I2cstart
       I2cwbyte &H73 , Lux
       If Err = 0 Then
          Print "Lux73: " ; Lux
          Waitms 250
       Else
          Print "Lux73: no ACK"
       End If
       I2cstop
    
       I2cstart
       I2cwbyte &H74 , Lux
       If Err = 0 Then
          Print "Lux74: " ; Lux
          Waitms 250
       Else
          Print "Lux74: no ACK"
       End If
       I2cstop
    
       I2cstart
       I2cwbyte &H75 , Lux
       If Err = 0 Then
          Print "Lux75: " ; Lux
          Waitms 250
       Else
          Print "Lux75: no ACK"
       End If
       I2cstop
    
       I2cinit
    
       I2cstart
       I2cwbyte 57                                              '0x39
       I2cwbyte 140                                             '0x8C
       I2crbyte Lux01 , Ack
       I2cwbyte 109                                             '0x6d
       I2crbyte Lux02 , Nack
    
       Print "erster Wert: " ; Lux01
       Print "zweiter Wert: " ; Lux02
    
       I2cinit
    Loop
    
    End
    Und was Hterm dabei ausgibt:

    Bild  

    Falls da mal jemand drüber schauen kann und mir evtl. Fehler im Code aufzeigt, damit ich nachbessern kann...

    Viele Grüße
    e.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von extremesports Beitrag anzeigen
    Ich hab gerade einen Schaltplan gefunden, wo jemand als Pullups gegen 3,3 Volt 10kOhm verwendet. Kann es daran liegen, dass ich die falschen Pullups verwende(1kOhm)?
    Zuerst mal dazu: der I2C Bus ist digital und nicht analog. Trotzdem gibt es ein furchtbares rumgeeier mit den Pullups. Das kommt wohl daher, daß keiner mehr mit digitaler Logic, Opencollector-Ausgängen und Wired-Ors umgehen kann. Also ganz kurz: der High-Pegel sowohl von SDA als auch SCL wird nur durch die Pullups gebildet. Der Wert ist eigentlich egal, solange damit gegen die Eigangsströme aller Busteilnehmer ein High erzeugt werden kann. Da reicht leicht 1 µA oder weniger. Aber: je größer die Kapazität der Busleitung ist, desto länger dauert es das High zu erreichen. Wenn man es also zügig haben will, sollte man die Pullups klein machen. Die Grenze sind da die 3 mA, die das normgerechte Maximum für einen I2C Ausgang sind (obwohl die meisten auch mehr leisten können). Bei wenigen cm Bus und nur zwei drei Bausteinen am Bus, passen zwischen 50k und 1k, läßt sich leicht ausrechen (oder einfach mit dem Scope sehen).

    Jetzt zu dem Code:

    Du scanst über 256 Busadressen, der I2C hat aber nur 128. Und bevor jetzt gleich gemault wird, so stehts in der Spec. Diese Adresse wird in den obersten 7 Bit des ersten Bytes eines Telegrams übertragen. Das unterste Bit zeigt an, ob es ein Read oder Write werden wird.

    Also: I2CWRITE(Adresse << 1 | RW_Bit)

    Da ich dein Basic ? nicht kenne, eine art pseudo C. Wenn man nur den Bus scannen will, sollte man nur Writes schicken und dann mit Stop abbrechen. Manche einfachen Slaves wollen nach einem Read unbedingt daß der Master etwas liest und hängen bis zum nächsten Reset.

    Wenn mein Hex-Rechner richtig funktioniert, ist 0x39 << 1 | 0 gleich 0x72, also gar nicht so falsch.

    Da ich nicht weiß, was die Funktion "I2creceive" macht, kann ich dazu wenig sagen, nur mit 0x39 << 1 | 0 als erstes Byte kann man nur schreiben, lesen kann man mit 0x39 << 1 | 1 .

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Drehscheibe > IR Bidirektionale Datenübertragung
    Von shakespear im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 6
    Letzter Beitrag: 31.03.2008, 16:04
  2. Optokoppler für bidirektionale Schnittstelle ???
    Von müllo im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 03.11.2005, 21:12
  3. Antworten: 16
    Letzter Beitrag: 28.06.2005, 21:44
  4. bidirektionale Alternative zu I²C: RS232
    Von God im Forum AVR Hardwarethemen
    Antworten: 28
    Letzter Beitrag: 28.05.2004, 11:44

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

    Werbung      LiFePO4 Speicher Test