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

Thema: i2c, master slave, twi_lib oder nicht - bin total verwirrt

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161

    i2c, master slave, twi_lib oder nicht - bin total verwirrt

    Anzeige

    Powerstation Test
    Hallo zusammen,

    ich steige gerade in die I2C Thematik ein und bin durch das viele Lesen jetzt total verwirrt.

    Ich habe 2 x Mega8 und 1 x Mega 32 die miteinander Daten austauschen sollen. Von den beiden Mega8 werden Werte für den Mega32 bereitgestellt.

    So nun bin ich total verwirrt bezüglich i2C, habe hier schon viel gelesen.

    Der Mega32 soll in bestimmten Abständen bei beiden Mega8 bestimmte Werte über I2C abrufen. Dann müssen die beiden Mega8 als Slave arbeiten, der Mega32 als Master. Richtig?

    Wenn das so richtig ist, dann brauche ich die berühmte i2C_TWI.LBX von Bascom um aus den beiden Mega8 Slave I2C Teilchen zu machen. Auch wenn ich die Hardware TWI nutzen will. Richtig?

    Mir wäre aber sowas lieber:

    Ginge auch ein "Multimaster- System"? Bei dem der Mega32 erst eine Aufforderung an die 8er sendet die nach erhalt der Aufforderung die Werte zurückgeben? Kann ich mir dann die i2c_TWI.LBX sparen?

    Würde mir das so vorstellen:

    M32-> Sendeaufforderung M8 Nr.1-> Daten senden M8 Nr.1 an M32-> M32 Sendeaufforderung M8 Nr.2 -> Daten senden M8 Nr.2 an M32

    Ich denke mir, das so die Daten schön der Reihe nach und zu definierten Zeiten ausgetauscht werden können und der Bus immer frei ist.


    Helft mir mal bitte auf die Sprünge.

    merci
    markus

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

    am I2C-Bus gibts immer mind. einen Master und einen Slave, der Master ist der Aktive, und der Slave macht nur mit, je nachdem was der Master so will.

    Die Lib die Du angegeben hast, ist dazu da, den Master unter Bascom die TWI-Hardware benutzen zu lassen, ansonsten wird das per Software geregelt.

    Für den Slave brauchst du dann auch noch etwas, entweder die Slave-Lib bei MCS (Bascom) kaufen, oder hier im Forum suchen und selber anpassen. Kommt auch darauf an wie gut Du Programmiertechnisch drauf bist.

    Warst du schon im Wiki und dort bei TWI usw. ?
    Da gibts dann u.a. einen Link zum Forum mit Beispiel-Slave.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161

    noch immer dumme frage

    so jetzt raucht mir der Kopf aber der Groschen ist endlich gefallen.

    wie die kommunikation abläuft habe ich mit einem Byte kapiert.

    Was muss ich aber verändern um den Array zu übertragen? Ich kapiers net... Ich muss doch irgendwo reinschreiben das es insgesamt 4 Bytes Datenbytes sind. Aber wie?

    Diesen Code aus WiKi:

    Master Receiver:

    Code:
    $regfile = "M8def.dat"                                      
    $crystal = 12000000                                         
    $baud = 9600
                                                    
    Declare Function Twi_read_byte(byval Slave As Byte) As Byte
    
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , E = Portd.3 , Rs = Portd.2 , Db7 = Portd.7 , Db6 = Portd.6 , Db5 = Portd.5 , Db4 = Portd.4
    
    Dim Twi_control As Byte                                     '
    Dim Twi_status As Byte
    Dim Twi_data As Byte
    
    Dim B As Byte
    
    
    Dim Ch1 As Long
    Dim Ch1counter(4) As Byte At Ch1 Overlay
    
    Dim Error As Byte
    
    
    Twcr = &B00000100                                          
    Twsr = 0                                                    
    Twbr = 72                                                  
    
    Ch1 = 0
    Ch1counter = 0
    
    
    
    Cls
    Locate 1 , 1
    Lcd "TWI Master Receiver"
    
    
    Do
    
    Ch1counter = Twi_read_byte(&H40)                            
    
    Locate 2 , 1
    Lcd "CH1:" ; Ch1
    
    Locate 4 , 1
    Lcd " Error : " ; Err
                                                                
    Waitms 25
    
    Loop
    
    End
    
    
    '--------------------------------------------------------------------------------
    Function Twi_read_byte(slave As Byte) As Byte               
    
    Error = 0                                                   
    
    Twi_read_byte = 0                                           
    
    
    Twcr = &B10100100                                           
    
    Gosub Twi_wait_int
    
    
        If Twi_status = &H08 Or Twi_status = &H10 Then
            Twdr = Slave Or &H01                                
            Twcr = &B10000100                                   
    
    
            Gosub Twi_wait_int
    
    
            If Twi_status = &H40 Then
                Twcr = &B10000100                              
    
    
    
                Gosub Twi_wait_int
    
                If Twi_status = &H58 Or Twi_status = &H50 Then
                    Twi_read_byte = Twdr                       
                    Error = 0                                   
                Else
                    Error = Twi_status                          
                End If
    
            Else
    
                Error = Twi_status                              
            End If
    
            
            Twcr = &B10010100                                   
            
        Else
            
            Twcr = &B10000100                                   
            Error = Twi_status                                  
        End If
    
    End Function
    
    
    
    
    
    Twi_wait_int:
        Do
            Twi_control = Twcr And &H80
        Loop Until Twi_control = &H80
    
        Twi_status = Twsr And &HF8                              
    Return
    Und der Slave Transmitter:

    Code:
    $regfile = "m8def.dat"                                      
    $crystal = 7372800                                          
    ' $baud = 9600                                              
    
    Config Pinc.0 = Output
    
    '------------- I2C Variablen ----------------------
    Dim Twi_control As Byte                                     
    Dim Twi_status As Byte
    Dim Twi_data As Byte
    
    
    
    Dim Ch1 As Long
    
    Dim Ch1counter(4)As Byte at Ch1 Overlay 
                        
    Declare Sub Twi_init_slave
    
    Ch1 = 0
    Ch1counter = 0
    
    Twi_data = 0
    
    Call Twi_init_slave                                         ' TWI aktivieren
    
    Do
    
    Portc.0 = 1
    
    Incr Ch1
    
    
    
        Twi_control = Twcr And &H80
    
        If Twi_control = &H80 Then
           Twi_status = Twsr And &HF8                           
            If Twi_status = &HA8 Or Twi_status = &HB8 Then      
                Twdr = Ch1counter(4)                            
                Portc.0 = 0
    
                                                
            End If
                                                                
            Twcr = &B11000100                                   
        End If
    
    Loop
    
    
    End
    
    '------- Unterprogramme--------------
    
    
    'Mega8 als I2C Slave setzen
    Sub Twi_init_slave
                                                                
        Twsr = 0                                                
        Twdr = &HFF                                             
        Twar = &H40                                             
        Twcr = &B01000100                                       
    
    End Sub

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    danke Linux_80

    warst schneller. Ich habe mir jetzt stundenlang Wiki reingezogen. Das thema habe ich zumindest für ein Byte geschnallt. Auch ohne Lib.

    Programmiertechnisch bin ich ehrlich gesagt net so gut drauf, mache das ganze noch net lang. mit I2C habe ich gerade angefangen mich zu beschäftigen.

    Bin für jede Hilfestellung dankbar!!

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Etwas aufgebohrtes Slave-Beispiel:
    https://www.roboternetz.de/phpBB2/ze...=246777#246777

    Für den Master würde ich aber trotzdem die Bascom eingebauten Befehle verwenden, und die I2C-TWI-Lib, denn damit schaut das Programm etwas übersichtlicher aus.
    Also so wie in diesem Beispiel

Berechtigungen

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

Labornetzteil AliExpress