Code:
$regfile = "m8def.dat"
$crystal = 3686400
$hwstack = 46
$swstack = 40
$framesize = 40
'**************************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
Config Portb = Output
Brenner Alias Portb.3
Pumpefb Alias Portb.4
Pumpehk Alias Portb.5
Dim ___lcdno As Byte
___lcdno = 0
Initlcd
Cursor Off
Cls
___lcdno = 1
Initlcd
Cursor Off
Cls
'**************************Def. allgemeiner Variabeln***************************
Dim Tempmessstelle(8) As Single
Dim Tagnacht As Bit
Dim Nachtbetrieb As Byte
Dim Tagbetrieb As Byte
Const Tagtemp_og = 21.6
Const Tagtemp_ug = 21.4
Const Nachttemp_og = 20.9
Const Nachttemp_ug = 20.7
Dim Zähler As Byte
Zähler = 0
'*************************Config Timer1*****************************************
Config Timer1 = Timer , Prescale = 1024 '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 = 34286 'Timer1 soll schon von 34285 wegzählen 4 sekunden
'***************************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:02:00" ' to watch the day changing value
'Date$ = "02.27.07" ' erstmaliges stellen der Uhr
'***************Variabeln für Servo*********************************************
Config Portc.2 = Output
Dim Minimum As Integer
Dim Maximum As Integer
Dim Vorlauftemp As Integer
Dim Servosoll As Integer
Dim Ist As Integer
Minimum = 1200 ' Vorlaufminimum
Maximum = 500 ' Vorlaufmaximum
Ist = Maximum
Pulseout Portc , 2 , Maximum 'Servo auf maximale Vorlauftemperatur
Waitms 60
'***************************Config 1Wire****************************************
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
Boiler Alias 5
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
'***************************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
'***********************************Hauptprogramm*******************************
Do
Loop
End
'**********************************1Wire****************************************
1wire:
Locate 2 , 20
Lcd Time$
Wait 1
For Id = Innen To 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
Tempmessstelle(id + 1) = Temperatur
If Temperatur <> 85.0 Then ' < 80.0 And Temperatur > -20.0 Then
Tempmessstelle(id + 1) = Temperatur
End If
'Innen Alias 0
'Vorlauf Alias 1
'Rücklauf Alias 2
'Aussen Alias 3
'Kessel Alias 4
'Boiler Alias 5
___lcdno = 0
Select Case Id
Case Innen:
Locate 1 , 1 : Lcd "WZ: "
Locate 1 , 5 : Lcd Fusing(temperatur , "#.#")
Case Aussen:
Locate 1 , 11 : Lcd "AT: "
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
Select Case Id
Case Kessel:
Locate 1 , 11 : Lcd "KE: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
End Select
Cursor Off
Next Id
Return
'***************************Gültigkeit Messwerte********************************
'Checkmessergebnisse:
'Return
'***************************Vorlauftem Servoschritte****************************
Servostellung:
Vorlauftemp = Int(tempmessstelle(4))
Vorlauftemp = Vorlauftemp - 22
If Vorlauftemp <= 0 Then
Vorlauftemp = 0
Else
Vorlauftemp = Vorlauftemp * 10
End If
Return
'*********************Vorlauftemperatur reduzieren******************************
Vorlauftempgeringer:
Servosoll = Minimum - Vorlauftemp
If Ist < Servosoll Then
Ist = Ist + 1
Pulseout Portc , 2 , Ist
Waitms 60
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 Tempmessstelle(1) >= Tagtemp_og Then 'And Oldmesswert(1) >= Tagtemp_og Then
Brenner = 0 ' Brenner
Pumpefb = 0 ' Pumpe FB
Pumpehk = 0 ' PumpeHK
End If
If Tempmessstelle(1) < Tagtemp_ug Then 'And Oldmesswert(1) < Tagtemp_ug Then
Brenner = 1
Pumpefb = 1
Pumpehk = 1
End If
Return
'**************************Sub für Nachtbetrieb*********************************
Nachtbetrieb:
If Tempmessstelle(1) >= Nachttemp_og Then 'And Oldmesswert(1) >= Nachttemp_ogthen
Brenner = 0
Pumpefb = 0
Pumpehk = 0 ' Pumpe FB
End If
If Tempmessstelle(1) < Nachttemp_ug Then 'And Oldmesswert(1) < Nachttemp_ug Then
Brenner = 1
Pumpefb = 1
Pumpehk = 1
End If
Return
'**************************Subroutine für Timer1********************************
Isr_von_timer1: 'ISR von Timer1
Timer1 = 34286
If _hour >= Nachtbetrieb Or _hour < Tagbetrieb Then 'Or _hour = 7 Or _hour = 8 Then
Tagnacht = 0 'Nachteinstellung
Else
Tagnacht = 1 'Tageinstellung
End If
Gosub 1wire
'Gosub Checkmessergebnisse
Gosub Servostellung
Gosub Schalterelais
' If Zähler < 2 Then
' Zähler = Zähler + 1
' Else
Gosub Vorlauftempgeringer
' Zähler = 0
' 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 , &HBD , &HB6 , &H23 , &H01 , &H08 , &H00 , &H40 '
Data &H10 , &H56 , &HA3 , &H23 , &H01 , &H08 , &H00 , &H3F
EDIT Ich hab' schon mal Code-Tags implementiert
Lesezeichen