PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uhr und Wochentag



martin66119
28.10.2007, 16:57
Einen schönen Sonntag euch allen hier im Forum!

Kann mir bitte jemand helfen. Ich weiß, dass der Code etwas lang ist, jedoch möchte ich ihn komplett hier hereinstellen. Ggf. kann ihn ja jemand oder Teile davon brachen.

Das Problem was ich habe ist, ich möchte gerne Abhängig vom Wochentag die Minimale Kesseltemperatur ändern. Nur wenn ich Weekday auf dem Display ausgebe kommt heute der Tag "5". Was mache ich da falsch.

Ein paar Infos zu meinem Programm.
In meinem Programm lese ich ein paar DS1820 aus. Zusätzlich noch zwei Temperaturwerte mit dem 10 Bit-AD-Wandler. Abhängig von den Messwerten und der Uhzeit schalte ich den Brenner sowie die Punpen ein und aus.

Ich weiß, dass es etwas anfängerhaft programmiert ist. Wie auch immer! Ich lerne noch,
__________________________________________________ ___________


$regfile = "m8def.dat"
$crystal = 3686400
$hwstack = 256
$swstack = 256
$framesize = 256
'***************************Config Schaltausgänge*******************************
Config Portb = Output
Brenner Alias Portb.3
Pumpefb Alias Portb.4
Pumpehk Alias Portb.5
'**************************Def. allgemeiner Variabeln***************************
Dim Tagnacht As Bit
Dim Nachtbetrieb As Byte
Dim Tagbetrieb As Byte
Dim Tempmessstelle(8) As Single
Dim Brennerstarts As Integer
Dim Interrupt_brenner As Bit
Dim Zeit_in_min As Integer
Dim Kessel_max As Single
Dim Kessel_min As Single
Dim Kessel_grenz_max As Single
Dim Kessel_grenz_min As Single
Dim Delta_kessel As Single
Dim Delta_vl_rl_fb As Single
Dim Wassertemp As Bit
Dim Aussentemp As Single
Dim Flag_aussentemp As Bit

Aussentemp = 2.68
Dim Flag_frequenz As Bit
Flag_frequenz = 0

Kessel_max = 57.0 '60.0
Kessel_min = 40.0 '43.0
Kessel_grenz_max = Kessel_max
Kessel_grenz_min = Kessel_min

Wassertemp = 1

Brennerstarts = 0
Interrupt_brenner = 0

Nachtbetrieb = 22
Tagbetrieb = 4

Const Tagtemp_og = 21.8
Const Tagtemp_ug = 21.6
Const Nachttemp_og = 21.4
Const Nachttemp_ug = 21.2

'**************************Funktionen LCD-Display*******************************

Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port

Dim ___lcdno As Byte

___lcdno = 0
Initlcd
Cursor Off
Cls
___lcdno = 1
Initlcd
Cursor Off
Cls
'************************************************* ******************************

Config 1wire = Portc.1 'DS1820

Match_rom Alias &H55
Read_scratchpad Alias &HBE
Start_conversion Alias &H44

Innen Alias 0
Vorlauf_fb Alias 1
Rücklauf_fb Alias 2
Vorlauf_hk Alias 3
Kessel Alias 4

Dim Read_temp As Integer
Dim Sensor_ids(48) As Byte
Dim Id As Byte
Dim Offset As Byte
Dim Ds_array(7) As Byte
Dim Bruchteil As Single
Dim Temperatur As Single
Dim I As Integer
'*************************Config INT0 zur Frequenzmesung************************
Enable Interrupts
Enable Int0
Config Int0 = Falling
Dim Flankenzahl As Integer
Flankenzahl = 0
On Int0 Irq
'*************************Config Timer1*****************************************
Config Timer1 = Timer , Prescale = 256 '256 '64 '256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 51135 'Timer1 soll schon von 34285 wegzählen
'***************************Config RTC******************************************
Config Sda = Portc.4
Config Scl = Portc.5

Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1

Config Clock = User ' this will dim the bytes automatic
Dim Weekday As Byte

'Time$ = "01:50:00" ' to watch the day changing value
Date$ = "10.28.07" ' erstmaliges stellen der Uhr
'Weekday = 7
'***************************AD-Config*******************************************
Config Adc = Single , Prescaler = Auto
Dim Faktor As Single
Dim Sp As Integer
Faktor = 5.28 / 1023

