Ich habe mal ein Board geroutet da hat es mit den Kondensatoren am Encoder nicht geklappt - ohne dann schon.
Meine Idee war das im encoder Befehl ein entprellen schon integriert ist?
Ich habe mal ein Board geroutet da hat es mit den Kondensatoren am Encoder nicht geklappt - ohne dann schon.
Meine Idee war das im encoder Befehl ein entprellen schon integriert ist?
Hallo dussel,
das wäre schön und würde zwei Teile einsparen. Ich habe den selben Encoder (ALPS STEC12E) mit und ohne 100nF ausprobiert, beides hat die gleiche Wirkung. Ich versuche morgen mal das dezidiert zu beschreiben.
Wichtiger wäre mir allerdings die Problematik der "Verheiratung" der beiden Code-Stücke zu etwas sinnvollem. Dazu jmd Anregungen?
Wie wäre es denn wenn Du die Codestücke ordnest - also die Teile der Encoderabfrage dort hin schreibst wo zum beispiel die Ports und Subs definiert/deklariert werden...deine Encoderabfrage mit in die do loop der (leeren) Hauptschleife kopieren oder ausschneiden. Die do loop vom encoder vorher im einzelprogramm kann man komplett auskommentieren ( '( ...auskommentierter codetext... ') oder normal mit ' ) oder entfernen. Die Subs bleiben wo sie sind.
Ok, ich versuch's mal.
So, und beim Starten dieses Codes leuchtet zunächst die gelbe Led (ist klar, Timer1), und beim Drehen je eine Raste leuchtet grün und in die andere rot, gehen aber nicht wieder aus. Dies jeweils egal mit Encoder mit 100nF gegen GND oder ohne und ebenso mit dem Pollin-Drehencoder ohne Kondensatoren, der hier schon mehrfach angesprochen wurde und der mehr oder weniger Ärger macht.Code:' Testprogramm für A3967 Platine mit Dir Step und Enable $regfile = "attiny2313.dat" $framesize = 32 $swstack = 32 $hwstack = 32 $crystal = 8000000 'Quarzfrequenz $baud = 9600 Config Timer1 = Timer , Prescale = 1 Enable Timer1 Timsk.toie1 = 1 Dim Timer1_reload As Word Portd.4 = 1 ' Pullup Widerstand ein für Enable - ****Enable =0 bedeutet Motor On!!!! **** Enable Interrupts ' 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 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 Pin 6 - alles mit Pulldown - steht für Step/Takt Config Portd.5 = Output Portd.5 = 0 ' Pin 9 - der hier steht für Dir Config Portb.4 = Output Portb.4 = 0 ' Pin 16 - diese Led steht für Enable Led_gelb Alias Portd.2 Led_gruen Alias Portd.5 Led_rot Alias Portb.4 On Timer1 Isr_timer1 'Deklaration der Timerroutine Dim Wert As Word Wert = 100 'willkürlich gewählter Startwert Dim Zustand As Byte '***********Hauptschleife:********** Do Zustand = Encoder(Pind.0 , Pind.1 , Linksroutine , Rechtsroutine , 0) If Wert > 100 Then Led_rot = 1 If Wert < 100 Then Led_gruen = 1 Loop End Isr_timer1: Timer1_reload = 45536 'Vorgabe für 400 / sec Timer1 = Timer1_reload Toggle Led_gelb '= Stepper_takt Return Linksroutine: Decr Wert Return Rechtsroutine: Incr Wert Return
Ich habe an der Encoder-Routine mal hinten die 1 auf 0 geändert, weil ich ja das Prog ja weiter laufen lassen will. Mit 1 stoppt es hier wohl.
Wie bekomme ich es hin dass rot und grün wieder ausgehen?
Uind eben das Grundproblem - wie bekomme ich schnelleren/langsameren Takt an D2/Led_Gelb aufgrund Links/Rechtsdrehung hin?
Vielen Dank für Eure Anregungen!
Geändert von MrMiffy08 (16.10.2012 um 22:19 Uhr) Grund: paar Fehlerchen
die LEDs gehen nicht aus weil Du sie nur einschaltest wenn > oder < ... einfach noch ne bedingung mit dazu schreiben die ausschaltet wenn > oder < jeweils dazu. leider wenig zeit grade...
EDIT: Kann es sein, das unter jedes IF auch ein END IF muss?
Geändert von HeXPloreR (17.10.2012 um 16:47 Uhr)
Hallo HeXPlore!
Vielen Dank für Deine Hinweise! Ich habe mal eine Else eingefügt und den Timer Takt mal auf sichtbar korrigiert. das takkert jetzt mit 1Hz und die Led's gehen an und aus wie sie sollen. Also dieser Teil funktioniert jetzt schonmal. Super!
Der Gesamte Code sieht jetzt so aus:
Wie könnte ich nun weiter kommen mit der "Verheiratung" der Funktionen?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 '-----Deklarationen fuer Drehimpulsgeber: ' Testprogramm für A3967 Platine mit Dir Step und Enable $regfile = "attiny2313.dat" $framesize = 32 $swstack = 32 $hwstack = 32 $crystal = 8000000 'Quarzfrequenz $baud = 9600 Config Timer1 = Timer , Prescale = 256 Enable Timer1 Timsk.toie1 = 1 Dim Timer1_reload As Word Portd.4 = 1 ' Pullup Widerstand ein für Enable - ****Enable =0 bedeutet Motor On!!!! **** Enable Interrupts ' 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 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 Pin 6 - alles mit Pulldown - steht für Step/Takt Config Portd.5 = Output Portd.5 = 0 ' Pin 9 - der hier steht für Dir Config Portb.4 = Output Portb.4 = 0 ' Pin 16 - diese Led steht für Enable Led_gelb Alias Portd.2 Led_gruen Alias Portd.5 Led_rot Alias Portb.4 On Timer1 Isr_timer1 'Deklaration der Timerroutine Dim Wert As Word Wert = 100 'willkürlich gewählter Startwert Dim Zustand As Byte '***********Hauptschleife:********** Do Zustand = Encoder(pind.0 , Pind.1 , Linksroutine , Rechtsroutine , 0) If Wert > 100 Then Led_rot = 1 Else Led_rot = 0 End If If Wert < 100 Then Led_gruen = 1 Else Led_gruen = 0 End If Loop End Isr_timer1: Timer1_reload = 34286 'Vorgabe für 400 / sec Timer1 = Timer1_reload Toggle Led_gelb '= Stepper_takt Return Linksroutine: Decr Wert Return Rechtsroutine: Incr Wert Return
Vielen Dank wieder für alle Hinweise!
Hallo zusammen,
ich hatte heute morgen beim Grübeln über mein Problem eine Erleuchtung: ist das was ich da brauche für die Ansteuerung nicht eigentlich PWM? Also ich will ja mit dem Encoder langsamer/schneller steuern, der Takt soll sich dabei verändern. Kann man denn so langsames PWM erzeugen? Oder ist es besser, PWM schneller zu machen und sw-mäßig runterzuteilen? Ist der Gedanke überhaupt korrekt?
Danke für Eure Hilfe!
Geändert von MrMiffy08 (18.10.2012 um 23:46 Uhr)
Lesezeichen