Ich habe folgenden Code:
Code:
'-------------------------------------------------------------------------------
' Filename : QuadrDec_1.0.bas
' Purpose  : Quadrature Decoder/Counter and Display
' Author   : Ger langezaal
' Date     : 5 April 2002
' Compiler : BASCOM-AVR   Rev. 1.11.6.5
'
'-------------------------------------------------------------------------------
'
' Algorithm:
' Interrupt on both edges of phase A
' Test phase B in ISR
' When phase B <> phase A then decrement counter
' When phase B = phase A then increment counter
' Convert counter value to displacment units
' Format value in string and display
'
'-------------------------------------------------------------------------------
'
' Setup for AT90S2313-10
'
' INT0 edge is set to rising edge
' INT1 edge is set to falling edge
' Encoder phase A to INT0 and INT1  (PD2 and PD3)
' Encoder phase B to PD4
' Pushbutton between Portd.5 and GND  (display zero)
' LCD at PortB
'
' Example for PROXXON KT150 XY table:
' Displacement/rev = 2 mm
' Encoder resolution = 20 pulses/rev
' Interrupt on both pulse edges = 40 interrupts/rev
' Dial resolution: 2 mm / 40 = 0.05 mm
' The optical encoder came from a used mouse (two available)
'
'-------------------------------------------------------------------------------
'
' Options/Compiler/Chip:
' HW Stack   48
' Soft Stack  8
' Framesize  16
'
'-------------------------------------------------------------------------------
'
$regfile = "m32def.dat"
$crystal = 16000000                                         '10 MHz
$baud = 9600

Dim Axis_raw As Integer                                     'optical pulse counter
Dim Axis_save As Eram Integer                               'counter in eeprom
Dim I As Byte                                               'helpvar for udr
Dim Stopp As Bit
Dim Sending As Bit

Config Portd = Input
Portd = 255                                                 'enable Portd pullup's

Phase_a Alias Pind.2                                        'INT0 also connected to Pind.3 = INT1
Phase_b Alias Pind.6

'---[ Set Interrupt logic ]-----------------------------------------------------

Mcucr = &B00001011                                          'set interrupt edges
On Int0 Phase_a_edge                                        'ISR on rising edge
On Int1 Phase_a_edge                                        'ISR on falling edge
On Urxc Communication
Enable Int0
Enable Int1
Enable Urxc
Enable Interrupts

'---[ Initialization ]----------------------------------------------------------

Stopp = 0
Axis_raw = 0
Sending = 1

If Axis_raw <> Axis_save Then
' Axis_raw = Axis_save
End If

'---[ Main program loop ]-------------------------------------------------------

Do
  If Sending = 1 Then Print "{" ; Axis_raw ; "}";
  Waitms 100
Loop

'-------------------------------------------------------------------------------
End

'---[ Interrupt Service Routine ]-----------------------------------------------
Phase_a_edge:                                               'Interrupt on rising and falling edge
  If Phase_b <> Phase_a Then                                'test phase B
    Decr Axis_raw                                           'CCW
  Else
    Incr Axis_raw                                           'CW
  End If
  If Stopp = 0 Then
   If Axis_raw =< 0 Then
    Print "!"
    Stopp = 1
   End If
  End If
  If Stopp = 1 Then If Axis_raw > 0 Then Stopp = 0
Return

Communication:
   I = Udr
   If Chr(i) = "#" Then Axis_raw = 0
   If Chr(i) = "$" Then Axis_save = Axis_raw
   If Chr(i) = "^" Then Sending = 1
   If Chr(i) = "°" Then Sending = 0
Return
'-------------------------------------------------------------------------------
Sobald ich nu etwas an den Chip sende wird die variable Axis_raw auf 0 gesetzt. Die IF Abfragen werden ignoriert.
Was stimmt da nicht?

Mfg
Tobi