'***************************ID 1Wire configurieren******************************
For Id = 1 To 40 'Einlesen der 5 Sensoren IDs (5*8 Byte)
I = Id - 1
Readeeprom Sensor_ids(id) , I
Next Id
'**************************Initialisierung******** ******************************

Brenner = 0
Pumpefb = 1
Pumpehk = 1

'**************************Hauptrogramm*********** ******************************
Do
Waitms 1000
For Id = Innen To Kessel 'Kessel
Offset = Id * 8
Offset = Offset + 1 'Offset geht auf 1, 9, 17, 25 und 33
1wreset 'hier wird der Temperaturwert eingelesen
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8 '8 Byte ID wird übertragen
1wwrite Read_scratchpad
For I = 1 To 7 'nur bis 7, weil 8 und 9 uninteressant
Ds_array(i) = 1wread()
Next I
Read_temp = Makeint(ds_array(1) , Ds_array(2))
1wreset 'jetzt wird wieder die Konvertierung gestartet
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8
1wwrite Start_conversion
Shift Read_temp , Right
If 127 < Read_temp Then Read_temp = Read_temp - 32768
Bruchteil = 16 - Ds_array(7)
Bruchteil = Bruchteil / 16
Bruchteil = Bruchteil - 0.25
Temperatur = Read_temp + Bruchteil

If Temperatur >= -16.0 Then
Tempmessstelle(id + 1) = Read_temp + Bruchteil 'Temperatur
End If
___lcdno = 0
Locate 1 , 2 : Lcd "BO-U RA-T KE-T VLB-T RLB-T"
Select Case Id
Case Innen: '1
Locate 2 , 7 : Lcd Fusing(tempmessstelle(1) , "#.#")
Locate 2 , 11 : Lcd " "
Case Kessel: '2
Locate 2 , 12 : Lcd Fusing(tempmessstelle(2) , "#.#")
Locate 2 , 16 : Lcd " "
Case Vorlauf_fb: '3
Locate 2 , 17 : Lcd Fusing(tempmessstelle(3) , "#.#")
Locate 2 , 21 : Lcd " "
Case Rücklauf_fb: '4
Locate 2 , 23 : Lcd Fusing(tempmessstelle(4) , "#.#")
Locate 2 , 27 : Lcd " "
End Select
Locate 2 , 6 : Lcd " "
If Tempmessstelle(8) >= 0 Then
Locate 2 , 2 : Lcd Fusing(tempmessstelle(8) , "#.##")
Else
Locate 2 , 1 : Lcd Fusing(tempmessstelle(8) , "#.#")
End If

___lcdno = 1

Locate 2 , 20
Lcd Time$
Locate 2 , 15 : Lcd " "
Select Case Id
Case Vorlauf_hk: '5
Locate 1 , 1 : Lcd "Vl-hk " : Lcd Fusing(tempmessstelle(5) , "#.#")
Locate 1 , 11 : Lcd " "
End Select
'Locate 1 , 12 : Lcd "AU-T " : Lcd Fusing(tempmessstelle(7) , "#.##")
Locate 1 , 12 : Lcd "AU-T " : Lcd Fusing(aussentemp , "#.##")
Locate 1 , 21 : Lcd " "
Locate 2 , 1 : Lcd "Starts:" '"B-Start: "
Locate 2 , 9 : Lcd Brennerstarts 'Brennerstarts
Locate 2 , 16
Lcd Weekday
Cursor Off
Next Id

If _hour >= Nachtbetrieb Or _hour < Tagbetrieb Then 'Or _hour = 7 Or _hour = 8 Then
Tagnacht = 0 'Nachteinstellung
Else
Tagnacht = 1 'Tageinstellung
End If

Gosub Ad_wandler
Gosub Überwachung_kesseltemp 'Aussentemp_mittel
Gosub Schalterelais
Gosub Aussentemp_mittel
Gosub Kesselgrenzwert
'Gosub Überwachung_pumpen
If Wassertemp = 0 Then
Gosub Überwachung_brauchwassertemp
End If
Loop
End
'*******************************Uhr stellen + 1min******************************
Uhr_plus_min:
Return
'*******************************Frequenzzähler**** ******************************
Frequenz:
Return

'*******************************Überwachung Brauchwassertemp********************
Überwachung_brauchwassertemp:
If Tempmessstelle(4) <= 42.0 Then
Wassertemp = 0
If Tempmessstelle(2) < 48.0 Then
Brenner = 1
End If
If Tempmessstelle(2) > 58.0 Then
Brenner = 0
End If
Pumpehk = 1
Pumpefb = 0
End If
If Tempmessstelle(2) >= 50 Then
Wassertemp = 1
End If
Return
'*******************************Überwachung Pumpen******************************
Überwachung_pumpen:
If Tempmessstelle(2) < 29.0 Then
Pumpefb = 0
End If
If Tempmessstelle(2) >= 32.0 Then
Pumpefb = 1
End If
If Tempmessstelle(2) < 38.0 Then
Pumpehk = 0
End If
If Tempmessstelle(2) >= 36.0 Then
Pumpehk = 1
End If
Return
'*******************************AD-Wandler**************************************
Ad_wandler:
Start Adc
Sp = Getadc(0)
Tempmessstelle(8) = Sp * Faktor
'Tempmessstelle(8) = Tempmessstelle(8) - 0.35
'Tempmessstelle(8) = 132.14 * Tempmessstelle(8)
'Tempmessstelle(8) = Tempmessstelle(8) - 153.93 ' Boiler_temp unten
Sp = Getadc(2)
Tempmessstelle(7) = Sp * Faktor ' Außentemp
'Sp = Getadc(2)
'Tempmessstelle(6) = Sp * Faktor
Return
'
'**************************Überwachung Kesseltemp*******************************
Überwachung_kesseltemp:
If Tempmessstelle(2) >= Kessel_grenz_max Or Tempmessstelle(8) >= 1.52 Then
Brenner = 0
If Interrupt_brenner = 0 Then
Brennerstarts = Brennerstarts + 1
Interrupt_brenner = 1
End If
End If

If Tempmessstelle(2) < Kessel_grenz_min And Tempmessstelle(8) <= 1.46 Then
Brenner = 1
Interrupt_brenner = 0
End If
Return
'*************************Kesselgrenzwert bestimmen*****************************
Kesselgrenzwert:
If Aussentemp > 1.8 And Aussentemp < 3.0 Then
If Aussentemp >= 2.68 Then ' Aussentemp >= 18 Grad
Delta_kessel = 0
End If

If Aussentemp > 2.10 And Aussentemp < 2.68 Then
Delta_kessel = 2.68 - Aussentemp
Delta_kessel = Delta_kessel * 11
Delta_kessel = Abs(delta_kessel)
End If

If Aussentemp <= 2.10 Then 'Aussentemp <= -7 Grad
Delta_kessel = 0.58 * 11
End If
End If
Return
'*************************Mittelwert der Außentemp******************************
Aussentemp_mittel:
'If _min = 0 Then
Aussentemp = Tempmessstelle(7) + Aussentemp
Aussentemp = Aussentemp / 2
'End If
Return
'*************************Sub Relais schalten***********************************
Schalterelais:
Select Case Tagnacht
Case 0
Gosub Nachtbetrieb
Case 1
Gosub Tagbetrieb
End Select
Return
'**************************Sub für Tagbetrieb**********************************
Tagbetrieb:
'If Weekday = 6 Or Weekday = 7 Then
' If _hour <= 8 Then
'' Kessel_grenz_min = Kessel_min
' Kessel_grenz_max = Kessel_max + Delta_kessel
' Else
' Kessel_grenz_min = Kessel_min + Delta_kessel
' Kessel_grenz_max = Kessel_max + Delta_kessel
' End If
'Else
If _hour <= 12 Then
Kessel_grenz_min = Kessel_min
Kessel_grenz_max = Kessel_max + Delta_kessel
Else
Kessel_grenz_min = Kessel_min + Delta_kessel
Kessel_grenz_max = Kessel_max + Delta_kessel
End If
'End If
If Tempmessstelle(1) <= Tagtemp_ug Then
Pumpefb = 1
End If
If Tempmessstelle(1) >= Tagtemp_og Then
Brenner = 0
Pumpefb = 0
End If
Return
'**************************Sub für Nachtbetrieb*********************************
Nachtbetrieb:
Kessel_grenz_min = 29.0
If Tempmessstelle(2) >= Kessel_grenz_min Then
Brenner = 0
Pumpefb = 1
Else
Brenner = 0
Pumpefb = 0
End If
If _hour = 0 Then 'Brennerstarts auf Null setzen
Brennerstarts = 0
Delta_kessel = 0
Aussentemp = 2.68
End If
Return
'***************************INTO Interrupt**************************************
Irq:
Incr Flankenzahl
Return '
'**************************Subroutine für Timer1*******************************
Isr_von_timer1: 'ISR von Timer1
Timer1 = 51135
Flankenzahl = 0
Return
'***************************Subs für RTC****************************************
Getdatetime:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307

