Hallo zusammen,
so, ich habe jetzt mal ein bisschen an den Werten geschraubt (mein Schrittmotor kam beim schnellsten Turn nicht mehr mit) und habe versucht die Begrenzung in die Inc/Dec Routine einzubinden. Bin aber etwas ratlos, denn das hat nun gar nichts gebracht, obwohl ich rein rechnerisch weit vor dem höchsten Timerwert ende (bei 50+155 = 205) - was ist denn das? Wieso läuft da der TImer immer noch über statt bei 205 zu stoppen? Versteh ich nicht. Was mache ich falsch?
Und zum Thema -
In der Isr_Timer0 wird erst der Timer0 gesetzt und dann abgefragt und eventuell nochmal gesetzt. Man könnte erst
Timer0_reload und Wert verrechnen und dann abhängig vom errechneten Wert in der Bedingung den
Timer0 nur einmal setzen und verhindert somit unnötiges "Hüpfen" des Timers.
ist das in meinem Code jetzt so richtig? Oder muss ich an anderer Stelle noch was ändern?
Vielen Dank für weitere Hilfe!
Aktueller Stand:
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 Timer0 = Timer , Prescale = 1024 'Timer1 Deklarationen für den Takt des Steppers
Enable Timer0
'Timsk.toie0 = 1 'hab ich mal wegkommentiert.....
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 - 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
Dim Wert As Word
Wert = 50 'willkürlich gewählter Startwert
Dim Zustand As Byte
'***********Hauptschleife:**********
Do
Led_rot = 0 'Enable ein
Led_gruen = 1 'Dir
Zustand = Encoder(pind.0 , Pind.1 , Linksroutine , Rechtsroutine , 0)
Loop
End
Isr_timer0:
Timer0_reload = 50 'Vorgabe für 38 / sec
Timer0 = Timer0_reload + Wert
Toggle Led_gelb '= Stepper_takt
Return
Linksroutine:
Decr Wert
If Wert = 10 Then
Wert = 10
End If
Return
Rechtsroutine:
Incr Wert
If Wert = 155 Then
Wert = 155
End If
Return
Lesezeichen