Temp Messung mit dem DS18S20+

Phantomias2006

Mitglied
10. Jan. 2010
56
0
6
Sprachen
Hallo

Ich wünsche euch nachträglich alles gute zu Weihnachten!

So nun zu meinen Problem,

Da ich jetzt wieder mal ein paar Tage Zeit habe/hatte dachte ich mir ich setze mich wieder mal zu meinem Spielzeug ;)

Ich habe diese Woche mein LCD 128x64 an mein Pollin EVA Board angeschlossen
und mit einigen Anfangsproblemen läuft dieses nun. (Danke an Cassio habe seinen Code + Schaltplan verwendet obwohl der schaltplan beim Pollin - Display leider nicht 100% stimmt ?!)

Da ich auch 2 DS18S20 damals mitbestellt habe dachte ich mir ich versuche mich mal mit einer einfachen Temp - Messung.

Gesagt getan gleich mal ein paar Testscripts runtergeladen zum Probieren.
Nur will irgendwie keiner der Testscripts so richtig

Das Display zeigt immer Werte um die 300°C an (Raumtemp. ca. 22)

Habe schon verschiedene Formel für die Berechnung probiert nur bekomme ich immer einen Falschen wert.
Mit der Formel laut Datenblatt bekomme ich Werte zwischen 55-60 Grad

Hier mal mein Code



CodeBox bascom

'--------------------------------------------------------------------------'
' LCD Testprogramm '
' LCD_128x64.bas '
' 2010, Phantomias '
' Freeware '
'--------------------------------------------------------------------------'
'
'--------------------------------------------------------------------------'

$regfile = "m16def.dat" 'definieren des verwendeten Chips

$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)



' Configuriere das LCD
'some routines to control the display are in the glcdKS108.lib file
$lib "glcdKS108.lbx"

'First we define that we use a graphic LCD
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portd , Cd = 0 , Rd = 1 , Ce = 2 , Ce2 = 3 , Enable = 4 , Reset = 5
'CE =CS1 Chip select
'CE2=CS2 Chip select second chip
'CD=Data/instruction
'RD=Read
'RESET = reset
'ENABLE= Chip Enable

Dim X As Byte , Y As Byte , Z1 As Byte , Z2 As Byte
Setfont Font8x8
Gosub Lcd_cls2

Config 1wire = Porta.0


Declare Sub Convallt ' Convert T on ALL sensors
Declare Function Decigrades(byval Sc(9) As Byte) As Single
Waitms 10


Dim B As Byte
Dim W As Word
Dim Dg As Single 'DECIgrades, I call it, cause I have no space for commas on the display....
Dim Min1 As Single
Dim Max1 As Single
Dim Deci As Integer

Dim Akt As String * 10
Dim Minn As String * 10
Dim Maxx As String * 10

Dim Line1 As String * 20


Dim Dsid1(8) As Byte
Dim Decigrades1 As Single

Dim Sc(9) As Byte

Setfont Font8x8


'---------------------------------------------------------------------------




Gosub Lcd_cls2

Lcdat 1 , 1 , " 1-Wire"
Lcdat 2 , 1 , " Thermometer"
Lcdat 3 , 1 , " mit DS18S20"
Lcdat 5 , 1 , "2010 Phantomias"

Wait 2

Gosub Lcd_cls2


W = 1wirecount()

' Search for Sensor - no errorcontrol made, but would be easy to do with the "Err"-variable
' Getting the sensor ID.

Dsid1(1) = 1wsearchfirst()


' Sensor identified and stored in variable

If Dsid1(8) = Crc8(dsid1(1) , 7) Then ' Control that the received CRC match the calculated

Lcdat 1 , 1 , "CRC OK"
Lcdat 2 , 1 , "Sensor ID"
Wait 1

End If

Wait 1

Gosub Lcd_cls2

Line1 = "Aktuell: " + Chr(248) + "C"
Lcdat 1 , 1 , Line1

Line1 = "Min: " + Chr(248) + "C"
Lcdat 3 , 1 , Line1

Line1 = "Max: " + Chr(248) + "C"
Lcdat 4 , 1 , Line1
Min1 = 9999 ' to get a real value from start

' Main loop
Do
Convallt ' "Convert ALL T on the 1w-bus"
Waitus 200 ': Waitus 200 : Waitus 200 : Waitus 200 'if you use 2-wire, could be reduced to 200us

1wverify Dsid1(1) 'Issues the "Match ROM "
If Err = 1 Then
Lcdat 1 , 1 , "Err " 'Err = 1 if something is wrong
Elseif Err = 0 Then 'lcd " Sensor found"
1wwrite &HBE
Sc(1) = 1wread(9) 'read bytes into array
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))
If Min1 > Dg Then Min1 = Dg
If Max1 < Dg Then Max1 = Dg

Akt = Fusing(dg , "##.##")
Minn = Fusing(min1 , " ##.##")
Maxx = Fusing(max1 , " ##.##")

Lcdat 1 , 64 , Akt 'Anzeige geändert
Lcdat 3 , 32 , Minn
Lcdat 4 , 32 , Maxx
End If
End If

Wait 1
Loop

End 'end program


'Makes the Dallas "Convert T" command on the 1w-bus configured in "Config 1wire = Portb. "
'WAIT 200-750 ms after issued, internal conversion time for the sensor
'SKIPS ROM - so it makes the conversion on ALL sensors on the bus simultaniously
'When leaving this sub, NO sensor is selected, but ALL sensors has the actual
'temperature in their scratchpad ( within 750 ms )
Sub Convallt
1wreset ' reset the bus
1wwrite &HCC ' skip rom
1wwrite &H44 ' Convert T
End Sub

'Makes a integer value of the first two bytes in scratchpad

Function Decigrades(byval Sc(9) As Byte)



Deci = 0
Deci = Makeint(sc(1) , Sc(2))
Decigrades = Deci
Decigrades = Decigrades * 50
Decigrades = Decigrades - 25
Decigrades1 = Sc(8) - Sc(7)
Decigrades1 = Decigrades1 * 100
Decigrades1 = Decigrades1 / Sc(8)
Decigrades = Decigrades + Decigrades1
Decigrades = Decigrades / 10



' Decigrades = Decigrades * 50
' Decigrades = Decigrades - 0.25
' Decigrades1 = Sc(8) - Sc(7)
' Decigrades1 = Decigrades1 * 100
' Decigrades1 = Decigrades1 / Sc(8)
' Decigrades = Decigrades + Decigrades1
' Decigrades = Decigrades / 10


End Function

'---------------------------------------------------------------------
Lcd_cls2:
Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2 ' both displays off
Cls
Waitms 10
Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2 'both on
Return
'---------------------------------------------------------------------
$include "font8x8.font"


Ich hoffe jemand von euch kann mir sagen was ich Falsch mache.

Danke
mfg
Florian
 
Hallo Florian!

Ich habe mir deine Berechnung noch nicht angesehen.....
sondern nur mal deinen Code mit BASCOM-Highlight versehen. ;)

So ist er für alle wesentlich einfacher zu lesen! :)


Wenn ich gleich noch Zeit finde, schaue ich mir deinen Programmcode noch mal an.


Schöne Weihnachten,
Cassio
 
Hallo Florian!

Was mir gerade noch einfällt......

Du kannst in der Zwischenzeit ja mal HIER nach meiner Temperaturberechnung schauen.
Steht im Beispielcode ganz unten.
Such dir mal die Subroutine "Get_1wire" ! Dort steht alles drin. ;)


Gruß,
Cassio
 
Hi

Danke schon mal!
Hab schnell mal deine Berechnung verwendet und jetzt Funkt. mein
Code...

Genaueren vergleich werde ich mir morgen mal ansehen.
Bekomme jetzt zumindest die Ausgabe 22-23°C und das müsste hinkommen...

Danke nochmal

mfg
Florian

Hallo Florian!

Was mir gerade noch einfällt......

Du kannst in der Zwischenzeit ja mal HIER nach meiner Temperaturberechnung schauen.
Steht im Beispielcode ganz unten.
Such dir mal die Subroutine "Get_1wire" ! Dort steht alles drin. ;)


Gruß,
Cassio
 
Hallo !

Sorry, bin etwas spät wieder zurück....

Inzwischen hast du es ja scheinbar selbst gelöst. :)


Wenn ich mir das so auf die Schnelle von dir ansehe dann würde ich vermuten, dass du bei der Berechnung eine falsche "Reihenfolge" verwendet hast.
Schau doch noch mal ins Datenblatt und dann auf deine alte Rechnung.

Grüße,
Cassio
 
Hi

Ja Funktioniert jetzt ganz gut bis auf das mein 7805 sehr warm wird?!
Ist das normal? Hab einen eigenen für das Display und durch die Abstrahlung
ist meine Ist_Temp um ca. 5° höher...
Muss also mal den Ds18S20 auslagern...
Hier mal mein geänderter Code!
Habe mir ein paar sachen von dir abgeschaut

Aber wie gesagt dein Schlatplan stimmte nicht mit der beschaltung überein
Musste Ce = 2 , Ce2 = 3 ändern weil die Displayhälften vertauscht waren



CodeBox bascom

'--------------------------------------------------------------------------'
' LCD Testprogramm '
' LCD_128x64.bas '
' 2010, Phantomias '
' Freeware '
'--------------------------------------------------------------------------'
'
'--------------------------------------------------------------------------'

$regfile = "m16def.dat" 'definieren des verwendeten Chips

$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)




'-------------------------------------------------------------------------------
'###############################################################################
'Display Konfigurieren ########################################################
'###############################################################################
'-------------------------------------------------------------------------------

' Configuriere das LCD
'some routines to control the display are in the glcdKS108.lib file
$lib "glcdKS108.lbx"



'First we define that we use a graphic LCD
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portd , Cd = 0 , Rd = 1 , Ce = 2 , Ce2 = 3 , Enable = 4 , Reset = 5
'CE =CS1 Chip select
'CE2=CS2 Chip select second chip
'CD=Data/instruction
'RD=Read
'RESET = reset
'ENABLE= Chip Enable
Setfont Font8x8

'-------------------------------------------------------------------------------
'###############################################################################
'-------------------------------------------------------------------------------


'-------------------------------------------------------------------------------
'###############################################################################
'1wire Port definieren ########################################################
'###############################################################################
'-------------------------------------------------------------------------------

Config 1wire = Porta.0

'-------------------------------------------------------------------------------
'###############################################################################
'-------------------------------------------------------------------------------

Declare Sub Convallt ' Convert T on ALL sensors
Declare Function Temp(byval Sc(9) As Byte) As Single
Waitms 10

Dim X As Byte
Dim Y As Byte
Dim Z1 As Byte
Dim Z2 As Byte

Dim B As Byte
Dim W As Word
Dim Dg As Single 'DECIgrades, I call it, cause I have no space for commas on the display....
Dim Min1 As Single
Dim Max1 As Single
Dim Deci As Integer

Dim Akt As String * 10
Dim Minn As String * 10
Dim Maxx As String * 10

Dim Line1 As String * 20


Dim Dsid1(8) As Byte
Dim Temp1 As Single
Dim Ist_temp As Single
Dim Sc(9) As Byte
Dim Temp2 As Byte

Setfont Font8x8


'---------------------------------------------------------------------------




Gosub Lcd_cls2
Gosub Lcd_line
Lcdat 2 , 9 , " 1-Wire"
Lcdat 3 , 9 , " Thermometer"
Lcdat 4 , 9 , " mit DS18S20"
Lcdat 5 , 9 , " Phantomias"

Wait 2

Gosub Lcd_cls2


W = 1wirecount()

' Search for Sensor - no errorcontrol made, but would be easy to do with the "Err"-variable
' Getting the sensor ID.

Dsid1(1) = 1wsearchfirst()


' Sensor identified and stored in variable

If Dsid1(8) = Crc8(dsid1(1) , 7) Then ' Control that the received CRC match the calculated


Gosub Lcd_line
Lcdat 3 , 9 , "CRC OK"
Lcdat 4 , 9 , "Sensor ID"
Wait 1

End If

Wait 1

Gosub Lcd_cls2

Gosub Lcd_line

Line1 = "Temp: " + Chr(248) + "C"
Lcdat 3 , 9 , Line1

Line1 = "Min: " + Chr(248) + "C"
Lcdat 5 , 9 , Line1

Line1 = "Max: " + Chr(248) + "C"
Lcdat 6 , 9 , Line1
Min1 = 9999 ' to get a real value from start


'-------------------------------------------------------------------------------
'###############################################################################
'Hauptschleife ###############################################################
'###############################################################################
'-------------------------------------------------------------------------------

Do


Convallt ' "Convert ALL T on the 1w-bus"


1wverify Dsid1(1) 'Issues the "Match ROM "
If Err = 1 Then
Lcdat 1 , 1 , "Err " 'Err = 1 if something is wrong
Elseif Err = 0 Then 'lcd " Sensor found"
1wwrite &HBE
Sc(1) = 1wread(9) 'read bytes into array
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Temp(sc(9))
If Min1 > Dg Then Min1 = Dg
If Max1 < Dg Then Max1 = Dg

Akt = Fusing(dg , "##.##")
Minn = Fusing(min1 , " ##.##")
Maxx = Fusing(max1 , " ##.##")

Lcdat 3 , 54 , Akt 'Anzeige geändert
Lcdat 5 , 54 , Minn
Lcdat 6 , 54 , Maxx
End If
End If

Wait 1
Loop

End 'end program


'Makes the Dallas "Convert T" command on the 1w-bus configured in "Config 1wire = Portb. "
'WAIT 200-750 ms after issued, internal conversion time for the sensor
'SKIPS ROM - so it makes the conversion on ALL sensors on the bus simultaniously
'When leaving this sub, NO sensor is selected, but ALL sensors has the actual
'temperature in their scratchpad ( within 750 ms )
Sub Convallt
1wreset ' reset the bus
1wwrite &HCC ' skip rom
1wwrite &H44 ' Convert T
Do
Temp2 = 1wread()
Loop Until Temp2 = &HFF

End Sub

'Makes a integer value of the first two bytes in scratchpad

Function Temp(byval Sc(9) As Byte)

Temp = Sc(2)
Temp = Temp + Sc(1)
Temp1 = Temp
Temp1 = Temp1 / 2
Ist_temp = Sc(8) - Sc(7)
Ist_temp = Ist_temp / Sc(8)
Ist_temp = Ist_temp + Temp1
Ist_temp = Ist_temp - 0.25
Temp = Ist_temp


End Function
'--------------------------------------------------------------------------------------------------
'#####################################################################
'--------------------------------------------------------------------------------------------------


'---------------------------------------------------------------------
'#####################################################################
'Sub Funktionen: ####################################################
'#####################################################################
'---------------------------------------------------------------------

'---------------------------------------------------------------------
'Rahmen für Display #################################################
'---------------------------------------------------------------------

Lcd_line:

'Line oben links rechts
Line(0 , 0) -(128 , 0) , 255
Line(3 , 3) -(124 , 3) , 255

'Line unten links rechts
Line(0 , 63) -(128 , 63) , 255
Line(3 , 60) -(124 , 60) , 255


'Line links oben unten
Line(0 , 0) -(0 , 63) , 255
Line(3 , 3) -(3 , 60) , 255

'Line rechts oben unten
Line(127 , 0) -(127 , 63) , 255
Line(124 , 3) -(124 , 60) , 255
Return
'#####################################################################
'---------------------------------------------------------------------

'---------------------------------------------------------------------
'Display löschen ####################################################
'---------------------------------------------------------------------
Lcd_cls2:
Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2 ' both displays off
Cls
Waitms 10
Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2 'both on
Return
'#####################################################################
'---------------------------------------------------------------------
$include "font8x8.font"


mfg
Florian
 
Aber wie gesagt dein Schlatplan stimmte nicht mit der beschaltung überein
Musste Ce = 2 , Ce2 = 3 ändern weil die Displayhälften vertauscht waren


Hallo !

Ich hatte es zu Beginn nach dem Displayplan angeschlossen......
und da waren die beiden Hälften bei mir vertauscht. :hmmmm:
Aus dem Grunde habe ich es bei mir und hier im Plan geändert!

Hast du das Display denn auch von Pollin?


Du kannst die Pin-Zuweisung der beiden Display-Controller aber auch im Programm ändern (Ce & Ce2). ;)

Grüße,
Cassio
 
Hi

Ja das Display ist auch von Pollin!
Ich habe es im Programm geändert!(siehe Quellcode)
War zu faul die Lötstation wieder zu bemühen ;)

Desweiteren ist auch die Hintergrundbeleuchtung Falsch.
bzw. Auch Falsch auf dem Display angeschrieben....

Naja jetzt jetzt muss ich mal schauen wie ich Temp's im
- bereich anzeigen kann?!
Wenn ich den Fühler raushänge geht er mit der Temp runter.
Dann zeigt er mal kurz -0,21 an und dann gehts bei 255 weiter.

Fällt dir da spontan was ein?
mfg

Hallo !

Ich hatte es zu Beginn nach dem Displayplan angeschlossen......
und da waren die beiden Hälften bei mir vertauscht. :hmmmm:
Aus dem Grunde habe ich es bei mir und hier im Plan geändert!

Hast du das Display denn auch von Pollin?


Du kannst die Pin-Zuweisung der beiden Display-Controller aber auch im Programm ändern (Ce & Ce2). ;)

Grüße,
Cassio
 
Desweiteren ist auch die Hintergrundbeleuchtung Falsch.
bzw. Auch Falsch auf dem Display angeschrieben....


Hallo!

Oh ja, das kenne ich auch..... Schau mal hier--> Nachtrag zum Display

Die Displays sind zwar günstig, aber scheinbar stimmt das Ein oder Andere dann mal nicht. ;)


Eigentlich müsste deine Berechnung nun auch Minus-Temperaturen ausgeben.
Vergleich bitte mal die Variablen in deinem Programm!
Code:
'--------------------------------------------------- 
' 1-Wire Temperaturmessung mit DS1820 
Config 1wire = Pina.2 
Config Single = Scientific , Digits = 1 

Dim Ist_temp As Single ' Ist-Temperatur 
Dim Temp As Word 
Dim Temp1 As Integer 
Dim Scratch(9) As Byte 
Dim I1w As Byte

Mit Sicherheit hast du eine falsch dimensioniert! ;)

Grüße,
Cassio
 
Ja Ich denke das wirds gewesen sein.
Ich habe mir jetzt einfach mal deinen Quelltext genommen und
für mich abgeändert. Jetzt zeigt er auch - an

Zwecks der Programmstrucktur hätte ich auch noch eine Frage.
Vermutlich soll in der Hauptschleife so wenig als möglich drin sein oder?
Also Sprich alle Funktionen wenns geht auslagern und mit GoSub verweisen??

Desweiteren hätte ich noch eine Bitte!Hast du von dem DCF77 einen Schaltplan rumliegen den du mir hochladen könntest? Hab so ein Modul von Pollin und da
du auf deinen Link ja eines angeschlossen hast und der Quelltext auch dabei ist wäre das Ideal zum experimentieren

mfg und Vilen Dank
Florian
 
Hallo Florian!

Wenn du etwas zu DCF77 wissen möchtest. dann schau doch mal in DIESEN THREAD !

Dort haben wir das ganze Thema inklusive "Fehlersuche" bei Juro schon einmal durch.

Kannst ja mal reinschauen und wenn dann noch fragen sind, dann melde dich einfach noch mal. ;)


Viel Spaß beim Lesen (die Lösung zum Problem ist wirklich lustig :cool: ) !

Cassio
 
Hallo,

Ich hoffe ich finde dieses WE wieder mal etwas Zeit mich mit der Materie auseinander zu setzen ;)

Ein paar sachen bringe ich leider nicht wirklich zum Laufen bzw. sehe ich den Fehler nicht

Hier mal der Aktuelle Quellcode



CodeBox bascom

'--------------------------------------------------------------------------'
' LCD Testprogramm '
' LCD_128x64.bas '
' 2010, Phantomias '
' Freeware '
'--------------------------------------------------------------------------'
'
'--------------------------------------------------------------------------'

$regfile = "m16def.dat" 'definieren des verwendeten Chips

$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)




'-------------------------------------------------------------------------------
'###############################################################################
'Display Konfigurieren ########################################################
'###############################################################################
'-------------------------------------------------------------------------------

' Configuriere das LCD
'some routines to control the display are in the glcdKS108.lib file
$lib "glcdKS108.lbx"



'First we define that we use a graphic LCD
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portd , Cd = 0 , Rd = 1 , Ce = 2 , Ce2 = 3 , Enable = 4 , Reset = 5
'CE =CS1 Chip select
'CE2=CS2 Chip select second chip
'CD=Data/instruction
'RD=Read
'RESET = reset
'ENABLE= Chip Enable
Setfont Font8x8

'-------------------------------------------------------------------------------
'###############################################################################
'-------------------------------------------------------------------------------


'-------------------------------------------------------------------------------
'###############################################################################
'1wire Port definieren ########################################################
'###############################################################################
'-------------------------------------------------------------------------------

Config 1wire = Porta.3

Config Single = Scientific , Digits = 1

Dim Ist_temp As Single ' Ist-Temperatur
Dim Temp As Word '
Dim Temp1 As Integer '
Dim Scratch(9) As Byte '
Dim I1w As Byte '

'-------------------------------------------------------------------------------
'###############################################################################
'-------------------------------------------------------------------------------



Waitms 10



Dim Min1 As Single
Dim Max1 As Single


Dim Akt As String * 10
Dim Minn As String * 10
Dim Maxx As String * 10

Dim Line1 As String * 20

Setfont Font8x8


'---------------------------------------------------------------------------




Gosub Lcd_cls2
Gosub Lcd_line
Lcdat 2 , 9 , " 1-Wire"
Lcdat 3 , 9 , " Thermometer"
Lcdat 4 , 9 , " mit DS18S20"
Lcdat 5 , 9 , " Phantomias"

Wait 2

Gosub Lcd_cls2


' to get a real value from start


'-------------------------------------------------------------------------------
'###############################################################################
'Hauptschleife ###############################################################
'###############################################################################
'-------------------------------------------------------------------------------


Do
Gosub Lcd_line
Gosub Lcd_line1
Gosub Anzeige
Gosub Get_1wire





Loop

End

'---------------------------------------------------------------------
'#####################################################################
'Sub Funktionen: ####################################################
'#####################################################################
'---------------------------------------------------------------------

Anzeige:
If Scratch(9) = Crc8(scratch(1) , 8) Then

If Max1 < Ist_temp Then Max1 = Ist_temp
If Min1 > Ist_temp Then Min1 = Ist_temp


Akt = Fusing(ist_temp , "##.##")
Minn = Fusing(min1 , " ##.##")
Maxx = Fusing(max1 , " ##.##")

Lcdat 3 , 54 , Akt 'Anzeige geändert
Lcdat 5 , 54 , Minn
Lcdat 6 , 54 , Maxx

End If

Return
'---------------------------------------------------------------------
'Rahmen für Display #################################################
'---------------------------------------------------------------------
Lcd_line1:


Line1 = "Temp: " + Chr(248) + "C"
Lcdat 3 , 9 , Line1

Line1 = "Min: " + Chr(248) + "C"
Lcdat 5 , 9 , Line1

Line1 = "Max: " + Chr(248) + "C"
Lcdat 6 , 9 , Line1
Min1 = 9999

Return

'#####################################################################
'---------------------------------------------------------------------

'---------------------------------------------------------------------
'Rahmen für Display #################################################
'---------------------------------------------------------------------
Lcd_line:

'Line oben links rechts
Line(0 , 0) -(128 , 0) , 255
Line(3 , 3) -(124 , 3) , 255

'Line unten links rechts
Line(0 , 63) -(128 , 63) , 255
Line(3 , 60) -(124 , 60) , 255


'Line links oben unten
Line(0 , 0) -(0 , 63) , 255
Line(3 , 3) -(3 , 60) , 255

'Line rechts oben unten
Line(127 , 0) -(127 , 63) , 255
Line(124 , 3) -(124 , 60) , 255

Return
'#####################################################################
'---------------------------------------------------------------------

'---------------------------------------------------------------------
'Get_1wire ################################################
'---------------------------------------------------------------------

Get_1wire:
1wreset
1wwrite &HCC
1wwrite &H44

Do
Temp = 1wread() ' Ende der Temperaturmessung abwarten
Loop Until Temp = &HFF

1wreset
1wwrite &HCC
1wwrite &HBE

For I1w = 1 To 9
Scratch(i1w) = 1wread()
Next

Temp = Scratch(2)
Shift Temp , Left , 8

Temp = Temp + Scratch(1)
Temp1 = Temp
Temp1 = Temp1 / 2
Ist_temp = Scratch(8) - Scratch(7)
Ist_temp = Ist_temp / Scratch(8)
Ist_temp = Ist_temp + Temp1
Ist_temp = Ist_temp - 2.25




Return

'#####################################################################
'---------------------------------------------------------------------


'---------------------------------------------------------------------
'Display löschen ####################################################
'---------------------------------------------------------------------
Lcd_cls2:
Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2 ' both displays off
Cls
Waitms 10
Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2 'both on
Return
'#####################################################################
'---------------------------------------------------------------------
$include "font8x8.font"

Also ich lasse mir bei meinen LCD auch die MIN - MAX Temp die gemessen wurde mitanzeigen
Max Funktioniert ja recht gut aber Min geht immer mit der Aktuellen Temp. mit?!
Sieht jemand von euch mein Problem?

Desweiteren lügt der Temp fühler um ca. 2Grad (Hab das mal im code geändert "- 2.25" satt "-0.25" das kann es ja auch nicht sein das ich selber einen Abgleich machen muss oder?

Vielen dank schon mal.
mfg
Florian
 
Hallo Florian!

Also die Angelegenheit mit den -2,25 kann wirklich nicht sein!

Die Sensoren sind von Haus aus abgeglichen und zur Berechnung der richtigen Temperatur musst du wirklich nur -0,25 rechnen!

Sitzt dein Sensor vielleicht etwas dicht neben dem Display (Hintergrundbeleuchtung), oder dem Spannungsregler.... oder irgend etwas was noch ein bisschen Wärme produziert?

Was dir bei deinem Programmcode nicht so gut gelungen ist.....
Du sendest immer wieder alles neu zum Display. :eek:
Alle Linien und Texte werden immer wieder neu dargestellt.... obwohl sie sich doch gar nicht ändern. :hmmmm:

Du kannst die Sub`s mit den "statischen" Werten (z.B. Linien und Texte für das "Layout") ganz zu Beginn einmal laden und erst dann in die Do-Loop Schleife wechseln.
Danach würde ich die DS1820-Sub in zwei Teile teilen....
Einmal nur das Konvertieren der Daten "beauftragen" und nach einiger Zeit (Timer?) dann die neuen Werte holen und die Temperatur berechnen.


Dann habe ich mich noch über dies hier gewundert:
Code:
Akt = Fusing(ist_temp , "##.##")

Die Variable "Ist_temp" hast du doch folgender Maße deklariert:
Code:
Config Single = Scientific , [B]Digits = 1[/B]

Dim Ist_temp As Single                                      ' Ist-Temperatur

Warum also das "Fusing" für "Akt" auf zwei Stellen nach dem Komma? :hmmmm:


OK, dass waren aber alles nicht deine Fragen. ;)

Warum dein Min-Wert immer mit der Ist_temp "mitwandert"?
Dreh die Bedingung doch mal um und fasse sie zusammen:
Code:
If Scratch(9) = Crc8(scratch(1) , 8) Then

   If Ist_temp > Max1 Then
      Max1 = Ist_temp
      Maxx = Fusing(max1 , " ##.##")
      Lcdat 6 , 54 , Maxx
   Elseif Ist_temp < Min1 Then
      Min1 = Ist_temp
      Minn = Fusing(min1 , " ##.##")
      Lcdat 5 , 54 , Minn
   Else
   End If

   Akt = Fusing(ist_temp , "##.##")
   Lcdat 3 , 54 , Akt                                'Anzeige geändert

Else
End if

Ggf. musst du die Ausgabe nur für den ersten Start (bis Minn und Maxx gefüllt werden) noch anpassen......
Aber du solltest ja dein "Layout" sowieso noch mal überdenken. :)

Grüße,
Cassio
 
Hallo Cassio!

Vielen Dank für deine schnelle Antwort.
Hab deinen Code ausprobiert aber leider hat er am Anfang noch nicht Funktioniert. Aber wie du selber gesagt hast

Ggf. musst du die Ausgabe nur für den ersten Start (bis Minn und Maxx gefüllt werden) noch anpassen......

Habe dazu folgenes eingefügt

Dim Min1 As Single
Dim Max1 As Single
Min1 = 9999
Geht das eventuell etwas eleganter?
Oder passt das so?


Sitzt dein Sensor vielleicht etwas dicht neben dem Display (Hintergrundbeleuchtung), oder dem Spannungsregler.... oder irgend etwas was noch ein bisschen Wärme produziert?

War Ursprünglich so das er neben dem Spannungsregler auf meiner lochrasterplatine war (Ich denke mit dem Spannungsregler könnte ich auch das Haus heizen :D ) Aber habe den schon letzte Woche von der Platone entkoppelt also externe einflüsse kann ich ausschließen.
Eventuell hat ja der Temp Sensor etwas (War von Pollin)
Hab leider keinen 2ten mehr zum Testen....

Was dir bei deinem Programmcode nicht so gut gelungen ist.....
Du sendest immer wieder alles neu zum Display. :eek:
Alle Linien und Texte werden immer wieder neu dargestellt.... obwohl sie sich doch gar nicht ändern. :hmmmm:
Ja ich weiß. Hab jetzt folgendes gemacht

Gosub Lcd_line
Gosub Lcd_line1

Do

Gosub Get_1wire
Gosub Anzeige

Loop

End

Sollte jetzt zumindes etwas besser sein oder hast du was anderes gemeint?

Danach würde ich die DS1820-Sub in zwei Teile teilen....
Einmal nur das Konvertieren der Daten "beauftragen" und nach einiger Zeit (Timer?) dann die neuen Werte holen und die Temperatur berechnen.
Ok da musst du bitte etwas genauer werden...

Meinst du es in etwa so?

Teil1
1wreset
1wwrite &HCC
1wwrite &H44

Do
Temp = 1wread() ' Ende der Temperaturmessung abwarten
Loop Until Temp = &HFF

Teil2

1wreset
1wwrite &HCC
1wwrite &HBE

For I1w = 1 To 9
Scratch(i1w) = 1wread()
Next

Temp = Scratch(2)
Shift Temp , Left , 8

Temp = Temp + Scratch(1)
Temp1 = Temp
Temp1 = Temp1 / 2
Ist_temp = Scratch(8) - Scratch(7)
Ist_temp = Ist_temp / Scratch(8)
Ist_temp = Ist_temp + Temp1
Ist_temp = Ist_temp - 0.25

Muss ich Teil1 dann immer aufrufen oder nur 1mal?

Die Variable "Ist_temp" hast du doch folgender Maße deklariert:
Code:
Config Single = Scientific , [B]Digits = 1[/B]

Dim Ist_temp As Single                                      ' Ist-Temperatur

Habs jetzt gelöscht (Würde ja auch nichts bringen wenn ich 2 statt 1 reinschreibe oder ? Die Zeile brauch ich ja nicht)


Bezüglich des Timers...
Bitte nicht schlagen :pleasantry: aber da ich ja noch Anfänger bin habe ich
mich mit dem Timer noch nicht gearbeitet also da fehlt mir noch der Plan...

Hier nochmal der Quelltext komplett eventuell findet ihr ja noch den einen oder anderen Verbesserungsvorschlag


CodeBox bascom

'--------------------------------------------------------------------------'
' LCD Testprogramm '
' LCD_128x64.bas '
' 2010, Phantomias '
' Freeware '
'--------------------------------------------------------------------------'
'
'--------------------------------------------------------------------------'

$regfile = "m16def.dat" 'definieren des verwendeten Chips

$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)




'-------------------------------------------------------------------------------
'###############################################################################
'Display Konfigurieren ########################################################
'###############################################################################
'-------------------------------------------------------------------------------

' Configuriere das LCD
'some routines to control the display are in the glcdKS108.lib file
$lib "glcdKS108.lbx"



'First we define that we use a graphic LCD
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portd , Cd = 0 , Rd = 1 , Ce = 2 , Ce2 = 3 , Enable = 4 , Reset = 5
'CE =CS1 Chip select
'CE2=CS2 Chip select second chip
'CD=Data/instruction
'RD=Read
'RESET = reset
'ENABLE= Chip Enable
Setfont Font8x8 'Schrift einbinden


'###############################################################################
'-------------------------------------------------------------------------------



'-------------------------------------------------------------------------------
'###############################################################################
'1wire Port definieren ########################################################
'###############################################################################
'-------------------------------------------------------------------------------

Config 1wire = Porta.3

'###############################################################################
'-------------------------------------------------------------------------------


'-------------------------------------------------------------------------------
'###############################################################################
'Variablen definieren ########################################################
'###############################################################################
'-------------------------------------------------------------------------------

Config Single = Scientific

Dim Ist_temp As Single ' Ist-Temperatur
Dim Temp As Word '
Dim Temp1 As Integer '
Dim Scratch(9) As Byte '
Dim I1w As Byte '


Dim Min1 As Single
Dim Max1 As Single
Min1 = 9999


Dim Akt As String * 10
Dim Minn As String * 10
Dim Maxx As String * 10


Dim Line1 As String * 20


'###############################################################################
'-------------------------------------------------------------------------------

'Waitms 10
'Setfont Font8x8

'###############################################################################
'-------------------------------------------------------------------------------


'-------------------------------------------------------------------------------
'###############################################################################
'Startbildschirm anzeigen: ###################################################
'###############################################################################
'-------------------------------------------------------------------------------


Gosub Lcd_cls2 'Anzeige löschen
Gosub Lcd_line

Lcdat 2 , 9 , " 1-Wire"
Lcdat 3 , 9 , " Thermometer"
Lcdat 4 , 9 , " mit DS18S20"
Lcdat 5 , 9 , " Phantomias"

Wait 2

Gosub Lcd_cls2 'Anzeige löschen


Gosub Lcd_line
Gosub Lcd_line1

'###############################################################################
'-------------------------------------------------------------------------------


'-------------------------------------------------------------------------------
'###############################################################################
'Hauptschleife ###############################################################
'###############################################################################
'-------------------------------------------------------------------------------


Do



Gosub Get_1wire
Gosub Anzeige






Loop

End
'###############################################################################
'-------------------------------------------------------------------------------


'-------------------------------------------------------------------------------
'###############################################################################
'Sub Funktionen: ##############################################################
'###############################################################################
'-------------------------------------------------------------------------------



'---------------------------------------------------------------------
'Rahmen für Display #################################################
'---------------------------------------------------------------------
Anzeige:

If Scratch(9) = Crc8(scratch(1) , 8) Then



If Ist_temp > Max1 Then
Max1 = Ist_temp
Maxx = Fusing(max1 , " ##.##")
Lcdat 6 , 54 , Maxx
Elseif Ist_temp < Min1 Then
Min1 = Ist_temp
Minn = Fusing(min1 , " ##.##")
Lcdat 5 , 54 , Minn
Else
End If


Akt = Fusing(ist_temp , "##.##")
Lcdat 3 , 54 , Akt 'Anzeige geändert

Else
End if

Return
'#####################################################################
'---------------------------------------------------------------------


'---------------------------------------------------------------------
'Rahmen für Display #################################################
'---------------------------------------------------------------------
Lcd_line1:


Line1 = "Temp: " + Chr(248) + "C"
Lcdat 3 , 9 , Line1

Line1 = "Min: " + Chr(248) + "C"
Lcdat 5 , 9 , Line1

Line1 = "Max: " + Chr(248) + "C"
Lcdat 6 , 9 , Line1


Return

'#####################################################################
'---------------------------------------------------------------------


'---------------------------------------------------------------------
'Rahmen für Display #################################################
'---------------------------------------------------------------------
Lcd_line:

'Line oben links rechts
Line(0 , 0) -(128 , 0) , 255
Line(3 , 3) -(124 , 3) , 255

'Line unten links rechts
Line(0 , 63) -(128 , 63) , 255
Line(3 , 60) -(124 , 60) , 255


'Line links oben unten
Line(0 , 0) -(0 , 63) , 255
Line(3 , 3) -(3 , 60) , 255

'Line rechts oben unten
Line(127 , 0) -(127 , 63) , 255
Line(124 , 3) -(124 , 60) , 255

Return


'#####################################################################
'---------------------------------------------------------------------


'---------------------------------------------------------------------
'Get_1wire ################################################
'---------------------------------------------------------------------


Get_1wire:
1wreset
1wwrite &HCC
1wwrite &H44

Do
Temp = 1wread() ' Ende der Temperaturmessung abwarten
Loop Until Temp = &HFF

1wreset
1wwrite &HCC
1wwrite &HBE

For I1w = 1 To 9
Scratch(i1w) = 1wread()
Next

Temp = Scratch(2)
Shift Temp , Left , 8

Temp = Temp + Scratch(1)
Temp1 = Temp
Temp1 = Temp1 / 2
Ist_temp = Scratch(8) - Scratch(7)
Ist_temp = Ist_temp / Scratch(8)
Ist_temp = Ist_temp + Temp1
Ist_temp = Ist_temp - 0.25

Return

'#####################################################################
'---------------------------------------------------------------------


'---------------------------------------------------------------------
'Display löschen ####################################################
'---------------------------------------------------------------------
Lcd_cls2:
Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2 ' both displays off
Cls
Waitms 10
Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2 'both on
Return
'#####################################################################
'---------------------------------------------------------------------

$include "font8x8.font"
 
Hallo Florian!

Na, siehst du..... wird doch. ;)


Geht das eventuell etwas eleganter?
Oder passt das so?

Natürlich geht das so.....
Du kannst aber auch zum ersten Start (vor der Do-Loop Schleife) den DS1820 erst einmal in Ruhe auslesen und den aktuellen Wert dann in Min und Max kopieren.
Sieht etwas eleganter aus. ;)
Ich weiß auch nicht, ob du später die Min- und Max-Werte nach einem Stromausfall erhalten möchtest.....
Dann musst du den jeweils neuesten Wert nur ins EEPRom speichern und kannst diese zum Start wieder in dein Programm einlesen.


War Ursprünglich so das er neben dem Spannungsregler auf meiner lochrasterplatine war....

Man soll externe Wärmequellen und die Wärmestrahlung nicht unterschätzen.
Ich habe auch einige Zeit suchen müssen, warum ich manchmal auf 5cm Längendifferenz sogar manchmal einige Grad Temperaturdifferenz habe.
Irgendwann ist es mir mal aufgefallen.......
Es kommt eben drauf an, wohin (und wie direkt) der Lichtkegel meiner Schreibtischlampe fällt. ;)

Letztlich fragt sich noch.... wer von den beiden Thermometern misst denn nun genau? :rolleyes:


Meinst du es in etwa so?

Ja, genau!
Einmal startest du beim DS1820 die Temperaturkonvertierung.....
und einige Zeit später holst du die aktuellen Werte ab und berechnest die Temperatur.
Damit würde dann dies auch entfallen:
Code:
Do
Temp = 1wread() ' Ende der Temperaturmessung abwarten
Loop Until Temp = &HFF


Bezüglich des Timers...
Bitte nicht schlagen aber da ich ja noch Anfänger bin habe ich
mich mit dem Timer noch nicht gearbeitet also da fehlt mir noch der Plan...

Nö, hier schlägt keiner..... oder zumindest ich nicht. ;)

Für Anfänger sind die Timer im AVR meist unverständlich, weil man eine falsche Vorstellung davon hat.
Letztlich könnte man zu den Timern auch "Zähler" mit einstellbaren Geschwindigkeiten sagen. :)

Ein Timer macht letztlich nichts weiter als von Wert X zu Wert Y zu zählen und die Geschwindigkeit richtet sich nach dem Systemtakt..... und einem Vorteiler (Prescaler).
Mehr können die "Timer" eigentlich gar nicht. Darum nennen sie sich ja auch Timer/Counter. ;)

Wenn du zum Beispiel einen 8Bit Timer nimmst (meistens Timer0) dann zählt dieser von 0 bis 255.
Wie schnell er dabei zählt, hängt von deinem Systemtakt und dem Vorteiler ab.
Hierfür gibt es folgende Formel:
Prescaler * Timer
----------------- = sec. bis zum Überlauf
Systemfrequenz

1024 * 256
----------- = 0,032768 sec. = 32,77 ms
8000000

Bei einem Systemtakt von 8MHz und einem Vorteiler von 1024 benötigt dein AVR nur knappe 33ms um von 0 bis 255 zu zählen. :eek:

Wenn der Timer0 dann bei 255 angekommen ist und er wieder bei 0 anfängt, ist er quasi "übergelaufen" (Overflow) und kann einen Interrupt auslösen.

Wenn du dir dies zu nutze machst, kannst du z.B. alle 32,7ms eine Variable hochzählen.
Wenn diese Variable z.B. den Wert 31 erreicht hat (31 * 32,7ms = 1013,7ms = 1,01 sec.), setzt du sie auf 0 zurück und....... kannst ggf. ein "Flag" setzen.
In der Hauptschleife wird dieses Flag ausgewertet und veranlasst dein Programm irgendetwas zu erledigen.
Wann und wie du das Flag dann zurücksetzt ist eine Sache deiner Ideen. ;)


Wenn du nun "1 + 1" zusammen zählst dann solltest du nun die Möglichkeit haben, deinen Temperatursensor einmal jede "zweite Sekunde" zur Konvertierung der Temperatur zu veranlassen und beim nächsten Mal (nach 1,01 sec.) die Werte auszulesen und die neue Temperatur zu berechnen. :)

Kannst es ja mal probieren......
wird schon klappen.

Gruß,
Cassio
 
Hallo

Kannst es ja mal probieren......
wird schon klappen.

Naja Probieren werde ich es auf jeden Fall aber obs wird?!:rolleyes:

Ich habe mir das Buch vom Claus Kühnel gekauft (eventuell kennst du das?)
Leider muss ich sagen das es für Anfänger eher schwer zu verstehen ist...
Am meisten habe ich vom Probieren und Quellcode studieren gelernt
(wobei ich noch nicht viel gelernt habe :D )
Das Problem ist das ein Programm natürlich vorher mal Funktionieren muss
damit mann Probieren und lernen kann.

Kennst du eventuell ein gutes Buch was für einen Anfänger wie mich gut wäre? Bei den Bücherpreisen muss man da vorher mal etwas nachfragen.
Das was mich beim Buch vom Kühnel stört ist das bei gewissen sachen nur kurz drauf eingegangen wird Quasi hier der Quellcode der macht das und das und aus.

Werde mal versuchen zur Temp-messung auch noch eine Uhr dazu zu Programmieren und dann eine Steuerung zu machen die einen Pin nach der Temp steuert (sprich bei unter 21Grad ein und bei 22Grad aus, wobei das zurzeit kein Problem sein dürfte oder?) und Paralell dazu eine Quasi Zeitschaltuhr die nach der Zeit auch etwas Steuert. Hoffe das ich da mit den Timing keine Probs bekomme als anfänger...

Bezüglich der Uhr/Zeitschaltuhr soll ich da ein neues Thema erstellen wenn Fragen auftreten oder kann/darf ich das hier auch Posten?

PS.:Kennst du eventuell für das KS108 Display eine kleinere Font wie 8x8?
z.B.: 6x6

Vielen Dank für deine schnelle Hilfe immer

mfg
 
Hi,

...Kennst du eventuell ein gutes Buch was für einen Anfänger wie mich gut wäre?...
  • Roland Walter - AVR Mikrokontroller Lehrbuch
  • Marius Meissner Bascom - AVR Sprachbefehle, die deusche Übersetzung der Bascom- Hilfe (und nur diese)
Macht zusammen ca. €110, aber es lohnt sich auf jden Fall.


Grüsse,

Michael
 
Hallo Florian!

Also das Buch von Claus Kühnel kennt (und hat) wohl jeder, der mit BASCOM anfängt bzw. arbeitet. ;)

Mir ging es zu Beginn auch so mit dem Buch....
Der Trick ist:
Du musst einfach mal drin stöbern und nicht die Kapitel der Reihe nach lesen. ;)

Ich finde es persönlich sehr gut... gebe aber zu, dass es nicht als Erstlektüre für den absoluten Anfänger gedacht ist.
Allerdings finde ich die Erklärungen zu den Beispielprogrammen doch recht gelungen.
Manchmal muss man dabei auch selber mal etwas nachdenken. ;)


Wenn du noch eine Uhr hinzu programmieren möchtest, dann schau mal in der Hilfe unter "Softclock" nach. ;)
Die Sache mit der Schaltuhr würde ich auf etwas später verschieben.

Um den Inhalt eines Threads mit dem Thema in Einklang zu halten wird es aber besser sein, wenn du dann für die jeweiligen Aufgaben/Probleme separate Threads eröffnest. ;)


PS.:Kennst du eventuell für das KS108 Display eine kleinere Font wie 8x8?
z.B.: 6x6

Hm.... nee so spontan leider nicht. :hmmmm:
Schau doch mal unter ....\Programme\MCS Electronics\BASCOM-AVR\SAMPLES\LCDGRAPH
Dort gibt es z.B. eine My6_8.font...... habe sie aber persönlich noch nicht verwendet.

Kann aber sein, dass es irgendwo im Internet auch eine 3x5-Font gibt. ;)


Grüße,
Cassio
 
Hi

Vielen dank Ihr 2 für eure Info (Die Bücher werd ich mir mal ansehen...)

Dann hätte ich noch eine Frage... Kennt jemand einen Händler der
den DS18S20 auch in dem geschlossenen gehäuse mit dem Kabel drann verkauft
(auch zu einen guten Preis nicht €15 wie beim Conrad)?

Hier mal mein Aktueller Code:
Habe jetzt mal meinen DS1307 in Betrieb genommen. Funktioniert jetzt Relativ gut hat aber auch lange genug gedauert.... :D

Wenn noch jemand Fehler oder Verbesserungsvorschläge hat immer her damit



CodeBox bascom

'--------------------------------------------------------------------------'
' '
' 2010, Phantomias '
' Freeware '
'--------------------------------------------------------------------------'
'
'--------------------------------------------------------------------------'

$regfile = "m16def.dat" 'definieren des verwendeten Chips

$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)


'-------------------------------------------------------------------------------
'###############################################################################
'Display Konfigurieren ########################################################
'###############################################################################
'-------------------------------------------------------------------------------

' Configuriere das LCD
'some routines to control the display are in the glcdKS108.lib file
$lib "glcdKS108.lbx"



'First we define that we use a graphic LCD
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portd , Cd = 0 , Rd = 1 , Ce = 2 , Ce2 = 3 , Enable = 4 , Reset = 5
'CE =CS1 Chip select
'CE2=CS2 Chip select second chip
'CD=Data/instruction
'RD=Read
'RESET = reset
'ENABLE= Chip Enable
Setfont Font8x8 'Schrift einbinden


'###############################################################################
'-------------------------------------------------------------------------------



'-------------------------------------------------------------------------------
'###############################################################################
'1wire Port definieren ########################################################
'###############################################################################
'-------------------------------------------------------------------------------

Config 1wire = Porta.3 'Tempfühler DS18S20

'###############################################################################
'-------------------------------------------------------------------------------


'-------------------------------------------------------------------------------
'###############################################################################
'Variablen definieren ########################################################
'###############################################################################
'-------------------------------------------------------------------------------



Dim Ist_temp As Single ' Ist-Temperatur
Dim Temp As Word '
Dim Temp1 As Integer '
Dim Scratch(9) As Byte '
Dim I1w As Byte '


Dim Min1 As Single
Dim Max1 As Single
Min1 = 9999


Dim Akt As String * 10
Dim Minn As String * 10
Dim Maxx As String * 10


Dim Tempon As Single
Dim Tempoff As Single

Dim Line1 As String * 20
Dim Line2 As String * 20





'###############################################################################
'-------------------------------------------------------------------------------



'-------------------------------------------------------------------------------
'###############################################################################
'DS1307 Konfigurieren: ###################################################
'###############################################################################
'-------------------------------------------------------------------------------


Config Sda = Porta.1 ' I2C Bus konfigurieren
Config Scl = Porta.0
Const Ds1307w = &HD0 ' Addresse der Ds1307 Uhr
Const Ds1307r = &HD1

Config Clock = User ' Interne Time/Date Routinen für Bascom konfigurieren
Config Date = Dmy , Separator = .


'Time$ = "18:55:00"
'Date$ = "09.01.10" ' Stellen der Uhr, muss nur einmal ausgeführt werden


'###############################################################################
'-------------------------------------------------------------------------------


'-------------------------------------------------------------------------------
'###############################################################################
'Startbildschirm anzeigen: ###################################################
'###############################################################################
'-------------------------------------------------------------------------------


Gosub Lcd_cls2 'Anzeige löschen
Gosub Lcd_line

Lcdat 2 , 12 , " Brut'O'mat"
Lcdat 3 , 9 , ""
Lcdat 4 , 9 , + Chr(174) + "Florian"
Lcdat 5 , 3 , ""

Wait 2

Gosub Lcd_cls2 'Anzeige löschen
Gosub Lcd_line
Gosub Lcd_line1



'###############################################################################
'-------------------------------------------------------------------------------


'-------------------------------------------------------------------------------
'###############################################################################
'Hauptschleife ###############################################################
'###############################################################################
'-------------------------------------------------------------------------------



Do
Lcdat 7 , 5 , Date$
Lcdat 8 , 5 , Time$


Waitms 1000

Gosub Get_1wire_1
Gosub Get_1wire_2
Gosub Anzeige
Gosub Temp_on_off


Loop

End
'###############################################################################
'-------------------------------------------------------------------------------


'-------------------------------------------------------------------------------
'###############################################################################
'Sub Funktionen: ##############################################################
'###############################################################################
'-------------------------------------------------------------------------------



'---------------------------------------------------------------------
'TempAnzeige für Display ###########################################
'---------------------------------------------------------------------
Anzeige:

If Scratch(9) = Crc8(scratch(1) , 8) Then



If Ist_temp > Max1 Then
Max1 = Ist_temp
Maxx = Fusing(max1 , " ##.#")
Lcdat 4 , 90 , Maxx
Elseif Ist_temp < Min1 Then
Min1 = Ist_temp
Minn = Fusing(min1 , " ##.#")
Lcdat 3 , 90 , Minn
Else
End If


Akt = Fusing(ist_temp , "##.#")


Lcdat 3 , 9 , Akt
Else
End If

Return
'#####################################################################
'---------------------------------------------------------------------


'---------------------------------------------------------------------
'Rahmen für Display #################################################
'---------------------------------------------------------------------
Lcd_line1:

Line1 = " Temp: Min-Max"
Lcdat 1 , 1 , Line1 , 1

Line1 = "Uhrzeit: "
Lcdat 5 , 1 , Line1 , 1

Line1 = " " + Chr(248) + "C"
Lcdat 3 , 9 , Line1

Return


Lcd_line:

'Line oben links rechts
Line(0 , 0) -(128 , 0) , 255

'Line links oben unten
Line(0 , 0) -(0 , 63) , 255

'Line rechts oben unten
Line(127 , 0) -(127 , 63) , 255

Return

'#####################################################################
'---------------------------------------------------------------------



'---------------------------------------------------------------------
'Get_1wire ################################################
'---------------------------------------------------------------------


Get_1wire_1:

1wreset
1wwrite &HCC
1wwrite &H44

Do
Temp = 1wread() ' Ende der Temperaturmessung abwarten
Loop Until Temp = &HFF

Get_1wire_2:

1wreset
1wwrite &HCC
1wwrite &HBE

For I1w = 1 To 9
Scratch(i1w) = 1wread()
Next

Temp = Scratch(2)
Shift Temp , Left , 8

Temp = Temp + Scratch(1)
Temp1 = Temp
Temp1 = Temp1 / 2
Ist_temp = Scratch(8) - Scratch(7)
Ist_temp = Ist_temp / Scratch(8)
Ist_temp = Ist_temp + Temp1
Ist_temp = Ist_temp - 0.25

Return


'---------------------------------------------------------------------
'Temp Steuerung: ############################################
'---------------------------------------------------------------------
Temp_on_off:


Tempon = Tempoff - 0.5
Tempoff = 28

If Ist_temp > Tempoff Then

Lcdat 7 , 90 , "Aus"

Elseif Ist_temp < Tempon Then

Lcdat 7 , 90 , "Ein"
Else
End If

Return


'#####################################################################
'---------------------------------------------------------------------


'---------------------------------------------------------------------
'Uhr mit DS1307 ####################################################
'---------------------------------------------------------------------


Dim Weekday As Byte
Getdatetime:
I2cstart ' Start
I2cwbyte Ds1307w ' DS1307 schreiben
I2cwbyte 0 ' DS1307 Adresszeiger auf 0 stellen

I2cstart ' Start
I2cwbyte Ds1307r ' DS1307 lesen (ab vorher eingestellter Adresse 0)
I2crbyte _sec , Ack ' Sekunden
I2crbyte _min , Ack ' Minuten
I2crbyte _hour , Ack ' Stunden
I2crbyte Weekday , Ack ' Wochentag (in Dummy gelesen da von date$/time$ nicht genutzt)
I2crbyte _day , Ack ' Tag
I2crbyte _month , Ack ' Monat
I2crbyte _year , Nack ' Jahr
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 ' Start
I2cwbyte Ds1307w ' DS1307 schreiben
I2cwbyte 4 ' DS1307 Adresszeiger auf 4 (Byte 5) stellen
I2cwbyte _day ' Tag schreiben
I2cwbyte _month ' Monat schreiben
I2cwbyte _year ' Jahr schreiben
I2cstop
Return

Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Start
I2cwbyte Ds1307w ' DS1307 schreiben
I2cwbyte 0 ' DS1307 Adresszeiger auf 0 stellen
I2cwbyte _sec ' Sekunden schreiben
I2cwbyte _min ' Minuten schreiben
I2cwbyte _hour ' Stunden schreiben
I2cstop
Return

'#####################################################################
'---------------------------------------------------------------------


'---------------------------------------------------------------------
'Display löschen ####################################################
'---------------------------------------------------------------------
Lcd_cls2:
Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2 ' both displays off
Cls
Waitms 10
Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2 'both on
Return
'#####################################################################
'---------------------------------------------------------------------

$include "font8x8.font"


Danke

mfg
Florian
 
Hallo Florian,
vielleicht noch ein paar Hinweise zu dem Code.

Deine Main Loop würde ich etwas umstellen, und zwar so:

Code:
Do
   Lcdat 7 , 5 , Date$
   Lcdat 8 , 5 , Time$

   Gosub Get_1wire_1

   Waitms 1000

   Gosub Get_1wire_2
   Gosub Anzeige
   Gosub Temp_on_off
Loop

Du kannst dann die Warteschleife
Do
Temp = 1wread() ' Ende der Temperaturmessung abwarten
Loop Until Temp = &HFF
aus der Sub Get_1wire_1 entfernen. Dahin ging Cassios Hinweis einige Post vorher.
Anstelle der Schleife solltest du aber ein Return einfügen, ansonsten läuft das Programm direkt in die Sub Get_1wire_2 rein, die du ja anschließend in der Main Loop noch einmal aufrufst.

Diesen Teil der Sub Get_1wire_2
Temp = Scratch(2)
Shift Temp , Left , 8
Temp = Temp + Scratch(1)
Temp1 = Temp

würde ich ersetzen durch
Temp1 = Makeint(Scratch(1),Scratch(2))

Temp ist vom Typ Word und daher immer gefährdet, das Vorzeichen zu verlieren. Temp1 ist Integer, da passt das.

HBA
 

Ü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)