Hallo Leute,
grüßt Euch erst mal!
Ich lese zwar schon lange, aber meine Zeit, die ich mit den Kleinen (Atmels) verbringen darf ist eher gering.
Tja, nach dem meine Heizung ausfiel, habe ich selber Hand angelegt.
Getrennt geht alles bestens aber zusammen?????
Gut, mein Problem ist ganz einfach.
Das Programm steuert den Vorlauf. Das funzt auch.
Da das in die Do - While Schleife integriert ist, weiss ich nicht wie ich die Übermittlung und Auswertung der seriellen Schnittstelle bauen kann?
Solange ich nichts über die Serielle Schnittstelle schicke geht es einwandfrei!
Wenn was über die Schnittstelle kommt, reagiert das Ding nur noch auf die Schnittstelle.
Ganz unten im Code ist die Auswertung der seriellen Schnittstelle.
Wie schaffe ich es, dass nachdem ich z.B. zaehlerx ausgegeben habe die Schleife weiter läuft?
Hua, viel Tobak um zu erklären wo ich hänge!
Scusi
Ich hoffe Ihr habt eine Idee!!
LG Olli
grüßt Euch erst mal!
Ich lese zwar schon lange, aber meine Zeit, die ich mit den Kleinen (Atmels) verbringen darf ist eher gering.
Tja, nach dem meine Heizung ausfiel, habe ich selber Hand angelegt.
Getrennt geht alles bestens aber zusammen?????
Gut, mein Problem ist ganz einfach.
Das Programm steuert den Vorlauf. Das funzt auch.
Da das in die Do - While Schleife integriert ist, weiss ich nicht wie ich die Übermittlung und Auswertung der seriellen Schnittstelle bauen kann?
Solange ich nichts über die Serielle Schnittstelle schicke geht es einwandfrei!
Wenn was über die Schnittstelle kommt, reagiert das Ding nur noch auf die Schnittstelle.
Ganz unten im Code ist die Auswertung der seriellen Schnittstelle.
Wie schaffe ich es, dass nachdem ich z.B. zaehlerx ausgegeben habe die Schleife weiter läuft?
Hua, viel Tobak um zu erklären wo ich hänge!
Scusi
Ich hoffe Ihr habt eine Idee!!
LG Olli
PHP:
$prog &HFF , &HEF , &HD9 , &H00
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
Ddrd = &B10000000
Portd = &B100000
Declare Sub Init
Declare Sub Convallt
Declare Function Decigrades(byval Sc(9) As Byte) As Integer
Declare Sub Setlcd
Declare Sub Setvars
Dim I As Byte
Dim Inputstring As String * 12
Dim Zeiger As Byte At &HA0
Dim Zaehlerx As Byte
Declare Sub Auswerten
Dim Tempbyte As Byte At &HA7
Dim Flag As Byte At &HA1
Dim Protokoll(10) As Byte
Dim Atadress As Byte
Dim A As Byte
Dim B As Byte
Dim W As Word
Dim Vfuss As Integer
Dim Ds As Integer
Dim Tcounter As Byte
Dim Legionellen As Bit
Dim Tempa_min As Integer
Dim Tempb_min As Integer
Dim Tempa_max As Integer
Dim Tempb_max As Integer
Dim Tempsoll_min As Integer
Dim Tempsoll_max As Integer
Dim Brenner As Bit
'Temperatur Variablen
Dim Dgvorlauf As Integer
Dim Dg As Integer
Dim Nachtabsenkung_start As Integer
Dim Nachabsenkung_stop As Integer
' temp Variable Clock
Dim Tmp_c As String * 4
' temp Variable Nachtabsenkung start
Dim Tmp_ns As Integer
' temp Variable Clock als integer zum rechnen
Dim Tmp_ac As Integer
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Sc(9) As Byte 'Scratchpad
Dim Sod As Long
Dim Key As String * 10
Zeiger = 1
Atadress = 13
'Ports konfiguriren
'1wire
Config 1wire = Porta.0
Config 1wire = Porta.1
'AUSGÄNGE
Config Portb = Output
Open "COMD.0:9600,8,n,1" For Input As #1
Open "COMD.1:9600,8,n,1" For Output As #2
'LCD
Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3
Config Lcd = 20 * 4
'Taster
'Config Portd = Input
'Pullup an Portd
'Portd = &HFF
' Timer hier wird die Steuerung ausgeführt
' fast eine Sekunde reicht
Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Check_values 'verzweige bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
'[now init the clock]
Config Date = Dmy , Separator = .
Config Clock = Soft
'assign the date to the reserved date$
'The format is MM/DD/YY
Date$ = "01/16/10"
Time$ = "22:00:00"
Cls
Lcd "Controller"
Locate 2 , 1
Lcd "DS18S20"
Wait 3
Dsid1(1) = 1wsearchfirst(pina , 0)
Dsid2(1) = 1wsearchfirst(pina , 1)
' Schauen ob die errechnete Checksumme die selbe ist wie die wo im ROM abgelegt ist
If Dsid1(8) = Crc8(dsid1(1) , 7) Then
Locate 1 , 1
Lcd "CRC OK Sensor 1 ID"
Wait 1
Locate 1 , 1
For A = 1 To 8
Lcd Hex(dsid1(a))
Next
End If
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
Locate 2 , 1
Lcd "CRC OK Sensor 2 ID"
Wait 1
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid2(b))
Next
End If
Wait 1
Cls
Init
' Main loop
Do
A = Ischarwaiting()
If A = 1 Then 'we got something
Tempbyte = Waitkey(#1)
Gosub Zeichenempfang
If Flag = 1 Then
Gosub Protokoll
Flag = 0
Zeiger = 1
End If
Else
Setvars
Setlcd
Convallt ' "Messdaten einlesen"
Waitus 80
1wverify Dsid1(1) , Pina , 0 'eintrag Im Rom Prüfen ""
If Err = 1 Then
'Lcd "DsId1 nicht am bus " 'Err = 1 Fehler aufgetreten
Elseif Err = 0 Then
1wwrite &HBE , 1 , Pina , 0
Sc(1) = 1wread(9 , Pina , 0)
If Sc(9) = Crc8(sc(1) , 8) Then
Dgvorlauf = Decigrades(sc(9))
Dgvorlauf = Dgvorlauf / 10
End If
End If
1wverify Dsid2(1) , Pina , 1
If Err = 1 Then
'Lcd "DsId2 nicht am bus "
Elseif Err = 0 Then
1wwrite &HBE , 1 , Pina , 1
Sc(1) = 1wread(9 , Pina , 1)
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))
Dg = Dg / 10
End If
End If
Wait 1
End If
Loop
End 'end program
Sub Init
Cls
Tcounter = 0
Vfuss = 27
Ds = 0
Legionellen = 0
Tempa_min = 60
Tempb_min = 35
Tempa_max = 65
Tempb_max = 40
Brenner = 0
Portb.0 = 0 'Fussbodenregler
Portb.1 = 0 'Fussbodenregler
Portb.2 = 1 'Pumpe Fussbodenheizung
Portb.3 = 1 'Pumpe Bad
End Sub
Sub Convallt
'1wreset ' reset the bus
'1wwrite &HCC ' skip rom
'1wwrite &H44 ' Convert T
1wreset Pina , 0
1wwrite &HCC , 1 , Pina , 0
1wwrite &H44 , 1 , Pina , 0
1wreset Pina , 1
1wwrite &HCC , 1 , Pina , 1
1wwrite &H44 , 1 , Pina , 1
End Sub
Function Decigrades(byval Sc(9) As Byte)
Dim Tmp As Byte , T As Integer , T1 As Integer
Tmp = Sc(1) And 1
If Tmp = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
T = T * 50
T = T - 25
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
Decigrades = T / 10
End Function
' wird vom Timer aus aufgerufen
Check_values:
Tcounter = Tcounter + 1
If Tcounter > 20 Then
If Dgvorlauf < Vfuss Then
Locate 2 , 1
Lcd "Vorlauf up"
Portb.0 = 0
Portb.1 = 1
Waitms 600
Cls
Portb.0 = 0
Portb.1 = 0
End If
If Dgvorlauf > Vfuss Then
Locate 2 , 1
Lcd "Vorlauf down"
Portb.1 = 0
Portb.0 = 1
Waitms 600
Cls
Portb.1 = 0
Portb.0 = 0
End If
Tcounter = 0
End If
'Heizkesseltemperatur
If Legionellen = 1 Then
Tempsoll_max = Tempa_max
Tempsoll_min = Tempa_min
Legionellen = 0
Else
Tempsoll_max = Tempb_max
Tempsoll_min = Tempb_min
End If
If Brenner = 1 And Dg > Tempsoll_max Then
Brenner = 0
End If
If Brenner = 0 And Dg < Tempsoll_max Then
Brenner = 1
End If
Return
Sub Setlcd
Locate 1 , 1 : Lcd Dgvorlauf : Locate 1 , 5 : Lcd Dg : Locate 1 , 9 : Lcd Time$
Locate 2 , 1 : Lcd Portb.2 : Locate 2 , 3 : Lcd Portb.3 : Locate 2 , 6. : Lcd Sod
End Sub
Sub Setvars
Dim Pob1 As Bit
Dim Pob2 As Bit
Sod = Secofday()
Pob1 = 0
Pob2 = 0
' Pumpe Fussbodenheizung
If Sod > 18000 And Sod < 79200 Then
Pob1 = 1
End If
Portb.2 = Pob1
' Pumpe Bad
If Sod > 23400 And Sod < 27000 Then
Pob2 = 1
End If
If Sod > 61200 And Sod < 70200 Then
Pob2 = 1
End If
Portb.3 = Pob2
' Legionellen heizen auf 60 Grad
If Sod > 23400 And Sod < 23500 Then
Legionellen = 1
Else
Legionellen = 0
End If
End Sub
Zeichenempfang:
Protokoll(zeiger) = Tempbyte
If Tempbyte = 0 Then
Zeiger = 1
End If
If Protokoll(1) = 27 Then
If Tempbyte = 0 Then
Flag = 1
End If
Incr Zeiger
Else
Zeiger = 1
End If
Return
End
Protokoll:
If Protokoll(2) = Atadress Then
Flag = 2
End If
If Protokoll(2) = 255 Then
Flag = 2
End If
If Flag = 2 Then
Zaehlerx = Protokoll(3)
Locate 2 , 1
Lcd Zaehlerx
Protokoll(1) = 0
Protokoll(2) = 0
Protokoll(3) = 0
Protokoll(4) = 0
End If
Return
End