I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop
Return

Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return

'************************************************* ******************************
$eeprom

Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF ' 0
Data &H10 , &H1B , &HD0 , &H23 , &H01 , &H08 , &H00 , &H23 ' 1
Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11 ' 2
Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67 ' 3
'Data &H10 , &HBD , &HB6 , &H23 , &H01 , &H08 , &H00 , &H40 ' 4
Data &H10 , &H56 , &HA3 , &H23 , &H01 , &H08 , &H00 , &H3F ' 5

for_ro
28.10.2007, 18:19
Hallo Martin,
ist das das ganze Programm? Ich vermisse den Aufruf von "Getdatetime".

Gruß

Rolf

martin66119
28.10.2007, 20:32
Hallo Rolf!

Ja, das ist das ganze Programm. Getdatetime ist aber drin. SO ca. 50 Zeilen vor dem Ende. Kann sein, dass der Aufruf nicht richtig ist aber die Uhrzeit funktioniert.

Gruß
Martin

Dirk
28.10.2007, 20:37
Hallo Martin,


Nur wenn ich Weekday auf dem Display ausgebe kommt heute der Tag "5". Was mache ich da falsch.

Du must den Wochentag auch in die RTC schreiben:


I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte Weekday
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop

Gruß Dirk

for_ro
28.10.2007, 20:46
Hallo Rolf!

Getdatetime ist aber drin. SO ca. 50 Zeilen vor dem Ende.



Ne, ich meine den Befehl "Gosub Getdatetime", ebenso "Gosub Setdate" und "Gosub Settime", die müssen doch auch irgendwo sein.

Gruß

Rolf

martin66119
28.10.2007, 21:06
Sorry, das verstehe ich jetzt nicht. Die Befehle stehen nirgendow! Aber die Uhr läuft doch. Was muss ich tun?

Dirk
28.10.2007, 21:21
Hallo Martin,


Die Befehle stehen nirgendow!

Du setzt doch die Anfangswerte für die RTC in der Sub "Setdate:"!

Diese Sub änderst du so, wie ich oben geschrieben habe. Zusätzlich must du dann noch das ' vor Weekday = 7 entfernen, damit der richtige Wochentag in die RTC geschrieben wird.

Gruß Dirk

martin66119
28.10.2007, 21:27
Hallo Dirk

ich habe das von dir eingesetzt: nun sieht es so aus. das ' werde ich entfernen

Getdatetime:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307

I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
'-----------------dein Teil------------------------------
I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte Weekday
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop
'--------------------------------------------------------

_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop
Return

Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return

martin66119
28.10.2007, 21:30
sorry falsch kpiert. so müsste es sein

Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop

I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte Weekday
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop
Return

Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return

Dirk
28.10.2007, 21:31
... ja, und Setdate: würde ich auch noch ändern (d.h. auch den Weekday schreiben).

Gruß Dirk

martin66119
28.10.2007, 21:45
Habe jetz folgendes drin. Auf dem Display erscheint "0"

Weekday = 7
LCD Weekday

Getdatetime:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307

I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop

I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte Weekday
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop

_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop

I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte Weekday
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop
Return

Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return

Dirk
28.10.2007, 21:58
... Setdate ist noch nicht ok. So sollte es sein:

Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 3 ' starting address in 1307
I2cwbyte Weekday ' Weekday
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop
Return


Aus Getdatetime: müssen die Schreibbefehle wieder raus.

martin66119
28.10.2007, 22:06
Ich habe gerade nochmal einen Versuch gestartet mit deinen Änderungen.

Im Disply steht aber immer noch " Null"

Ich poste nochmal meinen ganzen Code



