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
Lesezeichen