- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 10

Thema: I2C Programm - I/O Expander Problem

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2004
    Ort
    Bürstadt
    Alter
    36
    Beiträge
    383

    I2C Programm - I/O Expander Problem

    Anzeige

    Praxistest und DIY Projekte
    Hallo Leute!

    Also mein Problem beginnt damit, dass ich keine freien Ports mehr an meinem Atmega16 habe und deshalb eine Lösung suche.

    Bin dann auf sogenannte I/O Expander gestoßen...

    Hab jetzt hier einen richtig schönen MAX7300 20 zusätzliche Ports (dürfte erstmal reichen \/ ) rumliegen.

    Jetzt mein Problem: Wie steuer ich das mit I2C an? Also ich hab die SDA und SCL Leitungen mit jeweils 4.7kOhm an Vcc gehängt. Alles nach Plan angeschlossen. Ein fertiges Atmega8 Modul rausgeholt SDA und SCL miteinander verbunden und versucht das ganze zu proggen.

    Ohne Erfolg.

    Jetzt meine Fragen. Zum test hab ich eine LED mit 1K Widerstand an P12.
    Slave Adresse ist AD0 auf GND und AD1 auf GND.

    Im Datenblatt abgelesen und schon kam das durcheinander. Man kann jeden Pin als Input oder Output konfigurieren. Hab jetzt alles mögliche ausprobiert und bin bei diesem Code in Bascom stehen gelieben:


    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $lib "i2c.lib"
    
    Config Portb = Output
    Config Portc = Output
    Config Portd = Output
    Config I2cdelay = 5                                         '100KHZ Busfrequenz?
    Config Sda = Portc.4                                        ' Portc.4 ist SDA
    Config Scl = Portc.5                                        'Portc.5 ist SCL
    Const Slave = &B10000000                                    'Slavesadresse laut Datenblatt
    I2cinit                                                     ' Initialisieren
    
    
    Do
    
    I2cstart                                                    'start
    I2csend Slave , &H0B                                        'Portadresse
    I2csend Slave , &B01                                        'output
    I2csend Slave , 1                                           '1
    
    
    I2cstop                                                     'stop
    
    
    Wait 1
    
    Loop
    End
    Datenblatt findet ihr http://pdfserv.maxim-ic.com/en/ds/MAX7300.pdf

    Also ich bin totaler I2C newbie drum kann ich leider mit den Daten aus dem Datenblatt nicht viel anfangen. Wann muss ich welche Adresse senden?

    Danke fürs lesen

    MfG
    Ringo (need Help)
    Nobody is Perfect
    Visit www.ringo.roboterbastler.de last update: 23.05.2009

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2004
    Ort
    Bürstadt
    Alter
    36
    Beiträge
    383
    Hallo!

    Also ich hab jetzt wieder alles mögliche ausprobiert wieder ohne Erfolg..

    Kann mir niemand mal nen TIP geben?

    Ich bräuchte nur den angfangscode! so ne art initialisierung.

    Was ist der unterschied zwischen I2Csend und I2Cwbyte?

    Ich sende die adresse und dann fängt es schon an das ich nicht genau weiß was ich senden soll... in welcher Reihenfolge..

    Bitte, ich komm nicht weiter.

    MfG
    ringo
    Nobody is Perfect
    Visit www.ringo.roboterbastler.de last update: 23.05.2009

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    *murmel* Ich hab mir das datenblatt angesehen, ich sag' dir, was ich denke:
    Du mußt erst mal die Pin konfigurieren, normalerweise ist alles Input.
    P12 wäre das Konfig-register &H0B, die bits 0 u. 1
    (I2Cwbyte ist EIN byte senden, I2Csend gehen auch mehrere)
    Konfigurieren:
    I2cstart 'start
    I2cwbyte Slave
    I2cwbyte &H0B 'Port 12 -15 Config (Seite 7)
    I2cwbyte &H55 'Port 12 -15 = output
    '------------------------------------- mal soll nicht mit 0 kongfigurieren)
    I2cstop 'stop

    P12 auf "1" :
    I2cstart 'start
    I2cwbyte Slave
    I2cwbyte &H2C 'Port 12 only (Seite 13)
    I2cwbyte &H01 'Port 12 auf "1"
    I2cstop 'stop


    P12 auf "0" :
    I2cstart 'start
    I2cwbyte Slave
    I2cwbyte &H2C 'Port 12 only (Seite 13)
    I2cwbyte &H00 'Port 12 auf "1"
    I2cstop 'stop

    Und jetzt guck mal, ob ich dir einen Schwachsinn erzählt habe
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von Rage_Empire
    Registriert seit
    10.03.2005
    Ort
    Pforzheim
    Beiträge
    710
    würd nen pcf8574 nehmen, ist einfacher zu handhaben.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2004
    Ort
    Bürstadt
    Alter
    36
    Beiträge
    383
    DANKE! PICKNiCK! Du bist mein Held!

    Es Funktioniert! \/ \/ \/ \/

    Seit 2 Tagen bin ich am rummachen! Und du löst das in ein paar Minuten. irgendwie lässt mich das an meiner Intelligenz zweifeln

    Egal dein Code, so wie er oben steht funktioniert bis auf eine Kleinigkeit:

    Der Chip startet in Shutdown Modus.

    Mit
    I2cwbyte &H04
    I2cwbyte &H01

    stellt man in in normal Mode und dann dein code lässt p12 ein/aus schalten!

    DANKE!
    Jetzt hab ich auch das Prinzip verstanden!


    würd nen pcf8574 nehmen, ist einfacher zu handhaben.
    Den MAX7300 hab ich geschenkt bekommen und jetzt wo er funst ist das echt geil, 20 neue Ports.. \/

    MfG
    Ringo
    Nobody is Perfect
    Visit www.ringo.roboterbastler.de last update: 23.05.2009

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Zitat Zitat von Ringo
    ..Intelligenz zweifeln
    kränk' dich nicht, ich hab wahrscheinlich (wie andere) nach all den Jahren schon die richtige Matschbirne für sowas.
    Und wenn du's jetzt begriffen hast, wie's läuft, bist du ja auch schon auf dem Weg dazu.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2004
    Ort
    Bürstadt
    Alter
    36
    Beiträge
    383
    hehehe ja danke..

    Hab hier noch nen I2C Eprom rumliegen. Den dürfte ich alleine hinbekommen ^^


    MfG
    Ringo
    Nobody is Perfect
    Visit www.ringo.roboterbastler.de last update: 23.05.2009

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    18.05.2005
    Beiträge
    53
    weiß jemand wie man eingänge mit dem max7300 abfragen kann?

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    18.05.2005
    Beiträge
    53
    kann mir wirklich keiner helfen?

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    10.06.2005
    Ort
    Buchbrunn
    Alter
    35
    Beiträge
    68
    Hallo,

    Ich hab auch ein Problem mit einem I²C Portexpander allerdings nicht mit dem MAX7300 sondern mit dem PCA9535D (16bit Portexpander).
    Ich kann auf ihn zugreifen und auch auf ihn schreiben nur schalten die Ports nicht auch wenn sie auf Output gesetzt wurden.
    Laut Datenblatt muss man erst die Slaveadresse, dann ein Command Byte, und dann die Daten senden.
    • Register:
      0 = Input Port0
      1 = Input Port1
      2 = Output Port0 (default: &HFF <hat keinen Einfluss auf Port die als Input konfiguriert sind)
      3 = Output Port1 (default: &HFF <hat keinen Einfluss auf Port die als Input konfiguriert sind)
      4 = Polarity Inversion Port0 (default: &H00 < keine invertierung)
      5 = Polarity Inversion Port1 (default: &H00 < keine invertierung)
      6 = Configuration Port0 (default: &HFF = Alles als input)
      7 = Configuration Port1 (default: &HFF = Alles als input)

    wenn man Register 7 verwendet und 2 Bytes mit daten schreibt dann wird das 2te Datenbyte ins Register 6 geschrieben.
    Demnach müsste man um alle ports als Output zu verwenden die Register 6 und 7 auf &H00 setzen, das geht aber nicht warum auch immer.
    Hier mal der Code:

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 9600
    
    Config Scl = Portc.5
    Config Sda = Portc.4
    
    Print "TEST"
    Print
    
    Dim Data0 As Byte
    Dim Data1 As Byte
    Dim Command As Byte
    Dim Slaveaddress As Byte
    
    Slaveaddress = 78
    
    Do
    
     Input "Data0: " , Data0
     Input "Data1: " , Data1
     Input "Commandbyte: " , Command
     Print "sende..."
    
     I2cstart
            I2cwbyte Slaveaddress
            If Err = 1 Then
               I2cstop
               Print "....Error1!"
            Else
               I2cwbyte Command
               I2cwbyte Data0
               I2cwbyte Data1
    
               If Err = 1 Then
                   I2cstop
                   Print "....Error2!"
               Else
                   I2cstop
                   Print "... erfolgreich!"
               End If
            End If
    
            Wait 2
    
     Loop
     End

    Wäre Froh wenn ihr mit helfen könntet bin schon seit 2 tagen am verzweifeln

    Hier noch das Datenblatt vom PCA9535: Klick

    Gruß Wolfgang

Berechtigungen

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

Labornetzteil AliExpress