Ergebnis 1 bis 6 von 6

Thema: Interruptproblem Bascom 2.0.7.5<->2.0.7.8

  1. #1
    Kabelträger
    Registriert seit
    24.11.2016
    Beiträge
    8

    Unglücklich Interruptproblem Bascom 2.0.7.5<->2.0.7.8

    Hallo,
    ich habe ein Problem nach Update von 2.0.7.5 auf 2.0.7.8.001 in der Interruptbehandlung.
    lauffähig unter 2.9.7.5, Fehlfunktion unter 2.0.7.8.001 (und auch schon unter 2.0.7.6)

    Hintergrund:

    • ein I2C-Display (EA-DOG-XL 160) mit resistivem Touchscreen.
    • I2C Hardware benutzt:
      Config Twi = 400000
      $lib "I2C_TWI.Lbx"
    • Alle i2c-routinen laufen definitiv im Hauptprogramm.
    • Im Timer-Interrrupt wird aller ca. 15ms der Touchscreen abgefragt, dazu werden Portpins vom Port A wechselweise als Ein- und Ausgang geschaltet. Aus den gewonnenen ADC-Werten wird der Touch-Punkt erkannt und berechnet
    • Timer3:
      Config Timer3 = Timer , Prescale = 1
      On Timer3 Isr_timer3 , Nosave
    • ADC:
      Config Adc = Single , Prescaler = Auto , Reference = Avcc
      Start Adc


    Ich habe jetzt soweit eingegrenzt, daß folgende Routine nicht im Interrupt aufgerufen werden darf, ansonsten gibt es auf dem Display Fehlanzeigen (I2C-Befehlsstrom zerstört?):

    Sub Glcd_scale_touch
    Const Glcd_xmin = 95
    Const Glcd_xmax = 940
    Const Glcd_ymax = 110
    Const Glcd_ymin = 890

    Local Xm As Long
    Local Ym As Long
    Local Diff As Integer

    Xm = Glcd_raw_xpos - Glcd_xmin
    Xm = Xm * Glcd_width
    Diff = Glcd_xmax - Glcd_xmin
    Xm = Xm / Diff

    If Xm < 0 Then Xm = 0
    If Xm > Glcd_width Then Xm = Glcd_width

    Glcd_touch_xpos = Xm

    Ym = Glcd_raw_ypos - Glcd_ymin
    Ym = Ym * Glcd_height_px
    Diff = Glcd_ymax - Glcd_ymin
    Ym = Ym / Diff

    If Ym < 0 Then Ym = 0
    If Ym > Glcd_height_px Then Ym = Glcd_height_px
    Glcd_touch_ypos = Ym

    End Sub
    Die ISR-Routine (Timer-ISR) beginnt mit Push aller Register incl. SREG (ISR ist NOSAVE deklariert, weil ich wirklich alle Register sichern muß! (Stichwort Restore/Read, geht auf R7/8 wimre..) O.g. Routine wird per call aufgerufen. Alle hier benutzen Variablen sind integer oder byte. Timing unwahrscheinlich, da ich statt Call mal ein passendes Waitms eingefügt habe, keine Probleme


    Irgendwelche Tips, wo ich suchen muß?

    Danke und Gruß,
    Christian

  2. #2
    Transistor wender Avatar von Michael
    Registriert seit
    01.11.2016
    Alter
    47
    Beiträge
    110
    Ich habe jetzt soweit eingegrenzt, daß folgende Routine nicht im Interrupt aufgerufen werden darf, ansonsten gibt es auf dem Display Fehlanzeigen (I2C-Befehlsstrom zerstört?):
    Komm bitte deinen Helfern entgegen und poste auch den Rest des eingegrenzten Programms, die ganzen Einstellungen z.B. im Header spielen auch eine Rolle.

    Gruß, Michael

  3. #3
    Kabelträger
    Registriert seit
    24.11.2016
    Beiträge
    8
    Zitat Zitat von Michael Beitrag anzeigen
    Komm bitte deinen Helfern entgegen und poste auch den Rest des eingegrenzten Programms, die ganzen Einstellungen z.B. im Header spielen auch eine Rolle.

    Gruß, Michael
    Das ganze Programm ist ein bißchen groß, hier noch die weiteren zugehörigen Einstellungen/Deklarationen/...:

    $regfile = "m1284pdef.dat" ' specify the used micro
    Const Icrystal = 20000000 ' use const in Program
    $crystal = Icrystal



    $prog &HFF , &HF7 , &HD1 , &HFC ' full swing osc.
    $programmer = 9 ' STK500 native

    $hwstack = 300
    $swstack = 300
    $framesize = 400


    [....]
    Config Timer3 = Timer , Prescale = 1
    On Timer3 Isr_timer3 , Nosave
    [....]


    Isr_timer3:

    $asm ' R8/R9 für Restore, Read: data Zeiger!!!!! werden sonst nicht gesichert :-(((((
    push r0
    in r0, sreg
    push r0

    push r1
    push R2
    push r3
    push r4
    push R5
    push r6
    push r7
    push R8
    push r9
    push r10
    push R11
    push r12
    push r13
    push R14
    push r15
    push r16
    push R17
    push R18
    push R19
    push R20
    push R21
    push R22
    push R23
    push R24
    push R25
    push R26
    push R27
    push R28
    push R29
    push R30
    push R31


    $end Asm


    ' ca. 300Hz (20MHz / 65536, 16 bit timer...)
    If Touch_beep_counter > 0 Then
    Decr Touch_beep_counter

    If Touch_beep_counter = 0 Then
    Touch_beep = False

    If Touch_err_counter > 0 Then
    Decr Touch_err_counter
    If Touch_err_counter.0 = 1 Then
    Touch_beep = True
    End If
    Touch_beep_counter = Glcd_beep_time_const
    If Touch_err_counter = 0 Then
    Touch_beep = False
    Touch_beep_counter = 0
    End If
    End If
    End If
    End If


    Incr Timer75
    If Timer75 >= 2 Then ' jeder 4. Int-> Timer 75Hz

    Timer75 = 0

    Call Glcd_scale_touch




    If Backlitdimdown <> 0 Then
    Backlitpwm = Backlitpwm + Backlitdimdown

    If Backlitpwm <= Dimbacklight_min Then
    Backlitdimdown = 0
    Backlitpwm = Dimbacklight_min
    End If

    If Backlitpwm >= Dimbacklight_max Then
    Backlitdimdown = 0
    Backlitpwm = Dimbacklight_max
    End If

    Blpwmlin = Lookup(backlitpwm , Pwm256 )
    Pwm2a = Blpwmlin
    End If

    End If

    $asm
    pop r31
    pop r30
    pop r29
    pop r28
    pop r27
    pop r26
    pop r25
    pop r24
    pop r23
    pop r22
    pop r21
    pop r20
    pop r19
    pop r18
    pop r17
    pop r16
    pop r15
    pop r14
    pop r13
    pop r12
    pop r11
    pop r10
    pop r9
    pop r8
    pop r7
    pop r6
    pop r5
    pop r4
    pop r3
    pop r2
    pop r1
    pop r0
    Out Sreg , R0
    pop r0
    $end Asm

    Return



    [....]
    Deklarierte Variablen (Auszug für den o.g. Teil):
    Dim Glcd_current_page As Integer
    Dim Glcd_current_column As Integer
    Dim Glcd_tempstr As String * 128
    Dim Glcd_tempstrchr(129) As Byte At Glcd_tempstr Overlay
    Dim Glcd_bytearr(8) As Byte
    Dim Glcd_touch_xpos As Integer , Glcd_touch_ypos As Integer
    Dim Glcd_raw_xpos As Integer , Glcd_raw_ypos As Integer
    Dim Glcd_touch_repeat As Byte
    Dim Glcd_touch_valid As Byte
    Dim Glcd_touch_valid_x As Byte
    Dim Glcd_touch_valid_y As Byte
    Dim Glcd_x_tind As Integer
    Dim Glcd_y_tind As Integer
    Dim Glcd_tmpx_sum As Long
    Dim Glcd_contrast_value As Byte
    Dim Glcd_tmpy_sum As Long
    Dim Glcd_touch_read_axis As Byte
    Dim Glcd_toggle_byte As Byte

    Dim Glcd_touch_valid_permanent As Byte

  4. #4
    Kabelträger
    Registriert seit
    24.11.2016
    Beiträge
    8
    So wie es aussiht, habe ich das Problem:

    die LOCAL definierten Variablen im SUB machen irgendwas kaputt.... (Stacksize hatte ich schon testweise erhöht, das ist es also (wahrscheinlich) nicht!

    Gruß,
    Christian

  5. #5
    tschoeatsch
    Gast
    Wenn das an den bascom-Versionen liegt, hast du schon mal in den Versionshistorys nach Hinweisen gefahndet? Die Historys sind auf der Seite, wo man die Vollversion und updates runter laden kann.

  6. #6
    Kabelträger
    Registriert seit
    24.11.2016
    Beiträge
    8
    in der History habe ich zwischen den genannten Versionen keine Hinweise gefunden.

    Auf alle Fälle läuft mein Projekt jetzt schon 20 Minuten störungsfrei (vorher hat es nichtmal 1 Minute bis zum Problem gebraucht...)

    Die LOCAL definierten Variablen hab ich jetzt global DIMensioniert...

    Gruß, Christian

Lesezeichen

Lesezeichen

Berechtigungen

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