-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Slave-Master-Slave übertragung geht nicht

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.07.2008
    Beiträge
    49

    Slave-Master-Slave übertragung geht nicht

    Anzeige

    Hallo

    Ich möchte einfach nur Daten von Mikrokontroller 1 (Slave) zu yC 2 (Master) senden dieser soll dies erkennen und dann neue Daten zu yC 3 (slave) senden.
    Leider Funktioniert dies bei meinem angehängten Programm nicht die Daten kommen von yC 1 zwar bei yC 2 an aber danach geht nichts mehr warum?

    yC 1:
    Code:
    '-----------------------------Registrierung-------------------------------------
    $regfile = "m32def.dat"                                     'Konfiguration auf ATmega 32
    $include "MyTWI.bas"
    
    $crystal = 16000000                                         'Quarztakt 16MHz
    $baud = 9600
    Config Twi = 400000
    
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40
    
    $eeprom
    
    I2cinit
    Declare Sub Twi_slave_sendet_byte(byval Variable As Byte)
    
    '-----------------------------Configuration-------------------------------------
    
    Config Porta = Input
    Config Portb = Input
    Config Portd = Output
    '-----------------------------Dimensionierung-----------------------------------
    
    Dim Slaveadress As Byte
    Dim Neuesbyte As Bit
    Dim Status As Bit
    Dim Twi_control As Byte
    Dim Twi_status As Byte
    Dim Var As Byte
    Dim Varsend As Byte
    Dim Twi_slv_data(1) As Byte
    Dim Slave_mode As Byte
    Dim Tmp As Byte
    Dim Flanke1 As Bit
    Dim Impuls1 As Bit
    Dim Senden1 As Byte
    
    '-----------------------------Vorkonfiguration----------------------------------
    Slaveadress = &H42
    Twi_slv_data(1) = Slaveadress
    Twi_slv_addr = Slaveadress
    Twi_sr_data = Varptr(slave_mode)                            'datenbuffer empfang
    Twi_st_data = Varptr(twi_slv_data(1))                       'datenbuffer senden
    
    Twar = Twi_slv_addr                                         'I2C Adress Mega32 + GCA
    Config Twi = 400000                                         'I2C Speed
    On Twi Twi_mst_slv_isr , Nosave
    
    Gosub Twi_sense                                             'Aktivieren Slave-Funktion
    Enable Interrupts
    
    Led1 Alias Portd.2
    Tast1 Alias Pinb.0
    
    Led1 = 1
    
    
    Senden1 = &H11
    
    '-----------------------------Hauptprogramm--------------------------------------
    Do
    
       If Tast1 = 1 And Flanke1 = 0 And Impuls1 = 0 Then
    
       Led1 = 0
       Flanke1 = 1
    
       Do
          Call Twi_slave_sendet_byte(senden1)
       Loop Until Status = 1
       Waitms 200
    End If
    
    If Tast1 = 1 And Flanke1 = 1 And Impuls1 = 0 Then
    
       Led1 = 1
       Flanke1 = 0
    
       Do
          Call Twi_slave_sendet_byte(senden1)
       Loop Until Status = 1
       Waitms 200
    End If
    
    If Tast1 = 0 Then Impuls1 = 0
    
    Loop
    End
    
    'unterprogramme
    
    Slave_empfaengt_byte:
    
    If Twi_slv_flag <> 0 Then
       Select Case Twi_slv_flag
       Case &H60 :
             Var = Slave_mode                                   'es ist was empfangen worden
    
       Case &HA8 :                                              'daten sind abgeholt worden
          For Tmp = 1 To 1
             Twi_slv_data(tmp) = 0                              ' also löschen ?
          Next
       End Select
       Twi_slv_flag = 0                                         'löschen marker
       Twi_slv_stat = 0                                         'löschen marker
       Gosub Twi_sense
                                              'alles wieder enablen
                                              'und Bus freigeben
    
    Sub Twi_slave_sendet_byte(variable As Byte)
    
       Status = 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
    
            ' will der Master ein Byte haben
            If Twi_status = &HA8 Or Twi_status = &HB8 Then
                Twdr = Variable
                Status = 1                                      ' neue Daten ausgeben
            End If
    
            ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
            Twcr = &B11000100                                   ' TWINT löschen, mit ACK
        End If
    
    End Sub
    End If
    yC 2:
    Code:
    '-----------------------------Registrierung-------------------------------------
    
    $regfile = "m32def.dat"                                     'Konfiguration auf ATmega 32
    $lib "i2c_twi.lbx"
    
    $crystal = 16000000                                         'Quarztakt 16MHz
    $baud = 9600
    Config Twi = 400000
    
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40
    
    $eeprom
    
    I2cinit
    Declare Function Twi_read_byte(byval Slave As Byte) As Byte ' default use 40 for the frame space
    
    '-----------------------------Configuration-------------------------------------
    
    Config Porta = Output
    Config Portb = Output
    Config Portc = Input
    '-----------------------------Dimensionierung-----------------------------------
    
    Dim Slave As Byte
    Dim Twi_status As Byte
    Dim Twi_read_byte As Byte
    Dim Twi_control As Byte
    Dim Error As Bit
    Dim Flanke1 As Bit
    Dim Impuls1 As Bit
    Dim Progmodus As Bit
    Dim Emfaengt As Byte
    
    Led1 Alias Portb.0
    Led2 Alias Porta.0
    Led3 Alias Porta.1
    Tast1 Alias Pinc.3
    
    '-----------------------------Vorkonfiguration----------------------------------
    
    Led1 = 1
    Led2 = 1
    Led3 = 1
    
    '-----------------------------Hauptprogramm--------------------------------------
    Do
    
       Emfaengt = Twi_read_byte(&H42)
    
       If Emfaengt = &H11 Then
    
          Led2 = 0
          I2cstart
          I2cwbyte &H40
          I2cwbyte &H20
          I2cstop
          Waitms 1
    
       End If
    
    Loop
    End
    
    'Unterprogramme
    
    
    
    ' TWI read_byte
    ' holt ein Byte und schliesst die Übertragung ab
    Function Twi_read_byte(slave As Byte) As Byte
        Error = 0                                               ' Fehler zurücksetzen
    
        Twi_read_byte = 0                                       ' Wert vorbelegen
    
        ' Startbedingung
        Twcr = &B10100100                                       ' TWINT
    
        ' warten bis TWINT gesetzt ist
        Gosub Twi_wait_int
    
        ' wenn Zugriff auf den Bus erlaubt, Slaveadresse ausgeben
        If Twi_status = &H08 Or Twi_status = &H10 Then
            Twdr = Slave Or &H01                                ' slave adresse + Read
            Twcr = &B10000100                                   ' TWINT löschen, Byte senden
    
            ' warten bis TWINT gesetzt ist
            Gosub Twi_wait_int
    
            ' Slave hat sich gemeldet
            If Twi_status = &H40 Then
                Twcr = &B10000100                               ' TWINT löschen, Byte senden
                              ' kein ACK (TWEA = 0) senden, weil wir nur ein Byte lesen wollen
    
                ' warten bis TWINT gesetzt ist
                Gosub Twi_wait_int
    
                ' ein Byte wurde empfangen
                If Twi_status = &H58 Or Twi_status = &H50 Then
                    Twi_read_byte = Twdr                        ' Daten lesen
                    Error = 0                                   ' kein Fehler
                Else
                    Error = Twi_status                          ' Fehler
                End If
    
            Else
                ' kein slave
                Error = Twi_status                              ' Fehler
            End If
    
            ' STOPbedingung kommt hier immer im Ablauf, egal welcher Status
            Twcr = &B10010100                                   ' TWINT löschen, STOP senden
            ' nach einem STOP wird TWINT nicht mehr gesetzt,
            ' man darf/kann also nicht darauf warten !
    
        Else
            ' Bus belegt, wird er wieder freigegeben
            Twcr = &B10000100                                   ' TWINT löschen, Bus freigeben
            Error = Twi_status                                  ' Fehler
        End If
    
    End Function
    
    ' warten bis TWINT gesetzt ist, status auslesen
    Twi_wait_int:
        Do
            Twi_control = Twcr And &H80
        Loop Until Twi_control = &H80
    
        Twi_status = Twsr And &HF8                              ' status
        ' status nur zu Debugzwecken ausgeben, weil Bus sehr langsam wird !
    '    Print "Err " ; Hex(twi_status)
    Return
    yC 3:
    Code:
    '-----------------------------Registrierung-------------------------------------
    $regfile = "m32def.dat"                                     'Konfiguration auf ATmega 32
    $include "MyTWI.bas"
    
    $crystal = 16000000                                         'Quarztakt 16MHz
    '$baud = 9600
    Config Twi = 400000
    
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40
    
    $eeprom
    
    I2cinit
    Declare Sub Twi_slave_sendet_byte(byval Variable As Byte)
    
    '-----------------------------Configuration-------------------------------------
    
    Config Portb = Input
    Config Portd = Output
    Config Porta = Input
    
    '-----------------------------Dimensionierung-----------------------------------
    
    
    Dim Slaveadress As Byte
    Dim Neuesbyte As Bit
    Dim Status As Bit
    Dim Twi_control As Byte
    Dim Twi_status As Byte
    Dim Var As Byte
    Dim Varsend As Byte
    Dim Twi_slv_data(1) As Byte
    Dim Slave_mode As Byte
    Dim Tmp As Byte
    
    '-----------------------------Vorkonfiguration----------------------------------
    Slaveadress = &H40
    Twi_slv_addr = Slaveadress
    Twi_sr_data = Varptr(slave_mode)                            'datenbuffer empfang
    Twi_st_data = Varptr(twi_slv_data(1))                       'datenbuffer senden
    
    Twar = Twi_slv_addr                                         'I2C Adress Mega32 + GCA
    Config Twi = 400000                                         'I2C Speed
    On Twi Twi_mst_slv_isr , Nosave                             'ISR f. TWI
    
    Gosub Twi_sense                                             'Aktivieren Slave-Funktion
    Enable Interrupts
    Twi_slv_data(1) = Slaveadress
    
    Led1 Alias Portd.0
    
    Led1 = 1
    
    '----------------------------Hauptprogramm--------------------------------------
    Do
    
       Gosub Slave_empfaengt_byte
    
       If Var = &H20 Then Led1 = 0
    
    Loop
    End
    
    
    'unterprogramme
    
    Slave_empfaengt_byte:
    
    If Twi_slv_flag <> 0 Then
       Select Case Twi_slv_flag
       Case &H60 :
             Var = Slave_mode                                   'es ist was empfangen worden
    
       Case &HA8 :                                              'daten sind abgeholt worden
          For Tmp = 1 To 1
             Twi_slv_data(tmp) = 0                              ' also löschen ?
          Next
       End Select
       Twi_slv_flag = 0                                         'löschen marker
       Twi_slv_stat = 0                                         'löschen marker
       Gosub Twi_sense
                                              'alles wieder enablen
                                              'und Bus freigeben
    
    Sub Twi_slave_sendet_byte(variable As Byte)
    
       Status = 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
    
            ' will der Master ein Byte haben
            If Twi_status = &HA8 Or Twi_status = &HB8 Then
                Twdr = Variable
                Status = 1                                      ' neue Daten ausgeben
            End If
    
            ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
            Twcr = &B11000100                                   ' TWINT löschen, mit ACK
        End If
    
    End Sub
    End If
    Danke für Hilfe
    mfg dämmi

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Problem bei yC3:
    die subroutine "Slave_empfaengt_byte:" hat kein "return" , er läuft sofort direkt in "Twi_slave_sendet_byte" rein.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    08.07.2008
    Beiträge
    49
    Hm... das ist leider nicht der Fehler ich versuche nun erst einmal nur den yC 3 anzusprechen .....

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    08.07.2008
    Beiträge
    49
    Also nun hab ich einfach beim yc2 die if abfrage und das lesen rausgenommen und nur senden lassen mit einer kleinen verzögerung dann funktioniert das auch.

    Aber wenn er erst vom yc1 lesen soll und dann an yc3 senden soll sendet er zwar weil die led aufleuchtet aber es kommt bei yc3 nicht an bzw dieser reagiert nicht drauf warum?......

    Danke
    mfg dämmi

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Das solltest du entfernen

    Dim Slave As Byte

    Das könnte den Bascom verwirren, weil du eine gleichnamige Variable in der Function verwendest
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    08.07.2008
    Beiträge
    49
    also wenn ich das netferne gehts so einiger maßen ......
    ich muss bevor der y2 wieder zu yc3 sendet eine waitms von 500 einbauen und selbst dann klappt es erst beim 3 versuch und wenn ich da keine waitms drin habe kommt es wieder nicht bei yc3 an .......

    sehr vielen dank für die hilfe
    mfg dämmi

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    08.07.2008
    Beiträge
    49
    kann mir keiner nen kleines beispiel prog schreiben oder mir sagen was ich falsch mache? Danke mfg dämmi

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    http://www.oldformation.at/electronic/download/down.htm
    ==> MyTWI 0.1

    das ist ein komplettes beispiel. Empfängt I2C Nachrichten, und sendet jede sekunde selber was weg.
    Wenn du die I2c-Adressen anpasst, kannst du das Programm in zwei AVR schreiben, die senden sich dann gegenseitig was
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    Hi PicNick,

    ... das ist ein komplettes beispiel ...
    DAS wäre ja direkt ein Grund Bascom zu lernen. Schicke Seite (-n). Leider kann ich blos C - und da bin ich mit TWI nie klargekommen. Macht nix - irgendwann stehts (wieder) oben auf meiner Liste.
    Ciao sagt der JoeamBerg

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Sorry, ich hab' mir eh' vorgenommen, von meinem Zeugs auch eine C-Version zu machen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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