Forum: Mikrocontroller und Digitale Elektronik DS18B20 mit Atmega8 bekomme nur 1 empfangen


von Motze (Gast)


Angehängte Dateien:

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

von (prx) A. K. (prx)


Lesenswert?

Kondensatoren magst du nicht?

von interessierter (Gast)


Lesenswert?

Pull Up auf der Datenleitung des DS vergessen! 2 KOhm.

von Motze (Gast)


Lesenswert?

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

von Paul Baumann (Gast)


Lesenswert?

Sag mal, gucke ich richtig und der Atmega8 hat gar keinen Masseanschluß?
(Pin 8, Pin 22)

Kopf kratz
MfG Paul

von Motze (Gast)


Lesenswert?

Doch die haben Masse aber das wird vom Programm nicht angezeigt 
sogenannte Hidden Pins. Wie gesagt LCD und Relais zieht ja an.

von interessierter (Gast)


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.

von Motze (Gast)


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

von Motze (Gast)


Lesenswert?

sorry 0,1255 ist der zweite Wert nicht 0,01255.

von Motze (Gast)


Lesenswert?

Weis keiner eine Lösung ich bin am verzweifeln!

von Helmut (Gast)


Lesenswert?

nimm mal einen 3,3 kOhm Widerstand als Pullup, dann läuft er wohl

von Mathias G. (motze)


Lesenswert?

Ich habe ein 2.2k Wiederstand verwendet hatte leider keinen 3,3k 
Wiederstand. Aber es hat sich nichts geändert. Er wechselt immer noch 
zwischen den zwei Werten.

mfg Mathias

von DS18b20 (Gast)


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 ?

von Mathias G. (motze)


Lesenswert?

bascom gibt mir dann eine Fehlermeldung aus und zwar:

Array expected

der Code ist Kopiert und sollte laufen zumindest bei anderen war das der 
Fall.

mfg Mathias

von interessierter (Gast)


Lesenswert?

so?

Do
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Waitms 800

   1wreset
   1wwrite &HCC
   1wwrite &HBE


   For X = 1 To 9
      sc(x) = 1wread()
   Next

von Mathias G. (motze)


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

: Bearbeitet durch User
von interessierter (Gast)


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

von Mathias G. (motze)


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

von interessierter (Gast)


Lesenswert?

sicher dass du den DS18B20 hast, nicht den DS18S20 oder DS1820?
Kondensatoren dran?

von Mathias G. (motze)


Lesenswert?

Ganz sicher 18b20 wo sollte ich den denn Kondensator anschließen?

von H.Joachim S. (crazyhorse)


Lesenswert?

Kondensatoren mag er doch nicht!
Muss auch ohne gehen, eh unnötiger Ballast :-)

von interessierter (Gast)


Lesenswert?

steht im Datenblatt des M8 oder in jeder vernünftigen Schaltung mit AVR 
drin.
VCC->GND und AVCC->GND, direkt am IC je 100nF || 10uF, VRef->GND nur 
100n.

von Wolfgang (Gast)


Lesenswert?

Motze schrieb:
> LCD Anzeige funktioniert

Das ist etwas verwunderlich. Was hast du denn am Pin 3 des LCD-Modules 
angeschlossen?

von mue_c (Gast)


Lesenswert?

1-wire funktioniert mit Bascom erst ab 8MHz Takt.
Darunter kann das Timing nicht eingehalten werden.

von mue_c (Gast)


Lesenswert?

Ich sehe gerade, dass 2MHz auch noch geht, aber bei 1MHz bekomme ich 
dein Programm nicht zum Laufen.

von Mathias G. (motze)


Lesenswert?

Komme gerade frisch aus der Kneipe aber genau das war das Problem jetzt 
funktioniert alles...

recht herzlichen dank nochmal...

vielen dank...

habe den atmel auf 8Mhz gestellt und schon läuft alles.

mfg Mathias

von Mathias G. (motze)


Angehängte Dateien:

Lesenswert?

Um die Sache noch zu klären was ich an Pin 3 des LCD angeschlossen habe 
hier noch ein Schalt"Plan" des LCD.

vielen dank nochmal euch allen.

mfg Mathias

von DS18b20 (Gast)


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.

von Mathias G. (motze)


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

von interessierter (Gast)


Lesenswert?

Magst du Freilaufdioden ;-)

von Mathias G. (motze)


Lesenswert?

Ja ist auch eine drin keine angst. Sonst wäre mein Transistor schon 
abgeraucht. Leider nicht eingezeichnet. Werde den Schaltplan auch 
nochmal hübsch machen und ihn nochmal reinstellen.

von mue_c (Gast)


Lesenswert?

Du rechnest doch mit Integer und setzt die beiden Werte über 
Makeint(sc(1),sc(2)) korrekt zusammen.
Da brauchst keine seltsame Umrechnung zu machen, in Celsius stehen die 
richtigen Werte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.