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)
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.
Gruß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
Searcher







Hoffentlich liegt das Ziel auch am Weg
Zitieren

Lesezeichen