- 3D-Druck Einstieg und Tipps         
Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 41

Thema: Bascom: Schrittmotorsteuerung mit Drehencoder?

  1. #21
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Anzeige

    E-Bike
    Zitat Zitat von MrMiffy08 Beitrag anzeigen
    Diese Takterhöhung/-erniedrigung geht ja nun schon mal, allerdings macht der Takt bei Erreichen des niedrigsten oder höchsten Wertes einen Sprung (das meinte ich mit Überlauf, ist unglücklich ausgedrückt) und geht auf die höchste bzw. niedrigste Taktrate. Ich möchte, dass der Takt bei der jeweils höchsten/niedrigsten Frequenz stehenbleibt und nicht zu einer anderen Geschwindigkeit wechselt.
    Das war/ist vermutlich jetzt noch die Abfrage in der Links- Rechtsroutine. Da kann "Wert" überlaufen. Schau meinen letzten Beitrag zu der Abfrage darin.

    Ja, ich sehe schon, als Anfänger benutzt man Vokabeln, die eigentlich was anderes meinen ohne zu ahnen dass das missverständlich ist.
    Null Problemo. Wir waren alle mal Anfänger und solange Du dran bleibst wird das schon. Auch ich zähle mich nicht zu den Nichtanfängern

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

  2. #22
    Benutzer Stammmitglied
    Registriert seit
    02.04.2009
    Beiträge
    78
    Hallo zusammen,
    noch mal Dank an Searcher für die Hinweise!
    Ich habe das > und < eingefügt und siehe da: Jetzt funktioniert es endlich wie es soll: Der Schritti dreht - mit gedrosseltem Tempo los, kann schneller durch den DE gesteuert werden und bleibt nun auhc bei der jeweiligen Max. und Min.- Geschwindigkeit stehen. Super!
    Etwas Feintuning an den Werten für den Timer und dem Wert asus dem Drehencoder, und jetzt passt alles.

    Ich werde nun noch das Enable für gesteuerten Stop und das Dir für eine Hin und Her-Bewegung implementieren. Wahrscheinlich brauche ich dann noch mal Hilfe, aber ich schraube erst mal ein wenig herum, will ja auch was lernen...

    Aktueller Code:

    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 = 32
    $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
    
    Pind.0 = 1                                                  'Pullups für den Drehencoder
    Pind.1 = 1
    Pind.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
    
    Motor_step Alias Portd.2
    Led_gruen Alias Portd.5
    Chip_enable Alias Portd.4
    
    Dim Wert As Word
    Wert = 2                                                    'willkürlich gewählter Startwert
    Dim Zustand As Byte
    
           '***********Hauptschleife:**********
    Do
    
    Chip_enable = 0                                             'Enable ein
    Led_gruen = 1                                               'Dir
    Zustand = Encoder(pind.0 , Pind.1 , Linksroutine , Rechtsroutine , 0)
    
    Loop
    
    End
    
    Isr_timer0:
      Timer0_reload = 4                                         'Vorgabe für 38 / sec
      Timer0 = Timer0_reload + Wert
      Toggle Motor_step                                         '= Stepper_takt
    Return
    
    Linksroutine:
    Decr Wert
       If Wert <= 1 Then
       Wert = 1
       End If
    Return
    
    Rechtsroutine:
    Incr Wert
       If Wert >= 230 Then
       Wert = 230
       End If
    Return

  3. #23
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    noch mal Dank an Searcher für die Hinweise!


    Diesmal noch eine kostenlose Bemerkung.

    Jeder schreibt sein Programm irgendwie anders als andere und wenn es zur eigenen Zufriedenheit funktioniert, ist alles gut.
    Deine Linksroutine würde ich jetzt zB so machen:

    Code:
    Linksroutine:
      if Wert > 1 then Decr Wert
    Return
    Da wird Wert nur dekrementiert, wenn es notwendig ist. Ob das dann auch wirklich OK ist in Zusammenarbeit mit dem restlichen Programm ist müßte man dann natürlich wieder testen.
    Wenn nach dem Then nur eine Anweisung für die If Abfrage folgt, kann man das alles in eine Zeile schreiben und sich das end if sparen. Es darf sogar noch ein else mit einer folgenden Anweisung folgen. Ausprobieren und wenn der Compiler nicht meckert ist es gut.

    Bei Deiner
    Code:
    Linksroutine:
      Decr Wert
      If Wert <= 1 Then
          Wert = 1
      End If
    Return
    wird Wert immer dekrementiert und wenn es notwendig ist auf 1 gesetzt. Das ist mehr Arbeit für den µC und braucht deshalb länger. Man sollte, allgemeine Regel, die Interrupt Routinen von der Laufzeit her so kurz wie möglich halten.

    Viel Spaß und Erfolg noch
    Gruß
    Searcher
    Geändert von Searcher (23.10.2012 um 12:59 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

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

    danke für die Feinheiten, das = habe ich noch entfernt. Soweit so gut.

    Nun habe ich noch eine Routine für die Tastenabfrage des Drehencoders eingefügt, buchstabengenau aus dem S. Hoffmann-Buch. Die hatte ich vorher schon mal getestet mit LED's, das funktionierte gut. Ich brauche davon momentan nur Kurz- und Langdruck, um zu stoppen und hin-und her zu fahren.
    Wenn ich jetzt das Programm so laufen lasse, muss ich feststellen dass der Schrittmotor sich Verschluckt: er macht vielleicht fünf sechs Schritte, stoppt dann kurz und macht wieder fünf sechs Schritte. Ein normales Durchlaufen ist das jedenfalls nicht. Das verstehe ich nicht. Wo mag das denn her kommen? Werden die Interrupts des Timer0 vom Programm gestört? Wenn ja wo denn?

    Der aktuelle Code:
    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 = 32
    $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
    
    Pind.0 = 1                                                  'Pullups für den Drehencoder
    Pind.1 = 1
    Pind.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
          Toggle Chip_enable
          Waitms 100
      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
            Waitms 500
      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
    Vielen Dank wieder für Hinweise!

    LG MM

  5. #25
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hi,

    Zitat Zitat von MrMiffy08 Beitrag anzeigen
    Code:
    Pind.0 = 1                                                  'Pullups für den Drehencoder
    Pind.1 = 1
    Pind.3 = 1
    Um die Pullups einzuschalten muß es Portd.0, Portd.1 und Portd.3 = 1 heißen.

    Weis nicht, ob es das Problem behebt und hab sonst erstmal keine Idee. Wenn die Pullups nicht eingeschaltet sind (wie bei dir) und die Außenbeschaltung nicht dementsprechend ist (externe Pullups), können sich die Eingänge Störimpulse einfangen, insbesondere vielleicht von dem Taster.

    Was genau für ein Encoder ist das und wie ist er an dem µC angschlossen?

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

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

    die Pullup-Bezeichnung habe ich umbenannt, das Phänomen ist wie zuvor. Ruckelnder Schrittmotor, aber gleichmäßig, sieht nicht nach Störungen aus sondern wie was rhythmisches.
    Der ALPS Drehencoder (STEC12E08) ist auf einem kleinen Platinchen verlötet mit einer LED, ich habe eine Version mit 100nF X7F an den Impulskontakten und eine ohne Kondensatoren, verbunden über 10 cm Flachbandkabel, beide verhalten sich gleich.
    Von der Motor Hardware habe ich auch zwei Versionen zum Gegenprüfen, einmal die mit dem Allegro A3967 und einmal eine mit dem kleinen Pololu Board md09b mit dem A4983, beide machen identische Zuckungen (alles im Vollschrittbetrieb, aber selbst Achtelstep sieht komisch aus...) mit dem Programm. Ich hab das mal auf Youtube eingestellt: Link

    Was haltet Ihr davon?

  7. #27
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Das sieht ja echt so aus, als wenn der Stepper manchmal nicht wüßte wohin
    Auf die Schnelle würd ich sagen, könnte es in der Case Bedingung liegen.

    Die Variable Gedrueckt hat ja immer einen Wert und demzufolge wird immer was getoggelt. Da müßte man eindeutige Verhältnisse schaffen. Also Wenn Kurz, dann Chip_enable = ein (und nicht Toggeln) oder so. Hab jetzt keinen konkreten Vorschlag dafür, aber sollte man vielleicht mal genauer unter die Lupe nehmen.

    Denke nicht, daß der Timer gestört wird.

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

  8. #28
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hi, mein Verdacht erhärtet sich.
    Wenn Gedrueckt den Wert Lang enthält und der Taster nicht betätigt wird, wird 6 mal ganz kurz hintereinander Chip_dir getoggelt.
    Danach eine Sekunde Pause und danach wieder von vorne.

    Um das zu überprüfen, statt Toggle das Chip_dir einfach mit einem festen Wert versorgen und schauen was passiert. Also in der Case Bedingung "Chip_dir = 0" und am besten auch gleich "Chip_enable = 0" (Chip_enable = 1 je nachdem, damit der Motor läuft)

    Wenn der Motor dann wieder ruhig läuft, muß man sich die ganze Tastenabfrage/-auswertung vornehmen

    PS:

    Code:
    Case Lang:       
        For I = 1 To 6          
           Toggle Chip_dir
        Next I
        Wait 1                           'Sollte dieses Wait nicht innerhalb der For Next stehen:confused:
    Case Doppel:
    Gruß
    Searcher
    Geändert von Searcher (27.10.2012 um 14:40 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  9. #29
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Und nochmal
    $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 17:58 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  10. #30
    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

Seite 3 von 5 ErsteErste 12345 LetzteLetzte

Ähnliche Themen

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

Berechtigungen

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

Solar Speicher und Akkus Tests