DS18B20 auslesen und Temperatur auf 7-Segment-Anzeige ausgeben

Gast #2898937
Lesenswert?

Hallo,

ich bin zur Zeit daran einen Thermometer zu Programmieren. Ein Bekannter 
hat mir dabei auch schon geholfen, jedoch hat er sich selbst auch noch 
nie mit diesem Sensor beschäftigt und macht selbst auch weniger mit 
Bascom.

Als µC habe ich einen Atmega8.
Der Temperatursensor ist ein DS18B20
Die 7-Segment Anzeigen haben eine gemeinsame Anode, welche über NPN 
Transistoren an +5V liegen.


Der Atmega8 ist so belegt:

Portd. 0 = a der Anzeigen
Portd. 1 = b der Anzeigen
...
Portd. 6 = g der Anzeigen


Portb. 0 = Anzeige 1
Portb. 1 = Anzeige 2
Portb. 2 = Anzeige 3

Portb. 3 = Sensor

Das Programm zur Ansteuerung der 7-Segment-Anzeige ist bereits 
geschrieben, jedoch weiß ich nicht, wie ich den Sensor auslese uns 
anschließend den Wert auf dem Displan ausgebe.

Es genügt eine Anzeige in ganzen Schritten.

Das bereits geschriebene Programm ist im Anhang als Textdokument.

Ich hoffe auf Hilfe :)

Gruß
Jochen
Angehängte Dateien:
#2898982
Lesenswert?

Hallo,

du brauchst so was wie:
1
dim busy as byte
2
dim Scratch(9) as byte
3
Config 1wire = Porta.0     ' 1wire Pin, Pulup nicht vergessen
4
1wreset                    ' reset 1wire
5
1wwrite skip_rom           ' adressierung überspringen
6
1wwrite convert_t          ' temperatur messen
7
do
8
    busy = 1wread()
9
loop until busy = &HFF     ' warten bis fertig, ca 750 ms
10
1wreset                    ' reset 1wire
11
1wwrite skip_rom           ' adressierung überspringen
12
1wwrite read_ram           ' scratch lesen
13
for i=1 to 9
14
    Scratch(i) = 1wread()  ' 9 byte in Ram
15
next
jetzt hast du in Scratch(1) das Vorzeichen und in Scratch(0) die 
Temperatur in 0.5 Grad Celsius. Man sollte aber noch die CRC auswerten.

Das ist mal schnell aus dem Kopf da ich nichts mehr mit Bascom mache.

Gruß Rene
Gast #2899780
Lesenswert?

Ich hab mir ein Aquariumthermoter mit nem DS18S20 gebaut und das dort 
auch so gemacht. Alle 60 sek wird der Sensor ausgelesen solange der 
Interrupt fürs Multiplexing aus und wieder ein. Vielleicht ne Sekunde 
sind die Anzeigen aus oder weniger und das stört eig wenig. Weil wenn 
man draufschaut dann sind sie meistens eh an.
Gast #2905275
Lesenswert?

So,

der Code wäre fertig, jedoch gibt Probleme:
Die Anzeige zeigt immer nur "00"

Es ist alles so beschalten, wie oben beschrieben, jedoch mit dem 
Unterschied, dass der Sensor nun an Portd. 7 dran hängt.

Für weitere Hilfe wäre ich sehr dankbar :)
#2905296
Lesenswert?

Kann es sein das du Read_temp nicht aufrufst?
1
Do
2

3
   Disable Timer0                                           ' Interrupts ausschalten
4
   Portd = &B01111111                                       ' alle Segmente ausschalten
5
   Portb.0 = 0 : Portb.1 = 0 : Portb.2 = 0                  ' alle Displays ausschalten
6

7
   gosub Read_temp   
8

9
   If Vorzeichen = 1 Then
10
      Display_numbers(1) = 10
11
   Else
12
      Display_numbers(1) = 11
13
   End If
14

15
   Display_numbers(2) = Temperatur / 10
16
   Display_numbers(3) = Temperatur Mod 10
17

18
   Enable Timer0                                        ' Interrupts anschalten
19

20
   Wait 10                                                  ' 10 Sekunden warten
21

22
Loop

das MSB kann nur $00 oder $FF sein.
1
If Scratch(2) >= 248 Then

Gruß Rene
#2905376
Lesenswert?

1
   If Scratch(2) >= 248 Then
2
      B1 = &HFF - Scratch(1)
3
      B2 = &HFF - Scratch(2)
4
      Vorzeichen = 1
5
   Else
6
      Vorzeichen = 0
7
   End If
8

9
   T1 = B1 / 16
10
   T2 = B2 * 16
11
   Temperatur = T1 + T2

B1 ist immer 0, vieviel ist 0 / 16 ?
1
if Scratch(2) = &HFF then
2
    TempRead = &HFF - Scratch(2)
3
    TempRead = TempRead / 2
4
    Vorzeichen = 1
5
else
6
    TempRead = Scratch(2) / 2
7
    Vorzeichen = 0
8
endif
9

10
Temperatur = TempRead - 0.25
11
T1 = Scratch(9) + Scratch(8)
12
T1 = T1 / Scratch(9)
13
Temperatur = Temperatur + T1
#2906506
Lesenswert?

1
T1 = Scratch(9) + Scratch(8)
da habe ich mich verschrieben es muß eine Subtraktion sein.
Kannst du dir die Werte des Scratch, Temperatur und T1 mal ausgeben 
lassen?

So wie ich das sehe gibst du die Temperatur ja nur in ganzen Grad 
Celsius ohne Nachkommastelle aus. Dann brauchst du die erweiterte 
Genauigkeit nicht.
Es reicht dann ja das Vorzeichen aus Scratch(2) zu lesen eventuell 
Scratch(1) anzupassen und durch 2 zu Teilen dann hast du schon die 
Temperatur auf ein Grad genau. Du sparst dir dann auch die ganze 
Gleitkommasache.


1
Dim Tempread As Single

Tempread muß eine Bytevariable sein.

Gruß Rene
#2906557
Lesenswert?

Anhang vergessen.

Wenn die Anzeige nicht so lang aus sein soll dann geht auch das noch:
1
Read_temp:
2
  Anzeige_aus
3
  1wreset                                             ' Initialisierung
4
  1wwrite Skip_rom                                    ' Skip ROM, da nur ein DS18B20 verwendet wird
5
  1wwrite Convert_t                                   ' Befehl für Messung geben
6
        Anzeige_an
7
        wait 1
8
        Anzeige_aus
9
  1wreset                                             ' Initialisierung  
10
  1wwrite Skip_rom                                    ' Skip ROM
11
     1wwrite Read_scratch                                ' Temperatur auslesen
12
  For I = 1 To 9
13
          Scratch(i) = 1wread()
14
  Next
15
  Anzeige_an
16
  If Scratch(2) = &HFF Then
17
    Tempread = &HFF - Scratch(2)
18
    Tempread = Tempread / 2
19
    Vorzeichen = 1
20
  Else
21
          Tempread = Scratch(2) / 2
22
    Vorzeichen = 0
23
  End If
24
Return
Angehängte Dateien:
Gast #2908356
Lesenswert?

Hallo und einen Guten Amend miteinander

Ich habe nun auch diesen Aufbau, wie Jochen, aufgebaut und das Programm 
von Rene auf den Atmega8 gemacht. Irgendwie kommt bei dem Link von 
Jochen nun ein Error??

Jedoch habe ich auch das Problem, dass immer nur "00" angezeigt wird?

Kann es sein, dass etwas an dem Code nicht stimmt, weil richtig 
aufgebaut habe ich es zu 100% und auch Jochen hat das Problem schon 
beschrieben. Kann mir jemand weiterhelfen?

Wenn es geht Rene, da du ja anscheinend was davon verstehst ;D

Ich wünsche noch einen schönen Abend
Alexander
Gast #2908567
Lesenswert?

Jochen schrieb:
> Jedoch wird nicht die richtige Temperatur angezeigt ...Ich steh echt
> auf dem Schlauch.

Hallo Jochen,
hast du denn inzwischen mal in das Datenblatt des Sensors geschaut oder 
wartest du nur darauf, dass Rene dir ein fertiges Programm abliefert?
Dann hättest du vielleicht auch erkannt, dass Renes Auswertung 
offensichtlich für einen DS1820 geschrieben ist, du aber scheinbar einen 
DS18B20 verwendest. Und dann sind die Ergebnisse durchaus 
nachvollziehbar.

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