- Labornetzteil AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 24 von 24

Thema: Wieder I2C TWI

  1. #21
    Erfahrener Benutzer Roboter Genie Avatar von Bammel
    Registriert seit
    11.12.2004
    Ort
    Bremen
    Alter
    37
    Beiträge
    1.400
    Anzeige

    E-Bike
    Hallo,
    also das zwischen deinen fragezeichen solltest du entfernen. dann konne ich so keinen fehler entdecken.

    müsste mich da nochmal genau reinlesen.
    aber z.Z. hab ich net so viel zeit bin grade umgezogen und mein inet läuft grade erst wieder.

  2. #22
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.03.2006
    Beiträge
    244
    Zitat Zitat von Bammel
    Hallo,
    also das zwischen deinen fragezeichen solltest du entfernen. dann konne ich so keinen fehler entdecken.

    müsste mich da nochmal genau reinlesen.
    aber z.Z. hab ich net so viel zeit bin grade umgezogen und mein inet läuft grade erst wieder.
    mhm ja kein problem. Also was ich noch festgestellt habe ist, dass der slave controller sich aufhängt wenn ich ein Byte abfragen will.
    Ich versuch da noch rum aber ich muss nach unserem Projektzeitplan das dings seit 4 Wochen am laufen haben

  3. #23
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.03.2006
    Beiträge
    244
    Code:
    '*******************************************************************************
    '  um mit dem master zu senden folgenden code benutzen
    '
    '  I2cstart
    '  i2cwbyte &H22    'slave-id
    '  I2cwbyte 1       'für motor 1
    '  I2cwbyte PWM1
    '  I2cwbyte PWM1b   'falls die pwm variable größer als ein byte ist
    '  I2cstop
    '
    'pb4,pb5,pd5,pd6,pd7,pb3,pd3,pb1 klappen
    '*******************************************************************************
    
    '===============================================================================
    '***| 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
    
    'sound
    '====
    Config Portb.2 = Output                                     'sound
    Dim Dauer As Word                                           'für peep
    
    
    'Klappenabfrage
    Dim Bytex As Byte                                           'rechenvariable
    Dim Klappen As Byte
    Dim Soll_motor_r As Byte
    Dim Soll_motor_l As Byte
    Config Portb.4 = Input
    Config Portb.5 = Input
    Config Portd.5 = Input
    Config Portd.6 = Input
    Config Portd.7 = Input
    Config Portb.3 = Input
    Config Portd.3 = Input
    Config Portb.1 = Input
    'pullups
    Config Portb.4 = 1
    Config Portb.5 = 1
    Config Portd.5 = 1
    Config Portd.6 = 1
    Config Portd.7 = 1
    Config Portb.3 = 1
    Config Portd.3 = 1
    Config Portb.1 = 1
    
    
    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 = 1
    Gosub I2c_tx
    
    
    Return
    
    
    '-------------------------------------------------------------------------------
    '***| beep |*****************************************************************
    '-------------------------------------------------------------------------------
    Beep:
    
       Anzahl_bytes = 1                                         '1 Byte holen
       Gosub I2c_rx
    
       Dauer = Buffer(1)                                        '1. byte aus buffer
       Dauer = Dauer * 20
       Portb.2 = 1
       Waitms Dauer                                             'piiiiieep
       Portb.2 = 0
    
    
    Return
    
    
    '-------------------------------------------------------------------------------
    '***| softreset |*****************************************************************
    '-------------------------------------------------------------------------------
    Softreset:
    
      Goto &H1C00
    
    
    
    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:
    
    
    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
    
                                                ' 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
    also falls du mal zeit hast kannst ja mal "klappenabfrage" angugn. 2 x-beliebige bytes, die in das array geschrieben werden und dann wird die TxRoutine aufgerufen.

  4. #24
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.03.2006
    Beiträge
    244
    ich hab rausgefunden, dass sich das programm an der senderoutine an der stelle aufhängt wo man das byte ausgeben will. Also in der Zeile: "TWCR = Buffer(n)

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress