Hallo zusammen,

Hab den Bus zum Laufen gebracht und bin richtig happy!!!

Ich habe nun nach einigen Versuchen das erste richtige Programm
für den Master und den Slave geschrieben. Das Master-Programm
scheint soweit zustimmen, aber beim Slave läuft dauernd etwas schief
und zwar funktioniert das Case 20 nicht.
Wenn der Slave den Wert 20 erhält, soll er den Ablauf in Case 20
durcharbeiten. Jedoch fährt er alle 3 Servos auf eine undefinierte Positon
und mehr nicht.
Was stimmt mit Case 20 nicht?
Habt ihr eine Idee???

Slave-Code:
Code:
$regfile = "m88def.dat"
$crystal = 16000000


'I2C Konfiguration
Dim Twi_control As Byte                                     ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte

Dim Neuesbyte As Byte                                       ' Bytemerker

Declare Sub Twi_init_slave

Twi_data = 0
Call Twi_init_slave                                         ' TWI aktivieren

'Servokonfiguration
Config Portb = Output

Config Servos = 3 , Servo1 = Portb.0 , Servo2 = Portb.1 , Servo3 = Portb.2 , Reload = 10

Enable Interrupts

Dim Xpos1 As Byte

'StatusLED
Config Portd.0 = Output
Statusled Alias Portd.0
Statusled = 1

'Variablen
Dim Freigabe As Byte
Freigabe = 0

' Hauptschleife
Do
   ' Merker zurücksetzen
    Neuesbyte = 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
            Twi_data = Twdr                                 ' neue Daten merken
            Neuesbyte = 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


    'Start
    If Twi_data = 10 Then
        Statusled = 0                                       ' StatusLED anschalten
        Freigabe = 1
    End If

    'Stop
    If Twi_data = 100 Then
        Statusled = 1                                       ' StatusLED ausschalten
        Freigabe = 0
    End If

    'Ablauf start
    If Freigabe = 1 Then
         Select Case Twi_data

         Case 20:
         Servo(1) = 100
         Servo(2) = 105
         Servo(3) = 80

         For Xpos1 = 100 To 103
         Servo(1) = Xpos1
         Waitms 167
         Next

         For Xpos1 = 103 To 106
         Servo(1) = Xpos1
         Waitms 167

         Next
         Servo(1) = 98
         Servo(2) = 140
         Servo(3) = 50
          Waitms 250

         Servo(1) = 91
         Servo(2) = 105
         Servo(3) = 80
          Waitms 250

         For Xpos1 = 91 To 94
         Servo(1) = Xpos1
         Waitms 167
         Next

         For Xpos1 = 94 To 97
         Servo(1) = Xpos1
         Waitms 167
         Next

         For Xpos1 = 97 To 100
         Servo(1) = Xpos1
         Waitms 167
         Next



         End Select
    End If

    Loop

End


' Unterprogramme


' TWI als slave aktivieren
Sub Twi_init_slave
    Twsr = 0                                                ' status und Prescaler auf 0
    Twdr = &HFF                                             ' default
    Twar = &HCA                                             ' Slaveadresse setzen
    Twcr = &B01000100                                       ' TWI aktivieren, ACK einschalten

End Sub
Grüße High Light