Hallo und einen schönen Abend!

Auch nach durchlesen einiger Artikel hier habe ich noch immer nicht den Sinn gefunden eine Sub zu declarieren.
Ich habe ein Prog geschrieben:
Code:
$regfile = "m8def.dat"                                                          ' specify the used micro
$crystal = 12000000                                                             ' used crystal frequency                                                                   ' use baud rate
$hwstack = 50                                                                   ' default use 32 for the hardware stack
$swstack = 50                                                                   ' default use 10 for the SW stack
$framesize = 40                                                                 ' default use 40 for the frame space
'$sim
'Declare Sub Fensterhoch_kue                                                     'PinB0 =>SV2/8  Fernbedienungsempfänger
'Declare Sub Fensterrunter_kue                                                   'PinB2 =>SV2/6
'Declare Sub Fensterhoch_bad                                                     'PinC3 =>SV2/4
'Declare Sub Fensterrunter_bad
'Declare Sub Temp_holen
'Declare Sub Rel_wasser_an
'------------------------------------------------------------------------------- Twi_lcd
$lib "Lcd_i2c.lib"                                                              'My I2C driver for the LCD

Config Lcd = 16 * 2
Config Lcdbus = 4
Initlcd
Cursor Off
Cls

Const Pcf8574_lcd = &H40                                                        'Defines the address of the I/O expander for LCD

Config Scl = Portc.5                                                            'Configure I2C SCL
Config Sda = Portc.4                                                            'Configure I2C SDA
Dim _lcd_e As Byte                                                              'Needed to control 4 line LCD
_lcd_e = 128

'------------------------------------------------------------------------------- Variablen
Const Rolltime = 32


Ddrd = &B11111111                                                               'Config Portd = Output
Portb = &B00000101
Portc = &B00001011                                                              'Pull up Portb.2 ein
Rel_bad_auf Alias Portd.0                                                       'Alias für Relaise-Fensterheber Bad auf
Rel_bad_zu Alias Portd.1
Rel_kue_auf Alias Portd.2
Rel_kue_zu Alias Portd.3
Rel_wasser Alias Portd.6                                                        'Eingangssignal von der Brennerzeitsteuerung
'Port_brenner Alias Portc.0                                  '{Portb.2}Eingang vom der Zeitsteuerung vom Ofen => Tag/Nachtprogramm: 0=Nachtabsenkung, 1=Tagprogramm

Dim Flag_bad_auf_1 As Word , Flag_bad_auf_2 As Word , Fenster_bad_offen As Bit
Dim Flag_bad_zu_1 As Word , Flag_bad_zu_2 As Word , Fenster_bad_zu As Bit
Dim Flag_kue_auf_1 As Word , Flag_kue_auf_2 As Word , Fenster_kue_auf As Bit
Dim Flag_kue_zu_1 As Word , Flag_kue_zu_2 As Word , Fenster_kue_zu As Bit
'Dim Flag_wo_auf_1 As Word , Flag_wo_auf_2 As Word
'Dim Flag_wo_zu_1 As Word , Flag_wo_zu_2 As Word

Dim Twi_daten As Byte
Dim Pump_st As Byte , Pump_st_z As Bit                                          'Zähler für die Pumpenstarts


'------------------------------------------------------------------------------- Timer1 konfigurieren
Config Timer1 = Timer , Prescale = 256
On Timer1 Counter_irq
Const Timer1vorgabe = 18661
Enable Timer1
Enable Interrupts
Dim Timecount As Word


'------------------------------------------------------------------------------- Configuration DS1820
Config 1wire = Portb.1
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(2) As Byte
Dim Ar2(2) As Byte
Dim T_vorl As Byte
'Dim Tempraturbyte(6) As Byte At T_vorl Overlay
Dim T_ruekl As Byte , T_ruekl_1 As Byte


Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()

'******************************************************************************* Hauptprogramm


Do

Debounce Pinb.0 , 0 , Fensterhoch_kue , Sub                                     'PinB0 =>SV2/8  Fernbedienungsempfänger
Debounce Pinb.2 , 0 , Fensterrunter_kue , Sub                                   'PinB2 =>SV2/6
Debounce Pinc.3 , 0 , Fensterhoch_bad , Sub                                     'PinC3 =>SV2/4
Debounce Pinc.1 , 0 , Fensterrunter_bad , Sub                                   'PinC1 =>SV2/2

If Timecount = 0 Then
   Lowerline                                                                    'select the lower line
   Waitms 1
   Locate 2 , 1
   Lcd "t=    "
End If
'
Lowerline                                                                       'select the lower line
Waitms 1
Locate 2 , 1
Lcd "t=" ; Timecount
Waitms 1
Locate 2 , 8
Lcd "pu=" ; Rel_wasser
Waitms 1
Locate 2 , 13
Lcd "br=" ; Pinc.0
Waitms 1
Upperline
Locate 1 , 11
Lcd "bs" ; Pump_st
'                                                              'Port_brenner
 Upperline
  Locate 1 , 1
  Lcd "Tr" ; T_ruekl
  Waitms 1
 Upperline
  Locate 1 , 6
  Lcd "Tv" ; T_vorl
  Waitms 1
'
'******************************************************************************* Steuerung Umlaufpumpe Warmwasser
  1wreset                                                                       '1wirebus resetten
  1wwrite &HCC : 1wwrite &H44
                                 'Messung der temp beider Sensoren starten
If Pinc.0 = 0 Then                                                              'Zeitprogramm vom Brenner
  If Timecount = 0 Or Timecount = 800 Or Timecount = 1600 Or Timecount = 2400 Or Timecount = 3200 Or Rel_wasser = 1 Then       'aller 20min {0,1200,2400} Rücklauftemperatur überprüfen dann Sprung in Unterprogramm
    Gosub Temp_holen
    Gosub Rel_wasser_an
  End If
End If                                                                          'beide DS1820 Messung anstoßen
'Gosub Temp_holen



'*************************************************
 Select Case Twi_daten
'******************************************************************************* Rolladen Bad rauf
         Case 1 : If Rel_bad_zu = 0 And Fenster_bad_offen = 0 Then              'Tastenverrieglung
                   Toggle Rel_bad_auf                                           'umschalten von Port zwischen 0&1
                   Fenster_bad_zu = 0                                           ' nach fenster vollständig runter, erst wieder möglich runter zu fahren nach dem es wieder rauffuhr
                   Else
                  Twi_daten = 0
                   Goto Ende
                   End If
                   'Locate 2 , 3
                   'Lcd Rel_bad_auf

                   If Rel_bad_auf = 1 And Flag_bad_auf_2 = 0 And Flag_bad_zu_2 = 0 Then       'if Abfrage jedesmal wenn case1 ist und somit der Port getoggle wird
                     Flag_bad_auf_1 = Rolltime + Timecount                      ' flag mit der Laufzeit für  Fenster kompl. auf plus Sekundenzähler
                      Elseif Rel_bad_auf = 1 And Flag_bad_zu_2 > 0 Then
                      Flag_bad_auf_2 = Rolltime - Flag_bad_zu_2                 'nach dem das Fenster runtergefahren wurde, wurde der Laufzeitwert im Flag_bad_zu_2 gespeichert, jetzt wird bei
                      Flag_bad_auf_1 = Timecount + Flag_bad_auf_2               ' erneutem auffahren die restliche Zeit, für komplett auf, neu in Flag_bad_auf_1 geschrieben
                      Flag_bad_zu_2 = 0                                         ' löschen der der Zeit die schon zugefahren ist
                   End If

                    If Rel_bad_auf = 0 And Flag_bad_auf_2 > 0 Then              'if Abfrage jedesmal wenn case1 ist und somit der Port getoggle wird
                      Elseif Rel_bad_auf = 1 And Flag_bad_auf_2 > 0 Then        '
                      Flag_bad_auf_1 = Timecount + Flag_bad_auf_2
                      Flag_bad_auf_2 = 0
                    End If

                    If Rel_bad_auf = 0 And Flag_bad_auf_1 > 0 Then
                      Flag_bad_auf_2 = Timecount
                      Flag_bad_auf_2 = Flag_bad_auf_1 - Flag_bad_auf_2
                    End If

                 Twi_daten = 0

'******************************************************************************* Rolladen Bad runter
        Case 11 : If Rel_bad_auf = 0 And Fenster_bad_zu = 0 Then
                  Toggle Rel_bad_zu
                 Fenster_bad_offen = 0
                  Else
                 Twi_daten = 0
                  Goto Ende
                  End If

                   If Rel_bad_zu = 1 And Flag_bad_zu_2 = 0 And Flag_bad_auf_2 = 0 Then
                      Flag_bad_zu_1 = Rolltime + Timecount
                      Elseif Rel_bad_zu = 1 And Flag_bad_auf_2 > 0 Then
                      Flag_bad_zu_2 = Rolltime - Flag_bad_auf_2
                      Flag_bad_zu_1 = Timecount + Flag_bad_zu_2
                      Flag_bad_auf_2 = 0
                   End If

                   If Rel_bad_zu = 0 And Flag_bad_zu_2 > 0 Then
                      Elseif Rel_bad_zu = 1 And Flag_bad_zu_2 > 0 Then
                      Flag_bad_zu_1 = Timecount + Flag_bad_zu_2
                      Flag_bad_zu_2 = 0
                      End If
                   If Rel_bad_zu = 0 And Flag_bad_zu_1 > 0 Then
                      Flag_bad_zu_2 = Timecount
                      Flag_bad_zu_2 = Flag_bad_zu_1 - Flag_bad_zu_2
                   End If
                  Twi_daten = 0

'******************************************************************************* Rolladen Küche rauf
         Case 2 : If Rel_kue_zu = 0 And Fenster_kue_auf = 0 Then
                   Toggle Rel_kue_auf
                  Fenster_kue_zu = 0
                   Else
                   Twi_daten = 0
                   Goto Ende
                   End If
                   Locate 2 , 5
                   Lcd Rel_kue_auf                                              '     If Flag_bad_auf_2 = 0  And
                   If Rel_kue_auf = 1 And Flag_kue_auf_2 = 0 And Flag_kue_zu_2 = 0 Then
                      Flag_kue_auf_1 = Rolltime + Timecount
                      Elseif Rel_kue_auf = 1 And Flag_kue_zu_2 > 0 Then
                      Flag_kue_auf_2 = Rolltime - Flag_kue_zu_2
                      Flag_kue_auf_1 = Timecount + Flag_kue_auf_2
                      Flag_kue_zu_2 = 0
                   End If

                    If Rel_kue_auf = 0 And Flag_kue_auf_2 > 0 Then
                      Elseif Rel_kue_auf = 1 And Flag_kue_auf_2 > 0 Then
                      Flag_kue_auf_1 = Timecount + Flag_kue_auf_2
                      Flag_kue_auf_2 = 0
                    End If

                    If Rel_kue_auf = 0 And Flag_kue_auf_1 > 0 Then
                      Flag_kue_auf_2 = Timecount
                      Flag_kue_auf_2 = Flag_kue_auf_1 - Flag_kue_auf_2
                    End If
                  Twi_daten = 0

'******************************************************************************* Rolladen Küche runter
        Case 22 : If Rel_kue_auf = 0 And Fenster_kue_zu = 0 Then
                  Toggle Rel_kue_zu
                 Fenster_kue_auf = 0
                  Else
                  Twi_daten = 0
                  Goto Ende
                  End If

                   If Rel_kue_zu = 1 And Flag_kue_zu_2 = 0 And Flag_kue_auf_2 = 0 Then
                      Flag_kue_zu_1 = Rolltime + Timecount
                      Elseif Rel_kue_zu = 1 And Flag_kue_auf_2 > 0 Then
                      Flag_kue_zu_2 = Rolltime - Flag_kue_auf_2
                      Flag_kue_zu_1 = Timecount + Flag_kue_zu_2
                      Flag_kue_auf_2 = 0
                   End If

                   If Rel_kue_zu = 0 And Flag_kue_zu_2 > 0 Then
                      Elseif Rel_kue_zu = 1 And Flag_kue_zu_2 > 0 Then
                      Flag_kue_zu_1 = Timecount + Flag_kue_zu_2
                      Flag_kue_zu_2 = 0
                      End If
                   If Rel_kue_zu = 0 And Flag_kue_zu_1 > 0 Then
                      Flag_kue_zu_2 = Timecount
                      Flag_kue_zu_2 = Flag_kue_zu_1 - Flag_kue_zu_2
                   End If
                 Twi_daten = 0
                  Ende:


 End Select

