- Labornetzteil AliExpress    Werbung      
Ergebnis 1 bis 10 von 41

Thema: Bascom: Schrittmotorsteuerung mit Drehencoder?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.720
    Und nochmal Bild  
    $hwstack muß auf mindestens 34 erhöht werden.
    Die ISR verlangt 32 und ein Unterprogramm nochmal 2, weil während der Abarbeitung eines Unterprogrammes die Timer-ISR auftreten kann.
    http://halvar.at/elektronik/kleiner_...swstack_frame/

    PS: Sollte aber nichts mit dem Problem zu tun haben. Hab es gerade simuliert und danach würden 32 auch ausreichen.

    Gruß
    Searcher
    Geändert von Searcher (27.10.2012 um 16:58 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    02.04.2009
    Beiträge
    78
    Hallo Searcher,

    ich hab jetzt wie Du vorschlägst den hwstack erhöht, dann den Langdrück-Kram mal kpl. auskommentiert und die beiden Waits bei Kurz und Doppel rausgenommen, der Schritti verhält sich immer noch so komisch mit den Zuckungen. Das ist doch äußerst suspekt, oder?
    Es muss in der Tastenabfrage stecken, denn ohne diese ist der Motor einwandfrei gelaufen.
    Ich hab diese erste Version noch extra gesichert um die Änderungen gegenzuprüfen.

    So läuft er einwandfrei:
    Code:
                                                   
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    $hwstack = 34
    $swstack = 32
    $framesize = 40
    $baud = 9600
    ' BASCOM-Programm
    ' Stefan Hoffmann 2009
    ' Drehimpulsgeber/Encoder     mit ENCODER-Befehl
    '
    ' In: Drehimpulsgeber an d.0 und d.1 sowie Taster
    
    ' Testprogramm  für A3967 Platine mit Dir Step und Enable
    
    $regfile = "attiny2313.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 8000000                                          'Interner Osz. 8 MHz
    $baud = 9600
    
    
    Config Timer0 = Timer , Prescale = 1024                     'Timer0 Deklarationen für den Takt des Steppers
    Enable Timer0
    Dim Timer0_reload As Word
    Portd.4 = 1                                                 'Pullup Widerstand ein   für Enable - ****Enable =0 bedeutet Motor On!!!!  ****
    Enable Interrupts
    On Timer0 Isr_timer0                                        'Deklaration der Timerroutine
    
             ' Inputs: Drehimpulsgeber an d.0 und d.1 sowie Taster an d.3
             '-----Deklarationen fuer Drehimpulsgeber:
    Config Pind.0 = Input
        Encoder_a Alias Pind.0                                  'Encoder Signal B  an Pin 2
    Config Pind.1 = Input
        Encoder_b Alias Pind.1                                  'Encoder Signal A  an Pin 3
    Config Pind.3 = Input
        Taster1 Alias Pind.3                                    'Taster
    
    Portd.0 = 1                                                  'Pullups für den Drehencoder
    Portd.1 = 1
    Portd.3 = 1
                                                       'LED-Outputs stellvertretend für Step, Dir, Enable
                                                      ' In der endgültigen Hardware liegen: Step/Takt auf PD.2 / Taster auf PD.3 / Enable auf PD4 / Richtung auf PD5 /
    Config Portd.2 = Output
        Portd.2 = 0                                             'das ist Step/Takt - Pin 6   - alles mit Pulldown + LEd_gelb
    Config Portd.5 = Output
        Portd.5 = 0                                             ' Pin 9  -  Dir - Richtungssignal
    Config Portd.4 = Output
        Portd.4 = 0                                             ' Pin 16   -  Enable - generelles Ein-Ausschaltsignal
    Config Portb.0 = Output
        Portb.0 = 0                                             'Pin 9 - LED_DE - am Drehencoder Anzeige
    
    Motor_step Alias Portd.2
    Chip_dir Alias Portd.5
    Chip_enable Alias Portd.4
    
    Dim Wert As Word
    Wert = 2                                                    'experimentell ermittelter Startwert für den Drehencoder
    Dim Zustand As Byte
           '*****************Deklarationen für den Taster - am DE - für die Lang-kurz- und Doppelklickroutine
    
    
           '***********Hauptschleife:**********
    Do
    
    Chip_enable = 0                                             'Enable ein
    Chip_dir = 1                                                'Dir
    
    
    Zustand = Encoder(pind.0 , Pind.1 , Linksroutine , Rechtsroutine , 0)
    
    
    
    
    Loop
    
    End
    
    
    '*****************Subroutine Tasterauswertung *****************************
    
    
    '**********************Interrupt-Routine Timer0 ************************************
    Isr_timer0:
      Timer0_reload = 4                                         'Vorgabe für 38 / sec
      Timer0 = Timer0_reload + Wert
      Toggle Motor_step                                         '= Stepper_takt
    Return
    
    
    '***********************Sub-Routinen Drehencoder  ***********************************
    Linksroutine:
    Decr Wert
       If Wert < 1 Then
       Wert = 1
       End If
    Return
    
    Rechtsroutine:
    Incr Wert
       If Wert > 230 Then
       Wert = 230
       End If
    Return

    Und so, mit Deinen Änderungen, läuft er mit Zuckungen:
    Code:
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    $baud = 9600
    ' BASCOM-Programm
    ' Stefan Hoffmann 2009
    ' Drehimpulsgeber/Encoder     mit ENCODER-Befehl
    '
    ' In: Drehimpulsgeber an d.0 und d.1 sowie Taster
    
    ' Testprogramm  für A3967 Platine mit Dir Step und Enable
    
    $regfile = "attiny2313.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 34
    $crystal = 8000000                                          'Interner Osz. 8 MHz
    $baud = 9600
    
    
    Config Timer0 = Timer , Prescale = 1024                     'Timer1 Deklarationen für den Takt des Steppers
    Enable Timer0
    Dim Timer0_reload As Word
    Portd.4 = 1                                                 'Pullup Widerstand ein   für Enable - ****Enable =0 bedeutet Motor On!!!!  ****
    Enable Interrupts
    On Timer0 Isr_timer0                                        'Deklaration der Timerroutine
    
             ' Inputs: Drehimpulsgeber an d.0 und d.1 sowie Taster an d.3
             '-----Deklarationen fuer Drehimpulsgeber:
    Config Pind.0 = Input
        Encoder_a Alias Pind.0                                  'Encoder Signal B  an Pin 2
    Config Pind.1 = Input
        Encoder_b Alias Pind.1                                  'Encoder Signal A  an Pin 3
    Config Pind.3 = Input
        Taster1 Alias Pind.3                                    'Taster
    
    Portd.0 = 1                                                 'Pullups für den Drehencoder
    Portd.1 = 1
    Portd.3 = 1
                                                       'LED-Outputs stellvertretend für Step, Dir, Enable
                                                      ' In der endgültigen Hardware liegen: Step/Takt auf PD.2 / Taster auf PD.3 / Enable auf PD4 / Richtung auf PD5 /
    Config Portd.2 = Output
        Portd.2 = 0                                             'das ist Step/Takt - Pin 6   - alles mit Pulldown + LEd_gelb
    Config Portd.5 = Output
        Portd.5 = 0                                             ' Pin 9  -  Dir - Richtungssignal
    Config Portd.4 = Output
        Portd.4 = 0                                             ' Pin 16   -  Enable - generelles Ein-Ausschaltsignal
    Config Portb.0 = Output
        Portb.0 = 0                                             'Pin 9 - LED_DE - am Drehencoder Anzeige
    
    Motor_step Alias Portd.2
    Chip_dir Alias Portd.5
    Chip_enable Alias Portd.4
    
    Dim Wert As Word
    Wert = 2                                                    'experimentell ermittelter Startwert für den Drehencoder
    Dim Zustand As Byte
                  '*****************Deklarationen für den Taster - am DE - für die Lang-kurz- und Doppelklickroutine
    Dim Zaehler As Byte
    Const Langzaehler = 100                                     'Danach gilt die Taste als lange gedrueckt
    Const Doppelzaehler = 20                                    'Innerhalb dessen muss zweiter Klick erfolgen
    Dim Gedrueckt As Byte                                       'Art des Drueckens (Kurz/Lang/Doppel)
    Const Kurz = 1
    Const Lang = 2
    Const Doppel = 3
    Dim I As Byte
    
    
           '***********Hauptschleife:**********
    Do
    
    Chip_enable = 0                                             'Enable ein
    Chip_dir = 1                                                'Dir
    
    
    Zustand = Encoder(pind.0 , Pind.1 , Linksroutine , Rechtsroutine , 0)
    
    
    Debounce Taster1 , 0 , Tastenauswertung , Sub
    
      Select Case Gedrueckt                                     'Hier koennen beliebige Anweisungen erfolgen
      Case Kurz:                                                'Es wurde einmal kurz gedrueckt
          Chip_enable = 1                                       'Motor stoppen
    
      Case Lang:                                                'Die Taste wurde lange gedrueckt
         ' For I = 1 To 6
          '   Toggle Chip_dir
          'Next I
          'Wait 1
    
      Case Doppel:                                              'Die Taste wurde doppelt gedrueckt
          Chip_enable = 0                                       'Motor wieder an
    
      End Select
    
      Portd.2 = 0
      Portd.5 = 0
      Portb.4 = 0
    
    
    Loop
    
    End
    
    '**********************Interrupt-Routine Timer0 ************************************
    Isr_timer0:
      Timer0_reload = 4                                         'Vorgabe für 38 / sec
      Timer0 = Timer0_reload + Wert
      Toggle Motor_step                                         '= Stepper_takt
    Return
    
    '***********************Sub-Routinen Drehencoder  ***********************************
    Linksroutine:
    Decr Wert
       If Wert < 1 Then
       Wert = 1
       End If
    Return
    
    Rechtsroutine:
    Incr Wert
       If Wert > 230 Then
       Wert = 230
       End If
    Return
    
    '*****************Subroutine Tasterauswertung *****************************
    Tastenauswertung:
      Zaehler = 0
      Do
        Incr Zaehler
        Waitms 10
      Loop Until Taster1 = 1 Or Zaehler = Langzaehler
    
      If Zaehler = Langzaehler Then                             'lange gedrueckt
        Gedrueckt = Lang
      Else                                                      'einmal kurz gedrueckt
        Zaehler = 0
        Do
          Incr Zaehler
          Waitms 10
        Loop Until Taster1 = 0 Or Zaehler = Doppelzaehler
    
        If Zaehler = Doppelzaehler Then                         'bleibt bei einmal kurz
          Gedrueckt = Kurz
        Else
          Gedrueckt = Doppel                                    'zweites Mal kurz gedrueckt
        End If
      End If
    Return
    (Die Schleife bei "Lang" soll übrigens dazu dienen den Motor 6 sec. lang in die eine und dann in die andere Richtung laufen zu lassen. Geht das überhaupt so?)

    Aber zuerst zum Problem des Zuckens. Das tritt auch auf wenn die Taste gar nicht gedrückt wurde, also die Sub selbst kann es wohl nicht sein, aber wo klemmt es denn dann? Sehr merkwürdig.

    Danke für Deine Hilfe!

    LG MM

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.720
    Zitat Zitat von MrMiffy08 Beitrag anzeigen
    Und so, mit Deinen Änderungen, läuft er mit Zuckungen:
    Code:
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    $hwstack = 34
    $swstack = 10
    $framesize = 40
    $baud = 9600
    ' BASCOM-Programm
    ' Stefan Hoffmann 2009
    ' Drehimpulsgeber/Encoder     mit ENCODER-Befehl
    '
    ' In: Drehimpulsgeber an d.0 und d.1 sowie Taster
    
    ' Testprogramm  für A3967 Platine mit Dir Step und Enable
    
    $regfile = "attiny2313.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 34
    $crystal = 8000000                                          'Interner Osz. 8 MHz
    $baud = 9600
    
    
    Config Timer0 = Timer , Prescale = 1024                     'Timer1 Deklarationen für den Takt des Steppers
    Enable Timer0
    Dim Timer0_reload As Word
    Portd.4 = 1                                                 'Pullup Widerstand ein   für Enable - ****Enable =0 bedeutet Motor On!!!!  ****
    Enable Interrupts
    On Timer0 Isr_timer0                                        'Deklaration der Timerroutine
    
             ' Inputs: Drehimpulsgeber an d.0 und d.1 sowie Taster an d.3
             '-----Deklarationen fuer Drehimpulsgeber:
    Config Pind.0 = Input
        Encoder_a Alias Pind.0                                  'Encoder Signal B  an Pin 2
    Config Pind.1 = Input
        Encoder_b Alias Pind.1                                  'Encoder Signal A  an Pin 3
    Config Pind.3 = Input
        Taster1 Alias Pind.3                                    'Taster
    
    Portd.0 = 1                                                 'Pullups für den Drehencoder
    Portd.1 = 1
    Portd.3 = 1
                                                       'LED-Outputs stellvertretend für Step, Dir, Enable
                                                      ' In der endgültigen Hardware liegen: Step/Takt auf PD.2 / Taster auf PD.3 / Enable auf PD4 / Richtung auf PD5 /
    Config Portd.2 = Output
        Portd.2 = 0                                             'das ist Step/Takt - Pin 6   - alles mit Pulldown + LEd_gelb
    Config Portd.5 = Output
        Portd.5 = 0                                             ' Pin 9  -  Dir - Richtungssignal
    Config Portd.4 = Output
        Portd.4 = 0                                             ' Pin 16   -  Enable - generelles Ein-Ausschaltsignal
    Config Portb.0 = Output
        Portb.0 = 0                                             'Pin 9 - LED_DE - am Drehencoder Anzeige
    
    Motor_step Alias Portd.2
    Chip_dir Alias Portd.5
    Chip_enable Alias Portd.4
    
    Dim Wert As Word
    Wert = 2                                                    'experimentell ermittelter Startwert für den Drehencoder
    Dim Zustand As Byte
                  '*****************Deklarationen für den Taster - am DE - für die Lang-kurz- und Doppelklickroutine
    Dim Zaehler As Byte
    Const Langzaehler = 100                                     'Danach gilt die Taste als lange gedrueckt
    Const Doppelzaehler = 20                                    'Innerhalb dessen muss zweiter Klick erfolgen
    Dim Gedrueckt As Byte                                       'Art des Drueckens (Kurz/Lang/Doppel)
    Const Kurz = 1
    Const Lang = 2
    Const Doppel = 3
    Dim I As Byte
    
    
           '***********Hauptschleife:**********
    Do
    
    Chip_enable = 0                                             'Enable ein
    Chip_dir = 1                                                'Dir
    
    
    Zustand = Encoder(pind.0 , Pind.1 , Linksroutine , Rechtsroutine , 0)
    
    
    Debounce Taster1 , 0 , Tastenauswertung , Sub
    
      Select Case Gedrueckt                                     'Hier koennen beliebige Anweisungen erfolgen
      Case Kurz:                                                'Es wurde einmal kurz gedrueckt
          Chip_enable = 0                                       'Motor stoppen, 0 für starten ?
    
      Case Lang:                                                'Die Taste wurde lange gedrueckt
          For I = 1 To 6
          Chip_dir = 0
          Wait 1
          Next I
    
      Case Doppel:                                              'Die Taste wurde doppelt gedrueckt
          Waitms 500                                       'ursprüngliches Programm, Motor wieder an
    
      End Select
    
      Portd.2 = 0
      Portd.5 = 0
      Portb.4 = 0
    
    
    Loop
    
    End
    
    '**********************Interrupt-Routine Timer0 ************************************
    Isr_timer0:
      Timer0_reload = 4                                         'Vorgabe für 38 / sec
      Timer0 = Timer0_reload + Wert
      Toggle Motor_step                                         '= Stepper_takt
    Return
    
    '***********************Sub-Routinen Drehencoder  ***********************************
    Linksroutine:
    Decr Wert
       If Wert < 1 Then
       Wert = 1
       End If
    Return
    
    Rechtsroutine:
    Incr Wert
       If Wert > 230 Then
       Wert = 230
       End If
    Return
    
    '*****************Subroutine Tasterauswertung *****************************
    Tastenauswertung:
      Zaehler = 0
      Do
        Incr Zaehler
        Waitms 10
      Loop Until Taster1 = 1 Or Zaehler = Langzaehler
    
      If Zaehler = Langzaehler Then                             'lange gedrueckt
        Gedrueckt = Lang
      Else                                                      'einmal kurz gedrueckt
        Zaehler = 0
        Do
          Incr Zaehler
          Waitms 10
        Loop Until Taster1 = 0 Or Zaehler = Doppelzaehler
    
        If Zaehler = Doppelzaehler Then                         'bleibt bei einmal kurz
          Gedrueckt = Kurz
        Else
          Gedrueckt = Doppel                                    'zweites Mal kurz gedrueckt
        End If
      End If
    Return
    (Die Schleife bei "Lang" soll übrigens dazu dienen den Motor 6 sec. lang in die eine und dann in die andere Richtung laufen zu lassen. Geht das überhaupt so?)

    Aber zuerst zum Problem des Zuckens. Das tritt auch auf wenn die Taste gar nicht gedrückt wurde, also die Sub selbst kann es wohl nicht sein, aber wo klemmt es denn dann? Sehr merkwürdig.
    Die Änderungen hab ich mehr so gemeint: Rot = Änderungen
    [edit] gerade entdeckt, blau ist doppelt
    Hab wenig Hoffnung daß es dann wirklich rund läuft.
    Zum 6 sec rechts oder links Lauf muß das wait 1 in der For Next Schleife stehen - siehe die rote Änderung.

    Nur noch eine eine Idee für heute: Das ursprüngliche Programm mit dem Debounce - Tastenabfrage bei dem es nicht rund läuft: Was passiert, wenn Du nur die Debounce Zeile auskommentierst?

    Ich weis nicht, ob das Debounce den Timer beeinflußt - in der Doku ist nichts zu finden. Vom Video her scheint die Laufrichtung zu wechseln

    Gruß
    Searcher
    Geändert von Searcher (27.10.2012 um 18:34 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    02.04.2009
    Beiträge
    78
    Hallo Searcher,

    danke für Deine Geduld. Habe jetzt noch Deine Änderungen versucht:
    der blaue Doppel-Quatsch weg, die roten Änderungen rein: Gleiches Verhalten. und nein, auch mit dem auskommentieren der Debounce-Zeile alleine ist das gleiche Zucken da, nur wenn die Sub mit weg ist läuft er gleichmäßig. Zum Haareraufen, ich mach jetzt auch erst mal Schluss, Dir einen schönen und erholsamen Abend, ein lecker Bierchen vielleicht und ein schöner Film! Ich geh mit meinem Jüngsten noch bisschen Basteln...

    LG MM

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.720
    OK, ich merke auch, wie ich den Überblick verliere, falls ich ihn gehabt habe Bild  
    Mal drüber schlafen und schönen Abend noch.

    Vielleicht hat hier noch jemand anderes eine Eingebung.

    Ansonsten hilft alles verwerfen und ein anderes Konzept/ Aufbau des Programms.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.720
    Alles frisch? Ich hab das Pech, daß ich mich immer verbeißen muß und habe heute noch mal ein bißchen simuliert (im Bascom Simulator Bild   )

    Ausgehend von Deinem Programm vom 28.10., 1:52h habe ich das Zucken zunächst eliminiert - hoffe ich. Verantwortlich war das "Portd.5 = 0" kurz vor Ende der Hauptschleife.

    Dann noch ein paar Änderungen nach meinem Gutdünken eingebracht. Siehe Remarks im Programm.

    Die Tastensteuerung und auch die Drehzahlsteuerung ist ungut, da sie immer haupsächlich auf die Richtungswechsel warten muß. Die Richtungswechsel würd ich als erstes wieder rausnehmen, da ich mir kaum vorstellen kann, daß man das gut steuern kann. Soll nur eine Demo sein.

    Hoffe, daß endlich das Zucken weg ist. Bin auf Erfahrungbericht gespannt und bitte gerne Nachfragen.

    Code:
    ' BASCOM-Programm
    ' Stefan Hoffmann 2009
    ' Drehimpulsgeber/Encoder     mit ENCODER-Befehl
    '
    ' In: Drehimpulsgeber an d.0 und d.1 sowie Taster
    
    ' Testprogramm  für A3967 Platine mit Dir Step und Enable
    ' Modifiziert von Searcher
    
    $regfile = "attiny2313.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 34                           '1. 32 nach 43 geändert
    $crystal = 8000000                                          'Interner Osz. 8 MHz
    $baud = 9600
    
             ' Inputs: Drehimpulsgeber an d.0 und d.1 sowie Taster an d.3
             '-----Deklarationen fuer Drehimpulsgeber:
    Config Pind.0 = Input
        Encoder_a Alias Pind.0                                  'Encoder Signal B  an Pin 2
    Config Pind.1 = Input
        Encoder_b Alias Pind.1                                  'Encoder Signal A  an Pin 3
    Config Pind.3 = Input
        Taster1 Alias Pind.3                                    'Taster
    
    Portd.0 = 1                             'Pullups für den Drehencoder
    Portd.1 = 1                             '2. pind nach portd geändert
    Portd.3 = 1
                                                       'LED-Outputs stellvertretend für Step, Dir, Enable
                                                      ' In der endgültigen Hardware liegen: Step/Takt auf PD.2 / Taster auf PD.3 / Enable auf PD4 / Richtung auf PD5 /
    Config Portd.2 = Output
        Portd.2 = 0                                             'das ist Step/Takt - Pin 6   - alles mit Pulldown + LEd_gelb
    Config Portd.5 = Output
        Portd.5 = 0                                             ' Pin 9  -  Dir - Richtungssignal
    Config Portd.4 = Output
        Portd.4 = 0                                             ' Pin 16   -  Enable - generelles Ein-Ausschaltsignal
    Config Portb.0 = Output
        Portb.0 = 0                                             'Pin 9 - LED_DE - am Drehencoder Anzeige
    
    Motor_step Alias Portd.2
    Chip_dir Alias Portd.5
    Chip_enable Alias Portd.4
    
    Dim Wert As Word
    Wert = 2                                                    'experimentell ermittelter Startwert für den Drehencoder
    Dim Zustand As Byte
                  '*****************Deklarationen für den Taster - am DE - für die Lang-kurz- und Doppelklickroutine
    Dim Zaehler As Byte
    Const Langzaehler = 100                                     'Danach gilt die Taste als lange gedrueckt
    Const Doppelzaehler = 20                                    'Innerhalb dessen muss zweiter Klick erfolgen
    Dim Gedrueckt As Byte                                       'Art des Drueckens (Kurz/Lang/Doppel)
    Const Kurz = 1
    Const Lang = 2
    Const Doppel = 3
    Dim I As Byte
    
    Chip_enable = 1                         'Motor aus     'Enable ein    raus aus der Hauptschleife
    Chip_dir = 1                            'Dir           raus aus der Hauptschleife
    
    'Timer und ISR erst loslaufen lassen, wenn mit Chip_enable Motor aus ist
    Config Timer0 = Timer , Prescale = 1024                     'Timer1 Deklarationen für den Takt des Steppers
    Dim Timer0_reload As Word
    'Portd.4 = 1        'Pullup Widerstand ein für Enable - ****Enable =0 bedeutet Motor On!!!!  ****
    On Timer0 Isr_timer0                    'Deklaration der Timerroutine
    Enable Timer0                           'Enable Timer0 nach "On Timer0 Isr..."
    Enable Interrupts
    
           '***********Hauptschleife:**********
    
    Do
    
    Zustand = Encoder(pind.0 , Pind.1 , Linksroutine , Rechtsroutine , 0)
    
    Debounce Taster1 , 0 , Tastenauswertung , Sub
    
      Select Case Gedrueckt                 'Hier koennen beliebige Anweisungen erfolgen
      Case Kurz:                                                'Es wurde einmal kurz gedrueckt
          Chip_enable = 0                   'Motor ein bei einmal kurz gedrückt
          Waitms 100
      Case Lang:                                                'Die Taste wurde lange gedrueckt
          For I = 1 To 6
            Toggle Chip_dir
            Wait 6                          'Wenn lang gedrückt, wechselt Motor alle 6 Sekunden die Laufrichtung
          Next I
    
      Case Doppel:                                              'Die Taste wurde doppelt gedrueckt
          Chip_enable = 1                   'Motor aus wenn doppelt gedrückt
          Waitms 500
      End Select
    
    
    '  Portd.2 = 0                           'das ist Motorstep
    '  Portd.5 = 0                           'das ist Chip_dir, Verursacher vom Zappeln !!!
    '  Portb.4 = 0                           'das ist ???
    
    
    Loop
    
    End
    
    '**********************Interrupt-Routine Timer0 ************************************
    Isr_timer0:
      Timer0_reload = 4                                         'Vorgabe für 38 / sec
      Timer0 = Timer0_reload + Wert
      Toggle Motor_step                                         '= Stepper_takt
    Return
    
    '***********************Sub-Routinen Drehencoder  ***********************************
    Linksroutine:
    Decr Wert
       If Wert < 1 Then
       Wert = 1
       End If
    Return
    
    Rechtsroutine:
    Incr Wert
       If Wert > 230 Then
       Wert = 230
       End If
    Return
    
    '*****************Subroutine Tasterauswertung *****************************
    Tastenauswertung:
      Zaehler = 0
      Do
        Incr Zaehler
        Waitms 10
      Loop Until Taster1 = 1 Or Zaehler = Langzaehler
    
      If Zaehler = Langzaehler Then                             'lange gedrueckt
        Gedrueckt = Lang
      Else                                                      'einmal kurz gedrueckt
        Zaehler = 0
        Do
          Incr Zaehler
          Waitms 10
        Loop Until Taster1 = 0 Or Zaehler = Doppelzaehler
    
        If Zaehler = Doppelzaehler Then                         'bleibt bei einmal kurz
          Gedrueckt = Kurz
        Else
          Gedrueckt = Doppel                                    'zweites Mal kurz gedrueckt
        End If
      End If
    Return
    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    02.04.2009
    Beiträge
    78

    Hallo Searcher,

    Du bist genial!!! In der Tat war es wohl dieses Setzen von Chip_dir und Chip_enable in der Hauptschleife das diese Zuckungen verursacht. Ich hab jetzt nur mal Deinen letzten Code reingeschossen und damit läuft der Schritti jetzt wunderbar weich und regelmäßig und wird genau nach meinen Vorstellungen gestoppt, hin und her gedreht und wieder gestartet - einfach klasse!
    Allerdings ist jetzt die Geschwindigkeitsregelung abhanden gekommen, ich schau mir das noch mal an, komme heute abend wieder rein.

Ähnliche Themen

  1. Schrittmotorsteuerung LB1845 und atmega48 in BASCOM
    Von chris155 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 09.05.2010, 18:41
  2. Wie Drehencoder anschließen ?
    Von Blamaster im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 07.09.2009, 19:01
  3. Menüsteuerung mit Drehencoder ?
    Von Blamaster im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 25
    Letzter Beitrag: 30.06.2009, 22:34
  4. Drehencoder auswerten
    Von MartinFunk im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 16.05.2007, 16:05
  5. Drehencoder Panasonic
    Von Mr-400-Volt im Forum Software, Algorithmen und KI
    Antworten: 0
    Letzter Beitrag: 04.02.2007, 20:47

Berechtigungen

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

    Werbung      fchao-Sinus-Wechselrichter AliExpress