- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: I2C Slave

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    11.09.2007
    Beiträge
    211

    I2C Slave

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    ich habe einen Sensor mit dem I2C Bus, den ich abfragen möchte.
    Hier ist mein Beispielprogramm:

    Code:
    $regfile = "M8def.dat"                                      'es handelt sich um einen ATmega8
    $crystal = 16000000                                        
    $hwstack = 32                                               
    $swstack = 10                                               '
    $framesize = 40                                            
    $baud = 9600
    
    
    Dim Lesen1 As Byte
    
    
    'SDA und SCL definieren
    Config Sda = Portc.4
    Config Scl = Portc.5
    
    I2cinit
    
    
    I2cstart
    I2cwbyte &B6
    I2crbyte Lesen1 , Nack                                  
    I2cstop
    
    Print Err
    
    
    Print "gelesen: "
    Print Lesen1
    
    
    End
    Die Ausgabe sieht immer so aus:


    • 1
      gelesen:
      255


    Datenblatt des Sensors:
    http://www.captured-dreams.de/temp/T...n_Note_0_6.pdf


    Hat jemand eine Idee, was ich falsch mache? Ich vermute bei der Adressierung ist etwas falsch. Im Datenblatt steht, dass die Adresse des Slave "54h" ist, aber wie konfigutiere ich das?

    Danke!

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    ohne jetzt genauer auf das DB einzugehen, die Slave-Adresse stimmt so nicht, B6 ist eine "schreib"-Adresse, es muss Bit 0 gesetzt werden, damit der Slave Daten rausrückt.
    Und in Bascom gibt man HexZahlen so an:
    &HB6 bzw. hier sollte es &HB7 sein.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    11.09.2007
    Beiträge
    211
    Hallo,

    vielen Dank!
    Ich habe die Adressen korrigiert und spreche jetzt den Slave nur per

    Code:
    I2cinit
    I2cstart
    I2cwbyte &H54h
    I2cstop
    
    Print Err
    an. Trotzdem wird Err = 1 gesetzt

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Das kleine "h" nach der Adresse hat da aber nix zu suchen.
    Welche Adresse hat denn nun der Slave ?

    &H54 ist die Adresse zum schreiben, &H55 entsprechend zum lesen vom Slave.

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    11.09.2007
    Beiträge
    211
    Also im Datenblatt steht, dass der Slave die Adresse 54h hat. Um ihn auszulesen muss 0xB5 oder 0xB6 gesendet werden. Oder ich verstehe da irgendwas völlig falsch

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Aber erst muss die Adresse gesendet werden, dann der Befehl zum auslesen!

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    11.09.2007
    Beiträge
    211
    Zitat Zitat von uwegw
    Aber erst muss die Adresse gesendet werden, dann der Befehl zum auslesen!
    Das ist klar, aber wenn ich erstmal nur die Adresse des Slave anspreche, dürfte es doch keinen Fehler geben, oder?

    Datenblatt:

    The I2C slave address is 54h.

    0xB6 Read object temperature Object temperature in hundredth of degree 2
    0xB5 Read ambient temperature Ambient temperature in hundredth of degree 2

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    21.07.2008
    Ort
    Moosburg
    Alter
    46
    Beiträge
    49

    Re: I2C Slave

    Hi,

    ich bin jetzt kein Bascom-Programmierer, kann also sein, dass die Syntax des Programms nicht ganz richtig ist, ich setzte aber den I2C-Bus sehr oft ein. So, wie ich den Sensor verstanden habe, musst Du zuerst den Befehl senden, der angibt, was Du auslesen willst:
    Code:
    I2cstart
    I2cwbyte &H54
    I2cwbyte &HB6
    I2cstop
    Danach liest Du vom Sensor. Das geht leider nicht direkt in einem:
    Code:
    I2cstart
    I2cwbyte &H55
    I2crbyte Lesen1 , Nack                                 
    I2cstop
    Man kann das auch mit einem REPEATED START machen und sich ein STOP sparen:
    Code:
    I2cstart
    I2cwbyte &H54
    I2cwbyte &HB6
    I2cstart
    I2cwbyte &H55
    I2crbyte Lesen1 , Nack                                 
    I2cstop
    Wichtig ist: Gerade Adressen signalisieren einen Schreibvorgang an den Slave, ungerade Adressen einen Lesevorgang vom Slave.

    Noch was: Die Leitungen SDA und SCL brauchen Pull-Up-Widerstäde. Wenn die nicht da sind, geht die Übertragung schief.

    Viele Grüße,

    Markus

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.09.2004
    Beiträge
    264
    Hallo,
    ich möchte mal folgenden Code in den Raum stellen:

    Code:
    i2cstart
    i2cwbyte 84
    i2cwbyte 182
    i2cstop
    
    i2cstart
    i2cwbyte 85
    i2crbyte highbyte
    i2crbyte lowbyte
    i2cstop
    
    Temp=(highbyte*256+lowbyte)/100  ' geht in Bascom so nicht, muß man zerlegen
    mfg

    Stefan

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    11.09.2007
    Beiträge
    211
    Hallo,

    vielen Dank für die Tipps, ich werde es heute Nachmittag nochmal ausprobieren. Ich glaube jetzt ist mir klar, wo das Problem liegt.

    Pull-Ups sind da (10k).

    Grüße
    Alex

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen