Code:
$regfile = "m8def.dat"
$crystal = 3686400
'***************************Config Schaltausgänge*******************************
Config Portb = Output
Brenner Alias Portb.5
Pumpefb Alias Portb.1
Pumpehk Alias Portb.2
Pumpeww Alias Portb.4
Heizungonoff Alias Portb.5
'**************************Def. allgemeiner Variabeln***************************
Dim Tagnacht As Bit
Dim Nachtbetrieb As Byte
Dim Tagbetrieb As Byte
Dim Tempmessstelle(7) As Single
Const Tagtemp_og = 21.6
Const Nachttemp_og = 21.0
Const Tagtemp_ug = 21.4
Const Nachttemp_ug = 20.8
Nachtbetrieb = 21
Tagbetrieb = 5
'**************************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 Bit
___lcdno = 0
Initlcd
Cursor Off
Cls
___lcdno = 1
Initlcd
Cursor Off
Cls
'*******************************************************************************
Config 1wire = Portb.3 'DS1820
Match_rom Alias &H55
Read_scratchpad Alias &HBE
Start_conversion Alias &H44
Innen Alias 0 'Innen
Aussen Alias 1 'Aussen
Kessel Alias 2
Rücklauf Alias 3
Vorlauf Alias 4
Dim Read_temp As Integer
Dim Sensor_ids(40) 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 Timer1*****************************************
Config Timer1 = Timer , Prescale = 8 '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$ = "19:44:00" ' to watch the day changing value
'Date$ = "02.26.07" ' erstmaliges stellen der Uhr
'***************************Config 1Wire****************************************
For Id = 1 To 40 'Einlesen der 5 Sensoren IDs (5*8 Byte)
I = Id - 1
Readeeprom Sensor_ids(id) , I
Next Id
Do
Wait 1
For Id = Innen To Vorlauf
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 - 32767
Bruchteil = 16 - Ds_array(7)
Bruchteil = Bruchteil / 16
Bruchteil = Bruchteil - 0.25
Temperatur = Read_temp + Bruchteil
Tempmessstelle(id + 1) = Temperatur
___lcdno = 0
Locate 1 , 1 : Lcd " Inn Auss Kess Vorl Rück "
Select Case Id
Case Innen:
Locate 2 , 2 : Lcd Fusing(temperatur , "#.#")
Case Aussen: 'ausgabe im Display ist dann z.B.
Locate 2 , 7 : Lcd Fusing(temperatur , "#.#") ' Inn Auss Kess Rück Vorl
Case Kessel: ' 14.4 52.4 67.3 43.0 62.8
Locate 2 , 12 : Lcd Fusing(temperatur , "#.#")
'Case Rücklauf:
' Locate 2 , 18 : Lcd Fusing(temperatur , "#.#")
'Case Vorlauf:
' Locate 2 , 23 : Lcd Fusing(temperatur , "#.#")
End Select
Next Id
Gosub Anzeigezeit
Loop
End
'***************************Anzeige Zeit****************************************
Anzeigezeit:
___lcdno = 1
Locate 2 , 1
Lcd Time$
Locate 2 , 12
Lcd Date$
Locate 2 , 21
Lcd "Tag: " ; Weekday
Waitms 500
Return
'*************************Sub Relais schalten***********************************
Schalterelais:
Select Case Tagnacht
Case 0
Gosub Nachtbetrieb
Case 1
Gosub Tagbetrieb
End Select
Return
'**************************Sub für Tagbetrieb***********************************
Tagbetrieb:
Pumpeww = 1
If Tempmessstelle(1) >= Tagtemp_og Then
Brenner = 0 ' Brenner
If Tempmessstelle(1) <= 2.95 Then
Pumpefb = 0 ' Pumpe FB
End If
If Tempmessstelle(1) < 3.05 Then
Pumpehk = 0 ' PumpeHK
End If
End If
If Tempmessstelle(1) <= Tagtemp_ug Then
Brenner = 1
Pumpefb = 1
Pumpehk = 1
End If
Return
'**************************Sub für Nachtbetrieb*********************************
Nachtbetrieb:
If Tempmessstelle(1) >= Nachttemp_og Then
Brenner = 0
If Tempmessstelle(1) < 2.9 Then
Pumpefb = 0 ' Pumpe FB
End If
If Tempmessstelle(1) < 3.0 Then
Pumpehk = 0 ' PumpeHK
End If
End If
If Tempmessstelle(1) < Nachttemp_ug Then
Brenner = 1
Pumpefb = 1
Pumpehk = 1
End If
Return
'**************************Subroutine für Timer1********************************
Isr_von_timer1: 'ISR von Timer1
Timer1 = 51135
If _hour >= Nachtbetrieb Or _hour < Tagbetrieb Or _hour = 7 Then 'Sp > 2 Then 'Timer1 soll wieder von 34285 wegzählen
Tagnacht = 0 'Nachteinstellung
Else
Tagnacht = 1 'Tageinstellung
End If
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
Data &H10 , &H1B , &HD0 , &H23 , &H01 , &H08 , &H00 , &H23
Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11
Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67
Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF '
Lesezeichen