mmhhh. Dann nehm' ich an, daß die LCD Befehle zu lange brauchen.
Da wärst du mit der interrupt-Methode dann wirklich besser dran
Druckbare Version
mmhhh. Dann nehm' ich an, daß die LCD Befehle zu lange brauchen.
Da wärst du mit der interrupt-Methode dann wirklich besser dran
Hallo zusammen,
im Anhang ist eine Routine , die einen Encoder über eine state machine voll decodiert und damit die VOLLE Auflösung liefert. (d.h. bei JEDEM H/L Übergang wird rauf oder runter gezählt). Durch Speichern der Interrupts in Int_cnt und Abarbeiten in den While- Schleifen gehen auch bei schnellem Drehen keine Impulse verloren.
Hallo,
vielen Dank für Deinen gelungenen "Einstand" hier. Herzlich willkommen in Forum.
Gruß Dirk
Hallo,
ich habe auch die Statemachine versucht, funktioniert für mich leider auch nicht, ich denke ich habe wohl doch ein Hardwareproblem, denn mit einem anderen Drehgeber funktioniert es. An das Speicheroszi komme ich leider in nächster Zeit nicht ran, aber ich werde mal andere Hardwarelösungen versuchen um meinen Steppermotor zu benutzen.
Ich wünsche euch noch viel Spaß und nochmals vielen Dank !!!
Ach so, das Programm muss für die aktuellen Bascom Versionen etwas geändert werden, denn Bascom hat "ENCODER" ja jetzt als reservierten Befehl, das sollte man also nicht mehr als Variable verwenden.
MfG
Markus
Code:'-----------------------------------------------------------------
' (c) 2003 Manfred Fleischmann
' full quad encoder implementation with state machine
'-----------------------------------------------------------------
$regfile = "m32def.dat"
$crystal = 16000000
Ddrd.1 = 0 ' axial in
Ddrd.2 = 0 ' coder in
Ddrd.3 = 0 ' coder in
Portd.1 = 0 ' axial pullup
Portd.2 = 0 ' coder pullup
Portd.3 = 0 ' coder pullup
Const True = 1
Const False = 0
Dim Int_cnt As Byte
Dim Encoder1 As Bit ' Encoder ist ein reserviertes Wort in Bascom
Dim Rx_freq As Single
Dim Old As Byte
Dim New As Byte
Dim Calc As Byte
Enable Interrupts
Enable Int0 ' Enable the interrupt 1 / 2
Enable Int1
Mcucr = 00000101 ' Interrupt 0 und 1 bei logical change auslösen
On Int0 Int_encoder ' Labels for the Interrupt routine
On Int1 Int_encoder
INt_cnt = 128 ' Initialisierung
Encoder1 = True
Old = 3
Do ' Main Program Loop ****************************************************************************
If Encoder1 = True Then
While INt_cnt > 128
Rx_freq = Rx_freq + 10
Decr INt_cnt
Wend
While INt_cnt < 128
Rx_freq = Rx_freq - 10
Incr INt_cnt
Wend
Encoder1 = False
End If
Loop ' END MAIN ****************************************************************************
'***************** Encoder Interrupt Routine ***************************************
Int_encoder:
Encoder1 = True ' Frequenz muß nachgeführt werden
New = Pind
Calc = Old.2 Xor New.3 ' berechne FSM
Calc = Calc * 2
Decr Calc
INt_cnt = INt_cnt + Calc
Old = New
Return
End