mmhhh. Dann nehm' ich an, daß die LCD Befehle zu lange brauchen.
Da wärst du mit der interrupt-Methode dann wirklich besser dran
mmhhh. Dann nehm' ich an, daß die LCD Befehle zu lange brauchen.
Da wärst du mit der interrupt-Methode dann wirklich besser dran
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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
Lesezeichen