$regfile = "m8def.dat"
$crystal = 3686400
$hwstack = 256
$swstack = 256
$framesize = 256
'***************************Config Schaltausgänge*******************************
Config Portb = Output
Brenner Alias Portb.3
Pumpefb Alias Portb.4
Pumpehk Alias Portb.5
'**************************Def. allgemeiner Variabeln***************************
Dim Tagnacht As Bit
Dim Nachtbetrieb As Byte
Dim Tagbetrieb As Byte
Dim Tempmessstelle(8) As Single
Dim Brennerstarts As Integer
Dim Interrupt_brenner As Bit
Dim Zeit_in_min As Integer
Dim Kessel_max As Single
Dim Kessel_min As Single
Dim Kessel_grenz_max As Single
Dim Kessel_grenz_min As Single
Dim Delta_kessel As Single
Dim Delta_vl_rl_fb As Single
Dim Wassertemp As Bit
Dim Aussentemp As Single
Dim Pumpe_aus_nacht As Bit
Dim Pumpe_aus_nacht_temp As Single
Pumpe_aus_nacht = 0
Pumpe_aus_nacht_temp = 29.0

Aussentemp = 2.68

Kessel_max = 57.0 '60.0
Kessel_min = 40.0 '43.0
Kessel_grenz_max = Kessel_max
Kessel_grenz_min = Kessel_min

Wassertemp = 1

Brennerstarts = 0
Interrupt_brenner = 0

Nachtbetrieb = 22
Tagbetrieb = 4

Const Tagtemp_og = 21.8
Const Tagtemp_ug = 21.6
Const Nachttemp_og = 21.4
Const Nachttemp_ug = 21.2

'**************************Funktionen LCD-Display*******************************

Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port

Dim ___lcdno As Byte

___lcdno = 0
Initlcd
Cursor Off
Cls
___lcdno = 1
Initlcd
Cursor Off
Cls
'************************************************* ******************************

Config 1wire = Portc.1 'DS1820

Match_rom Alias &H55
Read_scratchpad Alias &HBE
Start_conversion Alias &H44

Innen Alias 0
Vorlauf_fb Alias 1
Rücklauf_fb Alias 2
Vorlauf_hk Alias 3
Kessel Alias 4

Dim Read_temp As Integer
Dim Sensor_ids(48) As Byte
Dim Id As Byte
Dim Offset As Byte
Dim Ds_array(7) As Byte
Dim Bruchteil As Single
Dim Temperatur As Single
Dim I As Integer
'**********************************Config Servo*********************************




'*************************Config Timer1*****************************************
Config Timer1 = Timer , Prescale = 256 '256 '64 '256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 51135 'Timer1 soll schon von 34285 wegzählen
'***************************Config RTC******************************************
Config Sda = Portc.4
Config Scl = Portc.5

Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1

Config Clock = User ' this will dim the bytes automatic
Dim Weekday As Byte

'Time$ = "01:50:00" ' to watch the day changing value
Date$ = "28.10.07" ' erstmaliges stellen der Uhr
Weekday = 7
'***************************AD-Config*******************************************
Config Adc = Single , Prescaler = Auto
Dim Faktor As Single
Dim Sp As Integer
Faktor = 5.28 / 1023

'***************************ID 1Wire configurieren******************************
For Id = 1 To 40 'Einlesen der 5 Sensoren IDs (5*8 Byte)
I = Id - 1
Readeeprom Sensor_ids(id) , I
Next Id
'**************************Initialisierung******** ******************************

Brenner = 0
Pumpefb = 1
Pumpehk = 1

'**************************Hauptrogramm*********** ******************************
Do
Waitms 1000
For Id = Innen To Kessel 'Kessel
Offset = Id * 8
Offset = Offset + 1 'Offset geht auf 1, 9, 17, 25 und 33
1wreset 'hier wird der Temperaturwert eingelesen
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8 '8 Byte ID wird übertragen
1wwrite Read_scratchpad
For I = 1 To 7 'nur bis 7, weil 8 und 9 uninteressant
Ds_array(i) = 1wread()
Next I
Read_temp = Makeint(ds_array(1) , Ds_array(2))
1wreset 'jetzt wird wieder die Konvertierung gestartet
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8
1wwrite Start_conversion
Shift Read_temp , Right
If 127 < Read_temp Then Read_temp = Read_temp - 32768
Bruchteil = 16 - Ds_array(7)
Bruchteil = Bruchteil / 16
Bruchteil = Bruchteil - 0.25
Temperatur = Read_temp + Bruchteil

