Code:
$regfile = "M8def.dat"
$crystal = 3686400
$hwstack = 46
$swstack = 40
$framesize = 40
$baud = 19200
'************************************************************
Dim Tagnacht As Bit
Dim Nachtbetrieb As Byte
Dim Tagbetrieb As Byte
Nachtbetrieb = 21
Tagbetrieb = 5
Dim Tempmessstelle(8) As Single
'************************Def. von Konstanten***************
Const Tagtemp_og = 22.0 ' Mischer ganz zu
Const Tagtemp_ug = 21.0 ' Mischer ganz auf
Const Nachttemp_og = 21.5 ' Mischer ganz zu
Const Nachttemp_ug = 20.5 ' Mischer ganz auf
'
'Im Bereich 21.0 bis 22.0 (Tagbetrieb) sowie im Bereich 20.5 bis 21.0 (Nachtb.)
'soll mit dem Servo der Mischer gesteuert werden.
'Mischerfunktion für diesen Bereich (y = m*x + n); x = Raumtemp, y = Mischerstellung
' y = 1200*x - 24600
' Bei Tagbetrieb:
' y = 1800 für Raumtemp < 21.0 Grad
' y = 600 für Raumtemp > 22.0 Grad
'
'Bei Nachtbetrieb:
' y = 1800 für Raumtemp < 20.0 Grad
' y = 600 für Raumtemp > 22.0 Grad
Die ganz Funktion (d.h. die Sub Mischersteuerung) soll nur alle 5 min oder so (am besten einstellbar) gestartet werden.
'************************************************************
Config Portc.2 = Output
'--------------------------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 Timer1----------------------------------
Config Timer1 = Timer , Prescale = 256 '256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Isr_von_timer1 ' bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 36835 'Timer1 soll schon von 65535 - x*14400
'--------------------------------Config 1Wire configurieren---------------------
Config 1wire = Portc.1 'DS1820
Match_rom Alias &H55
Read_scratchpad Alias &HBE
Start_conversion Alias &H44
Innen Alias 0
Vorlauf Alias 1
Rücklauf Alias 2
Aussen 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
For Id = 1 To 40 'Einlesen der 5 Sensoren IDs (5*8 Byte)
I = Id - 1
Readeeprom Sensor_ids(id) , I
Next Id
'--------------------------------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$ = "20:10:00" ' to watch the day changing value
'Date$ = "02.27.07" ' erstmaliges stellen der Uhr
'************************************************************
Dim Mischer_max As Integer
Dim Mischer_min As Integer
Dim Mischer_ist As Integer
'************************************************************
Mischer_max = 1800 ' Vorlaufminimum
Mischer_min = 600 'Vorlaufmaximum
Mischer_ist = Mischer_min
'***********************************************************
For I = Mischer_min To Mischer_max Step 10
Locate 2 , 1 : Lcd "MS:"
Locate 2 , 4 : Lcd I
Pulseout Portc , 2 , I 'Mischer_min 'Ist
Waitms 60
Next I
'************************************************************
Do
Wait 1
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
Temperatur = Temperatur + 0.2
Tempmessstelle(id + 1) = Temperatur
___lcdno = 0
Select Case Id
Case Innen:
Locate 1 , 1 : Lcd "WZ: "
Locate 1 , 5 : Lcd Fusing(temperatur , "#.#")
Case Aussen:
Locate 1 , 11 : Lcd "AU: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
Case Vorlauf: 'ausgabe im Display ist dann z.B.
Locate 2 , 1 : Lcd "VL: "
Locate 2 , 5 : Lcd Fusing(temperatur , "#.#" ) ' Inn Auss Kess Rück Vorl
Case Rücklauf: ' 14.4 52.4 67.3 43.0 62.8
Locate 2 , 11 : Lcd "RL: "
Locate 2 , 14 : Lcd Fusing(temperatur , "#.#")
End Select
___lcdno = 1
Locate 2 , 20
Lcd Time$
Select Case Id
Case Kessel:
Locate 1 , 11 : Lcd "KE: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
End Select
Cursor Off
Next Id
Loop
End
'**************************Sub Tagbetrieb**************
Tagbetrieb:
Return
'**************************Sub Nachtbetrieb************
Nachtbetrieb:
Return
'*************************Sub Relais schalten*******
Mischersteuerung:
Select Case Tagnacht
Case 0
Gosub Nachtbetrieb
Case 1
Gosub Tagbetrieb
End Select
Return
'************************************************************
Auswertung_tag_nacht:
If _hour >= Nachtbetrieb Or _hour < Tagbetrieb Or _hour = 7 Then
Tagnacht = 0 'Nachteinstellung
Else
Tagnacht = 1 'Tageinstellung
End If
Return
'**************************Subroutine für Timer1*******
Isr_von_timer1: 'ISR von Timer1
Timer1 = 36835
Gosub Auswertung_tag_nacht
Gosub Mischersteuerung
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 , &HBD , &HB6 , &H23 , &H01 , &H08 , &H00 , &H40 '
Data &H10 , &H56 , &HA3 , &H23 , &H01 , &H08 , &H00 , &H3F
Lesezeichen