Das Beispiel von starbearer.de sollte eigentlich funktionieren:
Code:
'***********************************************************
'* Ansteuerung von bis zu 20 Servos mit dem SD20 *
'* über den I2C Bus. *
'* das Programm dreht den Servo am Servo PIN 1 des SD20 *
'* und liest den Register 0 (Version) um die Vorgänge *
'* zu demonstrieren. *
'* (ohne Expanded Mode) *
'***********************************************************
'*********** Ports für den I2C Bus**************************
define SDA Port[15]
define SCL Port[16]
define I2C_Daten byte
define N byte 'Schleifenvariable
define Startbyte byte
define Kommandobyte byte
define ServoNummer byte
define ServoWinkel byte
'I2C Bus Ruhezustand
SDA=ON
SCL=ON
'*********** Hauptprogramm********************************
#Main
Get Startbyte ' Startbyte von der seriellen Schnittstelle
If Startbyte <> 97 Then GoTo Main ' Schleife, solang bis ein Startbyte empfangen wurde
If Startbyte = 97 Then GoTo KlasseA ' falls Kommandobyte = asci(97)="a" springe zur #KlasseA
#KlasseA ' Klasse A: Servodirektsteuerung
get ServoNummer ' Nummer des anzusteuernden Servos von der seriellen Schnittstelle empfangen
get ServoWinkel ' Winkel des anzusteuernden Servos von der seriellen Schnittstelle empfangen
GoSub ServoStellen
GoTo Main
#ServoStellen
GoSub I2C_Start ' I2C-Startbedingung
I2C_Daten = 194 ' Adresse des SD20 am I2C Bus
GoSub I2C_Write ' Adresse übertragen
I2C_Daten = ServoNummer ' Register des Servos, der angesprochen werden soll schreiben
GoSub I2C_Write ' Register übertragen
I2C_Daten = ServoWinkel ' Winkel auf den dieser Servo drehen soll schreiben
GoSub I2C_Write ' Winkel schreiben
GoSub I2C_Stop ' I2C-Stopbedingung.
Return
'*********** I2C Bus Standard Routinen********************
#I2C_Start
SDA = OFF
SCL = OFF
Return
#I2C_Stop
SDA = OFF
SCL=ON
SDA=ON
Return
#I2C_Write
For n = 1 To 8 ' 8 Bit schreiben in For-Next-Schleife
SDA = OFF
if (I2C_Daten and 128) =128 then SDA=ON
pulse SCL
I2C_Daten=I2C_Daten shl 1
Next
pulse SCL
Return
#I2C_Read
I2C_Daten = 0
deact SDA
For n = 1 To 8 ' 8 Bit lesen in For-Next-Schleife
I2C_Daten=I2C_Daten shl 1
SCL=ON
If SDA Then I2C_Daten = I2C_Daten + 1
SCL = OFF
Next
Return
#Ack
SDA = 0
pulse SCL
Return
#NoAck
SDA = 1
pulse SCL
Return
Lesezeichen