Hallo!!
Ich hab in Bascom eine Heizungssteuerung programmiert (Atmega32).
Bei der verwende ich auch den Timer0 und Int1 für eine Wasseruhr - Wenn
warmwasser gebraucht wird soll ein Magnetventil für 1 min eingeschaltet
sein.
Int1 überprüft die Wasseruhr und Timer0 zählt 1min ab.
Nur seit dem ich diese Funktion im Code integriert habe, hängt sich der
Prozessor manchmal auf.
Was ist da los??
Hier der Code (isr´s sind am ende):
$regfile = "m32def.dat" ' Atmega32
wird verwendet
$crystal = 16000000 ' Quarz =
16Mhz
$hwstack = 180 ' Hardware
Stack
$swstack = 180 ' Software
Stack
$framesize = 100 ' Frame
stace
'-----------------------------------------------------------------------
-------------------------
'--------------------------------- Configurationen
----------------------------------------
'-----------------------------------------------------------------------
-------------------------
'ADC_Config
'====================
Config Adc = Single , Prescaler = Auto , Reference = Avcc
'PWM_Config
'====================
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B
Pwm = Disconnect , Prescale = 256
'LCD_Config
'====================
Config Lcdpin = Pin , Rs = Portb.5 , E = Portb.4 , Db4 = Portb.3 , Db5 =
Portb.2 , Db6 = Portb.1 , Db7 = Portb.0
Config Lcd = 20 * 4 ' es wird
ein 4 x 20 LCD verwendet
Cursor Off ' Cursor
wird ausgeschaltet
Cls ' LCD
löschen
'Interrups_config
'====================
Config Watchdog = 1024
Start Watchdog
On Timer0 Timer0_isr
On Int1 Int1_isr
Config Timer0 = Timer , Prescale = 1024
Config Int1 = Falling
'-----------------------------------------------------------------------
-------------------------
'----------------------------------- Definitionen
-----------------------------------------
'-----------------------------------------------------------------------
-------------------------
'I/O´s
'====================
Config Portc = &B11111000 ' I = 0; O =
1 !!!
Sola_pum Alias Portc.3 '
Sicherheits Relais
Heiz_pum Alias Portc.4 ' Magnet
Ventiel
Boil_pum Alias Portc.5 ' Boiler
Pumpe
Magn_ven Alias Portc.6 ' Heizungs
Pumpe
Sich_rel Alias Portc.7 ' Solar
Pumpe
Config Portd = &B00100000
Portd = &B00001111 ' PullUp´s
einschalten
Taste_men Alias Pind.0 ' Menü
Taster
Taste_ab Alias Pind.1 ' Ab Taster
Taste_auf Alias Pind.2 ' Auf Taster
Wasseruhr Alias Pind.3 ' Wasseruhr
'Konstanten
'====================
Kollektor Alias 0
Heizung Alias 1
Boiler_2_unten Alias 2
Boiler_2_mitte Alias 3
Boiler_2_oben Alias 4
Boiler_1_unten Alias 5
Boiler_1_mitte Alias 6
Boiler_1_oben Alias 7
Hintergrundbel Alias Pwm1a
'Variablen
'====================
Dim Bsw1 As Byte
Dim Bsw2 As String * 3
Dim Zaehler As Byte
Dim Zaehler_1 As Byte
Dim H As Bit
Dim I As Byte
Dim Eeprom_data As Byte
Dim Tim0_count_byte As Byte
Dim J As Bit
Dim K As Long
Dim Sich_rel_bit As Bit
Sich_rel_bit = 0
Dim Heizung_max As Byte
Dim Boiler_max As Byte
Dim Kollektor_temp As Byte
Dim Heizung_temp As Byte
Dim Boiler_1_oben_temp As Byte
Dim Boiler_1_mitte_temp As Byte
Dim Boiler_1_unten_temp As Byte
Dim Boiler_2_oben_temp As Byte
Dim Boiler_2_mitte_temp As Byte
Dim Boiler_2_unten_temp As Byte
Dim Temp_1 As Byte
Dim Temp_2 As Byte
Dim Nachlaufzeit As Byte
Dim Isr_zahler As Byte
Isr_zahler = 0
Dim Isr_counter As Byte
'Variablen im EEprom
'====================
Dim 1_data As Eram Byte ' reserve -
wird nicht benötigt
Dim Boiler_max_data As Eram Byte
Dim Heiz_max_data As Eram Byte
Dim Dis_hel_data As Eram Byte
Dim Sich_rel_data As Eram Byte
'LCD Charakter
'====================
Deflcdchar 0 , 32 , 4 , 2 , 31 , 2 , 4 , 32 , 32 ' Pfeil
Definiert
Deflcdchar 1 , 10 , 32 , 17 , 17 , 17 , 19 , 13 , 32 ' ü
definiert
Deflcdchar 2 , 10 , 32 , 14 , 1 , 15 , 17 , 15 , 32 ' ä
definiert
Deflcdchar 3 , 10 , 32 , 17 , 17 , 17 , 17 , 14 , 32 ' Ü
definiert
'Unterprogrammen
'====================
Declare Function Temp_ermitteln(byval Channel As Byte) As Byte
Declare Function Byte_string_wandeln(byval Wert As Byte) As String
'-----------------------------------------------------------------------
-------------------------
'----------------------------------- Main Programm
----------------------------------------
'-----------------------------------------------------------------------
-------------------------
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - -
Zustandsabfrage: ' Nach Reset
Readeeprom Eeprom_data , Dis_hel_data ' Displ.
helligkeit wiederherstellen
Hintergrundbel = Eeprom_data
Readeeprom Eeprom_data , Sich_rel_data ' Status von
Sicherheits Relais wiederherstellen
If Eeprom_data = 0 Then
Sich_rel = 0
Else
Sich_rel = 1
Sich_rel_bit = 1
Goto Anzeige_heizung_uberhitzt ' Wenn
Heizung überhitzt ist in die Anzeige wechseln
End If
Readeeprom Eeprom_data , Boiler_max_data ' Boiler max
Wert auslesen
If Eeprom_data >= 150 Then Eeprom_data = 150
Boiler_max = Eeprom_data
Readeeprom Eeprom_data , Heiz_max_data ' Heizung
max Wert auslesen
If Eeprom_data >= 150 Then Eeprom_data = 150
Heizung_max = Eeprom_data
Enable Int1
Reset Watchdog
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - -
Anzeige_gemischt:
Zaehler = 0
H = 0
Cls ' Display
ausgabe
Locate 1 , 1 : Lcd "Solar = "
Locate 2 , 1 : Lcd "Heizung = "
Locate 3 , 1 : Lcd "Boiler 1 Mitte = "
Locate 4 , 1 : Lcd "Boiler 2 Mitte = "
Do
Reset Watchdog
Loop Until Taste_men = 1
Waitms 200
Do
Do
Bsw1 = Temp_ermitteln(kollektor) ' Schleife
für Temp. Wert ausgabe
Bsw2 = Byte_string_wandeln(bsw1)
Locate 1 , 18 : Lcd Bsw2
Bsw1 = Temp_ermitteln(heizung)
Bsw2 = Byte_string_wandeln(bsw1)
Locate 2 , 18 : Lcd Bsw2
Bsw1 = Temp_ermitteln(boiler_1_mitte)
Bsw2 = Byte_string_wandeln(bsw1)
Locate 3 , 18 : Lcd Bsw2
Bsw1 = Temp_ermitteln(boiler_2_mitte)
Bsw2 = Byte_string_wandeln(bsw1)
Locate 4 , 18 : Lcd Bsw2
If Taste_auf = 0 Or Taste_ab = 0 Then ' Taster für
Anzeige Wechsel abfragen
Do
Reset Watchdog
Loop Until Taste_auf = 1 And Taste_ab = 1
Goto Anzeige_boiler
End If
If Taste_men = 0 Then ' Taster für
Menue & Enstellungen abfragen
I = 0
Do
If I = 200 Then Goto Anzeige_einstellungen
Incr I
Waitms 10
Reset Watchdog
Loop Until Taste_men = 1
Goto Anzeige_menue
End If
If Sich_rel_bit = 1 Then Goto Anzeige_heizung_uberhitzt '
Wenn Heizung überhitzt ist in die Anzeige wechseln
Gosub Relais_steuerung
Incr Zaehler ' Zähler für
Zeit bis Displ.regeneration
Reset Watchdog
Loop Until Zaehler = 4 ' incr und
abfragen
If H = 0 Then ' 1. Hälfte
regenerieren
Locate 1 , 1 : Lcd "Solar = "
Locate 3 , 1 : Lcd "Boiler 1 Mitte = "
H = 1
Zaehler = 0
End If
If H = 1 Then ' 2. Hälfte
regenerieren
Locate 2 , 1 : Lcd "Heizung = "
Locate 4 , 1 : Lcd "Boiler 2 Mitte = "
H = 0
Zaehler = 0
End If
Reset Watchdog
Loop
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - -
Anzeige_boiler:
Zaehler = 0
H = 0
I = 0 ' Variable
für Zeit bis rückkehr zu
'Gemischter
Anzeige auf 0 setzen
Cls ' Display
ausgabe
Locate 1 , 1 : Lcd "Boiler 1 Boiler 2 "
Locate 2 , 1 : Lcd "Oben : Oben : "
Locate 3 , 1 : Lcd "Mitte: Mitte: "
Locate 4 , 1 : Lcd "Unten: Unten: "
Do
Do ' Schleife
für Temp. Wert ausgabe
Bsw1 = Temp_ermitteln(boiler_1_oben)
Bsw2 = Byte_string_wandeln(bsw1)
Locate 2 , 7 : Lcd Bsw2
Bsw1 = Temp_ermitteln(boiler_1_mitte)
Bsw2 = Byte_string_wandeln(bsw1)
Locate 3 , 7 : Lcd Bsw2
Bsw1 = Temp_ermitteln(boiler_1_unten)
Bsw2 = Byte_string_wandeln(bsw1)
Locate 4 , 7 : Lcd Bsw2
Bsw1 = Temp_ermitteln(boiler_2_oben)
Bsw2 = Byte_string_wandeln(bsw1)
Locate 2 , 18 : Lcd Bsw2
Bsw1 = Temp_ermitteln(boiler_2_mitte)
Bsw2 = Byte_string_wandeln(bsw1)
Locate 3 , 18 : Lcd Bsw2
Bsw1 = Temp_ermitteln(boiler_2_unten)
Bsw2 = Byte_string_wandeln(bsw1)
Locate 4 , 18 : Lcd Bsw2
If Taste_auf = 0 Or Taste_ab = 0 Then ' Taster für
Anzeige Wechsel abfragen
Do
Reset Watchdog
Loop Until Taste_auf = 1 And Taste_ab = 1
Goto Anzeige_gemischt
End If
If Taste_men = 0 Then ' Taster für
Menue & Enstellungen abfragen
I = 0
Do
If I = 200 Then Goto Anzeige_einstellungen
Incr I
Waitms 10
Reset Watchdog
Loop Until Taste_men = 1
Goto Anzeige_menue
End If
If Sich_rel_bit = 1 Then Goto Anzeige_heizung_uberhitzt '
Wenn Heizung überhitzt ist in die Anzeige wechseln
Gosub Relais_steuerung
Incr Zaehler ' Zähler für
Zeit bis Displ.regeneration
Reset Watchdog
Loop Until Zaehler = 4 ' incr und
abfragen
If H = 0 Then ' 1. Hälfte
regenerieren
Locate 1 , 1 : Lcd "Boiler 1"
Locate 1 , 12 : Lcd "Boiler 2"
Locate 3 , 1 : Lcd "Mitte:"
Locate 3 , 12 : Lcd "Mitte:"
H = 1
Zaehler = 0
End If
If H = 1 Then ' 2. Hälfte
regenerieren
Locate 2 , 1 : Lcd "Oben :"
Locate 2 , 12 : Lcd "Oben :"
Locate 4 , 1 : Lcd "Unten:"
Locate 4 , 12 : Lcd "Unten:"
H = 0
Zaehler = 0
End If
Incr I
Reset Watchdog ' Variable
für rückkehr nach Gemischter
Loop Until I = 20 ' Anzeige
incr und abfragen
Goto Anzeige_gemischt
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - -
Anzeige_menue:
Zaehler = 0
H = 0
J = 0
Waitms 200
Cls
Locate 1 , 9 : Lcd "Men" ; Chr(1) ' Display
ausgabe
Locate 2 , 1 : Lcd "Boiler max."
Locate 3 , 1 : Lcd "Heizung max."
Locate 4 , 1 : Lcd "Exit = lange Enter"
Readeeprom Eeprom_data , Boiler_max_data
If Eeprom_data > 150 Then Eeprom_data = 150
Writeeeprom Eeprom_data , Boiler_max_data
Bsw2 = Byte_string_wandeln(eeprom_data)
Locate 2 , 18 : Lcd Bsw2
Readeeprom Eeprom_data , Heiz_max_data
If Eeprom_data > 150 Then Eeprom_data = 150
Writeeeprom Eeprom_data , Heiz_max_data
Bsw2 = Byte_string_wandeln(eeprom_data)
Locate 3 , 18 : Lcd Bsw2
Do
Do
If Taste_auf = 0 And J = 0 Then '
Tastenabfrage
Do
Reset Watchdog
Loop Until Taste_auf = 1
Readeeprom Eeprom_data , Boiler_max_data
If Eeprom_data < 150 Then Eeprom_data = Eeprom_data + 1
Writeeeprom Eeprom_data , Boiler_max_data
Boiler_max = Eeprom_data ' max Wert
übergeben
Bsw2 = Byte_string_wandeln(eeprom_data)
Locate 2 , 18 : Lcd Bsw2
End If
If Taste_ab = 0 And J = 0 Then
Do
Reset Watchdog
Loop Until Taste_ab = 1
Readeeprom Eeprom_data , Boiler_max_data
If Eeprom_data > 0 Then Eeprom_data = Eeprom_data - 1
Writeeeprom Eeprom_data , Boiler_max_data
Boiler_max = Eeprom_data ' max Wert
übergeben
Bsw2 = Byte_string_wandeln(eeprom_data)
Locate 2 , 18 : Lcd Bsw2
End If
If Taste_auf = 0 And J = 1 Then
Do
Reset Watchdog
Loop Until Taste_auf = 1
Readeeprom Eeprom_data , Heiz_max_data
If Eeprom_data < 150 Then Eeprom_data = Eeprom_data + 1
Writeeeprom Eeprom_data , Heiz_max_data
Heizung_max = Eeprom_data ' max Wert
übergeben
Bsw2 = Byte_string_wandeln(eeprom_data)
Locate 3 , 18 : Lcd Bsw2
End If
If Taste_ab = 0 And J = 1 Then
Do
Reset Watchdog
Loop Until Taste_ab = 1
Readeeprom Eeprom_data , Heiz_max_data
If Eeprom_data > 0 Then Eeprom_data = Eeprom_data - 1
Writeeeprom Eeprom_data , Heiz_max_data
Heizung_max = Eeprom_data ' max Wert
übergeben
Bsw2 = Byte_string_wandeln(eeprom_data)
Locate 3 , 18 : Lcd Bsw2
End If
If Taste_men = 0 Then ' Menü
Tasten Abfrage
I = 0
Do
If I = 200 Then Goto Anzeige_gemischt
Incr I
Waitms 10
Reset Watchdog
Loop Until Taste_men = 1
Toggle J
Waitms 250
End If
Incr Zaehler ' Zähler für
Zeit bis Displ.regeneration
Reset Watchdog
Loop Until Zaehler = 10 ' incr und
abfragen
If H = 0 And J = 0 Then ' 1. Hälfte
regenerieren
Locate 1 , 9 : Lcd "Men" ; Chr(1)
Locate 3 , 1 : Lcd "Heizung max. ="
H = 1
Zaehler = 0
End If
If H = 0 And J = 1 Then ' 1. Hälfte
regenerieren
Locate 1 , 9 : Lcd "Men" ; Chr(1)
Locate 3 , 1 : Lcd "Heizung max. " ; Chr(0)
H = 1
Zaehler = 0
End If
If H = 1 And J = 0 Then ' 2. Hälfte
regenerieren
Locate 2 , 1 : Lcd "Boiler max. " ; Chr(0)
Locate 4 , 1 : Lcd "Exit = lange Enter"
H = 0
Zaehler = 0
End If
If H = 1 And J = 1 Then ' 2. Hälfte
regenerieren
Locate 2 , 1 : Lcd "Boiler max. ="
Locate 4 , 1 : Lcd "Exit = lange Enter"
H = 0
Zaehler = 0
End If
Reset Watchdog
Gosub Relais_steuerung
Loop
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - -
Anzeige_einstellungen:
Zaehler = 0
H = 0
J = 0
Cls
Locate 1 , 5 : Lcd "Enstellungen" ' Display
ausgabe
Locate 2 , 1 : Lcd "Sicherheit Rel.="
Locate 3 , 1 : Lcd "Displ. helligk.="
Locate 4 , 1 : Lcd "Exit = lange Enter"
Readeeprom Eeprom_data , Dis_hel_data
K = Eeprom_data
K = K * 100
K = K / 255
Eeprom_data = K
Bsw2 = Byte_string_wandeln(eeprom_data)
Locate 3 , 18 : Lcd Bsw2
Readeeprom Eeprom_data , Sich_rel_data
If Eeprom_data = 0 Then
Locate 2 , 18 : Lcd "Aus"
Else
Locate 2 , 18 : Lcd "Ein"
End If
Do
Reset Watchdog
Loop Until Taste_men = 1
Waitms 200
Do
Do
If Taste_ab = 0 And J = 0 Then '
Tastenabfrage
Do
Reset Watchdog
Loop Until Taste_ab = 1
Readeeprom Eeprom_data , Sich_rel_data
If Eeprom_data = 0 Then
Eeprom_data = 1
Writeeeprom Eeprom_data , Sich_rel_data
Sich_rel = 1
Sich_rel_bit = 1
Locate 2 , 18 : Lcd "Ein"
Gosub Erklaerung_sich_rel
Else
Eeprom_data = 0
Writeeeprom Eeprom_data , Sich_rel_data
Sich_rel = 0
Sich_rel_bit = 0
Locate 2 , 18 : Lcd "Aus"
Gosub Erklaerung_sich_rel
End If
Waitms 200
End If
If Taste_auf = 0 And J = 0 Then
Do
Reset Watchdog
Loop Until Taste_auf = 1
Readeeprom Eeprom_data , Sich_rel_data
If Eeprom_data = 0 Then
Eeprom_data = 1
Writeeeprom Eeprom_data , Sich_rel_data
Sich_rel = 1
Sich_rel_bit = 1
Locate 2 , 18 : Lcd "Ein"
Goto Erklaerung_sich_rel
Else
Eeprom_data = 0
Writeeeprom Eeprom_data , Sich_rel_data
Sich_rel = 0
Sich_rel_bit = 0
Locate 2 , 18 : Lcd "Aus"
Goto Erklaerung_sich_rel
End If
Waitms 200
End If
If Taste_auf = 0 And J = 1 Then
Do
Reset Watchdog
Loop Until Taste_auf = 1
Readeeprom Eeprom_data , Dis_hel_data
If Eeprom_data < 255 Then Eeprom_data = Eeprom_data + 5
Hintergrundbel = Eeprom_data
Writeeeprom Eeprom_data , Dis_hel_data
K = Eeprom_data
K = K * 100
K = K / 255
Eeprom_data = K
Bsw2 = Byte_string_wandeln(eeprom_data)
Locate 3 , 18 : Lcd Bsw2
End If
If Taste_ab = 0 And J = 1 Then
Do
Reset Watchdog
Loop Until Taste_ab = 1
Readeeprom Eeprom_data , Dis_hel_data
If Eeprom_data > 0 Then Eeprom_data = Eeprom_data - 5
Hintergrundbel = Eeprom_data
Writeeeprom Eeprom_data , Dis_hel_data
K = Eeprom_data
K = K * 100
K = K / 255
Eeprom_data = K
Bsw2 = Byte_string_wandeln(eeprom_data)
Locate 3 , 18 : Lcd Bsw2
End If
If Taste_men = 0 Then ' Menü
Tasten abfrage
I = 0
Do
If I = 200 Then Goto Anzeige_gemischt
Incr I
Waitms 10
Reset Watchdog
Loop Until Taste_men = 1
Toggle J
Waitms 250
End If
Incr Zaehler ' Zähler für
Zeit bis Displ.regeneration
Reset Watchdog
Loop Until Zaehler = 10 ' incr und
abfragen
If H = 0 And J = 0 Then ' 1. Hälfte
regenerieren
Locate 1 , 5 : Lcd "Enstellungen"
Locate 3 , 1 : Lcd "Displ. helligk.="
H = 1
Zaehler = 0
End If
If H = 0 And J = 1 Then ' 1. Hälfte
regenerieren
Locate 1 , 5 : Lcd "Enstellungen"
Locate 3 , 1 : Lcd "Displ. helligk." ; Chr(0)
H = 1
Zaehler = 0
End If
If H = 1 And J = 0 Then ' 2. Hälfte
regenerieren
Locate 2 , 1 : Lcd "Sicherheit Rel." ; Chr(0)
Locate 4 , 1 : Lcd "Exit = lange Enter"
H = 0
Zaehler = 0
End If
If H = 1 And J = 1 Then ' 2. Hälfte
regenerieren
Locate 2 , 1 : Lcd "Sicherheit Rel.="
Locate 4 , 1 : Lcd "Exit = lange Enter"
H = 0
Zaehler = 0
End If
Reset Watchdog
Gosub Relais_steuerung
Loop
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - -
Anzeige_heizung_uberhitzt:
Cls
Locate 1 , 1 : Lcd "Heizung " ; Chr(1) ; "berhitzt!!!" ' Display
ausgabe
Locate 2 , 1 : Lcd "Neustart: Enter"
Locate 3 , 1 : Lcd "dr" ; Chr(1) ; "cken und"
Locate 4 , 1 : Lcd "Sicherheit Rel.= Aus"
Do
If Taste_men = 0 Then ' Taster für
Enstellungen abfragen
Do
Reset Watchdog
Loop Until Taste_men = 1
Waitms 100
Goto Anzeige_einstellungen:
End If
Reset Watchdog
Gosub Relais_steuerung
Loop
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - -
Erklaerung_sich_rel:
Readeeprom Eeprom_data , Heiz_max_data ' Heizung
max Wert auslesen
If Eeprom_data >= 150 Then Eeprom_data = 150
Heizung_max = Eeprom_data
Readeeprom Eeprom_data , Boiler_max_data ' Boiler max
Wert auslesen
If Eeprom_data >= 150 Then Eeprom_data = 150
Boiler_max = Eeprom_data
Zaehler = 0
If Sich_rel_bit = 1 Then ' abfragen
ob Sich. Relais ein oder ausgesch. ist
' und eine Erklärung ausgeben
Cls
Locate 1 , 6 : Lcd "Erkl" ; Chr(2) ; "rung:"
Locate 2 , 1 : Lcd "Sicherheit Rel.= Ein"
Locate 3 , 1 : Lcd "Heizng war " ; Chr(1) ; "berhitzt"
Locate 4 , 1 : Lcd "und wurde ausgesch."
Else
Cls
Locate 1 , 6 : Lcd "Erkl" ; Chr(2) ; "rung: "
Locate 2 , 1 : Lcd "Sicherheit Rel.= Aus"
Locate 3 , 1 : Lcd "Heizung l" ; Chr(2) ; "uft normal"
Locate 4 , 1 : Lcd "mit " ; Chr(3) ; "berwachung"
End If
Do
If Taste_auf = 0 Or Taste_ab = 0 Or Taste_men = 0 Then '
Taste auf oder ab abfragen und zurück ins
Do
Reset Watchdog '
Einstellungs Menü wechseln oder
Loop Until Taste_auf = 1 And Taste_ab = 1 And Taste_men = 1
' nach 10sec. automatisch dahin gehen
Goto Anzeige_einstellungen
End If
Waitms 100
Incr Zaehler
Reset Watchdog
Loop Until Zaehler = 100
Goto Anzeige_einstellungen
'-----------------------------------------------------------------------
-------------------------
'---------------------------------- Unterprogramme
----------------------------------------
'-----------------------------------------------------------------------
-------------------------
Function Temp_ermitteln(channel As Byte) As Byte
Local Temp As Long
Local Wert As Word
Local A As Byte
Local B As Word
Start Adc
A = 0 ' aus 20
Messwerten den Mittelwert errechnen
B = 0
Do
Wert = Getadc(channel)
Waitms 1
B = B + Wert
Incr A
Loop Until A = 20
B = B / 20
B = B - 475 ' Messert in
Temperaturwert umrechnen
Temp = B * 10
If Temp > 0 And Temp < 1900 Then Temp = Temp / 17
If Temp > 1900 Then Temp = Temp / 16
Stop Adc
Temp_ermitteln = Temp + 3 ' Temperatur
um 3 Grad angehoben (zum Tolleranzausgleich)
Reset Watchdog
End Function
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - -
Function Byte_string_wandeln(wert As Byte) As String
Local A As String * 3
Local B As Byte
B = Wert
A = Str(b) ' Byte in
Sring umwandeln
A = Format(a , " 0") ' und
Formatieren
Byte_string_wandeln = A
Reset Watchdog
End Function
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - -
Relais_steuerung:
Heizung_temp = Temp_ermitteln(heizung) '
Temperaturen abfragen
Kollektor_temp = Temp_ermitteln(kollektor)
Boiler_1_oben_temp = Temp_ermitteln(boiler_1_oben)
Boiler_1_mitte_temp = Temp_ermitteln(boiler_1_mitte)
Boiler_1_unten_temp = Temp_ermitteln(boiler_1_unten)
Boiler_2_oben_temp = Temp_ermitteln(boiler_2_oben)
Boiler_2_mitte_temp = Temp_ermitteln(boiler_2_mitte)
Boiler_2_unten_temp = Temp_ermitteln(boiler_2_unten)
' Sicherheits Relais abfrage
If Heizung_temp >= Heizung_max Then
Sich_rel = 1
Sich_rel_bit = 1
Eeprom_data = 1
Writeeeprom Eeprom_data , Sich_rel_data
End If
Reset Watchdog
'Heizungs Pumpen abfrage
Temp_1 = Heizung_temp - 2
Temp_2 = Boiler_max - 2
If Temp_1 >= Boiler_1_mitte_temp And Boiler_1_mitte_temp <= Temp_2
And Kollektor_temp <= 45 And Heizung_temp > 25 Then Heiz_pum = 1
Temp_1 = Boiler_2_unten_temp - 2
Temp_2 = Boiler_1_unten_temp - 2
If Temp_1 >= Boiler_max And Temp_2 >= Boiler_max And Heizung_temp <
Boiler_max Then Heiz_pum = 1 ' geändert: And Temp_2 >= Boiler_max
Temp_2 = Boiler_1_unten_temp - 5
If Temp_2 >= Boiler_max And Heizung_temp < Boiler_max Then Heiz_pum =
1
If Boiler_1_unten_temp <= Boiler_max And Boiler_2_unten_temp <=
Boiler_max And Kollektor_temp >= 47 Then Heiz_pum = 0
If Heizung_temp <= Boiler_1_mitte_temp And Boiler_1_unten_temp <=
Boiler_max Then Heiz_pum = 0
If Boiler_1_mitte_temp >= Boiler_max And Heizung_temp >=
Boiler_1_mitte_temp And Boiler_1_unten_temp <= Boiler_max Then Heiz_pum
= 0
If Boiler_1_unten_temp >= Boiler_max And Heizung_temp >= Boiler_max
Then Heiz_pum = 0
Reset Watchdog
'Solar Pumpen abfrage
Temp_1 = Kollektor_temp - 4
If Temp_1 >= Boiler_1_unten_temp And Kollektor_temp >= 25 Then
Sola_pum = 1
Else
If Kollektor_temp <= Boiler_1_unten_temp Or Kollektor_temp < 22
Then Sola_pum = 0
End If
Reset Watchdog
'Boiler Pumpe abfrage
Temp_1 = Boiler_1_unten_temp - 2
If Temp_1 >= Boiler_max Then
Temp_1 = Heizung_temp + 2
Temp_2 = Kollektor_temp - 2
If Temp_1 <= Kollektor_temp Or Temp_2 >= Boiler_max Then
Boil_pum = 1
Magn_ven = 0
Else
If Boiler_1_unten_temp <= Boiler_max Or Kollektor_temp <=
Boiler_max Then
Boil_pum = 0
Else
If Heizung_temp >= Kollektor_temp And Boiler_1_mitte >=
Boiler_max Then Boil_pum = 0
End If
End If
Else
Reset Watchdog
'Magnet Ventil abfrage
Temp_1 = Boiler_1_oben_temp + 2
Temp_2 = Boiler_2_oben_temp + 2
If Boiler_2_oben_temp >= Temp_1 Then Enable Interrupts
If Boiler_2_oben_temp >= Temp_1 And Nachlaufzeit > 0 Then Magn_ven
= 1
If Boiler_1_oben_temp >= Temp_2 Then
Magn_ven = 0
Disable Interrupts
End If
If Boiler_1_unten_temp <= Boiler_max Or Kollektor_temp <=
Boiler_max Then
Boil_pum = 0
Else
If Heizung_temp >= Kollektor_temp And Boiler_1_mitte >=
Boiler_max Then Boil_pum = 0
End If
End If
Reset Watchdog
Return
'_______________________________________________________________________
_______________________
End
'-----------------------------------------------------------------------
-------------------------
'---------------------------------------- ISR
---------------------------------------------
'-----------------------------------------------------------------------
-------------------------
Int1_isr:
Push R12 ' save
registers
Push R13
Push R14
Push R15
If Nachlaufzeit < 10 Then
Waitms 1
If Wasseruhr = 0 Then
If Nachlaufzeit > 0 Then
Nachlaufzeit = 180 ' in
Sekunden
Isr_zahler = 0
Enable Timer0
Else
Isr_counter = 0
Do
If Wasseruhr = 1 Then
Nachlaufzeit = 180 ' in
Sekunden
Isr_zahler = 0
Isr_counter = 199
Enable Timer0
End If
Incr Isr_counter
Waitms 2
Loop Until Isr_counter = 200
End If
End If
End If
Pop R15 ' restore
registers
Pop R14
Pop R13
Pop R12
Reset Watchdog
Return
Timer0_isr:
Push R12 ' save
registers
Push R13
Push R14
Push R15
Timer0 = 100
Isr_counter = 1
If Nachlaufzeit > 0 Then
If Isr_zahler = 100 Then
Isr_zahler = 0
If Nachlaufzeit > 0 Then Decr Nachlaufzeit
Else
Incr Isr_zahler
End If
Else
Magn_ven = 0
Disable Timer0
End If
Pop R15 ' restore
registers
Pop R14
Pop R13
Pop R12
Reset Watchdog
Return
MFG
iprik schrieb: > Int1 überprüft die Wasseruhr und Timer0 zählt 1min ab. > Nur seit dem ich diese Funktion im Code integriert habe, hängt sich der > Prozessor manchmal auf. > > Was ist da los?? Kann ich nicht sagen. Aber ein paar allgemeine Dinge > Push R12 ' save > registers > Push R13 > Push R14 > Push R15 Lass die Register in Ruhe! Die gehen dich nichts an, um die kümmert sich der Compiler schon selbst. > Waitms 1 In einer ISR wird nicht gewartet! Während eine ISR läuft, sind Interrupts gesperrt. Wenn daher eine ISR abläuft und dort gewartet wird, können andere Interrupts verloren gehen.
Karl heinz Buchegger schrieb: >> Waitms 1 > > In einer ISR wird nicht gewartet! > Während eine ISR läuft, sind Interrupts gesperrt. Wenn daher eine ISR > abläuft und dort gewartet wird, können andere Interrupts verloren gehen. Und als besonders fatal wird sich diese Warterei erweisen, wenn der Watchdog in der Zwischenzeit zuschlägt.
1 | Do |
2 | If Wasseruhr = 1 Then |
3 | Nachlaufzeit = 180 |
4 | Isr_zahler = 0 |
5 | Isr_counter = 199 |
6 | Enable Timer0 |
7 | End If |
8 | Incr Isr_counter |
9 | Waitms 2 |
10 | Loop Until Isr_counter = 200 |
Du wartest hier fast eine halbe Sekunde in einem ISR herum, das geht überhaupt gar nicht. Setz einfach nur Flags und werte das im Hauptprogramm entsprechend aus. Dort kannst du gern warten, bis der Arzt kommt. /Hannes
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.