DS18B20 mit Atmega8 bekomme nur 1 empfangen

Gast #3355945
Lesenswert?

Hallo

Ich habe einen Atmega8 und einen DS18b20 Temperatursensor.

Mein Ziel:
Die Temperatur vom DS18b20 auslesen und auf ein LCD 2*16 Anzeigen Lassen 
und bei einen Bestimmten wert soll ein Relais schalten.
LCD Anzeige funktioniert und das Relais schaltet auch leider bekomme ich 
keinen vernünftigen wert aus den DS18B20. Habe die Schaltung Simuliert 
und eine Passende Platine dazu geätzt. Ist also alles wie bei der 
Simulation.

Anbei die Schaltung(nicht gerade die Schönste).

Der Quellcode ist in Bascom.
Der Atmega8 läuft intern mit 1MHz.


Meine Versorgungspannung ist 4,95V mit Multimeter gemessen.

Der Code:

$regfile = "m8def.dat"
$crystal = 1000000

Config 1wire = Pinc.1
Config Portc.0 = Output
Config Pinc.2 = Input
Config Pinc.3 = Input

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , _
   Db7 = Portd.3 , E = Portd.6 , Rs = Portd.7

Initlcd
Wait 1


Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32            ' replace 
[x] with number (0-7)
Cursor Off

Dim Temp_soll As Integer
Dim Temp_ist As Integer
Dim Temp_string As String * 10

Temp_ist = 60

Cls

'######################Tempsensor##################
Dim Sc(9) As Byte
Dim Temperatur As Integer
Dim Celsius As Single

Do

1wreset
 1wwrite &HCC                                               ' 
Überspringe Rombefehl Seriennummer weglassen
 1wwrite &H44                                               'messen
 Waitms 1000
 1wreset
 1wwrite &HCC
 1wwrite &HBE                                               ' Start 
Daten lesen
 Sc(1) = 1wread(9)                                          ' Gelesene 
Daten ins Array
 Waitms 1000

Temperatur = Makeint(sc(1) , Sc(2))                         ' Die oberen 
und unteren 8Bit in eine 16Bit Integer Variable speichern


Celsius = Temperatur / 16

Temp_string = Str(temp_ist)
Temp_string = Format(temp_string , "+0.0")

Locate 1 , 1
Lcd "Ist:"

If Temp_ist < -99 Or Temp_ist > 99 Then
Locate 1 , 1
Lcd Celsius ; Chr(0) ; "C"
Else
Locate 1 , 1
Lcd " " ; Celsius ; Chr(0) ; "C"
End If

Temp_string = Str(temp_soll)
Temp_string = Format(temp_string , "+0.0")

Locate 2 , 1
Lcd "Soll:"
If Temp_soll < -99 Or Temp_soll > 99 Then
Locate 2 , 10
Lcd Temp_string ; Chr(0) ; "C"
Else
Locate 2 , 10
Lcd " " ; Temp_string ; Chr(0) ; "C"
End If

If Temp_soll >= Temp_ist Then
Portc.0 = 0
Else
Portc.0 = 1
End If

If Pinc.3 = 1 And Temp_soll < 300 Then
Temp_soll = Temp_soll + 1
End If

If Pinc.2 = 1 And Temp_soll > -150 Then
Temp_soll = Temp_soll - 1
End If

Waitms 80
Loop
Angehängte Dateien:
Gast #3355969
Lesenswert?

Motze schrieb:
> Kondensatoren mag ich wirklich nicht aber der Pull-Up müsste drin sein
> mit 4,7k (R3) oder sehe ich das falsch?

Ok, auf dem hingerotzten Schalt"plan" nicht zu erkennen..

Also Kondis sind PFLICHT!

Teste mal den DS solo. Gibt ja in Bascom ne Demo dazu.
Gast #3356002
Lesenswert?

Erst mal vielen dank für eure Hilfe bis jetzt.

Die Anzeige zeigt zwei Werte abwechselnd an und zwar -0,0625 und 0,01255 
an.

Der Code:
$regfile = "m8def.dat"
$crystal = 1000000

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , _
   Db7 = Portd.3 , E = Portd.6 , Rs = Portd.7

Initlcd

Wait 1

Config 1wire = Portc.1

Dim Sc(9) As Byte
Dim Temperatur As Integer
Dim Celsius As Single

Do

 1wreset
 1wwrite &HCC                                               ' 
Überspringe Rombefehl Seriennummer weglassen
 1wwrite &H44                                               'messen
 Waitms 1000
 1wreset
 1wwrite &HCC
 1wwrite &HBE                                               ' Start 
Daten lesen
 Sc(1) = 1wread(9)                                          ' Gelesene 
Daten ins Array
 Waitms 500

Temperatur = Makeint(sc(1) , Sc(2))                         ' Die oberen 
und unteren 8Bit in eine 16Bit Integer Variable speichern


Celsius = Temperatur / 16                                   ' Bei 12Bit 
Auflösung (default Einstellung) durch 16 dividieren oder mit 0,0625 
multiplizieren

Locate 1 , 1
Lcd Celsius

Cls
Loop

End
Gast #3356156
Lesenswert?

Motze schrieb:
...
Dim Sc(9) As Byte
...
> Daten lesen
>  Sc(1) = 1wread(9)                                          ' Gelesene

Kenne mich in Bascomp definitiv nicht aus, aber wenn ich das richtig 
verstehe liest du in das Array Sc nicht alle neun Bytes ein sondern nur 
eins.
Sc = 1wread(9); sollte besser sein ?
#3356189
Lesenswert?

Bei deinen Quelltext hat er leider garnix angezeigt.

Habe den Quellcode leicht abgeändert:
1
$regfile = "m8def.dat"
2
$crystal = 1000000
3

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

8
Initlcd
9

10
Wait 1
11

12
Config 1wire = Portc.1
13

14
Dim Sc(9) As Byte
15
Dim Temperatur As Integer
16
Dim Celsius As Single
17
Dim X As Integer
18

19
Do
20

21
 1wreset
22
 1wwrite &HCC                                               ' Überspringe Rombefehl Seriennummer weglassen
23
 1wwrite &H44                                               'messen
24
 Waitms 1000
25
 1wreset
26
 1wwrite &HCC
27
 1wwrite &HBE                                               ' Start Daten lesen
28
 For X = 1 To 9
29
      Sc(x) = 1wread()
30
      Locate 1 , X
31
      Lcd Sc(x)
32
 Next                                                       ' Gelesene Daten ins Array
33
 Waitms 500
34

35

36
Loop
37

38
End

Jetzt zeigt er mir: 22222222255 an.
Was ich gar nicht nachvollziehen kann.

mfg Mathias
Gast #3356192
Lesenswert?

den rest nicht vergessen

Temperatur = Makeint(sc(1) , Sc(2))                         ' Die oberen
und unteren 8Bit in eine 16Bit Integer Variable speichern


Celsius = Temperatur / 16                                   ' Bei 12Bit
Auflösung (default Einstellung) durch 16 dividieren oder mit 0,0625
multiplizieren

Locate 1 , 1
Lcd Celsius

Cls
Loop

End
#3356195
Lesenswert?

So der ganze Quelltext nochmal.

Aber leider keine Veränderung

Obere Zeiler LCD 22222222255
Untere Zeile LCD -0,1255(0,0625) immer im Wechsel
1
$regfile = "m8def.dat"
2
$crystal = 1000000
3

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

8
Initlcd
9

10
Wait 1
11

12
Config 1wire = Portc.1
13

14
Dim Sc(9) As Byte
15
Dim Temperatur As Integer
16
Dim Celsius As Single
17
Dim X As Integer
18

19
Do
20

21
 1wreset
22
 1wwrite &HCC                                               ' Überspringe Rombefehl Seriennummer weglassen
23
 1wwrite &H44                                               'messen
24
 Waitms 1000
25
 1wreset
26
 1wwrite &HCC
27
 1wwrite &HBE                                               ' Start Daten lesen
28
 For X = 1 To 9
29
      Sc(x) = 1wread()
30
      Locate 1 , X
31
      Lcd Sc(x)
32
 Next                                                       ' Gelesene Daten ins Array
33
 Waitms 500
34

35
 Temperatur = Makeint(sc(1) , Sc(2))                        ' Die oberen
36

37

38
Celsius = Temperatur / 16                                   ' Bei 12Bit
39
Locate 2 , 1
40
Lcd Celsius
41

42
Loop
43

44
End

mfg Mathias
Gast #3356730
Lesenswert?

Schön das es funktioniert hat.

Mir ist allerdings noch ein kleiner Fehler aufgefallen.
Sobald die Temperatur unter 0 C° fällt wird nur noch Mist angezeigt :

+0.5 0000 0000 0000 1000 0008h  ((0 * 256) + 8 ) / 16 = 0,5

-0.5 1111 1111 1111 1000 FFF8h  ((255 * 256) + 248) / 16 = 4.095,5

Bei negativen Ergebnissen werden in dem MSB die Bits 15 - 11  auf eins 
gesetzt.
http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
- OPERATION—MEASURING TEMPERATURE und folgende Abschnitte

Pseudocode
if SC(2) > 248  // Prüfen ob "Bits 15 - 11 im MSB gesetzt sind"
{
WORD Temperatur = (65535 - Temperatur) + 1 // NOT
Celsius = Temperatur / -16  // Berechnung
}

65535 - 65.528 + 1 = 8
8 / -16 = -0,5

Hier gibt es bestimmt noch Spezialisten die das besser hinbekommen.
#3356742
Lesenswert?

Vielen dank für den Hinweis. Wäre mir bestimmt auch nie aufgefallen. 
Zumindest nicht solange in meinem Zimmer Temperaturen über null 
Herrschen.

Werde mal den Code ändern. Den gesamten Code werde ich dann nochmal hier 
reinstellen.

Ist ja eigentlich ne schöne Sache Temperatursensor mit Ist Soll 
vergleich und Schaltet dann bei gewissen über/Unterschreitungen ein 
Relais.

Habe ja komplett alles mit Layout und das werde ich dann noch ein bissel 
verändern. So was wie Kondensatoren rein(die ich ja nicht so mag) und 
ein bissel hübsch machen. Vielleicht brauch ja mal jemand/e so was.

mfg Mathias

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren