- LiFePO4 Speicher Test         
Ergebnis 1 bis 5 von 5

Thema: URXC Interrupt löscht Variablen???

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.06.2005
    Ort
    Göppingen
    Beiträge
    360

    URXC Interrupt löscht Variablen???

    Anzeige

    Powerstation Test
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Bin mir jetzt nicht sicher, aber das mit den ERAM Variablen scheint ein Problem zu sein,
    Probier mal die Variable erst in einen andere Temp-Variable zu kopieren bevor sie im IF verwendet wird.

    Evtl. dauert das schreiben und lesen (vom ERAM) auch nur zu lange, sodass in der ISR das ganze durcheinander kommt, vor allem weils zwei Byte sind !?
    Vielleicht mal mit Disable/Enable Interrupts rumprobieren, wenn an den Integervariablen Daten geändert werden, glaub nicht das Bascom das von sich aus macht.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.06.2005
    Ort
    Göppingen
    Beiträge
    360
    ok danke!

    mfg
    tobi

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    also die Verwendung von

    Chr(i) = "#"

    ist nicht besonders geschickt, versuchs doch mit

    if i = 35

    oder besser
    select case i:
    case 35:
    tudas xy
    case 36:
    tuanderes
    case xy: ....... etc.
    end select
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.06.2005
    Ort
    Göppingen
    Beiträge
    360
    werde ich versuchen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress