wodka
16.01.2009, 16:45
Hallo,
leider habe ich noch nicht soviel mit einem µC gearbeitet und habe nochmal grundlegende Fragen.
Ich habe die letzten Tage einen Kreuztisch(X,Y,Z) mit 3 Schrittmotoren und einer Motorschrittkarte für 3 Motoren in Betrieb genommen, wo ich nur den Takt und die Richtung vorgeben muss.
Zu schnellen Testzwecken habe ich die Bewegungen mit For Next Schleifen gelöst. Problem ist ja, dass die unterschiedlichen Motoren die Positionen nur nacheinander abarbeiten.
Wie löst man denn einen elegante Lösung, dass die Motoren gleichzeitig laufen würden. Werde nicht ganz so schlau draus, wie ich die Timern bzw. Interrupts einsetzen könnte!? Vielleicht kann mir jemand auf die Sprünge helfen bzw. vll. ein kleines Beipiel durch Änderung meines Codes.
$eeprom
$eepromhex
$regfile = "m32def.dat" ' Prozessortyp ATmega32
$crystal = 1000000 ' Taktrate
$hwstack = 32
$swstack = 10
$framesize = 40
$baud = 4800
Dim I As Integer
Config Pina.0 = Input
Porta.0 = 1
Config Pina.1 = Input
Porta.1 = 1
Config Pina.2 = Input
Porta.2 = 1
Config Portb.0 = Output
Stepper1x_takt Alias Portb.0
Stepper1x_takt = 0
Config Portb.1 = Output
Stepper1x_richtung Alias Portb.1
Stepper1x_richtung = 0
Config Portb.2 = Output
Stepper2y_takt Alias Portb.2
Stepper2y_takt = 0
Config Portb.3 = Output
Stepper2y_richtung Alias Portb.3
Stepper2y_richtung = 0
Config Portb.4 = Output
Stepper3z_takt Alias Portb.4
Stepper3z_takt = 0
Config Portb.5 = Output
Stepper3z_richtung Alias Portb.5
Stepper3z_richtung = 0
'Hauptschleife
Do
If Pina.1 = 0 Then
Stepper1x_richtung = 0
Stepper1x_takt = 1 : Waitus 10 : Stepper1x_takt = 0
Waitus 1600
End If
If Pina.2 = 0 Then
Stepper1x_richtung = 1
Stepper1x_takt = 1 : Waitus 10 : Stepper1x_takt = 0
Waitus 1600
End If
If Pina.0 = 0 Then
Stepper3z_richtung = 0
For I = 1 To 1200
Stepper3z_takt = 1 : Waitus 10 : Stepper3z_takt = 0
Waitus 1600
Next
Stepper2y_richtung = 1
For I = 1 To 8600
Stepper2y_takt = 1 : Waitus 10 : Stepper2y_takt = 0
Waitus 1600
Next
Stepper1x_richtung = 0
For I = 1 To 8090
Stepper1x_takt = 1 : Waitus 10 : Stepper1x_takt = 0
Waitus 1600
Next
Stepper2y_richtung = 0
For I = 1 To 8600
Stepper2y_takt = 1 : Waitus 10 : Stepper2y_takt = 0
Waitus 1600
Next
Stepper3z_richtung = 1
For I = 1 To 1200
Stepper3z_takt = 1 : Waitus 10 : Stepper3z_takt = 0
Waitus 1600
Next
Waitms 5000
Stepper3z_richtung = 0
For I = 1 To 1200
Stepper3z_takt = 1 : Waitus 10 : Stepper3z_takt = 0
Waitus 1600
Next
Stepper2y_richtung = 1
For I = 1 To 8600
Stepper2y_takt = 1 : Waitus 10 : Stepper2y_takt = 0
Waitus 1600
Next
Stepper1x_richtung = 1
For I = 1 To 8090
Stepper1x_takt = 1 : Waitus 10 : Stepper1x_takt = 0
Waitus 1600
Next
Stepper2y_richtung = 0
For I = 1 To 8600
Stepper2y_takt = 1 : Waitus 10 : Stepper2y_takt = 0
Waitus 1600
Next
Stepper3z_richtung = 1
For I = 1 To 1200
Stepper3z_takt = 1 : Waitus 10 : Stepper3z_takt = 0
Waitus 1600
Next
End If
Loop
End
leider habe ich noch nicht soviel mit einem µC gearbeitet und habe nochmal grundlegende Fragen.
Ich habe die letzten Tage einen Kreuztisch(X,Y,Z) mit 3 Schrittmotoren und einer Motorschrittkarte für 3 Motoren in Betrieb genommen, wo ich nur den Takt und die Richtung vorgeben muss.
Zu schnellen Testzwecken habe ich die Bewegungen mit For Next Schleifen gelöst. Problem ist ja, dass die unterschiedlichen Motoren die Positionen nur nacheinander abarbeiten.
Wie löst man denn einen elegante Lösung, dass die Motoren gleichzeitig laufen würden. Werde nicht ganz so schlau draus, wie ich die Timern bzw. Interrupts einsetzen könnte!? Vielleicht kann mir jemand auf die Sprünge helfen bzw. vll. ein kleines Beipiel durch Änderung meines Codes.
$eeprom
$eepromhex
$regfile = "m32def.dat" ' Prozessortyp ATmega32
$crystal = 1000000 ' Taktrate
$hwstack = 32
$swstack = 10
$framesize = 40
$baud = 4800
Dim I As Integer
Config Pina.0 = Input
Porta.0 = 1
Config Pina.1 = Input
Porta.1 = 1
Config Pina.2 = Input
Porta.2 = 1
Config Portb.0 = Output
Stepper1x_takt Alias Portb.0
Stepper1x_takt = 0
Config Portb.1 = Output
Stepper1x_richtung Alias Portb.1
Stepper1x_richtung = 0
Config Portb.2 = Output
Stepper2y_takt Alias Portb.2
Stepper2y_takt = 0
Config Portb.3 = Output
Stepper2y_richtung Alias Portb.3
Stepper2y_richtung = 0
Config Portb.4 = Output
Stepper3z_takt Alias Portb.4
Stepper3z_takt = 0
Config Portb.5 = Output
Stepper3z_richtung Alias Portb.5
Stepper3z_richtung = 0
'Hauptschleife
Do
If Pina.1 = 0 Then
Stepper1x_richtung = 0
Stepper1x_takt = 1 : Waitus 10 : Stepper1x_takt = 0
Waitus 1600
End If
If Pina.2 = 0 Then
Stepper1x_richtung = 1
Stepper1x_takt = 1 : Waitus 10 : Stepper1x_takt = 0
Waitus 1600
End If
If Pina.0 = 0 Then
Stepper3z_richtung = 0
For I = 1 To 1200
Stepper3z_takt = 1 : Waitus 10 : Stepper3z_takt = 0
Waitus 1600
Next
Stepper2y_richtung = 1
For I = 1 To 8600
Stepper2y_takt = 1 : Waitus 10 : Stepper2y_takt = 0
Waitus 1600
Next
Stepper1x_richtung = 0
For I = 1 To 8090
Stepper1x_takt = 1 : Waitus 10 : Stepper1x_takt = 0
Waitus 1600
Next
Stepper2y_richtung = 0
For I = 1 To 8600
Stepper2y_takt = 1 : Waitus 10 : Stepper2y_takt = 0
Waitus 1600
Next
Stepper3z_richtung = 1
For I = 1 To 1200
Stepper3z_takt = 1 : Waitus 10 : Stepper3z_takt = 0
Waitus 1600
Next
Waitms 5000
Stepper3z_richtung = 0
For I = 1 To 1200
Stepper3z_takt = 1 : Waitus 10 : Stepper3z_takt = 0
Waitus 1600
Next
Stepper2y_richtung = 1
For I = 1 To 8600
Stepper2y_takt = 1 : Waitus 10 : Stepper2y_takt = 0
Waitus 1600
Next
Stepper1x_richtung = 1
For I = 1 To 8090
Stepper1x_takt = 1 : Waitus 10 : Stepper1x_takt = 0
Waitus 1600
Next
Stepper2y_richtung = 0
For I = 1 To 8600
Stepper2y_takt = 1 : Waitus 10 : Stepper2y_takt = 0
Waitus 1600
Next
Stepper3z_richtung = 1
For I = 1 To 1200
Stepper3z_takt = 1 : Waitus 10 : Stepper3z_takt = 0
Waitus 1600
Next
End If
Loop
End