If Rel_bad_auf = 1 And Timecount => Flag_bad_auf_1 Then                         'rücksetzen des Ansteuerrelaise für Fensterheber nach abgelaufener Zeit
   Reset Rel_bad_auf
   Flag_bad_auf_1 = 0                                                           'rücksetzen vom Zeitzähler
   Fenster_bad_offen = 1                                                        'wenn Fensterladen kompl. offen dann verhindern das nochmalig angesteuert werden kann
   Fenster_bad_zu = 0                                                           'nach dem Fensterladen kompl. runtergefahren war wird beim auffahren die nochmalige "Runterfahrsperre" zurück gesetzt
   End If
 If Rel_bad_zu = 1 And Timecount => Flag_bad_zu_1 Then
   Reset Rel_bad_zu
   Flag_bad_zu_1 = 0
   Fenster_bad_offen = 0
   Fenster_bad_zu = 1
   End If
 If Rel_kue_auf = 1 And Timecount => Flag_kue_auf_1 Then
   Reset Rel_kue_auf
   Flag_kue_auf_1 = 0
   Fenster_kue_auf = 1
   Fenster_kue_zu = 0
   End If
 If Rel_kue_zu = 1 And Timecount => Flag_kue_zu_1 Then
   Reset Rel_kue_zu
   Flag_kue_zu_1 = 0
   Fenster_kue_zu = 1
   Fenster_kue_auf = 0
   End If


Loop
End

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Subroutinen
Counter_irq:

Timer1 = Timer1vorgabe
Incr Timecount                                                                  ' increment every sec the counter with 1
If Timecount => 3600 Then                                                       ' 5400 here is the 1,50 std
   Timecount = 0

                                                                            ' wenn nicht dann lade StartWert in Timer1
End If
Return

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Sensor 1 auslesen
Temp_holen:
  1wreset                                                                       'reset
  1wwrite &H55                                                                  'match rom command
  1wwrite Id1(1) , 8                                                            'id von sensor 1
  1wwrite &HBE

  Ar1(1) = 1wread(2)
  T_ruekl = Makeint(ar1(1) , Ar1(2))
      T_ruekl = T_ruekl / 2                                                     'Ar(1)

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Sensor2 auslesen

  1wreset                                                                       'reset
  1wwrite &H55                                                                  'match rom command
  1wwrite Id2(1) , 8                                                            'id von sensor 2
  1wwrite &HBE                                                                  'scratchpad lesen

 Ar2(1) = 1wread(2)
  T_vorl = Makeint(ar2(1) , Ar2(2))
      T_vorl = T_vorl / 2

Return

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Warmwasserpumpe ein/ausschalten und senden der Warmwassertemperatur
Rel_wasser_an:
 If T_vorl < T_ruekl Then
 Goto Rel_wasser_1
 End If
  T_ruekl_1 = T_vorl - T_ruekl                                                  'Abweichung zwischen Warmwassertemperatur und zurück geführte Umwälzwasser
  If T_ruekl < 30 And T_vorl >= T_ruekl And T_vorl < 45 Then

Rel_wasser_1:
  Rel_wasser = 1
  If Pump_st_z = 0 Then
     Pump_st_z = 1
     Incr Pump_st
  End If                                                                        'wenn Umwälzwasser kleiner als 26°C und die Warmwassertemperatur größer ist dann Umwälzpumpe an
                                                              ' (1.Byte = Temperatur;2.-4. = 0Bytes; 5.Senderadresse; 6.Byte Komando)
Elseif T_ruekl_1 =< 15 And T_ruekl_1 => 0 And Rel_wasser = 1 Then
  Rel_wasser = 0
  Pump_st_z = 0
End If

Return
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Fernbedienungsempfänger

Fensterhoch_kue:
  Twi_daten = 2
Return
                                                                'PinB0 =>SV2/8
Fensterrunter_kue:
  Twi_daten = 22
Return
                                                             'PinB2 =>SV2/6
Fensterhoch_bad:
  Twi_daten = 1
Return
                                                                'PinC3 =>SV2/4
Fensterrunter_bad:                                                              'PinC1 =>SV2/2
  Twi_daten = 11
Return

'###############################################################################
bei den ich einige Subroutinen mit Gosub anspringe. Ich nutze in dem Programm ein I2C LCD. Nun ohne die Deklaration läuft das Prog über eine gewisse Zeit hin stabil und macht was es soll. Aber nach einigen Stunden (5....6...?) fällt das Display aus und zeigt nur wirres Zeug an, auch geht dann ein bestimmter Programmteil nicht mehr.
Jetzt habe ich alle Unterroutinen mal deklariert und jetzt läuft's.

=> weshalb dies? Alle Variablen waren dimensioniert.
Wer hat für mich eine Erklärung für mich und die Zukunft?

Danke und Gruß MAT