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.