Forum: Mikrocontroller und Digitale Elektronik Stören Interrups in Bascom den Code??


von iprik (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Johannes S. (demofreak)


Lesenswert?

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
Noch kein Account? Hier anmelden.