Meine Bisherige Aquarium Steuerung

maikgen

Mitglied
24. März 2010
46
0
6
Sprachen
habe hier mal meine bisherige Aquarium steuerung angefügt. soll natürlich noch mehr kommen . aber das hab ich bis jetzt schon hinbekommen und das läuft auch schon im test betrieb. Nächste woche kommt denk ich mal noch DCF wenn dann entlich mein Modul kommt.
Bin auch gern für Verbesserungsvorschläge zu haben da es mein erstes richtiges Projekt ist und ich da auch noch viel lernen will und 100%ig auch kann



Code:
$crystal = 16000000
$regfile = "m32def.dat"
$baud = 9600
$hwstack = 16
$swstack = 32
$framesize = 32

Config Timer1 = Timer , Prescale = 256

Config Clock = Soft                                         'Use USER to write/use your own code
Config Date = Dmy , Separator = .                           'Tag.Monat.Jahr


'Ausgängebestimmen
'Config Portd.4 = Output                                     'PWM Ausgang
'Config Portd.5 = Output                                     'PWM Ausgang
'Config Portb.3 = Output                                     'PWM Ausgang  der wird noch später benutzt

Config Porta.5 = Output                                     'o2     (ADC2)
Config Porta.7 = Output                                     'Filter (ADC4)
Config Porta.4 = Output                                     'Temp 2 (ADC1)
Config Porta.6 = Output                                     'Temp 1 (ADC3)

Config Porta.0 = Output                                     'Blinke LED gelb Takt

Config 1wire = Portb.0                                      'Temp Fühlereingang


Declare Sub Pumpe(filter As Word , Luftan As Word , Luftaus As Word)
Declare Sub Init
Declare Sub Convallt
Declare Function Decigrades(byval Sc(9) As Byte) As Integer


On Timer1 Timer_irq

Const Timer16bit = 3036                                     '16Bit (3035)

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , _
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Initlcd


' Variablen bestimmen
Dim Sekunden As Byte
Dim Filter As Word
Dim Luft As Word
Dim Temp As Word

'für Temp
Dim D As Byte
Dim W As Word
Dim Dg As Integer
Dim Min1 As Integer
Dim Max1 As Integer
Dim Min2 As Integer
Dim Max2 As Integer
Dim Dsid1(8)as Byte
Dim Dsid2(8)as Byte
Dim Sc(9) As Byte
Dim Klein As Integer
Dim Gross As Integer
'für Temp
' Variablen bestimmen


Enable Timer0
Enable Timer1
Enable Interrupts

Time$ = "17:11:00"                                          'Zeit eingestellen
Date$ = "05.04.10"                                          'Datum einstellen


Ddrd = &HFF
'Temp
'**************************************
Cls

W = 1wirecount()

'erster Sensor
Dsid1(1) = 1wsearchfirst()
Do
Dsid2(1) = 1wsearchnext()
Loop Until Err = 1

'Hier ist die Programmhauptschleife
'****************************************************************************************************************************************************
Do

Convallt

Wait 1

Toggle Porta.0

'Zeit
 Locate 1 , 1
 Lcd Time$
 Locate 2 , 1
 Lcd Date$
 Cursor Off
'Zeit

Call Pumpe(filter , Luft , Temp)                            ' Unterprogramm für Filter, Sauerstoff, Temp aufrufen

Loop
'***************************************************************************************************************************************************
'Ende Hauptprogrammschleife

'Hier ist die erster Unterprogrammschleife
'***************************************************************************************************************************************************
Do

'______________________________________________________________________________________________________________________________________

'ZEITEINSTELLUNGEN

'Filter                                                      ' Auf ausgang ADC4

Sub Pumpe(Filter , Luft , Temp)
'Filter
      If _hour < 6 And _min < 00 Then Porta.4 = 0           'Filter aus  bis 6:00
      If _hour >= 06 And _min >= 00 Then Porta.4 = 1        'Filter an   Von 6:00
      If _hour >= 22 And _min >= 00 Then Porta.4 = 0        'Filter aus  bis 22:00

'Sauerstoff
      If _hour < 10 And _min < 00 Then Porta.5 = 0          'O2 aus      bis 10:00
      If _hour >= 10 And _min >= 00 Then Porta.5 = 1        'O2 an       Von 10:00
      If _hour >= 10 And _min >= 10 Then Porta.5 = 0        'O2 aus      bis 10:10
      If _hour >= 11 Then Porta.5 = 0
      If _hour >= 12 And _min >= 00 Then Porta.5 = 1        'O2 an       Von 12:00
      If _hour >= 12 And _min >= 10 Then Porta.5 = 0        'O2 aus      Bis 12:10
      If _hour >= 13 Then Porta.5 = 0
      If _hour >= 14 And _min >= 00 Then Porta.5 = 1        'O2 an       Von 14:00
      If _hour >= 14 And _min >= 10 Then Porta.5 = 0        'O2 aus      Bis 14:10
      If _hour >= 15 Then Porta.5 = 0
      If _hour >= 16 And _min >= 00 Then Porta.5 = 1        'O2 an       Von 16:00
      If _hour >= 16 And _min >= 10 Then Porta.5 = 0        'O2 aus      Bis 16:10
      If _hour >= 17 Then Porta.5 = 0
      If _hour >= 18 And _min >= 00 Then Porta.5 = 1        'O2 an       Von 18:00
      If _hour >= 18 And _min >= 10 Then Porta.5 = 0        'O2 aus      Bis 18:10
      If _hour >= 19 Then Porta.5 = 0

'Großes Becken
      If _hour < 7 And _min < 00 And Dg > 20 Then Porta.6 = 1       'Temp 1 bei 20°C an bis 6:00
      If _hour < 7 And _min < 00 And Dg < 22 Then Porta.6 = 0       'Temp 1 bei 22°C aus  bis 6:00
      If _hour >= 7 And _min > 00 And Dg > 22 Then Porta.6 = 1       'Temp 1 Bei 22°c An Ab 6:00
      If _hour >= 7 And _min > 00 And Dg < 24 Then Porta.6 = 0       'Temp 1 bei 24°C aus  ab 6:00
      If _hour >= 21 And _min > 00 And Dg > 19 Then Porta.6 = 1       'Temp 1 bei 19°C an ab 21:00
      If _hour >= 21 And _min > 00 And Dg < 20 Then Porta.6 = 0       'Temp 1 bei 20°C aus  ab 21:00

'Kleines Becken
      If _hour < 7 And _min < 00 And Dg > 22 Then Porta.6 = 1       'Temp 1 bei 22°C an bis 6:00
      If _hour < 7 And _min < 00 And Dg < 24 Then Porta.6 = 0       'Temp 1 bei 24°C aus  bis 6:00
      If _hour >= 7 And _min > 00 And Dg > 23 Then Porta.6 = 1       'Temp 1 bei 23°C an ab 6:00
      If _hour >= 7 And _min > 00 And Dg < 27 Then Porta.6 = 0       'Temp 1 bei 27°C aus  ab 6:00
      If _hour >= 21 And _min > 00 And Dg > 22 Then Porta.6 = 1       'Temp 1 bei 22°C an ab 21:00
      If _hour >= 21 And _min > 00 And Dg < 24 Then Porta.6 = 0       'Temp 1 bei 24°C aus  ab 21:00


'ENDE ZEITEINSTELLUNGEN
'_______________________________________________________________________________


'Temp
'Temp1                                                       'Auf Ausgang ADC3
1wverify Dsid1(1)                                           'Issues the "Match Rom"

Locate 1 , 12
If Err = 1 Then
Lcd "DsID 1 not on bus"

Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))
Gross = Decigrades(sc(9))

If Min1 > Dg Then Min1 = Dg
If Max1 < Dg Then Max1 = Dg

Lcd Dg : Lcd "C" : Locate 1 , 14                            'LCD Temp Einstellung

End If
End If

 'Temp2                                                      'Auf Ausgang ADC1
1wverify Dsid2(1)

Locate 2 , 12
If Err = 1 Then
Lcd "DsID2 not on Bus"

Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))
Klein = Decigrades(sc(9))

If Max2 < Dg Then Max2 = Dg
If Min2 > Dg Then Min1 = Dg

Lcd Dg : Lcd "C" : Locate 2 , 14                            'LCD Temp Einstellung


End If
End If

'Temp

End Sub Pumpe

Return

Loop
 '**************************************************************************************************************************************************
'Ende der Unterprogrammschleife


'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
  Timer1 = Timer16bit


Return

Sub Convallt
1wreset                                                     'reset the Bus
1wwrite &HCC                                                'Skip Rom
1wwrite &H44                                                'Convert T
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 / 100
End Function

End

Return


Settime:
Return

Getdatetime:
Return

Setdate:
Return
 
Hallo maikgen,
sieht schon gut aus deine Steuerung.
Hier noch ein paar Hinweise/Verbesserungsvorschläge:

Declare Function Decigrades(byval Sc(9) As Byte) As Integer
...
Dg = Decigrades(sc(9))
...
Function Decigrades(byval Sc(9) As Byte)

Dies wird funktonieren, aber eigentlich anders als beabsichtigt.
Mit byval Sc(9) As Byte sagst du BASCOM, dass du in der Funktion eine Variable Sc benutzen möchtest. Die Größe wird ignoriert.
Mit Decigrades(sc(9)) sagst du BASCOM, dass du den 9. Wert des Arrays Sc an die Funktion übergeben willst. Und nur diesen.
Wenn du nun in der Funktion ein Array-Element wie Sc(7) benutzt, wird dies nicht von dem übergebenen Parameter genommen, sondern von der globalen Variable Sc. Da in diese vorher die Werte geladen, ergibt sich kein Unterschied. Würdest du aber jetzt die Funktion z.B. mit einem zweiten Array Sc1 aufrufen
Dg = Decigrades(Sc1(9))
würden ganz seltsame Dinge passieren.
Wenn du an eine Funktion oder an eine Sub ein Array übergeben willst, dann geht das so:

Declare Function Decigrades(Sc_tmp As Byte) As Integer
...
Dg = Decigrades(Sc(1))
...
Function Decigrades(Sc_tmp As Byte) as integer
Local Tmp As Byte , T As Integer , T1 As Integer

Tmp = Sc_tmp(1) And 1
If Tmp = 1 Then Decr Sc_tmp(1)
T = Makeint(sc(1) , Sc_tmp(2))

T = T * 50
T = T - 25
T1 = Sc_tmp(8) - Sc_tmp(7)
T1 = T1 * 100
T1 = T1 / Sc_tmp(8)
T = T + T1
Decigrades = T / 100
End Function

Du hast vielleicht bemerkt, dass hinter Sc_Tmp kein Größe angegeben ist und dass davor kein byval steht. Das Array wird über byref (die default Übergabeart) übergeben. Dabei kennt die Funktion nur die Adresse des Elements, welches in dem Aufruf übergeben wurde. Wie du oben siehst, steht dort jetzt das erste Element.
Außerdem habe ich die Variablen Tmp, T und T1 zu lokalen Variablen gemacht, weil ich denke, dass du dies beabsichtigst hast. Solange du mit Dim deklarierst, werden globale Variablen angelegt.

Die Art, wie du die Zeitvergleiche gemacht hast, funktioniert auch nicht so, wie du dir das denkst.
Z.B. dies hier

If _hour < 6 And _min < 00 Then Porta.4 = 0 'Filter aus bis 6:00
If _hour >= 06 And _min >= 00 Then Porta.4 = 1 'Filter an Von 6:00
If _hour >= 22 And _min >= 00 Then Porta.4 = 0 'Filter aus bis 22:00


Das Do vor Sub Pumpe muss dort bestimmt weg. Es wird sowieso nie ausgeführt. Ebenso das Loop hinter End Sub Pumpe.
Die Variable _min it eine Variable vom Typ Byte. Sie kann nie kleiner als 0 werden. Und sie ist immer >= 0. Die erste Abfrage wird also nie zutreffen. Willst du auf bis 6:00 Uhr vergleichen, kannst du einfach schreiben
If _hour < 6 Then ...
Zwischen 6:00 und 22:00 Uhr funktioniert jetzt alles. Jetzt nimm mal an, es ist 23:00 Uhr.
Dann ist die Abfrage _hour >= 06 And _min >= 00 sicherlich erfüllt, dein Porta.4 wird also eingeschaltet.
Nun kommt die Abfrage, ob die Zeit >= 22:00 ist. Ja ist sie. Also wird der Porta.4 sofort wieder ausgeschaltet. Und das andauernd, bis um 0:00 Uhr. Nicht schön. Und wenn du ein Relais am Ausgang hast, auch sicherlich nicht gut.
Für diese Uhrzeiten funktioniert dein Ansatz vielleicht noch irgendwie. Aber hier wird es dann kompliziert:

If _hour >= 10 And _min >= 00 Then Porta.5 = 1 'O2 an Von 10:00
If _hour >= 10 And _min >= 10 Then Porta.5 = 0 'O2 aus bis 10:10


Kommentar zu _min wie oben. Jetzt nimm mal an, dass es 11:00 Uhr ist.
Die erste Abfrage schaltet Porta.5 ein. Die zweite nicht aus. um Glück kommt hinterher noch diese Abfrage
If _hour >= 11 Then Porta.5 = 0
die den Port ab 11:00 Uhr immer abschaltet.

Du tust dich wesentlich leichter, wenn die die Zeiten in Minuten des Tages umrechnest. Allerdings lassen sie sich dann nicht mehr so leicht lesen. Z.B wäre 14:10 die 850. Minute des Tages (14*60+10=850). Dies wird schwierig zu erkennen. Du kannst dies aber auch noch einfacher lesbar machen.
Rechne so:
Minute = _hour * 100
Minute = Minute + _min
Um 14:10 wäre dann Minute = 1410

Der Block zum Setzen von PortA.5 sähe dann so aus:
Select Case Minute
Case is < 1000: PortA.5=0
Case is < 1010: PortA.5=1
Case is < 1200: PortA.5=0
Case is < 1210: PortA.5=1
Case is < 1400: PortA.5=0
Case is < 1410: PortA.5=1
Case is < 1600: PortA.5=0
Case is < 1610: PortA.5=1
Case is < 1800: PortA.5=0
Case is < 1810: PortA.5=1
Case is >= 1900: PortA.5=0
End Select

Die Cases werden von oben nach unten abgearbeitet. Wenn einer zutrifft, werden alle nachfolgenden ignoriert.
Hierbei werden nur die notwendigen Änderungen am PortA.5 vorgenommen. Es wird nie unnötig hin und her geschaltet.
Entsprechend müsstest du dies auch für die anderen Ausgänge umsetzen.

Dies ist vielleicht etwas länglich geworden. Sorry.
HBA
 
Gut das mit der Zeit so umrechnen ist ein guter Gedanke das werde ich aufjedenfall machen das sie immer mal einschaltet hab ich schon mit bekommen deshalb hab ich auch die extra ausschalt Zeiten drin.
Aber so wie du es hier beschrieben hast ist es besser das ist wohl war und es spart zudem noch platz.

So das mit der Zeit hab ich schon geändert da hätte ich eigentlich auch selber drauf kommen können ist auch etwas übersichtlicher man braucht weniger Platz und geht sogar noch schneller zu schreiben Danke für den Tipp.
Das mit der Temp Reglung muss ich mir in Ruhe nochmal bedrachten.
 
So nun habe ich das Programm soweit angepasst und es funktioniert nun auch richtig oder besser.
Habe nun mit PWM angefangen aber leider läuft in der Zeit wo die PWM läuft der Rest nicht obwohl PWM auf Timer 0 läuft und der Rest auf Timer 1
Später soll es mal so sein das die PWM um 8 Uhr anfängt und 20 Uhr wieder komplett aus ist.



Code:
$crystal = 16000000
$regfile = "m32def.dat"
$baud = 9600
$hwstack = 16
$swstack = 32
$framesize = 32



'Hier wird der Timer und der Teiler festgelegt
Config Timer1 = Timer , Prescale = 256
Config Timer0 = Pwm , Compare Pwm = Clear Down , Prescale = 8



Config Clock = Soft                                         'Use USER to write/use your own code
Config Date = Dmy , Separator = .                           'Tag.Monat.Jahr


'Ausgängebestimmen

Config Porta = Output                                       'Port A komplett ausgänge

Config 1wire = Portb.0                                      'Temp Fühlereingang
Config Portb.3 = Output


'Hier geben wir der Definition einen schöneren Namen oder eine kurzen Namen
Takt Alias Porta.0
O2 Alias Porta.5
Fi Alias Porta.4
Gr Alias Porta.7
Kl Alias Porta.6
Led Alias Portb.3
Helligkeit Alias Ocr0


'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
Declare Sub Pumpe
Declare Sub Init
Declare Sub Convallt
Declare Function Decigrades(sc_tmp As Byte) As Integer
Declare Sub Pwm

On Timer1 Timer_irq

'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timer16bit = 3036                                     '16Bit (3035)

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , _
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Initlcd


' Variablen bestimmen

Dim Zeit As Word
Dim O2 As Bit
Dim Fi As Bit
Dim Gr As Bit
Dim Kl As Bit


'für Temp
Dim D As Byte
Dim W As Word
Dim Min1 As Integer
Dim Max1 As Integer
Dim Min2 As Integer
Dim Max2 As Integer
Dim Dsid1(8)as Byte
Dim Dsid2(8)as Byte
Dim Sc(9) As Byte
Dim Klein As Integer
Dim Gross As Integer
'für Temp

'PWM
Dim Hochdimmen As Byte
Dim Runterdimmen As Byte
'PWM

' Variablen bestimmen


'Hier werden die Timer aktiviert
Enable Timer0
Enable Timer1
Enable Interrupts

Time$ = "07:59:57"                                          'Zeit eingestellen
Date$ = "07.04.10"                                          'Datum einstellen



Ddrd = &HFF
'Temp
'**************************************
Cls

W = 1wirecount()

'erster Sensor
Dsid1(1) = 1wsearchfirst()
Do
Dsid2(1) = 1wsearchnext()
Loop Until Err = 1

'Hier ist die Programmhauptschleife
'****************************************************************************************************************************************************
Do

Convallt

Zeit = _hour * 100                                          'Zeit Umrechnung
Zeit = Zeit + _min                                          'Zeit Umrechnung

Wait 1

'Toggle Takt

'Zeit
 Locate 1 , 1
 Lcd Time$
 Locate 2 , 1
 Lcd Date$
'Zeit

'Temp
 Locate 1 , 10
 Lcd "G"
 Locate 1 , 12
 Lcd Gross : Lcd "C"
 Locate 2 , 10
 Lcd "K"
 Locate 2 , 12
 Lcd Klein : Lcd "C"
 Cursor Off
'Temp

'Unterprogramme aufrufen
Call Pumpe                                                  'Zeit einstellungen aufrufen Filter, O2, Heizung
If Zeit => 800 Then Call Pwm                                'PWM Aufrufen
'If Zeit => 2000 Then Portb.3 = 0 ab hier soll später mal das Licht komplett aussein

Loop
'***************************************************************************************************************************************************
'Ende Hauptprogrammschleife

'Hier ist die erster Unterprogrammschleife
'***************************************************************************************************************************************************
'______________________________________________________________________________________________________________________________________

'ZEITEINSTELLUNGEN

'Filter                                                      ' Auf ausgang ADC4

Sub Pumpe
'Filter
      If Zeit <= 559 Then Fi = 0                            'Filter aus  bis 5:59
      If Zeit >= 600 Then Fi = 1                            'Filter an   Von 6:00
      If Zeit >= 2200 Then Fi = 0                           'Filter aus  bis 22:00

'Sauerstoff
      If Zeit <= 959 Then O2 = 0                            'o2 aus bis 9:59
      If Zeit >= 1000 Then O2 = 1                           'o2 an ab 10:00
      If Zeit >= 1010 Then O2 = 0                           'o2 aus ab 10:10
      If Zeit >= 1200 Then O2 = 1                           'o2 an ab 12:00
      If Zeit >= 1210 Then O2 = 0                           'o2 aus ab 12:10
      If Zeit >= 1400 Then O2 = 1                           'o2 an ab 14:00
      If Zeit >= 1410 Then O2 = 0                           'o2 aus ab 14:10
      If Zeit >= 1600 Then O2 = 1                           'o2 an ab 16:00
      If Zeit >= 1610 Then O2 = 0                           'o2 aus ab 16:10
      If Zeit >= 1800 Then O2 = 1                           'o2 an ab 18:00
      If Zeit >= 1810 Then O2 = 0                           'o2 aus ab 18:10

'Großes Becken
      If Zeit <= 659 And Gross <= 19 Then Gr = 1            'Temp 1 bei 19°C an bis 6:59
      If Zeit <= 659 And Gross >= 22 Then Gr = 0            'Temp 1 bei 22°C aus  bis 6:59
      If Zeit >= 700 And Gross <= 22 Then Gr = 1            'Temp 1 bei 22°C an ab 7:00
      If Zeit >= 700 And Gross >= 24 Then Gr = 0            'Temp 1 bei 24°C aus  ab 7:00
      If Zeit >= 2100 And Gross <= 19 Then Gr = 1           'Temp 1 bei 19°C an ab 21:00
      If Zeit >= 2100 And Gross >= 21 Then Gr = 0           'Temp 1 bei 21°C aus  ab 21:00


'Kleines Becken
      If Zeit <= 659 And Klein <= 22 Then Kl = 1            'Temp 2 bei 22°C an bis 6:59
      If Zeit <= 659 And Klein >= 24 Then Kl = 0            'Temp 2 bei 24°C aus  bis 6:59
      If Zeit >= 700 And Klein <= 23 Then Kl = 1            'Temp 2 bei 23°C an ab 7:00
      If Zeit >= 700 And Klein >= 27 Then Kl = 0            'Temp 2 bei 27°C aus  ab 7:00
      If Zeit >= 2100 And Klein <= 22 Then Kl = 1           'Temp 2 bei 22°C an ab 21:00
      If Zeit >= 2100 And Klein >= 24 Then Kl = 0           'Temp 2 bei 24°C aus  ab 21:00


'ENDE ZEITEINSTELLUNGEN
'_______________________________________________________________________________


'Temp
'Temp1                                                       'Auf Ausgang ADC3
1wverify Dsid1(1)                                           'Issues the "Match Rom"

Locate 1 , 12
If Err = 1 Then
Lcd "DsID1 not on bus"

Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Gross = Decigrades(sc(9))

End If
End If

 'Temp2                                                      'Auf Ausgang ADC4
1wverify Dsid2(1)

Locate 2 , 12
If Err = 1 Then
Lcd "DsID2 not on Bus"

Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Klein = Decigrades(sc(9))

End If
End If

'Temp


End Sub Pumpe





'*************************************************************************
'Das muss noch so angepasst werden das die anderen Sachen  normal laufen
'If Zeit >= 800 Then Led = 1

Sub Pwm
For Hochdimmen = 0 To 255
Helligkeit = Hochdimmen
Waitms 10
Next

Waitms 400

For Runterdimmen = 255 To 0 Step - 1
Helligkeit = Runterdimmen
Waitms 10
Next

Waitms 400
'If Zeit >= 2000 Then Led = 0

End Sub Pwm
'*************************************************************************

Return

 '**************************************************************************************************************************************************
'Ende der Unterprogrammschleife


Timer_irq:
Timer1 = Timer16bit

Return

Sub Convallt
1wreset                                                     'reset the Bus
1wwrite &HCC                                                'Skip Rom
1wwrite &H44                                                'Convert T
End Sub

Function Decigrades(sc_tmp As Byte)
Local 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_tmp(8)
T = T + T1
Decigrades = T / 100

End Function

End

Return
Settime:
Return
Getdatetime:
Return
Setdate:
Return
 
Ich bräuchste mal etwas Hilfe von jemand weil ich nicht weiter kommen
wenn ich das DCF-Modul mit allen Sachen sußer Tempmessung laufen lasse geht alles super.

Wenn ich das Programm ohne DCF laufen lasse geht es auch super.

Sobald ich aber die Tempmessung mit und DCF einfüge geht nix mehr.
Aber leider geht alles zusammen nicht.
das steht im Display nur Müll.
Das einzige was ich noch erkenne ist "DSID not on Bus " also nicht gefunden
Das sagt mir das sich an einer Stelle DCF und Temp auf dem Bus gegenseitig behindern aber ich finde nicht wo ich bin mittlerweile auch total blin. und sehe nix mehr an was es liegen könnte

Code:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 16
$swstack = 32
$framesize = 32



Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , _
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Initlcd
Config Lcdmode = Port
Config Lcdbus = 4



Config Dcf77 = Pind.3 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .


Idcf Alias Pind.3
Reset Portd.3

Oled Alias Portb.3                                          'nur zum testen
Config Oled = Output                                        'Nur zum testen

Dcfpon Alias Portd.2
Config Dcfpon = Output
Set Dcfpon

Config Porta = Output                                       'Port A komplett ausgänge



Config 1wire = Portb.0                                      'Temp Fühlereingang
Config Portb.3 = Output


'Hier geben wir der Definition einen schöneren Namen oder eine kurzen Namen
Takt Alias Porta.0
O2 Alias Porta.5
Fi Alias Porta.4
Gr Alias Porta.7
Kl Alias Porta.6
'*****************************************************************************


Const Myversion1 = "Test"
Const Myversion2 = "Funkuhr"


Declare Sub Showtime_lcd()
Declare Sub Initdcf
Declare Sub Pumpe
Declare Sub Init
Declare Sub Convallt
Declare Function Decigrades(sc_tmp As Byte) As Integer

' Variablen bestimmen

Dim Zeit As Word
Dim O2 As Bit
Dim Fi As Bit
Dim Gr As Bit
Dim Kl As Bit


'für Temp
Dim D As Byte
Dim W As Word
Dim Min1 As Integer
Dim Max1 As Integer
Dim Min2 As Integer
Dim Max2 As Integer
Dim Dsid1(8)as Byte
Dim Dsid2(8)as Byte
Dim Sc(9) As Byte
Dim Klein As Integer
Dim Gross As Integer
'für Temp

Dim Lftag As Byte
Dim Tz As Byte
Dim Zeit0 As Byte

' Variablen bestimmen

Print Myversion1 ; Myversion2

Reset Oled
Set Dcfpon
Set Oled
Call Initdcf
Reset Oled
Reset Dcfpon

Cls
Enable Interrupts



Ddrd = &HFF

'TEMP

Cls

W = 1wirecount()

'erster Sensor
Dsid1(1) = 1wsearchfirst()
Do
Dsid2(1) = 1wsearchnext()
Loop Until Err = 1

'Temp


'****************** HAUPTPROGRAMMSCHLEIFE **********************************
'
Do
'**********************
'Nur zum testen
  If Idcf = 1 Then
    Set Oled
  Else
    Reset Oled
  End If
'**********************



'Temp
 Locate 3 , 1
 Lcd "Gross"
 Locate 3 , 8
 Lcd Gross : Lcd "C"
 Locate 4 , 1
 Lcd "Klein"
 Locate 4 , 8
 Lcd Klein : Lcd "C"
 Cursor Off
'Temp

'Unterprogramme aufrufen
Call Pumpe                                                  'Zeit einstellungen aufrufen Filter, O2, Heizung


Loop

End

Sectic:
If Dcf_status.7 = 1 Then
  Call Showtime_lcd()
Else
    Locate 1 , 1
    Lcd "sync"
    Locate 2 , 1
    Lcd Time$
    Print Date$ ; "  " ; Time$
End If


Return

'************* ENDE HAUPTPROGRAMM ******************************************

Sub Initdcf
 Initlcd
 Cls
 Locate 1 , 1 : Lcd Myversion1
 Locate 2 , 1 : Lcd Myversion2
 Wait 5
 Cls
 Cursor Off
End Sub


Sub Showtime_lcd()

  Lftag = Dayofyear()
  Incr Lftag

  Tz = Dcf77timezone()

  Print Date$ ; " " ; Time$ ; " " ; Lftag

  Locate 1 , 1
  Lcd Date$
  Locate 1 , 10
  Lcd "Tag:" ; Lftag
  Locate 2 , 1
  Lcd Time$

End Sub

'ZEITEINSTELLUNGEN

'Filter                                                      ' Auf ausgang ADC4

Sub Pumpe
'Filter
      If Zeit <= 559 Then Fi = 0                            'Filter aus  bis 5:59
      If Zeit >= 600 Then Fi = 1                            'Filter an   Von 6:00
      If Zeit >= 2200 Then Fi = 0                           'Filter aus  bis 22:00

'Sauerstoff
      If Zeit <= 959 Then O2 = 0                            'o2 aus bis 9:59
      If Zeit >= 1000 Then O2 = 1                           'o2 an ab 10:00
      If Zeit >= 1010 Then O2 = 0                           'o2 aus ab 10:10
      If Zeit >= 1200 Then O2 = 1                           'o2 an ab 12:00
      If Zeit >= 1210 Then O2 = 0                           'o2 aus ab 12:10
      If Zeit >= 1400 Then O2 = 1                           'o2 an ab 14:00
      If Zeit >= 1410 Then O2 = 0                           'o2 aus ab 14:10
      If Zeit >= 1600 Then O2 = 1                           'o2 an ab 16:00
      If Zeit >= 1610 Then O2 = 0                           'o2 aus ab 16:10
      If Zeit >= 1800 Then O2 = 1                           'o2 an ab 18:00
      If Zeit >= 1810 Then O2 = 0                           'o2 aus ab 18:10

'Großes Becken
      If Zeit <= 659 And Gross <= 19 Then Gr = 1            'Temp 1 bei 19°C an bis 6:59
      If Zeit <= 659 And Gross >= 22 Then Gr = 0            'Temp 1 bei 22°C aus  bis 6:59
      If Zeit >= 700 And Gross <= 22 Then Gr = 1            'Temp 1 bei 22°C an ab 7:00
      If Zeit >= 700 And Gross >= 24 Then Gr = 0            'Temp 1 bei 24°C aus  ab 7:00
      If Zeit >= 2100 And Gross <= 19 Then Gr = 1           'Temp 1 bei 19°C an ab 21:00
      If Zeit >= 2100 And Gross >= 21 Then Gr = 0           'Temp 1 bei 21°C aus  ab 21:00


'Kleines Becken
      If Zeit <= 659 And Klein <= 22 Then Kl = 1            'Temp 2 bei 22°C an bis 6:59
      If Zeit <= 659 And Klein >= 24 Then Kl = 0            'Temp 2 bei 24°C aus  bis 6:59
      If Zeit >= 700 And Klein <= 23 Then Kl = 1            'Temp 2 bei 23°C an ab 7:00
      If Zeit >= 700 And Klein >= 27 Then Kl = 0            'Temp 2 bei 27°C aus  ab 7:00
      If Zeit >= 2100 And Klein <= 22 Then Kl = 1           'Temp 2 bei 22°C an ab 21:00
      If Zeit >= 2100 And Klein >= 24 Then Kl = 0           'Temp 2 bei 24°C aus  ab 21:00


'ENDE ZEITEINSTELLUNGEN
'_______________________________________________________________________________


'Temp
'Temp1                                                       'Auf Ausgang ADC3
1wverify Dsid1(1)                                           'Issues the "Match Rom"

Locate 3 , 12
If Err = 1 Then
Lcd "DsID1 not on bus"

Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Gross = Decigrades(sc(9))

End If
End If

 'Temp2                                                      'Auf Ausgang ADC4
1wverify Dsid2(1)

Locate 4 , 12
If Err = 1 Then
Lcd "DsID2 not on Bus"

Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Klein = Decigrades(sc(9))


End If
End If

'Temp


End Sub Pumpe

Return



Sub Convallt
1wreset                                                     'reset the Bus
1wwrite &HCC                                                'Skip Rom
1wwrite &H44                                                'Convert T
End Sub

Function Decigrades(sc_tmp As Byte)
Local 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_tmp(8)
T = T + T1
Decigrades = T / 100


End Function

End
 
Hallo Maikgen!

Ich muss gestehen, dass ich mir dein Programm wohl einige Zeit zu Gemüte führen müsste, um wirklich alles "zu verstehen".

Was mir aber spontan aufgefallen ist:
Code:
Config Dcf77 = [B]Pind.3[/B] , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic 
Config Date = Dmy , Separator = . 

[B]Idcf Alias Pind.3 
Reset Portd.3 [/B]

Ich weiß wirklich nicht, wozu das gut sein soll? :hmmmm:
Warum gibst du dem DCF77-Eingangspin einen Alias und setzt ihn auf GND?

Apropos DCF77-Eingangspin....
Etwas tiefer im Programm steht:
Code:
Ddrd = &HFF

Mit der Angabe DDRD = &HFF setzt du ALLE Pins von Port.D auf Ausgang!
PinD.3 muss aber ein Eingang sein!!!


Was dies aber mit dem 1Wire zu tun haben soll, kann ich mir auch nicht erklären. :hmmmm:
Dafür muss ich mir dein Programm wohl noch mal genauer ansehen. ;)

Trotzdem solltest du das "Durcheinander" mit den Ein- und Ausgängen mal bereinigen.
Vielleicht gewöhnst du dir aber auch einfach eine andere Schreibweise und Struktur an, dann fällt es schneller auf. :)

Meine Schreibweise ist immer:
(Nur ein Beispiel !)
Code:
'Port.D
Ddrd = &B1111_1001                              '1 ist Ausgang 0 ist Eingang
Portd = &B0000_0110                             'auf Hi oder Low setzen
Und die einzelnen Bits immer schön von hinten beginnend zählen!

Gruß,
Cassio
 
Code:
[B]Idcf Alias Pind.3 
Reset Portd.3 [/B]

Ich weiß wirklich nicht, wozu das gut sein soll? :hmmmm:
Warum gibst du dem DCF77-Eingangspin einen Alias und setzt ihn auf GND?


Das muss man doch soweit ich bis jetzt gelesen habe bei dem Pollin Modul so machen auf GND setzen anders geht es auch nicht.

Gut das Mit dem Port.D das brauch ich wirklich net das hab ich raus genommen wer weis wo das her kommt.
Kann aber eigentlich auch nur irgendwo von der Temp sache mit kommen.

Mittlerweile bin ich soweit das der mir wieder was gescheides auf dem display anzeigt zumindest findet er die Uhr die anderen Sachen schaltet er nach der Uhr nur die Tempsensoren findet er nicht. Die sind aber richtig angeschlossen das hab ich auch schon getestet.

So bin nun auch am testen was alles von dem DCF Sachen raus kann weil da auch Sachen drin stehen die gar nicht gebraucht werden.
Zudem Versuche ich es auch noch etwas übersichtlicher zumachen.

Es Liegt wahrscheinlich mit der Reihenfolge zusammen wie was nach und nach abgearbeitet wird.
Weis jetzt nur noch nicht genau ob er zuerst die DCF oder erst die Temp Sensoren initialisieren muss.
Das wird sich noch zeigen zur Zeit ist kein DCF Signal da :-( aber das Problem hatte ich gestern auch schon das ist in 2 Stunden wieder da.
 
So nun bin ich soweit das die DCF und die Temp soweit geht. Es lag echt nur an der Reihenfolge ist irgnedwo auch logisch das er als erstes die DCF fertig machen muss bevor er überhaupt was anderes machen kann.
Habe jetzt nur das Problem das ich ein "Wait 1"brauche sonst geht die Temp nicht richtig wenn das "Wait 1 " aber drin steht geht die Uhr nur im 2 Sekunde takt. bin nun am überlegen wie ich eine Sekunde dort warten kann das er die Tempsensoren richtig findet udn die uhr trotzdem richtig läuft.
wenn ich das "wait 1" rausnehmen dann zeigt er erste Sensor nur 85C an und mehr nicht der 2 Sensor geht richtig. also ist er da zu schnell drüber gegangen bei der Initzialisierung des 1 Sensors habe es mal in Programm markiert wo das ist.

Code:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 16
$swstack = 32
$framesize = 32



Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , _
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Initlcd
Config Lcdmode = Port
Config Lcdbus = 4



Config Dcf77 = Pind.3 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .

Dcfpon Alias Portd.2
Oled Alias Portb.3
Idcf Alias Pind.3

Config 1wire = Portb.0

Config Oled = Output
Config Dcfpon = Output

Reset Portd.3
Set Dcfpon

Const Myversion1 = "Funkuhr"
Const Myversion2 = " Test "


Declare Sub Showtime_lcd()
Declare Sub Initdcf
Declare Sub Init
Declare Sub Convallt
Declare Function Decigrades(byval Sc(9) As Byte) As Integer
Declare Sub Temp1
Declare Sub Temp2


Dim Lftag As Byte
Dim Tz As Byte


Dim B As Byte
Dim W As Word
Dim Dg As Integer
Dim Gross As Integer
Dim Klein As Integer
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Sc(9) As Byte


Print Myversion1 ; Myversion2

Reset Oled
Set Dcfpon
Set Oled
Call Initdcf
Reset Oled
Reset Dcfpon

Cls
Enable Interrupts

W = 1wirecount()

'****************** HAUPTPROGRAMMSCHLEIFE **********************************
'
Do

  If Idcf = 1 Then
    Set Oled
  Else
    Reset Oled
  End If



Loop

End

Sectic:
If Dcf_status.7 = 1 Then
  Call Showtime_lcd()
Else
    Locate 1 , 1
    Lcd "sync"
    Locate 2 , 1
    Lcd Time$
    Print Date$ ; "  " ; Time$

End If

Call Temp1

Return



'************* ENDE HAUPTPROGRAMM ******************************************
Sub Initdcf
 Initlcd
 Cls
 Locate 1 , 1 : Lcd Myversion1
 Locate 2 , 1 : Lcd Myversion2
 Wait 5
 Cls
 Cursor Off
End Sub


Sub Showtime_lcd()

  Lftag = Dayofyear()
  Incr Lftag

  Tz = Dcf77timezone()

  Print Date$ ; " " ; Time$ ; " " ; Lftag

  Locate 1 , 1
  Lcd Date$
  Locate 1 , 10
  Lcd "Tag:" ; Lftag
  Locate 2 , 1
  Lcd Time$
  Locate 2 , 10
  If Tz = 1 Then
      Lcd "MEZ"
    Else
      Lcd "MESZ"
    End If

Call Temp2

End Sub Showtime_lcd()


Sub Temp1
Dsid1(1) = 1wsearchfirst()
Do
 Dsid2(1) = 1wsearchnext()
Loop Until Err = 1
End Sub Temp1

If Dsid1(8) = Crc8(dsid1(1) , 7) Then
 Locate 3 , 1
 Lcd "CRC OK Sensor 1 ID"
 Wait 1
 Locate 3 , 1
 For B = 1 To 8
 Lcd Hex(dsid1(b))
 Next
End If

' Second sensor
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
 Locate 4 , 1
 Lcd "CRC OK Sensor 2 ID"
 Wait 1
 Locate 4 , 1
 For B = 1 To 8
 Lcd Hex(dsid2(b))
 Next
End If
Wait 1
 Cls


Sub Temp2
Convallt
 'Das Wait1 muss noch raus sonst geht die Zeit nicht richtig es muss aber hier auch eine Sekunde gewartet werden sonst geht die Temp nicht
Wait 1

 1wverify Dsid1(1)

 Locate 3 , 1
 If Err = 1 Then
 Lcd "DsId1 not on bus "

 Elseif Err = 0 Then
 1wwrite &HBE
 Sc(1) = 1wread(9)
 If Sc(9) = Crc8(sc(1) , 8) Then
 Gross = Decigrades(sc(9))

 Lcd Gross : Lcd "C" : Locate 3 , 6

 End If
 End If

 1wverify Dsid2(1)
 Locate 4 , 1
 If Err = 1 Then
 Lcd "DsId2 not on bus "

 Elseif Err = 0 Then
 1wwrite &HBE
 Sc(1) = 1wread(9)
 If Sc(9) = Crc8(sc(1) , 8) Then
 Klein = Decigrades(sc(9))

 Lcd Klein : Lcd "C" : Locate 4 , 6

 End If
 End If
End Sub Temp2


End

Sub Convallt
 1wreset                                                    ' reset the bus
 1wwrite &HCC                                               ' skip rom
 1wwrite &H44                                               ' Convert T
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))
 'Print Hex(t)
 'Print T

 T = T * 50
 T = T - 25
 T1 = Sc(8) - Sc(7)
 T1 = T1 * 100
 T1 = T1 / Sc(8)
 T = T + T1
 Decigrades = T / 100

End Function
 
Schreib mal das Convallt ans Ende von Temp2.
Dann brauchst du keine extra Wartezeit, weil Sectic ja eh nur 1 mal pro Sekunde aufgerufen wird.

HBA
 
nein das bringt auch nix das selbe Problem da stimmt nur die zweite Temp die erste Zeigt 85C an.
 
nein das bringt auch nix das selbe Problem da stimmt nur die zweite Temp die erste Zeigt 85C an.
Wenn ich mich richtig erinnere dann ist das die Fehlermeldung des DS18S20
wenn irgendwas schief gegangen ist. zB nicht lange genug gewartet oder was
anderes.

Gruß
Dino
 
ja genau es wird nicht lang genug gewartet ist nur dir frage wie bekomme ich das hin das ich da etwas länger warte ohne Wartebefehl am besten mit einer Variablen.
Welche zum beispiel warte heist
und so etwa aussieht

Warte = Warte + _sec


Code:
Call Convallt

Warte = 0
If Warte >=  2  then 
 1wverify Dsid1(1)

 Locate 3 , 1
 If Err = 1 Then
 Lcd "DsId1 not on bus "

 Elseif Err = 0 Then
 1wwrite &HBE
 Sc(1) = 1wread(9)
 If Sc(9) = Crc8(sc(1) , 8) Then
 Gross = Decigrades(sc(9))

 Lcd Gross : Lcd "C" : Locate 3 , 1

 End If
 End If
 End If

so etwa hätte ich gedacht könnte es gehen.


habe es jetzt auch nochmal so gemacht und jetzt ging es auch komisch vorhin ging es nicht.
Nur jetzt zeigt er nur die zweite Temp an die Erste ist ganz weg
 
Probier es mal so:

Code:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 16
$swstack = 32
$framesize = 32



Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , _
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Initlcd
Config Lcdmode = Port
Config Lcdbus = 4



Config Dcf77 = Pind.3 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .

Dcfpon Alias Portd.2
Oled Alias Portb.3
Idcf Alias Pind.3

Config 1wire = Portb.0

Config Oled = Output
Config Dcfpon = Output

Reset Portd.3
Set Dcfpon

Const Myversion1 = "Funkuhr"
Const Myversion2 = " Test "


Declare Sub Showtime_lcd()
Declare Sub Initdcf
Declare Sub Init
Declare Sub Convallt
Declare Function Decigrades(byval Sc(9) As Byte) As Integer
Declare Sub Temp1
Declare Sub Temp2


Dim Lftag As Byte
Dim Tz As Byte


Dim B As Byte
Dim W As Word
Dim Dg As Integer
Dim Gross As Integer
Dim Klein As Integer
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Sc(9) As Byte


Print Myversion1 ; Myversion2

Reset Oled
Set Dcfpon
Set Oled
Call Initdcf
Reset Oled
Reset Dcfpon

Cls

W = 1wirecount()
Call Temp1
Convallt                                                     '!!!!!!!!!!!!!! ZUSÄTZLICH
Wait 1                                                      '!!!!!!!!!!!!!! ZUSÄTZLICH
Enable Interrupts
'****************** HAUPTPROGRAMMSCHLEIFE **********************************
'
Do

  If Idcf = 1 Then
    Set Oled
  Else
    Reset Oled
  End If



Loop

End

Sectic:
If Dcf_status.7 = 1 Then
  Call Showtime_lcd()
Else
    Locate 1 , 1
    Lcd "sync"
    Locate 2 , 1
    Lcd Time$
    Print Date$ ; "  " ; Time$

End If

Call Temp2                                                  '!!!!!!!!!!!!!! ZUSÄTZLICH
Convallt                                                    '!!!!!!!!!!!!!! ZUSÄTZLICH
Return



'************* ENDE HAUPTPROGRAMM ******************************************
Sub Initdcf
 Initlcd
 Cls
 Locate 1 , 1 : Lcd Myversion1
 Locate 2 , 1 : Lcd Myversion2
 Wait 5
 Cls
 Cursor Off
End Sub


Sub Showtime_lcd()

  Lftag = Dayofyear()
  Incr Lftag

  Tz = Dcf77timezone()

  Print Date$ ; " " ; Time$ ; " " ; Lftag

  Locate 1 , 1
  Lcd Date$
  Locate 1 , 10
  Lcd "Tag:" ; Lftag
  Locate 2 , 1
  Lcd Time$
  Locate 2 , 10
  If Tz = 1 Then
      Lcd "MEZ"
    Else
      Lcd "MESZ"
    End If

End Sub Showtime_lcd()


Sub Temp1
Dsid1(1) = 1wsearchfirst()
Do
 Dsid2(1) = 1wsearchnext()
Loop Until Err = 1

If Dsid1(8) = Crc8(dsid1(1) , 7) Then
 Locate 3 , 1
 Lcd "CRC OK Sensor 1 ID"
 wait 1
 Locate 3 , 1
 For B = 1 To 8
 Lcd Hex(dsid1(b))
 Next
End If

' Second sensor
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
 Locate 4 , 1
 Lcd "CRC OK Sensor 2 ID"
 wait 1
 Locate 4 , 1
 For B = 1 To 8
 Lcd Hex(dsid2(b))
 Next
End If
 Cls
End Sub Temp1                                               '!!!!!!!!!!!!!! ZUSÄTZLICH

Sub Temp2

 1wverify Dsid1(1)

 Locate 3 , 1
 If Err = 1 Then
   Lcd "DsId1 not on bus "

 Elseif Err = 0 Then
   1wwrite &HBE
   Sc(1) = 1wread(9)
   If Sc(9) = Crc8(sc(1) , 8) Then
      Gross = Decigrades(sc(9))

      Lcd Gross : Lcd "C" : Locate 3 , 6

   End If
 End If

 1wverify Dsid2(1)
 Locate 4 , 1
 If Err = 1 Then
   Lcd "DsId2 not on bus "

 Elseif Err = 0 Then
   1wwrite &HBE
   Sc(1) = 1wread(9)
   If Sc(9) = Crc8(sc(1) , 8) Then
      Klein = Decigrades(sc(9))

      Lcd Klein : Lcd "C" : Locate 4 , 6

   End If
 End If
End Sub Temp2


End

Sub Convallt
 1wreset                                                    ' reset the bus
 1wwrite &HCC                                               ' skip rom
 1wwrite &H44                                               ' Convert T
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))
 'Print Hex(t)
 'Print T

 T = T * 50
 T = T - 25
 T1 = Sc(8) - Sc(7)
 T1 = T1 * 100
 T1 = T1 / Sc(8)
 T = T + T1
 Decigrades = T / 100

End Function

Ich habe gerade noch einige Änderungen gemacht.

HBA
 
Ja super das geht besser da war zwar ein CLS zuviel drin aber das hab ich schon gefunden.
jetzt muss ich mir das mal in Ruhe anschaun was da anders ist als bei mir hab schon gesehen das da jetzt 2 oder 3 mal convallt aufgerufen wird. das hatte ich auch schon mal aber warscheinlich auch an der Falschen stelle

sync dauert recht lange bis jetz schon über 5 min aber ich lass es mal laufen werde mich morgen mochmal melden
 
ich habe eigentlich nur die Stellen geändert, an denen die Subs aufgerufen werden. Außerdem stand hinter End Sub Temp1 ein Stück Code außerhalb aller Subs, der nie ausgeführt werden konnte.

Die Abfolge ist so:
Zu Anfang holst du dir in der Sub Temp1 die Adressen der beiden Sensoren.
Anschließend wird Convallt aufgerufen, damit auch beim ersten Anzeigen der Temperaturen vernünftige Werte kommen.
In der Sub Sectic, die automatisch einmal pro Sekunde aufgerufen wird, wird die Sub Temp2 aufgerufen. Sie liest die Temp Werte der Sensoren ein und zeigt sie an. Danach wird wieder Convallt aufgerufen und die Sub Sectic beendet.
Bis zum nächsten Aufruf von Sectic sind die Sensoren längst fertig mit der Konvertierung und die Daten stehen zur Abholung bereit.
Die Wartezeit nach dem Start der Konvertierung ist also in die 1-Sekunden Wartezeit auf den nächsten Aufruf von Sectic verlegt worden und beeinflusst so dein Programm nicht.

Ich habe es bei mir so gemacht, dass keine Temperaturen während der ersten Synchronisierung gemessen werden. Ich weiß aber nicht, ob du dies mit dem Config DCF77 Befehl hinbekommst.
Evtl. kannst du Sectic so machen:

Code:
Sectic:
If Dcf_status.7 = 1 Then
   Call Showtime_lcd()
   Call Temp2                                                  '!!!!!!!!!!!!!! ZUSÄTZLICH
   Convallt                                                    '!!!!!!!!!!!!!! ZUSÄTZLICH
Else
    Locate 1 , 1
    Lcd "sync"
    Locate 2 , 1
    Lcd Time$
    Print Date$ ; "  " ; Time$

End If

Return

HBA
 
also das bingt auch nix das komische ist bei Synco zeigt er mir die richtigen temps an die ändern sich auch.
aber sobald er die Zeit hat steht bei der ersten Temp 85C die zweite Temp passt.

Ich glaube ich gebe auf.

Edit noch nicht ganz geb ich auch
nun ist es denk ich nicht mehr weit

Edit:
Den Temp sensor eins der wechselt immer zwischen der richtige temp und 85C wobei die richtige Temp nur einen Bruchteil einer sekunde maximal 1/4 sekunde steht weis net ob ich das bis jetzt nie gesehen habe oder ob das jetzt neu ist.
Also kennt er ja auch die beiden sensoren richtig jetzt ist nur das Problem wie bekomme ich die 85C weg.

So nun geht es man bin ich froh Danke euch allen schon mal für die Hilfe.

Code:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 16
$swstack = 32
$framesize = 32



Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , _
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Initlcd
Config Lcdmode = Port
Config Lcdbus = 4



Config Dcf77 = Pind.3 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .

Dcfpon Alias Portd.2
Oled Alias Portb.3
Idcf Alias Pind.3

Config 1wire = Portb.0

Config Oled = Output
Config Dcfpon = Output

Reset Portd.3
Set Dcfpon

Const Myversion1 = "Funkuhr"
Const Myversion2 = " Test "


Declare Sub Showtime_lcd()
Declare Sub Initdcf
Declare Sub Init
Declare Sub Convallt
Declare Function Decigrades(byval Sc(9) As Byte) As Integer
Declare Sub Temp1
Declare Sub Temp2


Dim Lftag As Byte
Dim Tz As Byte


Dim B As Byte
Dim W As Word
Dim Dg As Integer
Dim Gross As Integer
Dim Klein As Integer
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Sc(9) As Byte


Print Myversion1 ; Myversion2

Reset Oled
Set Dcfpon
Set Oled
Call Initdcf
Reset Oled
Reset Dcfpon

'Cls

W = 1wirecount()
Convallt


Enable Interrupts
'****************** HAUPTPROGRAMMSCHLEIFE **********************************
'
Do

  If Idcf = 1 Then
    Set Oled
  Else
    Reset Oled
  End If

Loop

End

Sectic:
If Dcf_status.7 = 1 Then
  Call Showtime_lcd()
  Call Temp2
  Convallt
Else
    Locate 1 , 1
    Lcd "sync"
    Locate 2 , 1
    Lcd Time$
    Print Date$ ; "  " ; Time$

End If

Call Temp1
Convallt
Return



'************* ENDE HAUPTPROGRAMM ******************************************
Sub Initdcf
 Initlcd
 Cls
 Locate 1 , 1 : Lcd Myversion1
 Locate 2 , 1 : Lcd Myversion2
 Wait 2
 Cls
 Cursor Off
End Sub


Sub Showtime_lcd()

  Lftag = Dayofyear()
  Incr Lftag

  Tz = Dcf77timezone()

  Print Date$ ; " " ; Time$ ; " " ; Lftag
  Locate 1 , 1
  Lcd Date$
  'Locate 1 , 10
  'Lcd "Tag:" ; Lftag
  Locate 2 , 1
  Lcd Time$
  'Locate 2 , 10
  'If Tz = 1 Then
  '    Lcd "MEZ"
  '  Else
   '   Lcd "MESZ"
   ' End If

End Sub Showtime_lcd()


Sub Temp1
Dsid1(1) = 1wsearchfirst()
Do
 Dsid2(1) = 1wsearchnext()
Loop Until Err = 1

'(
If Dsid1(8) = Crc8(dsid1(1) , 7) Then
 Locate 3 , 1
 Lcd "CRC OK Sensor 1 ID"
 'Wait 1
 Locate 3 , 1
 For B = 1 To 8
 Lcd Hex(dsid1(b))
 Next
 'Cls
End If

' Second sensor
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
 Locate 4 , 1
 Lcd "CRC OK Sensor 2 ID"
' Wait 1
 Locate 4 , 1
 For B = 1 To 8
 Lcd Hex(dsid2(b))
 Next
 'Cls
End If
')
End Sub Temp1


Sub Temp2

 1wverify Dsid1(1)

 Locate 4 , 1
 If Err = 1 Then
   Lcd "DsId1 not on bus "

 Elseif Err = 0 Then
   1wwrite &HBE
   Sc(1) = 1wread(9)
   If Sc(9) = Crc8(sc(1) , 8) Then
      Gross = Decigrades(sc(9))
 Lcd Gross : Lcd "C" : Locate 4 , 6
 End If
 End If

 1wverify Dsid2(1)
 Locate 3 , 1
 If Err = 1 Then
   Lcd "DsId2 not on bus "

 Elseif Err = 0 Then
   1wwrite &HBE
   Sc(1) = 1wread(9)
   If Sc(9) = Crc8(sc(1) , 8) Then
      Klein = Decigrades(sc(9))
Lcd Klein : Lcd "C" : Locate 3 , 6
 End If
 End If
End Sub Temp2


End

Sub Convallt
 1wreset                                                    ' reset the bus
 1wwrite &HCC                                               ' skip rom
 1wwrite &H44                                               ' Convert T
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 / 100

End Function

So ist das Programm jetzt.
Die Zeit passt zwar nicht 100% also die läuft zu langsam aber das kann man ja mit Synco ausgleichen da muss er eben alle 30min mal Zeit holen. Das ist auch erstmal egal
 
So nun hab ich mich mal an die Uhr genauigkeit gemacht.
sie läuft genau wenn ich nur die DCf laufen lasse ohne irgendwas anderes.
wenn ich aber die Temp mit laufen lasse dann läuft die Uhr zulangsam in der Minute etwa 10 sekunden das ist schon ganz schön viel das kann man ja auch nicht einfach mit syncro hinbekommen da müsste man ja jede minute abgleichen weil ich 6 Minuten ja schon eine Minute fehlt.
Uhrenquarz hab ich keinen mehr an TOSC1 und 2.


Muss noch dazu sagen habe das Modul von Pollin und könnte mir auch vorstellen das es mit dem gar nicht so einfach geht habe ich zumindest schon oft gelesen das das von Conrad oder Reichelt besser geht.
 
Hallo zusammen!

Ich weiß wirklich nicht, was ihr hier genau für ein Problem sucht. :hmmmm:

Das Hauptproblem liegt meiner Meinung nach in der Struktur des Programms!
Ich würde einfach mal den Programmcode in vernünftiger Weise neu zusammen stellen.
Wenn ich mir die "Sectic"-Routine allein schon ansehe, dann würde ich da als erstes den Rotstift ansetzen. ;)
Die "Sectic" sollte so kurz wie möglich sein.....
Zum Beispiel:
Code:
Sectic:
Toggle Puls
Return

oder z.B. auch:
Code:
Sectic
Incr Zeitzaehler
Return

Mehr nicht!
Den Rest sollte man in der Hauptschleife auswerten!

Dann würde ich die Displayanzeige "aufteilen".
Alles was nicht jede Sekunde geändert wird, muss auch nicht neu angezeigt werden!

Anschließend würde ich mich um die 1Wire-Sensoren kümmern.
Zum Beispiel kann man in den ungeraden Sekunden BEIDE DS1820 dazu veranlassen, die Temperaturkonvertierung durchzuführen.
In den geraden Sekunden (weil die Sensoren sowie bis zu 750ms Zeit brauchen) kann man dann die Scratchpads beider Sensoren auslesen und die Temperaturen berechnen lassen...... das sollte innerhalb einer Sekunde locker machbar sein.

Anschließend werden nur alle geäderten Variablen im Display neu ausgegeben und das war es dann.

Ich würde mal behaupten, dass sich dann die ganzen Timing-Probleme von "allein" lösen. ;)

Gruß,
Cassio
 
Auch hallo zusammen,

Ich weiß wirklich nicht, was ihr hier genau für ein Problem sucht. :hmmmm:

Das Hauptproblem liegt meiner Meinung nach in der Struktur des Programms!
Ich würde einfach mal den Programmcode in vernünftiger Weise neu zusammen stellen.
Wenn ich mir die "Sectic"-Routine allein schon ansehe, dann würde ich da als erstes den Rotstift ansetzen. ;)
Die "Sectic" sollte so kurz wie möglich sein.....
kann man wohl so sehen. Wenn man zuviel Zeit in der Sectic verbrät und die
Interrupts sich dann selber überholen geht natürlich viel durcheinander was
man auch wohl an der Zeit merkt.

Anschließend würde ich mich um die 1Wire-Sensoren kümmern.
Zum Beispiel kann man in den ungeraden Sekunden BEIDE DS1820 dazu veranlassen, die Temperaturkonvertierung durchzuführen.
In den geraden Sekunden (weil die Sensoren sowie bis zu 750ms Zeit brauchen) kann man dann die Scratchpads beider Sensoren auslesen und die Temperaturen berechnen lassen...... das sollte innerhalb einer Sekunde locker machbar sein.
Ich würde es folgendermaßen machen ...
1. in der Sectic beide Sensoren abfragen. Nicht mehr! NUR abfragen.
2. in der Sectic danach sofort bei beide Sensoren die Messung neu starten
Dann haben die Sensoren eine Sekunde Zeit alles zu verarbeiten. Das sollte
reichen. Alles andere wie schon gesagt in der Hauptroutine.

Ich würde mal behaupten, dass sich dann die ganzen Timing-Probleme von "allein" lösen. ;)
Ich würde mal bei über 75% aller Probleme auf falsches Timing tippen. Das
ist das, was einem immer die Hirnwindungen glühen läßt und einem oft genug
einen Knüppel in die Räder des Programms schmeißt. Vor allem Interrupts
sind da immer sehr gefählich wenn man nicht aufpaßt.

Gruß
Dino
 
so nun habe ich mich nochmal an das Temp Problem gemacht erstmal wieder ohne alles
denke aber mal das es schon erstmal etwas übersichtlicher ist.
es ist zwar immer noch ein Wait drin aber das werde ich auch noch weg bekommen.
Habe ihn auch die Adressen der Sensoren gegeben das ist denke ich mal auch noch etwas besser oder nicht.
Ist nur ein was an der Sache er zeigt noch eine T19 an die ist aber auch nur auf dem Startwert vom Temp2 und die bekomme ich noch nicht weg.

Code:
$regfile = "m32def.dat"
$crystal = 16000000

Match_rom Alias &H55
Skip_rom Alias &HCC
Auslesen Alias &HBE
Messen Alias &H44

Config 1wire = Portb.0                                      'Portb.0
Dim Ds1820id(16) As Byte                                    'Anzahle sensoren 8 = 1  16 = 2 , 24 = 3 , 32 = 4
Dim Sc(9) As Byte                                           
Dim T As Integer
Dim Anzahl As Byte
Dim Adressen As Byte

Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , _
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Initlcd
Config Lcdmode = Port
Config Lcdbus = 4
Cls

Restore Sensoren
For Anzahl = 1 To 16
   Read Ds1820id(anzahl)
Next I
1wreset
1wwrite Skip_rom
1wwrite Messen                                              'Alle angeschlossenen DS1820 zum Messen veranlassen


Do                                                          'Ausgabe alle 1 Sekunden
  Wait 1
  For Adressen = 1 To 9 Step 8                              '1,9,17,25
      Incr Anzahl
      1wreset                                               '1Wire Reseten
      1wwrite &H55                                          'MATCHROM=>Adress.den DS1820 anhand des ROM Inhaltes
      1wwrite Ds1820id(adressen) , 8                        '8 Byte ID wird uebertragen
      1wwrite Auslesen                                      'READ SCATCHPAD => Liest alle Bytes des SP Memorys
      Sc(1) = 1wread(9)
      T = Makeint(sc(1) , Sc(2))                            'komprimiert zwei Bytes in die Integervariable T
      T = T / 2                                             'Temperatur in ganzen Grad ausgeben
      Locate Anzahl , 6
      Lcd "T" ; Anzahl ; "=" ; T ; " C"                     'Anzeige erfolgt so: T1=23 C
  Next Id
  Anzahl = 0
   1wreset
   1wwrite Skip_rom
   1wwrite Messen                                           'Alle angeschlossenen DS1820 zum Messen veranlassen

   Cursor Off
Loop

End

Sensoren:
Data &H10 , &HE8 , &H5B , &HDD , &H01 , &H08 , &H00 , &HD7
Data &H10 , &H18 , &H63 , &HDD , &H01 , &H08 , &H00 , &H1F
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)