Hallo Leute ich hab mal wieder eine Frage, bin lausiger Programmier-Anfänger:
Ich will einen Schrittmotor steuern, der 48 S/U hat und per A3967 getrieben wird, also mit Enable, Dir und Step. Die Hardware steht und funktioniert, hab ein kl. Testprogramm damit laufen.
Code:
' Stepper_test1.bas - Testprogramm für A3967 Platine mit Dir Step und Enable
$regfile = "attiny2313.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000 'Quarzfrequenz
$baud = 9600
Declare Sub Key_pressed
Dim I As Long
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
Config Pind.2 = Output
Stepper_takt Alias Portd.2
Config Pind.4 = Output
Stepper_enable Alias Portd.4
Portd.4 = 0 'sprich Motor ON
On Timer1 Isr_timer1
' Step/Takt auf PD.2 / Taster auf PD.3 / Enable auf PD4 / Richtung auf PD5 /
'***********Hauptschleife:**********
Do
Loop
End
Isr_timer1:
Timer1_reload = 45536 ' Vorgabe für 400 / sec
Timer1 = Timer1_reload
Toggle Stepper_takt
Return
Der Schrittmotor soll nun aber mittels eines Drehencoders langsamer und schneller gemacht werden, die Routine hab ich aus dem Hoffmann-Buch.
Code:
'-----Deklarationen fuer Drehimpulsgeber:
Config Portd.0 = Input : Encoder_a Alias Pind.0 'Encoder Signal B an Pin 2
Config Portd.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:
Config Portd.2 = Output : Portd.2 = 0 'das ist Pin 6 alles mit Pulldown
Config Portd.5 = Output : Portd.5 = 0 ' Pin 9
Config Portb.4 = Output : Portb.4 = 0 ' Pin 16
Led_gelb Alias Portd.2
Led_gruen Alias Portd.5
Led_rot Alias Portb.4
' BASCOM-Programm
' Stefan Hoffmann 2009
' Drehimpulsgeber/Encoder mit ENCODER-Befehl
'
' In: Drehimpulsgeber an d.0 und d.1 sowie Taster
Dim Wert As Word
Wert = 100
Dim Zustand As Byte
Do
Zustand = Encoder(pind.0 , Pind.1 , Linksroutine , Rechtsroutine , 1)
If Wert > 100 Then Led_rot = 1
If Wert < 100 Then Led_gruen = 1
If Taster1 = 0 Then Led_gelb = 1
'Zu Testzwecken
Loop
End
Linksroutine:
Decr Wert
Return
Rechtsroutine:
Incr Wert
Return
Ich schnall einfach nicht, wie ich diese Routine mit einer Timer-Takterzeugung verheiraten kann. Der Takt ist doch konstant, und die Encoder-Routine braucht das doch als Variable, oder?
Habt ihr eine Idee, wie man so was lösen kann?
Vielen Dank für Anregungen!
MM08
(PS: - ich hatte schon einen anderen Code in Arbeit - s. Link und wieder verworfen, weil ich da schließlich vor dem gleichen Problem stand und kein Takt rauskam. Jetzt will ich das Ganze mal abspecken und klein und möglichst einfach wieder anfangen.)
Lesezeichen