Ich hab gestern bzw. heute Nacht noch weiter verschiedene Arten versucht:
(Das Servo 1 soll auf den Wert 200 gesetzt werden)
Code:
$regfile = "m32def.dat"
$hwstack = 32
$framesize = 32
$swstack = 32
$crystal = 16000000 'Quarzfrequenz
$baud = 9600
Porta.7 = 1 'Pullup Widerstand ein
'+++++++++++++++++++++++++++++++++++++++++++++++
Dim Ton As Integer
Dim I As Integer
Dim I2 As Integer
Dim Taste As Word
Dim Menuetext As String * 1
Dim Volt As Single
Dim Servonr As String * 1
Dim Servopos As String * 1
Const Ref = 5 / 1023 'Für Batteriespannungsberechnung
Const Servoid = &HC2 'I2C Servokarte-SlaveAdresse
'+++++++++++++++++++++++++++++++++++++++++++++++
'SUB-Programmteile:
Declare Sub Write_servo(byval Adres As Byte , Byval Value As Byte)
Declare Sub Batteriespannung()
Declare Sub Hauptmenue()
Declare Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)
Declare Sub Rnlcd_clr()
Declare Function Rnlcd_getscan() As Word
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Waitms 1 'Warte bis LCD bereit
Print Chr(27) ; Chr(122) ; Chr(0); 'Autosend deaktivieren
Print Chr(27) ; Chr(119) ; Chr(1); 'Tasten Scanmodus aktivieren
Rnlcd_clr 'Display löschen
Print "Halloeoeole!"
Print "Wenn dieser Text"
Print "erscheint, dann" 'Anfangstext
Print "klappt RS232 Modi" ;
Sound Portd.7 , 400 , 450 'BEEP
Sound Portd.7 , 400 , 250 'BEEP
Sound Portd.7 , 400 , 450 'BEEP
Waitms 200
Do
If I > 30 Then
I = 1
I2 = I2 + 1
Call Hauptmenue()
Print "###############"
Print "Bitte auswählen:"
Print Menuetext
Print "###############" ;
End If
I = I + 1
Taste = Rnlcd_getscan()
If Taste <> 0 Then
Select Case Taste
Case 1
Call Batteriespannung
Case 2
Call Write_servo(63 , 200)
Case 4
Call Write_servo(63 , 20)
End Select
Sound Portd.7 , 400 , 500
End If
Waitms 100
Loop
End
Sub Write_servo(byval Adres As Byte , Byval Value As Byte)
I2cinit
I2cstart 'start
I2cwbyte Servoid 'slave address
I2cwbyte Adres 'Servonummer
I2cwbyte Value 'Servo Position
I2cstop 'stop
End Sub
Sub Batteriespannung()
I = 0
I2 = 1
Local W As Word
Start Adc
W = Getadc(6)
Volt = W * Ref
Volt = Volt * 5.2941
Gosub Rnlcd_clr
Print ""
Print "Logik-Spannung: "
Print Volt ; " Volt "
Select Case Volt
Case 0 To 6.8
Print "schlecht<+------->OK";
Sound Portd.7 , 400 , 500
Sound Portd.7 , 400 , 500
Sound Portd.7 , 400 , 500
Sound Portd.7 , 400 , 500
Case 6.8 To 7.5
Print "schlecht<-+------>OK";
Sound Portd.7 , 400 , 500
Sound Portd.7 , 400 , 500
Case 7.5 To 8.2
Print "schlecht<--+----->OK";
Case 8.2 To 9
Print "schlecht<---+---->OK";
Case 9 To 9.7
Print "schlecht<----+--->OK";
Case 9.7 To 10.4
Print "schlecht<-----+-->OK";
Case 10.4 To 11.1
Print "schlecht<------+->OK";
Case 11.1 To 18
Print "schlecht<-------+>OK";
End Select
End Sub
Sub Hauptmenue()
If I2 > 3 Then
I2 = 1
End If
Select Case I2
Case 1
Menuetext = "1:BatSpannung"
Case 2
Menuetext = "2:I2CTest200"
Case 3
Menuetext = "3:I2CTest20"
End Select
End Sub
Wenn ich am Rn-Keylcd die 1 drücke bekomm ich wunderbar meine Spannung angezeigt... aber wenn ich die 2 drücke (also "Write_servo") braucht er ca. 20 sek um diesen Sub-Teil zu bearbeiten ist das normal?
Ist der Code so OK? [-o< und vor allem:
Ist die I2C-Adresse richtig angegeben??? --> (auf Seite 1) http://www.autonomics.de/assets/own/...datenblatt.pdf
Sind die I2C-Befehle richtig?
Im Datenblatt steht (auf Seite 12)
"8bit-Position Servo 1: <63>,<0-255>
8bit-Position Servo 2: <62>,<0-255>"
Lesezeichen