Hi,
sodana, meine Routine:
Code:
$regfile = "m32def.dat" 'verwendeter Chip
$crystal = 16000000 'Taktfrequenz
$hwstack = 32 'HardwareStack
$swstack = 32 'SoftwareStack
$framesize = 64
Config Timer1 = Timer , Prescale = 1
On Timer1 Servo
Enable Timer1
Start Timer1
'-----------------------------------------------------------------------'
'Verwendete Ports: '
'-----------------------------------------------------------------------'
Config Porta.0 = Output
Config Porta.1 = Output
Config Porta.2 = Output
Servo1 Alias Porta.0
Servo2 Alias Porta.1
Servo3 Alias Porta.2
'-----------------------------------------------------------------------'
'Variablendefinition: '
'-----------------------------------------------------------------------'
Dim Servo(6) As Word 'Array der Pulsweiten für Servos
Dim Servo_ein(6) As Byte '1 - Servo eingeschaltet; 0 - Servo ausgeschaltet
Dim I As Byte : I = 0 'Zählvariable
Dim J As Word : J = 1 'Zählvariable
Dim Verzoegerung As Word 'zum Einstellen der Refresh - Rate
Dim Verzoegerungsservo As Byte
'-----------------------------------------------------------------------'
'Hauptprogramm: '
'-----------------------------------------------------------------------'
For J = 1 To 6 'alle Servos inkl. Verzögerunsservos einschalten
Servo_ein(j) = 1
Next
Verzoegerung = 60000
Servo(4) = Verzoegerung 'Verzögerungsservos einstellen
Servo(5) = Verzoegerung
Servo(6) = Verzoegerung
Enable Interrupts 'Servointerrupt aktivieren
Do
For J = 15000 To 35000 Step 10
Servo(1) = J
Servo(2) = J
Servo(3) = J
Waitus 1000
Next
For J = 35000 To 15000 Step -10
Servo(1) = J
Servo(2) = J
Servo(3) = J
Waitus 1000
Next
Loop
'-----------------------------------------------------------------------'
'Funktionen: '
'-----------------------------------------------------------------------'
Servo:
Select Case I
Case 1 : Servo1 = 0
Case 2 : Servo2 = 0
Case 3 : Servo3 = 0
Case 4 : Verzoegerungsservo = 0
Case 5 : Verzoegerungsservo = 0
Case 6 : Verzoegerungsservo = 0
End Select
Incr I
If I = 7 Then
I = 0
End If
If Servo_ein(i) = 1 Then
Select Case I
Case 1 : Servo1 = 1
Case 2 : Servo2 = 1
Case 3 : Servo3 = 1
Case 4 : Verzoegerungsservo = 1
Case 5 : Verzoegerungsservo = 1
Case 6 : Verzoegerungsservo = 1
End Select
End If
Timer1 = 65535 - Servo(i)
Return
ich hab auch ein kurzes Video gemacht:
http://de.youtube.com/watch?v=diCrlAC4-3w
die Routine ist noch nicht das gelbe vom Ei, da es eine maximale Anzahl der Servos gibt, die angesteuert werden können. Wird diese Zahl überschritten, werden die (analogen) Servos kraftlos, da der Impuls nicht mehr alle 20 ms wiederholt werden kann. Da ich aber pro ATMega eh nur 3 Servos ansteuere, reichts für mich.
Viele Grüße
ikarus_177
Lesezeichen