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