If Temperatur >= -16.0 Then
Tempmessstelle(id + 1) = Read_temp + Bruchteil 'Temperatur
Tempmessstelle(id + 1) = Tempmessstelle(id + 1) - 0.1 'Korrektur Auf Termometer
End If
___lcdno = 0
Locate 1 , 2 : Lcd "BO-U RA-T KE-T VLB-T RLB-T"
Select Case Id
Case Innen: '1
Locate 2 , 7 : Lcd Fusing(tempmessstelle(1) , "#.#")
Locate 2 , 11 : Lcd " "
Case Kessel: '2
Locate 2 , 12 : Lcd Fusing(tempmessstelle(2) , "#.#")
Locate 2 , 16 : Lcd " "
Case Vorlauf_fb: '3
Locate 2 , 17 : Lcd Fusing(tempmessstelle(3) , "#.#")
Locate 2 , 21 : Lcd " "
Case Rücklauf_fb: '4
Locate 2 , 23 : Lcd Fusing(tempmessstelle(4) , "#.#")
Locate 2 , 27 : Lcd " "
End Select
Locate 2 , 6 : Lcd " "
If Tempmessstelle(8) >= 0 Then
Locate 2 , 2 : Lcd Fusing(tempmessstelle(8) , "#.##")
Else
Locate 2 , 1 : Lcd Fusing(tempmessstelle(8) , "#.#")
End If

___lcdno = 1

Locate 2 , 20
Lcd Time$
Locate 2 , 15 : Lcd " "
Select Case Id
Case Vorlauf_hk: '5
Locate 1 , 1 : Lcd "Vl-hk " : Lcd Fusing(tempmessstelle(5) , "#.#")
Locate 1 , 11 : Lcd " "
End Select
'Locate 1 , 12 : Lcd "AU-T " : Lcd Fusing(tempmessstelle(7) , "#.##")
Locate 1 , 12 : Lcd "AU-T " : Lcd Fusing(aussentemp , "#.##")
Locate 1 , 21 : Lcd " "
Locate 2 , 1 : Lcd "Starts:" '"B-Start: "
Locate 2 , 9 : Lcd Brennerstarts 'Brennerstarts
Locate 2 , 16
Lcd Weekday
Cursor Off
Next Id

If _hour >= Nachtbetrieb Or _hour < Tagbetrieb Then 'Or _hour = 7 Or _hour = 8 Then
Tagnacht = 0 'Nachteinstellung
Else
Tagnacht = 1 'Tageinstellung
End If

Gosub Ad_wandler
Gosub Überwachung_kesseltemp 'Aussentemp_mittel
Gosub Schalterelais
Gosub Aussentemp_mittel
Gosub Kesselgrenzwert
'Gosub Überwachung_pumpen
If Wassertemp = 0 Then
Gosub Überwachung_brauchwassertemp
End If
Loop
End

'*******************************Überwachung Brauchwassertemp********************
Überwachung_brauchwassertemp:
If Tempmessstelle(4) <= 42.0 Then
Wassertemp = 0
If Tempmessstelle(2) < 48.0 Then
Brenner = 1
End If
If Tempmessstelle(2) > 58.0 Then
Brenner = 0
End If
Pumpehk = 1
Pumpefb = 0
End If
If Tempmessstelle(2) >= 50 Then
Wassertemp = 1
End If
Return
'*******************************Überwachung Pumpen******************************
Überwachung_pumpen:
If Tempmessstelle(2) < 29.0 Then
Pumpefb = 0
End If
If Tempmessstelle(2) >= 32.0 Then
Pumpefb = 1
End If
If Tempmessstelle(2) < 38.0 Then
Pumpehk = 0
End If
If Tempmessstelle(2) >= 36.0 Then
Pumpehk = 1
End If
Return
'*******************************AD-Wandler**************************************
Ad_wandler:
Start Adc
Sp = Getadc(0)
Tempmessstelle(8) = Sp * Faktor
'Tempmessstelle(8) = Tempmessstelle(8) - 0.35
'Tempmessstelle(8) = 132.14 * Tempmessstelle(8)
'Tempmessstelle(8) = Tempmessstelle(8) - 153.93 ' Boiler_temp unten
Sp = Getadc(2)
Tempmessstelle(7) = Sp * Faktor ' Außentemp
'Sp = Getadc(2)
'Tempmessstelle(6) = Sp * Faktor
Return
'
'**************************Überwachung Kesseltemp*******************************
Überwachung_kesseltemp:
If Tempmessstelle(2) >= Kessel_grenz_max Or Tempmessstelle(8) >= 1.52 Then
Brenner = 0
If Interrupt_brenner = 0 Then
Brennerstarts = Brennerstarts + 1
Interrupt_brenner = 1
End If
End If

If Tempmessstelle(2) < Kessel_grenz_min And Tempmessstelle(8) <= 1.46 Then
Brenner = 1
Interrupt_brenner = 0
End If
Return
'*************************Kesselgrenzwert bestimmen*****************************
Kesselgrenzwert:
If Aussentemp > 1.8 And Aussentemp < 3.0 Then
If Aussentemp >= 2.68 Then ' Aussentemp >= 18 Grad
Delta_kessel = 0
End If

If Aussentemp > 2.10 And Aussentemp < 2.68 Then
Delta_kessel = 2.68 - Aussentemp
Delta_kessel = Delta_kessel * 11
Delta_kessel = Abs(delta_kessel)
End If

If Aussentemp <= 2.10 Then 'Aussentemp <= -7 Grad
Delta_kessel = 0.58 * 11
End If
End If
Return
'*************************Mittelwert der Außentemp******************************
Aussentemp_mittel:
'If _min = 0 Then
Aussentemp = Tempmessstelle(7) + Aussentemp
Aussentemp = Aussentemp / 2
'End If
Return
'*************************Sub Relais schalten***********************************
Schalterelais:
Select Case Tagnacht
Case 0
Gosub Nachtbetrieb
Case 1
Gosub Tagbetrieb
End Select
Return
'**************************Sub für Tagbetrieb**********************************
Tagbetrieb:
'If Weekday = 6 Or Weekday = 7 Then
' If _hour <= 8 Then
'' Kessel_grenz_min = Kessel_min
' Kessel_grenz_max = Kessel_max + Delta_kessel
' Else
' Kessel_grenz_min = Kessel_min + Delta_kessel
' Kessel_grenz_max = Kessel_max + Delta_kessel
' End If
'Else
If _hour <= 12 Then
Kessel_grenz_min = Kessel_min
Kessel_grenz_max = Kessel_max + Delta_kessel
Else
Kessel_grenz_min = Kessel_min + Delta_kessel
Kessel_grenz_max = Kessel_max + Delta_kessel
End If
'End If
If Tempmessstelle(1) <= Tagtemp_ug Then
Pumpefb = 1
End If
If Tempmessstelle(1) >= Tagtemp_og Then
Brenner = 0
Pumpefb = 0
End If
Return
'**************************Sub für Nachtbetrieb*********************************
Nachtbetrieb:
If _hour = Nachtbetrieb And Pumpe_aus_nacht = 0 Then
Pumpe_aus_nacht = 1
Pumpe_aus_nacht_temp = Tempmessstelle(4) + 2
End If
Kessel_grenz_min = Pumpe_aus_nacht_temp
If Tempmessstelle(2) >= Kessel_grenz_min Then
Brenner = 0
Pumpefb = 1
Else
Brenner = 0
Pumpefb = 0
End If
If _hour = 0 Then 'Brennerstarts auf Null setzen
Brennerstarts = 0
Delta_kessel = 0.0
Aussentemp = 2.68
Pumpe_aus_nacht = 0
End If
Return
'
'**************************Subroutine für Timer1*******************************
Isr_von_timer1: 'ISR von Timer1
Timer1 = 51135
Return
'***************************Subs für RTC****************************************
Getdatetime:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307

I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop

I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte Weekday
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop

_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 3 ' starting address in 1307
I2cwbyte Weekday ' Weekday
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop
Return

Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return



'************************************************* ******************************
$eeprom

Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF ' 0
Data &H10 , &H1B , &HD0 , &H23 , &H01 , &H08 , &H00 , &H23 ' 1
Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11 ' 2
Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67 ' 3
'Data &H10 , &HBD , &HB6 , &H23 , &H01 , &H08 , &H00 , &H40 ' 4
Data &H10 , &H56 , &HA3 , &H23 , &H01 , &H08 , &H00 , &H3F ' 5

Dirk
28.10.2007, 22:48
Hallo Martin,

so geht das noch nicht. Ich habe mir jetzt 'mal dein Prog etwas genauer angesehen:
1. Config Clock = User bedeutet, dass nur die Clock-Variablen erzeugt werden. Die Clock läuft aber nicht (kein Fortschritt von _second).
Das heißt: Getdatetime, Settime und Setdate brauchst du nicht. Du kannst sie mit Return irgendwo einstellen:
Getdatetime:
Settime:
Setdate:
Return
Du nennst deine Schreib- und Leseroutine anders: Z.B. Schreib_rtc, Lese_rtc. Darin schreibst/liest du immer ALLE Werte (Sekunden bis Jahr).

