- Labornetzteil AliExpress         
Ergebnis 1 bis 5 von 5

Thema: Problem: Zwei MEGA8 via I2C-Bus koppeln (mit I2C-slave-Lib)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    09.10.2005
    Beiträge
    17

    Problem: Zwei MEGA8 via I2C-Bus koppeln (mit I2C-slave-Lib)

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich habe folgendes Problem. Ich möchte 2 MEGA8 mit Hilfe des I2C-Busses miteinander koppeln um Daten (z.Z erstmal 1 Byte) vom Master zum Slave zu übertragen. Ich habe mir die Slave-Library (von MCS) gekauft. Bei der Anwendung habe ich mich genau an die Doku gehalten, bzw. habe hier im Forum alle Hinweise dazu gelesen. Trotzdem kann ich den Slave nicht dazu bewegen Daten vom Master zu empfangen und in Abh. vom Empfangswert eine LED einzuschalten.

    Hier der Code:
    Slave:

    Code:
    ' Testprogramm 2 zur Nutzung eines MEGA8 als I2C-Slave
    '
    ' I2C Port am Slave MEGA8:     SDA = Portd2 (INT0)
    '                              SCL = Portd4 (T0)
    '
    
    
    $regfile = "m8def.dat"                                      ' MC-Definitionen laden
    $crystal = 1000000                                          ' 1Mhz int. Quarzfrequenz
    $baud = 9600
    
    Dim A As Byte
    Dim B As Byte
    Dim Bfake As Byte
    
    Config I2cslave = &B01000000
    
    Config Portc.3 = Output
    Config Portb.0 = Output
    Config Portb.1 = Output
    Config Portb.2 = Output
    Config Portc.0 = Output
    Config Portc.1 = Output
    
    Led0 Alias Portb.0
    Led1 Alias Portb.1
    Led2 Alias Portb.2
    Led3 Alias Portc.0
    Led4 Alias Portc.1
    
    Portc.3 = 1                                                 ' LED-Katode aktivieren
    
    Do
    
    Led0 = Not Led0                                             ' Blinkindikator
    
    If Bfake = &H01 Then
    Led1 = 1
    Else
    Led1 = 0
    End If
    
    If Bfake = &H02 Then
    Led2 = 1
    Else
    Led2 = 0
    End If
    
    Waitms 500
    
    Loop
    
    
    I2c_master_has_data:
      'when your code is short, you need to put in a waitms statement
      'Take in mind that during this routine, a wait state is active and the master will wait
      'After the return, the waitstate is ended
    
      Waitms 1
      Bfake = _a1                                               ' this is not needed but it shows how you can store _A1 in a byte
                                                      'assign _A1 (R16)
    Return
    
    
    I2c_master_needs_data:
    
      Waitms 1
      _a1 = &B11111111                                          ' Get input from portB and assign it
    
    Return
    Master:

    Code:
    ' Testprogramm 2 zur Nutzung eines MEGA8 als I2C-Master
    ' in Zus. mit "M8_I2C_slave_2.bas"
    
    '
    ' I2C Port am Master MEGA8:     SDA = Port.C4   --------> PD4 (T0)
    '                               SCL = Port.C5   --------> PD2 (INT0)
    '
    
    
    $regfile = "m8def.dat"                                      ' MC-Definitionen laden
    $crystal = 1000000                                          ' 1Mhz int. Quarzfrequenz
    $baud = 4800
    
    
    Config Sda = Portc.4
    Config Scl = Portc.5
    
    Config I2cdelay = 10
    
    Do
    
    Print "Wert: 01 senden"
    
    I2csend &H40 , &H01
    
    Waitms 500
    
    Print "Wert: 02 senden"
    
    I2csend &H40 , &H02
    
    Waitms 500
    
    Loop
    Die beiden Leitungen (SCL &SDA) habe ich am Slave mit je einem PullUp 4k7 abgeschlossen. Wenn ich SCL & SDA nicht anschließe blinkt die Indikator-LED (meine Hauptschleife läuft also). Sind sie jedoch angeschlossen sind und der Master sendet munter seine Daten (Kontrolle via Terminal-Prog.) friert der Slave quasi ein (LED leuchtet dauernd, oder ist aus). Habe seitens des Masters auch schon die I2C-Befehle: I2INIT, I2CSTART, I2CWBYTE, I2CSTOP verwendet - funktionierte aber auch nicht.

    Hat jemand eine Idee, woran das liegen kann?

    Gruss,
    Ulf

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Die Reihenfolge im Master müsste eingentlich so sein:
    1. noch vor der Hauptschleife, nach den ganzen config... -Befehlen
    I2INIT
    In der Hauptschleife
    2. I2CSTART
    3. I2csend
    4. I2CSTOP

    Das wär die normale Abfolge: einmal initialisieren, und dann immer Übertragung starten, Daten senden und Übertragung beenden.


    Hast du irgendeinen fertigen Slave zur Verfügung (Portexpander, EEPROM,...), um mal zu testen, ob der Master korrekt arbeitet? Ansosnten ist halt schwer zu sehen, wo der Fehler liegen könnte...

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.04.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    336
    schau doch mal da https://www.roboternetz.de/phpBB2/vi...=147038#147038
    bei mir läufts nun schon ein bisschen.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Irgendwie scheints ja grad groß in Mode zu sein, sich nen i2c-Slave zu proggen... Ich machs auch, aber schon seit mindestens nem halben Jahr... und seit ein paar Tagen sogar sprachübergreifend: Der Master läuft unter C, der Slave mit Pascal... läuft schon ganz gut, obwohls mein ersten Versuche mit C sind.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    09.10.2005
    Beiträge
    17
    Vielen Dank für die Hinweise.

    Demnach scheint meine Programmierung in der dargestellten Variante mit I2Csend korrekt zu sein, oder?
    Die Variante mit I2Cinit und I2CSTART, I2CWBYTE, I2CSTOP funktioniert leider auch nicht.
    Beispiel:
    ...
    I2CSTART
    I2CWBYTE &H40 ' Adresse Slave
    I2CWBYTE &H01 ' Daten
    I2CSTOP
    ...

    Was könnte denn noch eine Ursache sein? Hardware (slaveseitig ?) Leitungsverlegung?
    Die Frage, ob ich an dem Master bereits andere I2C-Komponenten erfolgreich getestet habe kann ich nur bejahen.
    Sowohl einen PCF8574, als auch einen DS1621 konnte ich erfolgreich via I2C-Bus ansprechen.
    Muss die I2C-Slave-Library nicht im Code des Slaves explizip eingebunden werden? Das Beispiel (in der Doku)
    zeigt ja, dass es nicht erforderlich ist.
    Wie sieht es denn mit den TWI-Befehlen aus? Könnte man das Gleiche alternativ damit realisieren?

Berechtigungen

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

LiFePO4 Speicher Test