Typer
07.11.2010, 11:15
Hi,
mein plan ist es ein Quadpot zu bauen. Hab nun mal ein bein gebaut um zu testen wie das so wird.
Nun mein Problem....
In dem Bein sind 3 Servos verbaut, diese werden von einem atmega168 angesteuert.
Zum testen habe ich mal folgenden code verwendet
$regfile = "M168Pdef.dat" 'es handelt sich um einen ATmega168P
$crystal = 3686400 'der eingebauter RC-Oszillator läuft mit 3,6864 Mhz
$hwstack = 100 'im Speicher werden für den Hardware-Stack 100 Byte reserviert
$swstack = 100 'im Speicher werden für den Software-Stack 100 Byte reserviert
$framesize = 100 'im Speicher werden für den Frame 100 Byte reserviert
$baud = 19200
'Taster
S1 Alias Pind.2 'Taster1 an D.2
S2 Alias Pind.3 'Taster2 an D.3
S3 Alias Pind.4
Config Portd = Input 'Port D = input
Portd.2 = 1 'Pullup
Portd.3 = 1 'Pullup
Portd.4 = 1
'Servos
'Servo von 32 - 82
Config Servos = 3 , Servo1 = Portb.0 , Servo2 = Portb.1 , Servo3 = Portb.2 , Reload = 10
Config Portb = Output
Declare Sub Hoch
Declare Sub Runter
Declare Sub Mitte
Enable Interrupts
Dim X1 As Byte , X2 As Byte , X3 As Byte
X1 = 57
X2 = 57
X3 = 57
Servo(1) = X1
Servo(2) = X2
Servo(3) = X3
Bitwait S1 , Reset
Bitwait S1 , Set
Do
'Bitwait S1 , Set
If S1 = 0 Then Call Hoch
If S2 = 0 Then Call Mitte
If S3 = 0 Then Call Runter
Print "Servo1 = " ; Servo(1)
Print "Servo2 = " ; Servo(2)
Print "Servo3 = " ; Servo(3)
Waitms 50
Loop
End 'Ende des Programms
Sub Hoch
Servo(1) = 80
Servo(2) = 80
End Sub
Sub Mitte
Servo(1) = 57
Servo(2) = 57
End Sub
Sub Runter
Servo(1) = 35
Servo(2) = 35
End Sub
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
so gehts!
aber bei 3 Servos
Config Servos = 3 , Servo1 = Portb.0 , Servo2 = Portb.1 , Servo3 = Portb.2 , Reload = 10
fangen die Servos nach der bewegung an zu ruckeln.
Also habe ich versucht einen Interrupt über timer1 zu steuern
wie hier: http://www.rn-wissen.de/index.php/Servoansteuerung
(Anpassung der Frequenz mit rnAvr rechner)
jedoch zeigen die servos keine regung
wie kann ich herausfinden warum das nicht geht?
bzw kann mir jemand erläutern wie ein interrupt aussieht der nur einen servo ein paar cm in eine richtung und dann wieder zurück bewegt?!
mein plan ist es ein Quadpot zu bauen. Hab nun mal ein bein gebaut um zu testen wie das so wird.
Nun mein Problem....
In dem Bein sind 3 Servos verbaut, diese werden von einem atmega168 angesteuert.
Zum testen habe ich mal folgenden code verwendet
$regfile = "M168Pdef.dat" 'es handelt sich um einen ATmega168P
$crystal = 3686400 'der eingebauter RC-Oszillator läuft mit 3,6864 Mhz
$hwstack = 100 'im Speicher werden für den Hardware-Stack 100 Byte reserviert
$swstack = 100 'im Speicher werden für den Software-Stack 100 Byte reserviert
$framesize = 100 'im Speicher werden für den Frame 100 Byte reserviert
$baud = 19200
'Taster
S1 Alias Pind.2 'Taster1 an D.2
S2 Alias Pind.3 'Taster2 an D.3
S3 Alias Pind.4
Config Portd = Input 'Port D = input
Portd.2 = 1 'Pullup
Portd.3 = 1 'Pullup
Portd.4 = 1
'Servos
'Servo von 32 - 82
Config Servos = 3 , Servo1 = Portb.0 , Servo2 = Portb.1 , Servo3 = Portb.2 , Reload = 10
Config Portb = Output
Declare Sub Hoch
Declare Sub Runter
Declare Sub Mitte
Enable Interrupts
Dim X1 As Byte , X2 As Byte , X3 As Byte
X1 = 57
X2 = 57
X3 = 57
Servo(1) = X1
Servo(2) = X2
Servo(3) = X3
Bitwait S1 , Reset
Bitwait S1 , Set
Do
'Bitwait S1 , Set
If S1 = 0 Then Call Hoch
If S2 = 0 Then Call Mitte
If S3 = 0 Then Call Runter
Print "Servo1 = " ; Servo(1)
Print "Servo2 = " ; Servo(2)
Print "Servo3 = " ; Servo(3)
Waitms 50
Loop
End 'Ende des Programms
Sub Hoch
Servo(1) = 80
Servo(2) = 80
End Sub
Sub Mitte
Servo(1) = 57
Servo(2) = 57
End Sub
Sub Runter
Servo(1) = 35
Servo(2) = 35
End Sub
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
so gehts!
aber bei 3 Servos
Config Servos = 3 , Servo1 = Portb.0 , Servo2 = Portb.1 , Servo3 = Portb.2 , Reload = 10
fangen die Servos nach der bewegung an zu ruckeln.
Also habe ich versucht einen Interrupt über timer1 zu steuern
wie hier: http://www.rn-wissen.de/index.php/Servoansteuerung
(Anpassung der Frequenz mit rnAvr rechner)
jedoch zeigen die servos keine regung
wie kann ich herausfinden warum das nicht geht?
bzw kann mir jemand erläutern wie ein interrupt aussieht der nur einen servo ein paar cm in eine richtung und dann wieder zurück bewegt?!