mat-sche
05.01.2009, 20:34
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:
$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
Auch nach durchlesen einiger Artikel hier habe ich noch immer nicht den Sinn gefunden eine Sub zu declarieren.
Ich habe ein Prog geschrieben:
$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