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:
(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?)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
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







Zitieren
Hoffentlich liegt das Ziel auch am Weg 

Lesezeichen