-
        

Ergebnis 1 bis 2 von 2

Thema: For Next , Interrupt

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    20.11.2005
    Beiträge
    88

    For Next , Interrupt

    Anzeige

    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.

    Code:
    $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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Generell würde ich das so machen:

    Du wartest scheinbar zwischen den einzelnen Steps immer 1600µs.
    Daher würde ich einen Timer so aufsetzen, dass er alle 1600µs überläuft. In der ISR fragst du dann die Eingänge ab (so wie in deinem Code) und erzeugst einen Schritt für jede Richtung, die noch nicht fertig ist (Status Variable noch nicht die 1200, 8600 usw. erreicht). Dann erhöhst du eine Status Variable der jeweiligen Richtung. Also keine komplette Schleife, wie bei dir.
    Bei 1MHz Takt sind dann die 10µs um und die setzt die Ausgänge in der gleichen Reihenfolge wieder zurück.
    Die 10µs sind bei 1µs Systemtakt aber ziemlich schlecht einzuhalten. Würde ich schon eher 8MHz nehmen.
    Sind die abgefragten Pins eigentlich Endschalter oder wodurch werden immer neue Loops verhindert?

    Gruß

    Rolf

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •