Bascom ExtInt schuld an GLCD Fehler, aber wie ?

sBronco

Neues Mitglied
23. Mai 2010
22
0
0
Sprachen
Hi,
das ganze ist jetzt etwas komplizierter.


Ich habe einen Mega128 im Einsatz, das ganze ist eine Lüftersteuerung für meinen PC.
Der Prototyp ist seit einem guten halben Jahr im Einsatz und funktioniert tadellos.

Die 2. Version steht hier vor mir auf dem Schreibtisch und funktioniert ebenfalls perfekt,
solange ich die Lüftergeschwindigkeit nicht abfrage.

Die Int0 - Int3, Int6 und Int7 sind neu dazugekommen um die Flanken vom Fan festzustellen.

Es wird immer nur ein Lüfter abgefragt und das auch nicht ständig,
sondern alle 30sec ein kompletter Durchlauf.

Code:
' SETFAN Speedcheck
Macro SETFAN
   tFan = 5 : flag.1 = 1 : FANSIG = 0
   Select Case fanchannel
      'Config GREEN = Output
      Case 1:
         GIFR.IntF3 = 1
         Enable Int3
      Case 2:
         GIFR.IntF2 = 1
         Enable Int2
      Case 3:
         GIFR.IntF1 = 1
         Enable Int1
      Case 4:
         GIFR.IntF0 = 1
         Enable Int0
      Case 5:
         GIFR.IntF7 = 1
         Enable Int7
      Case 6:
         GIFR.IntF6 = 1
         Enable Int6
   End Select
   cFan = 0
End Macro

Macro GETFAN

      flag.1 = 0
      Disable Int3
      Disable Int2
      Disable Int1
      Disable Int0
      Disable Int7
      Disable Int6
      glcd.0 = 1
      'Shift FANSIG , left , 5
      FANSPEED(fanchannel) = FANSIG * 50
      'Shift FANSPEED(fanchannel) , right , 1 , SIGNED
      Incr fanchannel
      If fanchannel > 6 then
         fanchannel = 1
         tFan = 150
      End If
End Macro

'##################################################
' FANSIGNAL INTERRUPT
'##################################################
FANISR:
   incr FANSIG
Return

Die ganze Sache funktioniert eine ganze Weile gut,
bis die Anzeigeroutine durchdreht.

Code:
'##################################################
SUB MENUMAIN                                                ' Haupt Anzeige
   If rebuild = 1 then
      CLS : rebuild = 0 : TempA = PWM0
   End If

   For ch = 1 to 6

      If glcd.2 = 1 then
         LEISTUNGSANZEIGE                                   ' MACRO Leistung
         TEMPERATURANZEIGE                                  ' MACRO Temperatur
         If ch = 6 then glcd.2 = 0
      End If
      DREHZAHLANZEIGE                                       ' MACRO Drehzahl
   Next ch
'##################################################

In diesem ProgTeil wird nacheinander jeder der 6 Kanäle auf seiner Position angezeigt, wenns dann passiert, zählt die For ch = 1 to 6 aber nicht hoch, sondern bleibt 0 obwohl da 1 als Startwert steht.
Während der gesamten Anzeigeroutine sind Interrupts global DISABLED.

Wenn die Drehzahlerfassung auskommentiert ist, kommt es NICHT zu Fehlern.

Ich habe den FAN Teil jetzt schon zig mal umgeschrieben, andere Zeiten benutzt, nur 2 Flanken ausgewertet (1 Umdrehung) und aus der Dauer gerechnet, alle Stacks erhöht (verdoppelt).
Das Programm ist im wesentlichen das selbe das in meinem PC fehlerfrei arbeitet.

Ich komm nicht drauf woran das liegen könnte
 
Hallo sBronco,
man könnte dir wohl besser helfen, wenn du den kompletten Code einstellst.
Deine Schnipsel haben nichts miteinander zu tun und das Drumherum ist sicherlich an dem Problem beteiligt.

Grüße

Sebastian
 
Hi sBronco,

beim Roboternetz (54204-Interrupts-schuld-an-GLCD-Variablen-Fehler) scheint auch keiner mit der spärlichen Info zurechtzukommen.

Pack doch mal den ganzen Quellcode hier rein damit man sich das im "globalen Maßstab" ansehen kann.

Noch nen Tip : Simulator ist nicht gleich Wirklichkeit. Wenn dein Programm im Simulator funktioniert dann muß es nicht heißen das es auch in der realen Schaltung funktioniert oder auch andersrum.

Gruß
Dino
 
Von Simulator war keine Rede, der Code läuft seit Ende 2010 auf einem mehr oder weniger Identischen Gerät,
außer dem Teil der die Impulse Zählt.




kann hier nicht alles posten:
Der Text, den Sie eingegeben haben, besteht aus 41865 Zeichen und ist damit zu lang.
,
und da hab ich schon einiges weggelassen







Code:
   $PROG &HFF , &HEF , &HD9 , &HFF
   $regfile = "m128def.dat"
   $crystal = 16000000
   $hwstack = 320
   $swstack = 255
   $framesize = 100
   $BAUD = 250000
   $EEPLEAVE



   $include "init.bas"
   $include "HLLSMACRO.BAS"
   $include "CONTROL.BAS"
   $include "INTERFACE.BAS"


'##################################################
'  FLAG definition
'  regel 7   6   5   4  3   2  1 0  - Sensordaten da ? 1 = abholen
'          |   |   |   |   |   |   |-
'          |   |   |   |   |   |-
'          |   |   |   |   |-
'          |   |   |   |-
'          |   |   |-
'          |   |-
'          |-

'##################################################
'##################################################
'########      MAIN  ########
'##################################################
'##################################################
DO                                                          ' MAIN
   cycle = 1
'##################################################
   Do                                                       ' Loop through 6 Channels

      Call MENUSELECT

      cWait = cMain

'##################################################
      Do                                                    '100ms LOOP

         Call TouchPad

      Loop until cWait <> cMain                             '100ms LOOP
'##################################################

      cMain = 0

      Disable Interrupts
      Locate 16 , 16 : LCD TPxA ; ":" ; TPyA ; " |" ; cMenu ; " " ; uimenu ; " "
      Enable Interrupts

'###########  Sensor
      If cPoll >= tPoll then
         Set RED
         If flag.0 = 0 then
            tPoll = 8 : cPoll = 0 : Flag.0 = 1 : Call DSRESET
         else
            tPoll = 50 : cPoll = 0 : Flag.0 = 0 : Call DSREAD
            flag.7 = 1
         End If
         Reset RED
      End If
'###########

'###########  Regeln
      For ch = 1 to Channels
         Incr cChannel(ch)
      Next

      If Flag.0 = 0 AND cChannel(cycle) >= Intervall(cycle) then
            cChannel(cycle) = 0 : Call REGELUNG
      End If
'###########

'###########   Drehzahl
'      If cFan >= tFan then
'         If flag.1 = 0 then
            'SETFAN                                          ' Macro Fan Auswertung START
'         else
            'GETFAN                                          ' Macro Fan Auswertung Berechnung
'         End If
'      End If
'###########

'###########
'    If cMinute > 600 then SAVELOG
'###########

      Incr cycle
   Loop until Cycle > Channels                              ' Loop through 6 Channels

'##################################################


   Reset Watchdog
   If uimenu > 0 AND cMenu > 300 then                       ' Nach 30s zurück zu Menu 0
      uimenu = 0 : rebuild = 1 : menuitem = 0
      glcd.0 = 1 : cMenu = 0
   End If

LOOP                                                        ' MAINLOOP
 END
'##################################################
'##################################################
'##################################################
'##################################################




'##################################################
' FANSIGNAL INTERRUPT
'##################################################
FANISR:
   incr FANSIG
Return
'##################################################
' MAINTIMER INTERRUPT
'##################################################
Timerinterrupt:
   Incr c10ms
   Timer2 = 100

   If c10ms > 9 then
      Toggle GREEN
      c10ms = 0
      Incr cPoll
      Incr cMain
      Incr cFan
      Incr cMenu
      Incr cMinute
   End If
Return


'##################################################
'##################################################



$nocompile
goto Interface

Declare SUB TOUCHPAD

Declare SUB MENUSELECT
Declare SUB MENUMAIN
Declare SUB MENUCHANNEL

'##################################################
'##################################################
'##################################################
SUB MENUSELECT
      Select Case uimenu

         Case 0 :
            Call MENUMAIN

         Case 1 to 6 :
            Call MENUCHANNEL

   End Select



END SUB
'##################################################
'##################################################
SUB MENUMAIN                                                ' Haupt Anzeige
   If rebuild = 1 then
      CLS : rebuild = 0 : TempA = PWM0
   End If

   For ch = 1 to 6

      If glcd.2 = 1 then
         LEISTUNGSANZEIGE                                   ' MACRO Leistung
         TEMPERATURANZEIGE                                  ' MACRO Temperatur
         If ch = 6 then glcd.2 = 0
      End If
      DREHZAHLANZEIGE                                       ' MACRO Drehzahl
   Next ch
'##################################################
   If Touch < 5 then Exit Sub
   Touch = 255

   Select Case TPyA
      Case 1 to 11 :
         Select Case TPxA
            Case 1 to 14 :
               uimenu = 1 : CLS : glcd.0 = 1
            Case 15 to 28 :
               uimenu = 3 : CLS : glcd.0 = 1
            Case 29 to 42 :
               uimenu = 5 : CLS : glcd.0 = 1
         End Select

      Case 12 to 22 :
         Select Case TPxA
            Case 1 to 14 :
               uimenu = 2 : CLS : glcd.0 = 1
            Case 15 to 28 :
               uimenu = 4 : CLS : glcd.0 = 1
            Case 29 to 42 :
               uimenu = 6 : CLS : glcd.0 = 1
         End Select

   End Select

END SUB
'##################################################
'##################################################
SUB MENUCHANNEL

   Select Case menuitem

      Case 0 :

         If glcd.0 = 1 then
            SHOWPIC 1 , 1 , ChannelPic
            SHOWPIC 144 , 64 , LogFile
            glcd.0 = 0
         End If

         Locate 3 , 11 : LCD MaxTemp(uimenu)
         Locate 7 , 11 : LCD TargetTemp(uimenu)
         Locate 11 , 11 : LCD OFFTemp(uimenu)
         Locate 14 , 11 : LCD DrehzahlMin(uimenu)
         Locate 16 , 11 : LCD Intervall(uimenu)

         If Touch < 20 then Exit Sub
         Touch = 255

         If TPxA >= 41 AND TPyA <= 2 then
            EXITSETTING                                     ' EXIT
         End If


         Select Case TPxA

            Case 1 to 20 :
               Select Case TPyA
                  Case 3 to 5 :
                     menuitem = 1 : glcd.0 = 1 : CLS

                  Case 8 to 11 :
                     menuitem = 2 : glcd.0 = 1 : CLS

                  Case 14 to 16 :
                     menuitem = 3 : glcd.0 = 1 : CLS

                  Case 19 to 20 :
                     menuitem = 4 : glcd.0 = 1 : CLS

                  Case 22 to 24 :
                     menuitem = 5 : glcd.0 = 1 : CLS

            End Select
         End Select


End Sub




Interface:




$nocompile
goto CONTROL


  Declare SUB REGELUNG
  Declare SUB UNDER
  Declare SUB MATCH
  Declare SUB OVER



   Declare SUB DSRESET
   Declare SUB DSREAD




SUB REGELUNG

   If CurrentTemp(cycle) > TargetTemp(cycle) then Call OVER
   If CurrentTemp(cycle) >= LowTarget(cycle) AND CurrentTemp(cycle) <= TargetTemp(cycle) then Call MATCH
   If CurrentTemp(cycle) < LowTarget(cycle) then Call UNDER

        'If active.ch = 1 then
            math = prozent(cycle) * 255
            math = math / 100
      '  else
      '      math = 255
       '     prozent(cycle) = 100
      '  End If

    Select Case cycle
        Case 1 :
            PWM3A = math
        Case 2 :
            PWM3B = math
        Case 3 :
            PWM3C = math
        Case 4 :
            PWM1A = math
        Case 5 :
            PWM1B = math
        Case 6 :
            PWM1C = math
        End Select

    LastTemp(cycle) = CurrentTemp(cycle)
    glcd.2 = 1

End Sub



' SETFAN Speedcheck
Macro SETFAN
   tFan = 5 : flag.1 = 1 : FANSIG = 0
   Select Case fanchannel
      'Config GREEN = Output
      Case 1:
         GIFR.IntF3 = 1
         Enable Int3
      Case 2:
         GIFR.IntF2 = 1
         Enable Int2
      Case 3:
         GIFR.IntF1 = 1
         Enable Int1
      Case 4:
         GIFR.IntF0 = 1
         Enable Int0
      Case 5:
         GIFR.IntF7 = 1
         Enable Int7
      Case 6:
         GIFR.IntF6 = 1
         Enable Int6
   End Select
   cFan = 0
End Macro

Macro GETFAN

      flag.1 = 0
      Disable Int3
      Disable Int2
      Disable Int1
      Disable Int0
      Disable Int7
      Disable Int6
      glcd.0 = 1
      'Shift FANSIG , left , 5
      FANSPEED(fanchannel) = FANSIG * 50
      'Shift FANSPEED(fanchannel) , right , 1 , SIGNED
      Incr fanchannel
      If fanchannel > 6 then
         fanchannel = 1
         tFan = 150
      End If
End Macro
 
Hallo sBronco,
ich würde dir ja gerne helfen, aber mit diesem Codefragment ist das nicht möglich.
Kannst du nicht den Rest noch irgendwie hochladen?

@Dirk: Gilt diese Einschränkung auch für Files oder nur für Code im Post?

Grüße

Sebastian
 
Hi Sebastian,

Kannst du nicht den Rest noch irgendwie hochladen?
@Dirk: Gilt diese Einschränkung auch für Files oder nur für Code im Post?
Die Beschränkung gilt anscheinend für den Text (also mit allen Quotes und Code usw ...)

Am besten wär es wenn man das Proggi einfach mal zippt und dann hochlädt. Text läßt sich ja sehr gut komprimieren.

Gruß
Dino
 
Anhang anzeigen 07.2011 M128.zip

die 1000 und eine Bilddatei sind natürlich nicht dabei, das sind Zahlen und Grafiken.

Das Prog an sich tut ja, es ist ausschließlich der Teil mit den Int's, wenn der auskommentiert ist, funktioniert es.
Selbst wenn es passiert, läuft das Prog weiter, nur die Anzeige funktioniert dann nicht mehr RICHTIG, angezeigt wird
immer noch.
Der läuft durch alle 6 Kanäle zum Anzeigen, wenns passiert, zeigt er den nicht vorhandenen, nicht deklarierten, Kanal 0,
sollte aber eigentlich von 1 nach 6 hochzählen. Da es keinen Kanal 0 gibt, kann er auch nichts anzeigen.

Bei einem schnelllaufenden kleinen Lüfter mit 3600 u/min passiert es wesentlich früher, als bei einem Lüfter mit 350 u/min.

Vielleicht läuft da irgendein Register über oder Speicher oder, oder, oder.....

bin am Ende mit meinem Latein
 
Hallo sBronco,
wenn tatsächlich die Variable ch einen Wert von 0 annimmt und eigentlich nur in Schleifen benutzt wird, die selber die Werte beschränken (z.B. For Ch = 1 To 6) dann sehe ich zunächst einmal zwei Möglichkeiten, wie dies geschehen kann:
1. Die Stacks werden zu groß und überschreiben sich gegenseitig oder sogar den Variablenbereich oder
2. Eine andere Variable überschreibt ch. Dies könnten Strings oder Arrays sein.
Daraufhin habe ich mir mal deine Variablen angesehen, die vor ch definiert sind. Strings gibt es keine, aber jede Menge Arrays direkt vor ch:
Dim Templog6(100) As Byte , Powerlog6(100) As Byte

Und dann bin ich über diese Zeilen gestolpert

Incr Clog
If Clog > 200 Then Clog = 1
...
Powerlog6(clog) = Prozent(6)


Wenn clog während der Ausführung tatsächlich mal einen Wert > 100 annimmt, werden die Variablen, die nach Powerlog6 definiert sind locker überschrieben.
Setzt doch mal testweise die Abfrage auf Clog > 100 und schau mal, ob es dann immer noch passiert.

Grüße

Sebastian
 
Hi,
danke für deine Mühe, das werde ich Testen indem ich den Teil mal komplett raus nehme.
Ich glaube aber, das das Problem schon bestand, bevor ich das eingebaut hatte, bin mir nicht ganz sicher.
 
Der einzige Aufruf des Macros scheint jedenfalls auskommentiert zu sein:
' If cMinute > 600 then SAVELOG

Grüße

Sebastian
 
Ich hätte da noch ein kleines Testprogramm für die Stacks und den Frame.
Füge mal ganz oben noch dies ein
$dbg
Dadurch werden die Stacks und der Frame zu Beginn mit bestimmten Zeichen beschrieben, sodass sich später erkennen lässt, ob an die jeweiligen Stellen schon etwas geschrieben wurde.

Füge dies hier dann noch bei den Subs ein:

Code:
  Const Frame_size = 100
  Const Sram_end = _frame_high - Frame_size -1
  Const Frame_start = Sram_end + 1 + 24
  Const Frame_end = _swstack_low - 1

  Const Sw_start = _hwstack_low
  Const Sw_end = _swstack_low
  Const Sw_size = Sw_start - _swstack_low + 1

  Const Hw_start = $10ff                                    'gilt nur für Mega128 mit 4K SRAM
  Const Hw_end = _hwstack_low + 1
  Const Hw_size = Hw_start - Hw_end + 1

   Dim Test(1) As Byte At Sram_end , I As Word , Offset As Word
   Dim Fs As Word , Hs As Word , Ss As Word

  [B]Check_stack[/B]:
   For I = Frame_size To 25 Step -1
      Offset = I
      If Test(offset + 1) = 70 Then                         '"F" Zeichen für den Frame
         Incr Fs
      Else
         Exit For
      End If
   Next I
   For I = 1 To Sw_size
      Offset = Frame_size + I
      Offset = Offset + 1
      If Test(offset) = 83 Then                             '"S" Zeichen für den SW_Stack
         Incr Ss
      Else
         Exit For
      End If
   Next I
   For I = 1 To Hw_size
      Offset = Frame_size + Sw_size
      Offset = Offset + I
      If Test(offset + 1) = 72 Then                         '"H" Zeichen für den HW_Stack
         Incr Hs
      Else
         Exit For
      End If
   Next I
   Print "Free Stacks: HW=" ; Hs ; ", SW=" ; Ss ; ", Frame=" ; Fs       'hier kannst du auch die Ausgabe auf's LCD machen
   Fs = 0 : Ss = 0 : Hs = 0
Return

Wenn du den Befehl
Gosub Check_stack
irgendwo in deinem Programm ausführst, wird der aktuelle Stand der Stacks ausgegeben. Z.B. in einem Print oder auch auf dem LCD.
Du kannst den Befehl z.B. an eine Stelle machen, die jede Sekunde aufgerufen wird. Damit solltest du sehen können, ob die Stacks immer kleiner werden und es dann zu einem Überlauf kommt.
Du kannst den Befehl auch mal ganz am Anfang ausführen, dann sollten die vorgegeben Stack Werte ausgegeben werden. Da es eine Sub mit Rücksprung ist, werden die ersten Bytes im HW_Stack dadurch aber schon belegt.
Außerdem "klaut" dir Bascom immer gleich 24 Byte vom Frame für seine Verwendung.

Grüße

Sebastian

Edit:
Noch ein Hinweis:
$hwstack = 255 'nimm hier keine größeren Werte als 255
$swstack = 255 'da hat zumindestens der Simulator ein Problem
$framesize = 100 'und belegt bei $dbg nicht alle Zellen mit den Buchstaben
 
Das werde ich mal ausprobieren, Danke.

Die Log Sache habe ich mal eingebaut, war mir aber nicht sicher wie viel Speicher ich noch zur Verfügung habe und
hatte deshalb nur mal auf 100 Dimensioniert, der Plan war das so 10h gespeichert werden.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)