Hallo Searcher,
danke für die Feinheiten, das = habe ich noch entfernt. Soweit so gut.
Nun habe ich noch eine Routine für die Tastenabfrage des Drehencoders eingefügt, buchstabengenau aus dem S. Hoffmann-Buch. Die hatte ich vorher schon mal getestet mit LED's, das funktionierte gut. Ich brauche davon momentan nur Kurz- und Langdruck, um zu stoppen und hin-und her zu fahren.
Wenn ich jetzt das Programm so laufen lasse, muss ich feststellen dass der Schrittmotor sich Verschluckt: er macht vielleicht fünf sechs Schritte, stoppt dann kurz und macht wieder fünf sechs Schritte. Ein normales Durchlaufen ist das jedenfalls nicht. Das verstehe ich nicht. Wo mag das denn her kommen? Werden die Interrupts des Timer0 vom Programm gestört? Wenn ja wo denn?
Der aktuelle Code:
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 = 32
$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
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 - 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
Toggle Chip_enable
Waitms 100
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
Waitms 500
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
Vielen Dank wieder für Hinweise!
LG MM
Lesezeichen