2. Am Anfang deiner Hauptschleife liest du die RTC mit Lese_rtc. Du vergleichst die Sekunde (_second) mit der letzten Sekunde (die du vorher z.B. in einer Variablen Oldsecond gespeichert hast). Sind die ungleich, läuft deine Schleife weiter ab (auch mit LCD-Anzeige). Wenn _second = Oldsecond, dann wird gewartet. Das Waitms 1000 nimmst du dafür ganz weg.

3. Beim erstmaligen Stellen der RTC hier ...:
'Time$ = "01:50:00" ' to watch the day changing value
Date$ = "28.10.07" ' erstmaliges stellen der Uhr
Weekday = 7
... müßte anschließend einmalig Schreib_rtc aufgerufen werden, um die Werte in die RTC zu bringen.

4. Auf den Timer-Interrupt kannst du komplett verzichten. (Alles weg,- auch die ISR)

Gruß Dirk

martin66119
28.10.2007, 22:58
So wie ich das verstehe (eigentlich verstehe ich nichts) meine ganze Datum und Zeit - Funktion falsch. Aber wie ich es machen soll, verstehe ich noch nicht.

Hast du ggf. ein Beispiel? Wäre sehr nett!



Martin

Dirk
28.10.2007, 23:07
... mache mich morgen 'mal dran!

Nächtle Dirk

martin66119
29.10.2007, 07:02
Guten Morgen Dirk,

habe im Forum hier was gefunden.

Hier der Code: Werde heute Abend mal schauen ob das damit geht.

$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600

Config Sda = Portc.4
Config Scl = Portc.5

Dim _weekday As Byte
Dim _day As Byte
Dim _month As Byte
Dim _year As Byte
Dim _sec As Byte
Dim _min As Byte
Dim _hour As Byte

Dim Ds1307w As Byte
Dim Ds1307r As Byte

Ds1307w = &B11010000
Ds1307r = &B11010001

_day = 23
_month = 6
_year = 05
_sec = 10
_min = 10
_hour = 13
_weekday = 1

Rem Zeitsetzen
_sec = Makebcd(_sec)
_min = Makebcd(_min)
_hour = Makebcd(_hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte _sec
I2cwbyte _min
I2cwbyte _hour
I2cstop

Rem Datumsetzen
_day = Makebcd(_day)
_month = Makebcd(_month)
_year = Makebcd(_year)
_weekday = Makebcd(_weekday)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
'I2cwbyte _weekday
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop


Do

Rem Datum und Zeit holen
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0

I2cstart
I2cwbyte Ds1307r
I2crbyte _sec , Ack
I2crbyte _min , Ack
I2crbyte _hour , Ack
I2crbyte _weekday , Ack
I2crbyte _day , Ack
I2crbyte _month , Ack
I2crbyte _year , Nack
I2cstop

Print Bcd(_day) ; "/" ; Bcd(_month) ; "/" ; Bcd(_year)
Print Bcd(_hour) ; "/" ; Bcd(_min) ; "/" ; Bcd(_sec)
Print "---------------------------------------"

Waitms 1000

Loop

Gruß und Danke

Martin

Dirk
29.10.2007, 16:43
... ja das sieht gut aus!

Probier es damit. Das einzige, was ich anders machen würde ist das Warten für 1s. Ich würde die Do-Loop-Schleife mit der RTC steuern:
Am Anfang RTC lesen, _second mit der letzten ausgelesenen Sekunde vergleichen. Wenn immer noch dieselbe Sekunde, dann erneut die RTC lesen (mit einer Mini-Verzögerung, z.B. Waitms 100). Ist die nächste Sekunde angebrochen, läuft die Schleife weiter mit deiner ganzen Heizungssteuerung und zeigt auch die LCD-Ausgabe.
Also etwa so:
Oldsecond = _second
Do ' Hauptschleife
While _second = Oldsecond
' Hole Zeit (oder NUR _second) aus der RTC
Waitms 100
Wend
Oldsecond = _second
' Lese die komplette RTC aus, falls noch nicht oben passiert
' Hier die ganze weitere Heizungssteuerung
Loop
End

Gruß Dirk