- Labornetzteil AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: Wieder I2C TWI

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

    Powerstation Test
    @jo,
    äh, ja, nach dem Senden der 1, gleich ein erneutes i2cstart und die &h23 hinterher sollte klappen, wenn der Slave das so haben will

    Weil lesen und senden während einer Übertragung geht nicht, deshalb gibt es am Anfang das R/W Flag, mit dem man das Festlegt.

  2. #12
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.03.2006
    Beiträge
    244
    hey.. Ich habe mein Problem wohl nicht gut geschildert. Naja das am Master war schonmal der erste Fehler, aber in meinem Slave hats sicher auch noch irgendwo Fehler.
    Ich muss einen Sensor abfragen, (8 I/O Werte) und dann 2 byte auf Befehl vom Master übertragen. Master ist ein Mega32 und Slave ein Mega8. Ich habe den Code von Bammel mal übernommen und der Weg Master --> Slave funktioniert auch einwandfrei. aber Slave-->Master funktioniert nicht.

    Hier mal der Slave Code.

    Code:
    '===============================================================================
    '***| Mikrocontroller Config |**************************************************
    '===============================================================================
    
    'Microcontroller
    '================
    $regfile = "m8def.dat"
    $crystal = 16000000
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    
    'TWI
    '====
    Declare Sub Twi_init_slave
    Dim Twi_control As Byte
    Dim Twi_status As Byte
    Dim Befehl As Byte
    Dim Anzahl_bytes As Byte
    Dim Neuesb_flagge As Byte
    Dim Buffer(8) As Byte
    Dim N As Byte                                               'zähler/index variable
    
    Enable Interrupts
    
    
    'Init
    '=====
    Portb.2 = 0
    For N = 1 To 8
       Buffer(n) = 0
    Next N
    
    Befehl = 0
    Anzahl_bytes = 0
    Soll_motor_r = 100
    Soll_motor_l = 100
    
    Call Twi_init_slave
    
    '-------------------------------------------------------------------------------
    '***| Hauptprogramm |***********************************************************
    '-------------------------------------------------------------------------------
    'auf Befehle vom master warten
    
    Do
         Neuesb_flagge = 0
    
         'schauen ob TWINT gesetzt ist
         Twi_control = Twcr And &H80                            ' Bit7 von Controlregister
    
         If Twi_control = &H80 Then
            Twi_status = Twsr And &HF8                          ' Status
    
            'wurde ein Byte geschickt?
            If Twi_status = &H80 Or Twi_status = &H88 Then
                Befehl = Twdr                                   ' neue Daten merken
                Neuesb_flagge = 1                               ' merken das ein neues Byte da ist
            End If
    
    
            'TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
            Twcr = &B11000100                                   ' TWINT löschen, erzeugt ACK
         End If
    
         'wenn ein neues Byte gekommen ist verarbeiten
         If Neuesb_flagge <> 0 Then
    
           'Register zuordnen -> Befehl
           Select Case Befehl
    
                   Case 1
                   Gosub Klappen_abfrage
    
                   Case 10
                   Gosub Beep
    
                   Case 255
                   Gosub Softreset
    
    
           End Select
    
    
         End If
    
    Loop
    End
    
    
    
    '-------------------------------------------------------------------------------
    '***|KLappenabfrage|*****************************************************************
    '-------------------------------------------------------------------------------
    Klappen_abfrage:
    Incr Soll_motor_r
    Incr Soll_motor_l
    
    Buffer(1) = Soll_motor_r
    Buffer(2) = Soll_motor_l
    Anzahl_bytes = 2
    Gosub I2c_tx
    
    
    Return
    '-------------------------------------------------------------------------------
    '***| I2C-BUS Daten Empfangsroutinen |******************************************
    '-------------------------------------------------------------------------------
    I2c_rx:
    
    
     For N = 1 To Anzahl_bytes
     'erstes Byte empfangen
     Neuesb_flagge = 0
     Do
    
        Twi_control = Twcr And &H80
    
        If Twi_control = &H80 Then
            Twi_status = Twsr And &HF8
    
            If Twi_status = &H80 Or Twi_status = &H88 Then
                Buffer(n) = Twdr
                Neuesb_flagge = 2
            End If
    
            Twcr = &B11000100
        End If
    
        If Neuesb_flagge = 2 Then Exit Do
    
     Loop
    
     Next N
    
    Return
    
    '-------------------------------------------------------------------------------
    '***| I2C-BUS Daten Senderoutinen |******************************************
    '-------------------------------------------------------------------------------
    I2c_tx:
    '-?????
        Twar = &H23                                             ' Slaveadresse setzen I2C-RX-Adr:Hex23
    '-??????
    For N = 1 To Anzahl_bytes
     'erstes Byte empfangen
     Neuesb_flagge = 0
     Do
    
        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 = Buffer(n)
                Neuesb_flagge = 2
            End If
    
            Twcr = &B11000100
        End If
    
        If Neuesb_flagge = 2 Then Exit Do
    
     Loop
    
    Next N
    '????
        Twar = &H22                                             ' Slaveadresse setzen  I2C-RX-Adr:Hex22
    '?????
    Return
    
    '-------------------------------------------------------------------------------
    '***| TWI: Slavekonfiguration |*************************************************
    '-------------------------------------------------------------------------------
    
    Sub Twi_init_slave
        Twsr = 0                                                ' status und Prescaler auf 0
        Twdr = &HFF                                             ' default
        Twar = &H22                                             ' Slaveadresse setzen  I2C-RX-Adr:Hex22
        Twcr = &B01000100                                       ' TWI aktivieren, ACK einschalten
    End Sub
    In Fragezeichen habe ich mal makiert was ich noch hinzugefügt habe was aber auch nicht richtig ist, wie es scheint.

    am Master hab ich auch schon verschiedene Codes ausprobiert ausprobiert:

    Code:
    Sub Automatik
    
       Waitms 10
         I2cstart
         I2cwbyte Mega8_adresse
         I2cwbyte 1
         I2cstop
        ?? waitms 10
         I2cstart
         I2cwbyte Mega8_adresse_r
         I2crbyte E , Ack
         I2crbyte W , Nack
         I2cstop
    
    
    End Sub
    Ich empfange mit der "i2crbyte" am master immer das byte, welches ich als letzes geschickt habe, in meinem Fall die Adresse des Slaves (bei h22 und h23)

    Danke für schonmal im Vorraus an alle die sich meiner erbarmen aber ich finde den Fehler echt nicht. Ich mache schon eine halbe Ewigkeit damit rum

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.12.2008
    Ort
    Essen
    Alter
    65
    Beiträge
    358
    Hallo !

    Wenn ich es richtig verstanden habe, kannst Du mit dem Slave keine Daten "Senden".
    Dann wäre Multimaster die einzig machbare Lösung.
    Du solltest mal versuchen alle Aktionen vom Master zu erledigen:
    Also entweder :
    Master sendet an Slave
    Oder :
    Master holt Daten vom Slave

    Roland
    Robotik & Arduino Homepage
    http://www.ardumega.de

  4. #14
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.03.2006
    Beiträge
    244
    Zitat Zitat von rolber
    Wenn ich es richtig verstanden habe, kannst Du mit dem Slave keine Daten "Senden".
    aber theoretisch müsste es doch gehen

    Zitat Zitat von rolber
    Dann wäre Multimaster die einzig machbare Lösung.
    Du solltest mal versuchen alle Aktionen vom Master zu erledigen:
    Also entweder :
    Master sendet an Slave
    Oder :
    Master holt Daten vom Slave

    Roland
    äöö... genau das will ich. Aber das lässt sich doch nicht über Multimaster realisieren. Ich brauch einmal Master transmit und slave receive und einmal master receive mit slave transmit. Aber beides auf Kommando vom gleichen Master.

  5. #15
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.12.2008
    Ort
    Essen
    Alter
    65
    Beiträge
    358
    Hallo

    Hier der Teil des Programms ,der die Daten zum Master gibt.
    Daten: Datas(X)
    -------------------------------------------------------------
    'Master will ein Byte haben
    Case &HA8:
    Twdr = Datas(i)
    Incr I 'Data1 an Master
    Twcr = &B11000100
    ---------------------------------------------------------------------
    Alles klar ?
    Sonst weiter fragen
    ----------------------------------------------------------------------
    Daten holen dann vom Master so:

    I2creceive &H82 , Datas(i)

    Roland
    Robotik & Arduino Homepage
    http://www.ardumega.de

  6. #16
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.03.2006
    Beiträge
    244
    ne gar nix klar

    1) hab ich das doch schon in "meinem" code (von Herr Sommer) beim slave gepostet --> ziemlich weit unten die tx-routine

    2) beim Master wieso &H82? meine slaveadresse ist doch &H22.

  7. #17
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.12.2008
    Ort
    Essen
    Alter
    65
    Beiträge
    358
    &H82 war meine Slave Adresse
    Natürlich musst Du &H22 eingeben.
    Hatte aus meinem Programm kopiert.

    Roland
    Robotik & Arduino Homepage
    http://www.ardumega.de

  8. #18
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.03.2006
    Beiträge
    244
    ok. aber funktionieren tuts trotzdem noch nich

  9. #19
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.12.2008
    Ort
    Essen
    Alter
    65
    Beiträge
    358
    Master

    holt sich 18 Daten vom Slave :
    Code:
    Sub M32datenholen()                                         'Holt 18 Daten vom M32 Slave
    For I = 1 To 18
    
    I2creceive &H82 , Datas(i)                                  'Variable Datas(i) vom M32 Slave
    'Print "Data " ; Datas(i)
    
    Next I
    
    Waitms 150
    
    End Sub
    Robotik & Arduino Homepage
    http://www.ardumega.de

  10. #20
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.03.2006
    Beiträge
    244
    also der Fehler muss am slave programm liegen. Ich hab mal den Slave aus der Wiki von TWI_Praxis drauf gemacht, der funktioniert tadellos in beide richtungen. aber halt nicht beide zusammen. entweder der slave_transmit oder der slave_receive.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress