Forum: Mikrocontroller und Digitale Elektronik DS18B20 auslesen und Temperatur auf 7-Segment-Anzeige ausgeben


von Jochen (Gast)


Angehängte Dateien:

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

von Rene Z. (renezimmermann)


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

von Karl H. (kbuchegg)


Lesenswert?


von mue-c (Gast)


Lesenswert?

Hallo Jochen,
die wirklichen Probleme gehen erst los, wenn durch das Multiplexen das 
Timing des 1wire zerhauen wird.

Seit wann kann man den Prescale eines Timers eigentlich auf "5" setzen?

von Timer (Gast)


Lesenswert?

Für das Timing kann man ja den Timer solange deaktivieren, dass ist doch 
nicht das Problem

von Jochen (Gast)


Lesenswert?

Danke erstmal für die Antworten.

Das der Prescale auf 5 steht ist falsch ... den habe ich eben auf 8 
geändert.

von mue-c (Gast)


Lesenswert?

Timer schrieb:
> Für das Timing kann man ja den Timer solange deaktivieren, dass ist doch > nicht 
das Problem
Das wirst du dann in der Anzeige bemerken, da die Bascom Befehle für 
1wire schon mal mehrere ms dauern. So einfach geht das nun wieder nicht.

von Timer (Gast)


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.

von Jochen (Gast)


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

von Jochen (Gast)


Lesenswert?

Hier noch der Code: (eben vergessen ...)

https://dl.dropbox.com/u/41257941/temp.bas

von Rene Z. (renezimmermann)


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

von Rene Z. (renezimmermann)


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

von Jochen (Gast)


Lesenswert?

So,

ich habe gestern mal den Code abgeändert und er sieht nun so aus:
https://dl.dropbox.com/u/41257941/temp.bas

Jedoch zeigt die anzeige nur "01" an und ändert sich nicht.
Die Anzeige erlischt nun alle 10 Sekunden für ca. 1sekunde, wie es ja 
soll.

Jedoch wird nicht die richtige Temperatur angezeigt ...

Ich steh echt auf dem Schlauch.

von Rene Z. (renezimmermann)


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

von Rene Z. (renezimmermann)


Angehängte Dateien:

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

von Alexander (Gast)


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

von Rene Z. (renezimmermann)


Lesenswert?

>Kannst du dir die Werte des Scratch, Temperatur und T1 mal ausgeben
>lassen?

Wie ich schon sagte lasst euch die Werte mal ausgeben um den Fehler 
einzuschränken.

von mue-c (Gast)


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.

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.